The following function will determine if the specified configuration of available and dead processes can allow the cluster to survive
| 1370 | // The following function will determine if the specified configuration of available and dead processes can allow |
| 1371 | // the cluster to survive |
| 1372 | bool canKillProcesses(std::vector<ProcessInfo*> const& availableProcesses, |
| 1373 | std::vector<ProcessInfo*> const& deadProcesses, |
| 1374 | KillType kt, |
| 1375 | KillType* newKillType) const override { |
| 1376 | bool canSurvive = true; |
| 1377 | int nQuorum = ((desiredCoordinators + 1) / 2) * 2 - 1; |
| 1378 | |
| 1379 | KillType newKt = kt; |
| 1380 | if ((kt == KillInstantly) || (kt == InjectFaults) || (kt == FailDisk) || (kt == RebootAndDelete) || |
| 1381 | (kt == RebootProcessAndDelete)) { |
| 1382 | LocalityGroup primaryProcessesLeft, primaryProcessesDead; |
| 1383 | LocalityGroup primarySatelliteProcessesLeft, primarySatelliteProcessesDead; |
| 1384 | LocalityGroup remoteProcessesLeft, remoteProcessesDead; |
| 1385 | LocalityGroup remoteSatelliteProcessesLeft, remoteSatelliteProcessesDead; |
| 1386 | |
| 1387 | std::vector<LocalityData> primaryLocalitiesDead, primaryLocalitiesLeft; |
| 1388 | std::vector<LocalityData> primarySatelliteLocalitiesDead, primarySatelliteLocalitiesLeft; |
| 1389 | std::vector<LocalityData> remoteLocalitiesDead, remoteLocalitiesLeft; |
| 1390 | std::vector<LocalityData> remoteSatelliteLocalitiesDead, remoteSatelliteLocalitiesLeft; |
| 1391 | |
| 1392 | std::vector<LocalityData> badCombo; |
| 1393 | std::set<Optional<Standalone<StringRef>>> uniqueMachines; |
| 1394 | |
| 1395 | if (!primaryDcId.present()) { |
| 1396 | for (auto processInfo : availableProcesses) { |
| 1397 | primaryProcessesLeft.add(processInfo->locality); |
| 1398 | primaryLocalitiesLeft.push_back(processInfo->locality); |
| 1399 | uniqueMachines.insert(processInfo->locality.zoneId()); |
| 1400 | } |
| 1401 | for (auto processInfo : deadProcesses) { |
| 1402 | primaryProcessesDead.add(processInfo->locality); |
| 1403 | primaryLocalitiesDead.push_back(processInfo->locality); |
| 1404 | } |
| 1405 | } else { |
| 1406 | for (auto processInfo : availableProcesses) { |
| 1407 | uniqueMachines.insert(processInfo->locality.zoneId()); |
| 1408 | if (processInfo->locality.dcId() == primaryDcId) { |
| 1409 | primaryProcessesLeft.add(processInfo->locality); |
| 1410 | primaryLocalitiesLeft.push_back(processInfo->locality); |
| 1411 | } else if (processInfo->locality.dcId() == remoteDcId) { |
| 1412 | remoteProcessesLeft.add(processInfo->locality); |
| 1413 | remoteLocalitiesLeft.push_back(processInfo->locality); |
| 1414 | } else if (std::find(primarySatelliteDcIds.begin(), |
| 1415 | primarySatelliteDcIds.end(), |
| 1416 | processInfo->locality.dcId()) != primarySatelliteDcIds.end()) { |
| 1417 | primarySatelliteProcessesLeft.add(processInfo->locality); |
| 1418 | primarySatelliteLocalitiesLeft.push_back(processInfo->locality); |
| 1419 | } else if (std::find(remoteSatelliteDcIds.begin(), |
| 1420 | remoteSatelliteDcIds.end(), |
| 1421 | processInfo->locality.dcId()) != remoteSatelliteDcIds.end()) { |
| 1422 | remoteSatelliteProcessesLeft.add(processInfo->locality); |
| 1423 | remoteSatelliteLocalitiesLeft.push_back(processInfo->locality); |
| 1424 | } |
| 1425 | } |
| 1426 | for (auto processInfo : deadProcesses) { |
| 1427 | if (processInfo->locality.dcId() == primaryDcId) { |
| 1428 | primaryProcessesDead.add(processInfo->locality); |
| 1429 | primaryLocalitiesDead.push_back(processInfo->locality); |