GetKeyValuesReply or GetMappedKeyValuesReply (It would be nice if we could use REPLY_TYPE(GetKeyValuesFamilyRequest) instead of specify it as a separate template element)
| 4236 | // we could use REPLY_TYPE(GetKeyValuesFamilyRequest) instead of specify |
| 4237 | // it as a separate template element) |
| 4238 | class RangeResultFamily // RangeResult or MappedRangeResult |
| 4239 | > |
| 4240 | Future<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; |
no test coverage detected