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

Function getRange

fdbclient/NativeAPI.actor.cpp:4238–4554  ·  view source on GitHub ↗

GetKeyValuesReply or GetMappedKeyValuesReply (It would be nice if we could use REPLY_TYPE(GetKeyValuesFamilyRequest) instead of specify it as a separate template element)

Source from the content-addressed store, hash-verified

4236 // we could use REPLY_TYPE(GetKeyValuesFamilyRequest) instead of specify
4237 // it as a separate template element)
4238 class RangeResultFamily // RangeResult or MappedRangeResult
4239 >
4240Future<RangeResultFamily> getRange(Reference<TransactionState> trState,
4241 Future<Version> fVersion,
4242 KeySelector begin,
4243 KeySelector end,
4244 Key mapper,
4245 GetRangeLimits limits,
4246 Promise<std::pair<Key, Key>> conflictRange,
4247 int matchIndex,
4248 Snapshot snapshot,
4249 Reverse reverse,
4250 UseTenant useTenant = UseTenant::True) {
4251 // state using RangeResultRefFamily = typename RangeResultFamily::RefType;
4252 state GetRangeLimits originalLimits(limits);
4253 state KeySelector originalBegin = begin;
4254 state KeySelector originalEnd = end;
4255 state RangeResultFamily output;
4256 state Span span("NAPI:getRange"_loc, trState->spanContext);
4257 if (useTenant && trState->tenant().present()) {
4258 span.addAttribute("tenant"_sr, trState->tenant().get());
4259 }
4260
4261 try {
4262 state Version version = wait(fVersion);
4263 trState->cx->validateVersion(version);
4264
4265 state double startTime = now();
4266 state Version readVersion = version; // Needed for latestVersion requests; if more, make future requests at the
4267 // version that the first one completed
4268 // FIXME: Is this really right? Weaken this and see if there is a problem;
4269 // if so maybe there is a much subtler problem even with this.
4270
4271 if (begin.getKey() == allKeys.begin && begin.offset < 1) {
4272 output.readToBegin = true;
4273 begin = KeySelector(firstGreaterOrEqual(begin.getKey()), begin.arena());
4274 }
4275
4276 ASSERT(!limits.isReached());
4277 ASSERT((!limits.hasRowLimit() || limits.rows >= limits.minRows) && limits.minRows >= 0);
4278
4279 loop {
4280 if (end.getKey() == allKeys.begin && (end.offset < 1 || end.isFirstGreaterOrEqual())) {
4281 getRangeFinished(
4282 trState, startTime, originalBegin, originalEnd, snapshot, conflictRange, reverse, output);
4283 return output;
4284 }
4285
4286 Key locationKey = reverse ? Key(end.getKey(), end.arena()) : Key(begin.getKey(), begin.arena());
4287 Reverse locationBackward{ reverse ? (end - 1).isBackward() : begin.isBackward() };
4288 state KeyRangeLocationInfo beginServer =
4289 wait(getKeyLocation(trState,
4290 locationKey,
4291 getRangeRequestStream<GetKeyValuesFamilyRequest>(),
4292 locationBackward,
4293 useTenant,
4294 version));
4295 state KeyRange shard = beginServer.range;

Calls 15

nowFunction · 0.85
ifFunction · 0.85
getRangeFinishedFunction · 0.85
getKeyLocationFunction · 0.85
TenantInfoClass · 0.85
transformRangeLimitsFunction · 0.85
deterministicRandomFunction · 0.85
loadBalanceFunction · 0.85
RangeResultFamilyClass · 0.85
TraceEventClass · 0.85
delayFunction · 0.85
EventGetRangeErrorClass · 0.85

Tested by

no test coverage detected