Merge pull request #2513 from etschannen/feature-efficient-single-keyrange

do not serialize the begin key for single key ranges
This commit is contained in:
Evan Tschannen 2020-04-30 12:28:49 -07:00 committed by GitHub
commit ea59021d86
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 2 deletions

View File

@ -110,7 +110,17 @@ struct MutationRef {
template <class Ar>
void serialize( Ar& ar ) {
serializer(ar, type, param1, param2);
if (!ar.isDeserializing && type == ClearRange && equalsKeyAfter(param1, param2)) {
StringRef empty;
serializer(ar, type, param2, empty);
} else {
serializer(ar, type, param1, param2);
}
if (ar.isDeserializing && type == ClearRange && param2 == StringRef() && param1 != StringRef()) {
ASSERT(param1[param1.size()-1] == '\x00');
param2 = param1;
param1 = param2.substr(0, param2.size()-1);
}
}
// These masks define which mutation types have particular properties (they are used to implement isSingleKeyMutation() etc)

View File

@ -282,7 +282,18 @@ struct KeyRangeRef {
template <class Ar>
force_inline void serialize(Ar& ar) {
serializer(ar, const_cast<KeyRef&>(begin), const_cast<KeyRef&>(end));
if (!ar.isDeserializing && equalsKeyAfter(begin, end)) {
StringRef empty;
serializer(ar, const_cast<KeyRef&>(end), empty);
} else {
serializer(ar, const_cast<KeyRef&>(begin), const_cast<KeyRef&>(end));
}
if (ar.isDeserializing && end == StringRef() && begin != StringRef()) {
ASSERT(begin[begin.size()-1] == '\x00');
const_cast<KeyRef&>(end) = begin;
const_cast<KeyRef&>(begin) = end.substr(0, end.size()-1);
}
if( begin > end ) {
TraceEvent("InvertedRange").detail("Begin", begin).detail("End", end);
throw inverted_range();