changing the database configuration now checks that enough processes exist to support the new configuration
This commit is contained in:
parent
2a0d9cd621
commit
6e94d7d71a
|
@ -1624,6 +1624,11 @@ ACTOR Future<bool> configure( Database db, std::vector<StringRef> tokens, Refere
|
||||||
printf("Type `configure FORCE <TOKEN>*' to configure without this check\n");
|
printf("Type `configure FORCE <TOKEN>*' to configure without this check\n");
|
||||||
ret=false;
|
ret=false;
|
||||||
break;
|
break;
|
||||||
|
case ConfigurationResult::NOT_ENOUGH_WORKERS:
|
||||||
|
printf("ERROR: Not enough processes exist to support the specified configuration\n");
|
||||||
|
printf("Type `configure FORCE <TOKEN>*' to configure without this check\n");
|
||||||
|
ret=false;
|
||||||
|
break;
|
||||||
case ConfigurationResult::SUCCESS:
|
case ConfigurationResult::SUCCESS:
|
||||||
printf("Configuration changed\n");
|
printf("Configuration changed\n");
|
||||||
ret=false;
|
ret=false;
|
||||||
|
@ -1730,7 +1735,12 @@ ACTOR Future<bool> fileConfigure(Database db, std::string filePath, bool isNewDa
|
||||||
break;
|
break;
|
||||||
case ConfigurationResult::REGIONS_CHANGED:
|
case ConfigurationResult::REGIONS_CHANGED:
|
||||||
printf("ERROR: The region configuration cannot be changed while simultaneously changing usable_regions\n");
|
printf("ERROR: The region configuration cannot be changed while simultaneously changing usable_regions\n");
|
||||||
printf("Type `fileconfigure FORCE <TOKEN>*' to configure without this check\n");
|
printf("Type `fileconfigure FORCE <FILENAME>' to configure without this check\n");
|
||||||
|
ret=false;
|
||||||
|
break;
|
||||||
|
case ConfigurationResult::NOT_ENOUGH_WORKERS:
|
||||||
|
printf("ERROR: Not enough processes exist to support the specified configuration\n");
|
||||||
|
printf("Type `fileconfigure FORCE <FILENAME>' to configure without this check\n");
|
||||||
ret=false;
|
ret=false;
|
||||||
break;
|
break;
|
||||||
case ConfigurationResult::SUCCESS:
|
case ConfigurationResult::SUCCESS:
|
||||||
|
|
|
@ -293,6 +293,7 @@ ACTOR Future<ConfigurationResult::Type> changeConfig( Database cx, std::map<std:
|
||||||
|
|
||||||
if(!creating && !force) {
|
if(!creating && !force) {
|
||||||
state Future<Standalone<RangeResultRef>> fConfig = tr.getRange(configKeys, CLIENT_KNOBS->TOO_MANY);
|
state Future<Standalone<RangeResultRef>> fConfig = tr.getRange(configKeys, CLIENT_KNOBS->TOO_MANY);
|
||||||
|
state Future<vector<ProcessData>> fWorkers = getWorkers(&tr);
|
||||||
Void _ = wait( success(fConfig) || tooLong );
|
Void _ = wait( success(fConfig) || tooLong );
|
||||||
|
|
||||||
if(!fConfig.isReady()) {
|
if(!fConfig.isReady()) {
|
||||||
|
@ -377,6 +378,44 @@ ACTOR Future<ConfigurationResult::Type> changeConfig( Database cx, std::map<std:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Void _ = wait( success(fWorkers) || tooLong );
|
||||||
|
if(!fWorkers.isReady()) {
|
||||||
|
return ConfigurationResult::DATABASE_UNAVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(newConfig.regions.size()) {
|
||||||
|
std::map<Optional<Key>, std::set<Optional<Key>>> dcId_zoneIds;
|
||||||
|
for(auto& it : fWorkers.get()) {
|
||||||
|
if( it.processClass.machineClassFitness(ProcessClass::Storage) <= ProcessClass::WorstFit ) {
|
||||||
|
dcId_zoneIds[it.locality.dcId()].insert(it.locality.zoneId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(auto& region : newConfig.regions) {
|
||||||
|
if(dcId_zoneIds[region.dcId].size() < std::max(newConfig.storageTeamSize, newConfig.tLogReplicationFactor)) {
|
||||||
|
return ConfigurationResult::NOT_ENOUGH_WORKERS;
|
||||||
|
}
|
||||||
|
if(region.satelliteTLogReplicationFactor > 0 && region.priority >= 0) {
|
||||||
|
int totalSatelliteProcesses = 0;
|
||||||
|
for(auto& sat : region.satellites) {
|
||||||
|
totalSatelliteProcesses += dcId_zoneIds[sat.dcId].size();
|
||||||
|
}
|
||||||
|
if(totalSatelliteProcesses < region.satelliteTLogReplicationFactor) {
|
||||||
|
return ConfigurationResult::NOT_ENOUGH_WORKERS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
std::set<Optional<Key>> zoneIds;
|
||||||
|
for(auto& it : fWorkers.get()) {
|
||||||
|
if( it.processClass.machineClassFitness(ProcessClass::Storage) <= ProcessClass::WorstFit ) {
|
||||||
|
zoneIds.insert(it.locality.zoneId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(zoneIds.size() < std::max(newConfig.storageTeamSize, newConfig.tLogReplicationFactor)) {
|
||||||
|
return ConfigurationResult::NOT_ENOUGH_WORKERS;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,7 @@ public:
|
||||||
REGION_NOT_FULLY_REPLICATED,
|
REGION_NOT_FULLY_REPLICATED,
|
||||||
MULTIPLE_ACTIVE_REGIONS,
|
MULTIPLE_ACTIVE_REGIONS,
|
||||||
REGIONS_CHANGED,
|
REGIONS_CHANGED,
|
||||||
|
NOT_ENOUGH_WORKERS,
|
||||||
SUCCESS
|
SUCCESS
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue