63
63
/* calculate the number of elements in each bucket */
64
64
number_per_bucket= static_cast<uint32_t> ( ceil( static_cast<double>(number_sessions) / static_cast<double>(number_buckets) ) );
66
vector_of_scoreboard_vectors.reserve(number_buckets);
66
67
/* populate the vector of scoreboard vectors */
67
68
for (uint32_t j= 0; j < number_buckets; ++j)
69
vector<ScoreboardSlot* > *scoreboard_vector= new vector<ScoreboardSlot* >();
70
vector<ScoreboardSlot* > *scoreboard_vector= new vector<ScoreboardSlot*>;
72
scoreboard_vector->reserve(number_per_bucket);
71
73
/* preallocate the individual vectors */
72
vector<ScoreboardSlot* >::iterator scoreboard_vector_iterator= scoreboard_vector->begin();
73
74
for (uint32_t h= 0; h < number_per_bucket; ++h)
75
ScoreboardSlot *scoreboard_slot= new ScoreboardSlot();
76
scoreboard_vector_iterator= scoreboard_vector->insert(scoreboard_vector_iterator, scoreboard_slot);
78
scoreboard_vector->resize(number_per_bucket);
75
scoreboard_vector->push_back(new ScoreboardSlot);
81
77
/* insert the vector into the vector of scoreboard vectors */
82
vector<vector<ScoreboardSlot* >* >::iterator vector_of_scoreboard_vectors_iterator=
83
vector_of_scoreboard_vectors.begin();
85
vector_of_scoreboard_vectors_iterator=
86
vector_of_scoreboard_vectors.insert(vector_of_scoreboard_vectors_iterator, scoreboard_vector);
78
vector_of_scoreboard_vectors.push_back(scoreboard_vector);
88
vector_of_scoreboard_vectors.resize(number_buckets);
81
vector_of_scoreboard_locks.reserve(number_buckets);
90
82
/* populate the scoreboard locks vector each ScoreboardSlot vector gets a lock */
91
vector<boost::shared_mutex* >::iterator vector_of_scoreboard_locks_iterator= vector_of_scoreboard_locks.begin();
92
83
for (uint32_t k= 0; k < number_buckets; ++k)
94
boost::shared_mutex* lock= new boost::shared_mutex();
95
vector_of_scoreboard_locks_iterator=
96
vector_of_scoreboard_locks.insert(vector_of_scoreboard_locks_iterator, lock);
98
vector_of_scoreboard_locks.resize(number_buckets);
84
vector_of_scoreboard_locks.push_back(new boost::shared_mutex);
100
86
/* calculate the approximate memory allocation of the scoreboard */
101
87
size_t statusVarsSize= sizeof(StatusVars) + sizeof(system_status_var);
107
93
Scoreboard::~Scoreboard()
109
vector<vector<ScoreboardSlot* >* >::iterator v_of_scoreboard_v_begin_it= vector_of_scoreboard_vectors.begin();
110
vector<vector<ScoreboardSlot* >* >::iterator v_of_scoreboard_v_end_it= vector_of_scoreboard_vectors.end();
112
for (; v_of_scoreboard_v_begin_it != v_of_scoreboard_v_end_it; ++v_of_scoreboard_v_begin_it)
114
vector<ScoreboardSlot* > *scoreboard_vector= *v_of_scoreboard_v_begin_it;
116
vector<ScoreboardSlot* >::iterator scoreboard_vector_it= scoreboard_vector->begin();
117
vector<ScoreboardSlot* >::iterator scoreboard_vector_end= scoreboard_vector->end();
118
for (; scoreboard_vector_it != scoreboard_vector_end; ++scoreboard_vector_it)
120
delete *scoreboard_vector_it;
123
scoreboard_vector->clear();
124
delete scoreboard_vector;
125
} // vector_of_scoreboard_vectors is not on the stack and does not deletion
127
vector<boost::shared_mutex* >::iterator vector_of_scoreboard_locks_it= vector_of_scoreboard_locks.begin();
128
vector<boost::shared_mutex* >::iterator vector_of_scoreboard_locks_end= vector_of_scoreboard_locks.end();
130
for (; vector_of_scoreboard_locks_it != vector_of_scoreboard_locks_end; ++vector_of_scoreboard_locks_it)
132
boost::shared_mutex* lock= *vector_of_scoreboard_locks_it;
95
BOOST_FOREACH(std::vector<ScoreboardSlot*>* it0, vector_of_scoreboard_vectors)
97
BOOST_FOREACH(ScoreboardSlot* it, *it0)
101
BOOST_FOREACH(boost::shared_mutex* it, vector_of_scoreboard_locks)
137
uint32_t Scoreboard::getBucketNumber(Session *session)
105
uint32_t Scoreboard::getBucketNumber(Session *session) const
139
return (session->getSessionId() % number_buckets);
107
return session->getSessionId() % number_buckets;
142
110
ScoreboardSlot* Scoreboard::findScoreboardSlotToLog(Session *session)
150
118
/* Check if this session has already claimed a slot */
151
119
int32_t session_scoreboard_slot= session->getScoreboardIndex();
153
if (session_scoreboard_slot == -1)
155
boost::shared_mutex* LOCK_scoreboard_vector= vector_of_scoreboard_locks.at(bucket_number);
156
LOCK_scoreboard_vector->lock();
158
ScoreboardSlot *scoreboard_slot= NULL;
160
int32_t slot_index= 0;
161
for (vector<ScoreboardSlot *>::iterator it= scoreboard_vector->begin();
162
it != scoreboard_vector->end(); ++it, ++slot_index)
164
scoreboard_slot= *it;
166
if (scoreboard_slot->isInUse() == false)
168
scoreboard_slot->setInUse(true);
169
scoreboard_slot->setSessionId(session->getSessionId());
170
scoreboard_slot->setUser(session->user()->username());
171
scoreboard_slot->setIp(session->user()->address());
172
session->setScoreboardIndex(slot_index);
173
LOCK_scoreboard_vector->unlock();
174
return scoreboard_slot;
178
LOCK_scoreboard_vector->unlock();
180
else // already claimed a slot just do a lookup
182
ScoreboardSlot *scoreboard_slot= scoreboard_vector->at(session_scoreboard_slot);
183
return scoreboard_slot;
121
if (session_scoreboard_slot != -1)
122
return scoreboard_vector->at(session_scoreboard_slot);
124
boost::shared_mutex* LOCK_scoreboard_vector= vector_of_scoreboard_locks.at(bucket_number);
125
LOCK_scoreboard_vector->lock();
127
int32_t slot_index= 0;
128
for (vector<ScoreboardSlot*>::iterator it= scoreboard_vector->begin(); it != scoreboard_vector->end(); ++it, ++slot_index)
130
ScoreboardSlot& slot= **it;
134
slot.setSessionId(session->getSessionId());
135
slot.setUser(session->user()->username());
136
slot.setIp(session->user()->address());
137
session->setScoreboardIndex(slot_index);
138
LOCK_scoreboard_vector->unlock();
142
LOCK_scoreboard_vector->unlock();
186
144
/* its possible we did not claim a slot if the scoreboard size is somehow smaller then the
187
145
active connections */
191
149
ScoreboardSlot* Scoreboard::findOurScoreboardSlot(Session *session)
194
uint32_t bucket_number= getBucketNumber(session);
196
/* our vector corresponding to bucket_number */
197
vector<ScoreboardSlot* > *scoreboard_vector= vector_of_scoreboard_vectors.at(bucket_number);
199
151
/* Check if this session has already claimed a slot */
200
152
int32_t session_scoreboard_slot= session->getScoreboardIndex();
202
153
if (session_scoreboard_slot == -1)
207
ScoreboardSlot *scoreboard_slot= scoreboard_vector->at(session_scoreboard_slot);
208
return scoreboard_slot;
155
return vector_of_scoreboard_vectors.at(getBucketNumber(session))->at(session_scoreboard_slot);