| 8439 | |
| 8440 | ACTOR template <class T> |
| 8441 | static Future<Void> createCheckpointImpl(T tr, KeyRangeRef range, CheckpointFormat format) { |
| 8442 | ASSERT(!tr->getTenant().present()); |
| 8443 | TraceEvent("CreateCheckpointTransactionBegin").detail("Range", range); |
| 8444 | |
| 8445 | state RangeResult keyServers = wait(krmGetRanges(tr, keyServersPrefix, range)); |
| 8446 | ASSERT(!keyServers.more); |
| 8447 | |
| 8448 | state RangeResult UIDtoTagMap = wait(tr->getRange(serverTagKeys, CLIENT_KNOBS->TOO_MANY)); |
| 8449 | ASSERT(!UIDtoTagMap.more && UIDtoTagMap.size() < CLIENT_KNOBS->TOO_MANY); |
| 8450 | |
| 8451 | for (int i = 0; i < keyServers.size() - 1; ++i) { |
| 8452 | KeyRangeRef shard(keyServers[i].key, keyServers[i + 1].key); |
| 8453 | std::vector<UID> src; |
| 8454 | std::vector<UID> dest; |
| 8455 | decodeKeyServersValue(UIDtoTagMap, keyServers[i].value, src, dest); |
| 8456 | |
| 8457 | // The checkpoint request is sent to all replicas, in case any of them is unhealthy. |
| 8458 | // An alternative is to choose a healthy replica. |
| 8459 | const UID checkpointID = deterministicRandom()->randomUniqueID(); |
| 8460 | for (int idx = 0; idx < src.size(); ++idx) { |
| 8461 | CheckpointMetaData checkpoint(shard & range, format, src[idx], checkpointID); |
| 8462 | checkpoint.setState(CheckpointMetaData::Pending); |
| 8463 | tr->set(checkpointKeyFor(checkpointID), checkpointValue(checkpoint)); |
| 8464 | } |
| 8465 | |
| 8466 | TraceEvent("CreateCheckpointTransactionShard") |
| 8467 | .detail("Shard", shard) |
| 8468 | .detail("SrcServers", describe(src)) |
| 8469 | .detail("ServerSelected", describe(src)) |
| 8470 | .detail("CheckpointKey", checkpointKeyFor(checkpointID)) |
| 8471 | .detail("ReadVersion", tr->getReadVersion().get()); |
| 8472 | } |
| 8473 | |
| 8474 | return Void(); |
| 8475 | } |
| 8476 | |
| 8477 | Future<Void> createCheckpoint(Reference<ReadYourWritesTransaction> tr, KeyRangeRef range, CheckpointFormat format) { |
| 8478 | return holdWhile(tr, createCheckpointImpl(tr, range, format)); |
no test coverage detected