Merge pull request #5379 from neethuhaneesha/eagerReadsDisable
Disabling option for removing eagerReads for ClearRange mutations.
This commit is contained in:
commit
45b40addb7
|
|
@ -628,6 +628,7 @@ void ServerKnobs::initialize(Randomize randomize, ClientKnobs* clientKnobs, IsSi
|
|||
init( FETCH_KEYS_TOO_LONG_TIME_CRITERIA, 300.0 );
|
||||
init( MAX_STORAGE_COMMIT_TIME, 120.0 ); //The max fsync stall time on the storage server and tlog before marking a disk as failed
|
||||
init( RANGESTREAM_LIMIT_BYTES, 2e6 ); if( randomize && BUGGIFY ) RANGESTREAM_LIMIT_BYTES = 1;
|
||||
init( ENABLE_CLEAR_RANGE_EAGER_READS, true );
|
||||
|
||||
//Wait Failure
|
||||
init( MAX_OUTSTANDING_WAIT_FAILURE_REQUESTS, 250 ); if( randomize && BUGGIFY ) MAX_OUTSTANDING_WAIT_FAILURE_REQUESTS = 2;
|
||||
|
|
|
|||
|
|
@ -564,6 +564,7 @@ public:
|
|||
double FETCH_KEYS_TOO_LONG_TIME_CRITERIA;
|
||||
double MAX_STORAGE_COMMIT_TIME;
|
||||
int64_t RANGESTREAM_LIMIT_BYTES;
|
||||
bool ENABLE_CLEAR_RANGE_EAGER_READS;
|
||||
|
||||
// Wait Failure
|
||||
int MAX_OUTSTANDING_WAIT_FAILURE_REQUESTS;
|
||||
|
|
|
|||
|
|
@ -241,10 +241,12 @@ struct UpdateEagerReadInfo {
|
|||
|
||||
void addMutation(MutationRef const& m) {
|
||||
// SOMEDAY: Theoretically we can avoid a read if there is an earlier overlapping ClearRange
|
||||
if (m.type == MutationRef::ClearRange && !m.param2.startsWith(systemKeys.end))
|
||||
if (m.type == MutationRef::ClearRange && !m.param2.startsWith(systemKeys.end) &&
|
||||
SERVER_KNOBS->ENABLE_CLEAR_RANGE_EAGER_READS)
|
||||
keyBegin.push_back(m.param2);
|
||||
else if (m.type == MutationRef::CompareAndClear) {
|
||||
keyBegin.push_back(keyAfter(m.param1, arena));
|
||||
if (SERVER_KNOBS->ENABLE_CLEAR_RANGE_EAGER_READS)
|
||||
keyBegin.push_back(keyAfter(m.param1, arena));
|
||||
if (keys.size() > 0 && keys.back().first == m.param1) {
|
||||
// Don't issue a second read, if the last read was equal to the current key.
|
||||
// CompareAndClear is likely to be used after another atomic operation on same key.
|
||||
|
|
@ -260,8 +262,10 @@ struct UpdateEagerReadInfo {
|
|||
}
|
||||
|
||||
void finishKeyBegin() {
|
||||
std::sort(keyBegin.begin(), keyBegin.end());
|
||||
keyBegin.resize(std::unique(keyBegin.begin(), keyBegin.end()) - keyBegin.begin());
|
||||
if (SERVER_KNOBS->ENABLE_CLEAR_RANGE_EAGER_READS) {
|
||||
std::sort(keyBegin.begin(), keyBegin.end());
|
||||
keyBegin.resize(std::unique(keyBegin.begin(), keyBegin.end()) - keyBegin.begin());
|
||||
}
|
||||
std::sort(keys.begin(), keys.end(), [](const std::pair<KeyRef, int>& lhs, const std::pair<KeyRef, int>& rhs) {
|
||||
return (lhs.first < rhs.first) || (lhs.first == rhs.first && lhs.second > rhs.second);
|
||||
});
|
||||
|
|
@ -2384,21 +2388,22 @@ void getQueuingMetrics(StorageServer* self, StorageQueuingMetricsRequest const&
|
|||
ACTOR Future<Void> doEagerReads(StorageServer* data, UpdateEagerReadInfo* eager) {
|
||||
eager->finishKeyBegin();
|
||||
|
||||
vector<Future<Key>> keyEnd(eager->keyBegin.size());
|
||||
for (int i = 0; i < keyEnd.size(); i++)
|
||||
keyEnd[i] = data->storage.readNextKeyInclusive(eager->keyBegin[i]);
|
||||
if (SERVER_KNOBS->ENABLE_CLEAR_RANGE_EAGER_READS) {
|
||||
vector<Future<Key>> keyEnd(eager->keyBegin.size());
|
||||
for (int i = 0; i < keyEnd.size(); i++)
|
||||
keyEnd[i] = data->storage.readNextKeyInclusive(eager->keyBegin[i]);
|
||||
|
||||
state Future<vector<Key>> futureKeyEnds = getAll(keyEnd);
|
||||
state Future<vector<Key>> futureKeyEnds = getAll(keyEnd);
|
||||
state vector<Key> keyEndVal = wait(futureKeyEnds);
|
||||
eager->keyEnd = keyEndVal;
|
||||
}
|
||||
|
||||
vector<Future<Optional<Value>>> value(eager->keys.size());
|
||||
for (int i = 0; i < value.size(); i++)
|
||||
value[i] = data->storage.readValuePrefix(eager->keys[i].first, eager->keys[i].second);
|
||||
|
||||
state Future<vector<Optional<Value>>> futureValues = getAll(value);
|
||||
state vector<Key> keyEndVal = wait(futureKeyEnds);
|
||||
vector<Optional<Value>> optionalValues = wait(futureValues);
|
||||
|
||||
eager->keyEnd = keyEndVal;
|
||||
eager->value = optionalValues;
|
||||
|
||||
return Void();
|
||||
|
|
@ -2507,7 +2512,7 @@ bool expandMutation(MutationRef& m,
|
|||
i = d.lastLessOrEqual(m.param2);
|
||||
if (i && i->isClearTo() && i->getEndKey() >= m.param2) {
|
||||
m.param2 = i->getEndKey();
|
||||
} else {
|
||||
} else if (SERVER_KNOBS->ENABLE_CLEAR_RANGE_EAGER_READS) {
|
||||
// Expand to the next set or clear (from storage or latestVersion), and if it
|
||||
// is a clear, engulf it as well
|
||||
i = d.lower_bound(m.param2);
|
||||
|
|
|
|||
Loading…
Reference in New Issue