Step 4 of fixing storage server range reads: remove another unneeded iteration case in the forward direction when we don't exhaust our limits in the disk read. This also hopefully makes the code a bit clearer.

This commit is contained in:
A.J. Beamon 2020-02-06 13:27:04 -08:00
parent df2b0452b4
commit 16167b07d5
1 changed files with 7 additions and 8 deletions

View File

@ -1126,20 +1126,19 @@ ACTOR Future<GetKeyValuesReply> readRange( StorageServer* data, Version version,
ASSERT( atStorageVersion.size() <= limit ); ASSERT( atStorageVersion.size() <= limit );
if (data->storageVersion() > version) throw transaction_too_old(); if (data->storageVersion() > version) throw transaction_too_old();
bool more = atStorageVersion.size()!=0; // merge the sets in [vStart,vEnd) with the sets on disk, stopping at the last key from disk if we were limited
// merge the sets in [vStart,vEnd) with the sets on disk, stopping at the last key from disk if we read anything
int prevSize = result.data.size(); int prevSize = result.data.size();
merge( result.arena, result.data, atStorageVersion, vStart, vEnd, vCount, limit, more, *pLimitBytes ); merge( result.arena, result.data, atStorageVersion, vStart, vEnd, vCount, limit, atStorageVersion.more, *pLimitBytes );
limit -= result.data.size() - prevSize; limit -= result.data.size() - prevSize;
for (auto i = result.data.begin() + prevSize; i != result.data.end(); i++) for (auto i = result.data.begin() + prevSize; i != result.data.end(); i++)
*pLimitBytes -= sizeof(KeyValueRef) + i->expectedSize(); *pLimitBytes -= sizeof(KeyValueRef) + i->expectedSize();
// Setup for the next iteration // We may have reached our limits in the read from disk, but combining with the MVCC window could have
if (more) { // if there might be more data on disk, begin reading right after the last key read // given us back some room
readBegin = readBeginTemp = keyAfter( result.data.end()[-1].key ); if (atStorageVersion.more && limit > 0 && *pLimitBytes > 0) {
ASSERT( limit<=0 || *pLimitBytes<=0 || result.data.end()[-1].key == atStorageVersion.end()[-1].key ); ASSERT(result.data.end()[-1].key == atStorageVersion.end()[-1].key);
readBegin = readBeginTemp = keyAfter(result.data.end()[-1].key);
} else if (vEnd && vEnd->isClearTo()) { } else if (vEnd && vEnd->isClearTo()) {
ASSERT(vEnd->getEndKey() > readBegin); ASSERT(vEnd->getEndKey() > readBegin);
readBegin = vEnd->getEndKey(); readBegin = vEnd->getEndKey();