in cppcache/src/ClientMetadata.cpp [163:284]
void ClientMetadata::updateBucketServerLocations(
int bucketId, BucketServerLocationsType bucketServerLocations) {
checkBucketId(bucketId);
auto&& serverGroup = m_tcrdm->getServerGroup();
// This is for pruning according to server groups, only applicable when client
// is configured with
// server-group.
if (serverGroup.length() != 0) {
BucketServerLocationsType primaries;
BucketServerLocationsType secondaries;
for (BucketServerLocationsType::iterator iter =
bucketServerLocations.begin();
iter != bucketServerLocations.end(); ++iter) {
auto groups = (*iter)->getServerGroups();
if ((groups != nullptr) && (groups->length() > 0)) {
bool added = false;
for (int i = 0; i < groups->length(); i++) {
auto cs = (*groups)[i];
if (cs->length() > 0) {
auto&& str = cs->toString();
if (str == serverGroup) {
added = true;
if ((*iter)->isPrimary()) {
primaries.push_back(*iter);
break;
} else {
secondaries.push_back(*iter);
break;
}
}
} else {
added = true;
if ((*iter)->isPrimary()) {
primaries.push_back(*iter);
} else {
secondaries.push_back(*iter);
}
}
}
if (!added) {
if ((*iter)->isPrimary()) {
primaries.push_back(*iter);
} else {
secondaries.push_back(*iter);
}
}
}
}
// shuffle the deck
RandGen randGen;
if (primaries.size() > 0) {
std::shuffle(primaries.begin(), primaries.end(), randGen);
}
if (secondaries.size() > 0) {
std::shuffle(secondaries.begin(), secondaries.end(), randGen);
}
m_bucketServerLocationsList[bucketId].clear();
for (BucketServerLocationsType::iterator iter = primaries.begin();
iter != primaries.end(); ++iter) {
LOGFINER("updating primaries with bucketId %d", bucketId);
m_bucketServerLocationsList[bucketId].push_back(*iter);
}
// add secondaries to the end
for (BucketServerLocationsType::iterator iter = secondaries.begin();
iter != secondaries.end(); ++iter) {
LOGFINER("updating secondaries with bucketId %d", bucketId);
m_bucketServerLocationsList[bucketId].push_back(*iter);
}
} else {
BucketServerLocationsType primaries;
BucketServerLocationsType secondaries;
// separate out the primaries from the secondaries
for (BucketServerLocationsType::iterator iter =
bucketServerLocations.begin();
iter != bucketServerLocations.end(); ++iter) {
if ((*iter)->isPrimary()) {
primaries.push_back(*iter);
} else {
secondaries.push_back(*iter);
}
}
// shuffle the deck
RandGen randGen;
if (primaries.size() > 0) {
std::shuffle(primaries.begin(), primaries.end(), randGen);
}
if (secondaries.size() > 0) {
std::shuffle(secondaries.begin(), secondaries.end(), randGen);
}
m_bucketServerLocationsList[bucketId].clear();
// add primaries to the front
for (BucketServerLocationsType::iterator iter = primaries.begin();
iter != primaries.end(); ++iter) {
LOGFINER("updating primaries with bucketId %d and Server = %s ", bucketId,
(*iter)->getEpString().c_str());
m_bucketServerLocationsList[bucketId].push_back(*iter);
}
// add secondaries to the end
for (BucketServerLocationsType::iterator iter = secondaries.begin();
iter != secondaries.end(); ++iter) {
LOGFINER("updating secondaries with bucketId %d", bucketId);
m_bucketServerLocationsList[bucketId].push_back(*iter);
}
}
}