MCPcopy Create free account
hub / github.com/apple/foundationdb / validateAllCombinations

Function validateAllCombinations

fdbrpc/ReplicationUtils.cpp:359–433  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

357}
358
359bool validateAllCombinations(std::vector<LocalityData>& offendingCombo,
360 LocalityGroup const& localitySet,
361 Reference<IReplicationPolicy> const& policy,
362 std::vector<LocalityData> const& newItems,
363 unsigned int nCombinationSize,
364 bool bCheckIfValid) {
365 bool bValid = true;
366
367 if (newItems.size() < nCombinationSize) {
368 bValid = false;
369 }
370 // Ensure that the current set alone does not satisfy the
371 // specified policy
372 else if ((bCheckIfValid) && (!localitySet.validate(policy))) {
373 bValid = false;
374 } else if ((!bCheckIfValid) && (localitySet.validate(policy))) {
375 bValid = false;
376 } else {
377 bool bIsValidGroup;
378 Reference<LocalitySet> localSet = Reference<LocalitySet>(new LocalityGroup());
379 LocalityGroup* localGroup = (LocalityGroup*)localSet.getPtr();
380 localGroup->deep_copy(localitySet);
381
382 std::vector<LocalityEntry> localityGroupEntries = localGroup->getEntries();
383 int originalSize = localityGroupEntries.size();
384
385 for (int i = 0; i < newItems.size(); ++i) {
386 localGroup->add(newItems[i]);
387 }
388
389 std::string bitmask(nCombinationSize, 1); // K leading 1's
390 bitmask.resize(newItems.size(), 0); // N-K trailing 0's
391
392 std::vector<LocalityEntry> resultEntries;
393 do {
394 localityGroupEntries.resize(originalSize);
395 // [0..N-1] integers
396 for (int i = 0; i < bitmask.size(); ++i) {
397 if (bitmask[i]) {
398 localityGroupEntries.push_back(localGroup->getEntry(originalSize + i));
399 }
400 }
401
402 resultEntries.clear();
403
404 // Run the policy, assert if unable to satisfy
405 bool result = localSet->selectReplicas(policy, localityGroupEntries, resultEntries);
406 ASSERT(result);
407
408 bIsValidGroup = resultEntries.size() == 0;
409
410 if (((bCheckIfValid) && (!bIsValidGroup)) || ((!bCheckIfValid) && (bIsValidGroup))) {
411 offendingCombo.reserve(nCombinationSize);
412 for (int i = 0; i < newItems.size(); ++i) {
413 if (bitmask[i]) {
414 offendingCombo.push_back(newItems[i]);
415 }
416 }

Callers 3

getDurableVersionMethod · 0.85
datacenterDeadFunction · 0.85
canKillProcessesFunction · 0.85

Calls 13

printfFunction · 0.85
DisplayEntriesMethod · 0.80
clearMethod · 0.65
sizeMethod · 0.45
validateMethod · 0.45
getPtrMethod · 0.45
addMethod · 0.45
resizeMethod · 0.45
push_backMethod · 0.45
selectReplicasMethod · 0.45
reserveMethod · 0.45
beginMethod · 0.45

Tested by

no test coverage detected