BugFix:ReplicationPolicy always fails when teamSize is 1

Whenever use selectReplicas function, be careful that it may have bugs!
This bug is that it always return false (not able to find candidates)
when the storage team size is 1. This is wrong because when storage team size
is 1, the selectReplicas should return an empty result.
This commit is contained in:
Meng Xu 2019-06-27 13:47:46 -07:00
parent 90c158984c
commit 5f5c404291
1 changed files with 9 additions and 2 deletions

View File

@ -1367,6 +1367,7 @@ struct DDTeamCollection : ReferenceCounted<DDTeamCollection> {
if (leastUsedMachines.size()) {
// Randomly choose 1 least used machine
Reference<TCMachineInfo> tcMachineInfo = g_random->randomChoice(leastUsedMachines);
TraceEvent("MXDEBUG", distributorId).detail("MachineID", tcMachineInfo->machineID.contents().toString()).detail("Servers", tcMachineInfo->getServersIDStr());
ASSERT(!tcMachineInfo->serversOnMachine.empty());
LocalityEntry process = tcMachineInfo->localityEntry;
forcedAttributes.push_back(process);
@ -1384,9 +1385,13 @@ struct DDTeamCollection : ReferenceCounted<DDTeamCollection> {
// that have the least-utilized server
team.clear();
auto success = machineLocalityMap.selectReplicas(configuration.storagePolicy, forcedAttributes, team);
if (!success) {
if (!success && configuration.storageTeamSize > 1) { // NOTE: selectReplicas() returns false always when storageTeamSize == 1
TraceEvent("MXDEBUG", distributorId).detail("TeamSize", configuration.storageTeamSize);
break;
}
if ( !success && configuration.storageTeamSize == 1 && forcedAttributes.size() > 0 ) {
TraceEvent(SevError, "MXDEBUG", distributorId).detail("TeamSize", configuration.storageTeamSize).detail("Success", success);
}
ASSERT(forcedAttributes.size() > 0);
team.push_back((UID*)machineLocalityMap.getObject(forcedAttributes[0]));
@ -2043,7 +2048,7 @@ struct DDTeamCollection : ReferenceCounted<DDTeamCollection> {
.detail("MaxTeamNumberOnServer", minMaxTeamNumberOnServer.second)
.detail("MinMachineTeamNumberOnMachine", minMaxMachineTeamNumberOnMachine.first)
.detail("MaxMachineTeamNumberOnMachine", minMaxMachineTeamNumberOnMachine.second)
.detail("DoBuildTeams", doBuildTeams)
.detail("DoBuildTeams", self->doBuildTeams)
.trackLatest("TeamCollectionInfo");
}
}
@ -3215,7 +3220,9 @@ ACTOR Future<Void> storageServerTracker(
//Restart the storeTracker for the new interface
storeTracker = keyValueStoreTypeTracker(self, server);
hasWrongStoreTypeOrDC = false;
self->doBuildTeams = true;
self->restartTeamBuilder.trigger();
self->traceTeamCollectionInfo();
if(restartRecruiting)
self->restartRecruiting.trigger();
}