If rowLimit>=0, reads first rows sorted ascending, otherwise reads last rows sorted descending The total size of the returned value (less the last entry) will be less than byteLimit
| 233 | // If rowLimit>=0, reads first rows sorted ascending, otherwise reads last rows sorted descending |
| 234 | // The total size of the returned value (less the last entry) will be less than byteLimit |
| 235 | Future<RangeResult> readRange(KeyRangeRef keys, int rowLimit, int byteLimit, IKeyValueStore::ReadType) override { |
| 236 | if (recovering.isError()) |
| 237 | throw recovering.getError(); |
| 238 | if (!recovering.isReady()) |
| 239 | return waitAndReadRange(this, keys, rowLimit, byteLimit); |
| 240 | |
| 241 | RangeResult result; |
| 242 | if (rowLimit == 0) { |
| 243 | return result; |
| 244 | } |
| 245 | |
| 246 | if (rowLimit > 0) { |
| 247 | auto it = data.lower_bound(keys.begin); |
| 248 | while (it != data.end() && rowLimit && byteLimit > 0) { |
| 249 | StringRef tempKey = it.getKey(reserved_buffer); |
| 250 | if (tempKey >= keys.end) |
| 251 | break; |
| 252 | |
| 253 | byteLimit -= sizeof(KeyValueRef) + tempKey.size() + it.getValue().size(); |
| 254 | result.push_back_deep(result.arena(), KeyValueRef(tempKey, it.getValue())); |
| 255 | ++it; |
| 256 | --rowLimit; |
| 257 | } |
| 258 | } else { |
| 259 | rowLimit = -rowLimit; |
| 260 | auto it = data.previous(data.lower_bound(keys.end)); |
| 261 | while (it != data.end() && rowLimit && byteLimit > 0) { |
| 262 | StringRef tempKey = it.getKey(reserved_buffer); |
| 263 | if (tempKey < keys.begin) |
| 264 | break; |
| 265 | |
| 266 | byteLimit -= sizeof(KeyValueRef) + tempKey.size() + it.getValue().size(); |
| 267 | result.push_back_deep(result.arena(), KeyValueRef(tempKey, it.getValue())); |
| 268 | it = data.previous(it); |
| 269 | --rowLimit; |
| 270 | } |
| 271 | } |
| 272 | |
| 273 | result.more = rowLimit == 0 || byteLimit <= 0; |
| 274 | if (result.more) { |
| 275 | ASSERT(result.size() > 0); |
| 276 | result.readThrough = result[result.size() - 1].key; |
| 277 | } |
| 278 | return result; |
| 279 | } |
| 280 | |
| 281 | void resyncLog() override { |
| 282 | ASSERT(recovering.isReady()); |
no test coverage detected