| 64 | } |
| 65 | |
| 66 | ACTOR Future<Void> PipelinedReader::getNext_impl(PipelinedReader* self, Database cx) { |
| 67 | state Transaction tr(cx); |
| 68 | |
| 69 | state GetRangeLimits limits(GetRangeLimits::ROW_LIMIT_UNLIMITED, |
| 70 | (g_network->isSimulated() && !g_simulator.speedUpSimulation) |
| 71 | ? CLIENT_KNOBS->BACKUP_SIMULATED_LIMIT_BYTES |
| 72 | : CLIENT_KNOBS->BACKUP_GET_RANGE_LIMIT_BYTES); |
| 73 | |
| 74 | state Key begin = versionToKey(self->currentBeginVersion, self->prefix); |
| 75 | state Key end = versionToKey(self->endVersion, self->prefix); |
| 76 | |
| 77 | loop { |
| 78 | // Get the lock |
| 79 | wait(self->readerLimit.take()); |
| 80 | |
| 81 | // Read begin to end forever until successful |
| 82 | loop { |
| 83 | try { |
| 84 | tr.setOption(FDBTransactionOptions::ACCESS_SYSTEM_KEYS); |
| 85 | tr.setOption(FDBTransactionOptions::LOCK_AWARE); |
| 86 | |
| 87 | RangeResult kvs = wait(tr.getRange(KeyRangeRef(begin, end), limits)); |
| 88 | |
| 89 | // No more results, send end of stream |
| 90 | if (!kvs.empty()) { |
| 91 | // Send results to the reads stream |
| 92 | self->reads.send( |
| 93 | RangeResultBlock{ .result = kvs, |
| 94 | .firstVersion = keyRefToVersion(kvs.front().key, self->prefix.size()), |
| 95 | .lastVersion = keyRefToVersion(kvs.back().key, self->prefix.size()), |
| 96 | .hash = self->hash, |
| 97 | .prefixLen = self->prefix.size(), |
| 98 | .indexToRead = 0 }); |
| 99 | } |
| 100 | |
| 101 | if (!kvs.more) { |
| 102 | self->reads.sendError(end_of_stream()); |
| 103 | return Void(); |
| 104 | } |
| 105 | |
| 106 | begin = kvs.readThrough.present() ? kvs.readThrough.get() : keyAfter(kvs.back().key); |
| 107 | |
| 108 | break; |
| 109 | } catch (Error& e) { |
| 110 | if (e.code() == error_code_transaction_too_old) { |
| 111 | // We are using this transaction until it's too old and then resetting to a fresh one, |
| 112 | // so we don't need to delay. |
| 113 | tr.fullReset(); |
| 114 | } else { |
| 115 | wait(tr.onError(e)); |
| 116 | } |
| 117 | } |
nothing calls this directly
no test coverage detected