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

Method getNext_impl

fdbclient/MutationLogReader.actor.cpp:66–114  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

64}
65
66ACTOR 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 }

Callers

nothing calls this directly

Calls 15

versionToKeyFunction · 0.85
keyRefToVersionFunction · 0.85
ifFunction · 0.85
frontMethod · 0.80
setOptionMethod · 0.65
getRangeMethod · 0.65
getMethod · 0.65
KeyRangeRefClass · 0.50
VoidClass · 0.50
keyAfterFunction · 0.50
isSimulatedMethod · 0.45
takeMethod · 0.45

Tested by

no test coverage detected