| 31 | } |
| 32 | |
| 33 | bool IReplicationPolicy::validateFull(bool solved, |
| 34 | std::vector<LocalityEntry> const& solutionSet, |
| 35 | std::vector<LocalityEntry> const& alsoServers, |
| 36 | Reference<LocalitySet> const& fromServers) { |
| 37 | bool valid = true; |
| 38 | std::vector<LocalityEntry> totalSolution(solutionSet); |
| 39 | |
| 40 | // Append the also servers, if any |
| 41 | if (alsoServers.size()) { |
| 42 | totalSolution.reserve(totalSolution.size() + alsoServers.size()); |
| 43 | totalSolution.insert(totalSolution.end(), alsoServers.begin(), alsoServers.end()); |
| 44 | } |
| 45 | |
| 46 | if (!solved) { |
| 47 | if (validate(totalSolution, fromServers)) { |
| 48 | valid = false; |
| 49 | } else if (validate(fromServers->getGroupEntries(), fromServers)) { |
| 50 | valid = false; |
| 51 | } |
| 52 | } else if (!validate(totalSolution, fromServers)) { |
| 53 | valid = false; |
| 54 | } else if (solutionSet.empty()) { |
| 55 | if (!validate(alsoServers, fromServers)) { |
| 56 | valid = false; |
| 57 | } |
| 58 | } else { |
| 59 | auto lastSolutionIndex = solutionSet.size() - 1; |
| 60 | auto missingEntry = totalSolution[lastSolutionIndex]; |
| 61 | totalSolution[lastSolutionIndex] = totalSolution.back(); |
| 62 | totalSolution.pop_back(); |
| 63 | for (int index = 0; index < solutionSet.size() && index < totalSolution.size(); index++) { |
| 64 | if (validate(totalSolution, fromServers)) { |
| 65 | valid = false; |
| 66 | break; |
| 67 | } |
| 68 | auto tempMissing = totalSolution[index]; |
| 69 | totalSolution[index] = missingEntry; |
| 70 | missingEntry = tempMissing; |
| 71 | } |
| 72 | } |
| 73 | return valid; |
| 74 | } |
| 75 | |
| 76 | bool PolicyOne::selectReplicas(Reference<LocalitySet>& fromServers, |
| 77 | std::vector<LocalityEntry> const& alsoServers, |