Adding ReadRangeAction timeout, returning error and using timer_monotonic changes.

This commit is contained in:
Neethu Haneesha Bingi 2021-07-12 16:56:28 -07:00
parent 01e85610ab
commit 24ac173c95
3 changed files with 25 additions and 12 deletions

View File

@ -346,6 +346,7 @@ void ServerKnobs::initialize(Randomize randomize, ClientKnobs* clientKnobs, IsSi
init( ROCKSDB_METRICS_DELAY, 60.0 ); init( ROCKSDB_METRICS_DELAY, 60.0 );
init( ROCKSDB_READ_VALUE_TIMEOUT, 5.0 ); init( ROCKSDB_READ_VALUE_TIMEOUT, 5.0 );
init( ROCKSDB_READ_VALUE_PREFIX_TIMEOUT, 5.0 ); init( ROCKSDB_READ_VALUE_PREFIX_TIMEOUT, 5.0 );
init( ROCKSDB_READ_RANGE_TIMEOUT, 5.0 );
// Leader election // Leader election
bool longLeaderElection = randomize && BUGGIFY; bool longLeaderElection = randomize && BUGGIFY;

View File

@ -278,6 +278,7 @@ public:
double ROCKSDB_METRICS_DELAY; double ROCKSDB_METRICS_DELAY;
double ROCKSDB_READ_VALUE_TIMEOUT; double ROCKSDB_READ_VALUE_TIMEOUT;
double ROCKSDB_READ_VALUE_PREFIX_TIMEOUT; double ROCKSDB_READ_VALUE_PREFIX_TIMEOUT;
double ROCKSDB_READ_RANGE_TIMEOUT;
// Leader election // Leader election
int MAX_NOTIFICATIONS; int MAX_NOTIFICATIONS;

View File

@ -319,7 +319,8 @@ struct RocksDBKeyValueStore : IKeyValueStore {
Optional<UID> debugID; Optional<UID> debugID;
double startTime; double startTime;
ThreadReturnPromise<Optional<Value>> result; ThreadReturnPromise<Optional<Value>> result;
ReadValueAction(KeyRef key, Optional<UID> debugID) : key(key), debugID(debugID), startTime(now()) {} ReadValueAction(KeyRef key, Optional<UID> debugID)
: key(key), debugID(debugID), startTime(timer_monotonic()) {}
double getTimeEstimate() const override { return SERVER_KNOBS->READ_VALUE_TIME_ESTIMATE; } double getTimeEstimate() const override { return SERVER_KNOBS->READ_VALUE_TIME_ESTIMATE; }
}; };
void action(ReadValueAction& a) { void action(ReadValueAction& a) {
@ -328,12 +329,12 @@ struct RocksDBKeyValueStore : IKeyValueStore {
traceBatch = { TraceBatch{} }; traceBatch = { TraceBatch{} };
traceBatch.get().addEvent("GetValueDebug", a.debugID.get().first(), "Reader.Before"); traceBatch.get().addEvent("GetValueDebug", a.debugID.get().first(), "Reader.Before");
} }
if (now() - a.startTime > SERVER_KNOBS->ROCKSDB_READ_VALUE_TIMEOUT) { if (timer_monotonic() - a.startTime > SERVER_KNOBS->ROCKSDB_READ_VALUE_TIMEOUT) {
TraceEvent(SevError, "RocksDBError") TraceEvent(SevWarn, "RocksDBError")
.detail("Error", "Read value request timedout") .detail("Error", "Read value request timedout")
.detail("Method", "ReadValue") .detail("Method", "ReadValueAction")
.detail("Timeout value", SERVER_KNOBS->ROCKSDB_READ_VALUE_TIMEOUT); .detail("Timeout value", SERVER_KNOBS->ROCKSDB_READ_VALUE_TIMEOUT);
a.result.send(Optional<Value>()); a.result.sendError(transaction_too_old());
return; return;
} }
rocksdb::PinnableSlice value; rocksdb::PinnableSlice value;
@ -359,11 +360,10 @@ struct RocksDBKeyValueStore : IKeyValueStore {
double startTime; double startTime;
ThreadReturnPromise<Optional<Value>> result; ThreadReturnPromise<Optional<Value>> result;
ReadValuePrefixAction(Key key, int maxLength, Optional<UID> debugID) ReadValuePrefixAction(Key key, int maxLength, Optional<UID> debugID)
: key(key), maxLength(maxLength), debugID(debugID), startTime(now()){}; : key(key), maxLength(maxLength), debugID(debugID), startTime(timer_monotonic()){};
double getTimeEstimate() const override { return SERVER_KNOBS->READ_VALUE_TIME_ESTIMATE; } double getTimeEstimate() const override { return SERVER_KNOBS->READ_VALUE_TIME_ESTIMATE; }
}; };
void action(ReadValuePrefixAction& a) { void action(ReadValuePrefixAction& a) {
rocksdb::PinnableSlice value;
Optional<TraceBatch> traceBatch; Optional<TraceBatch> traceBatch;
if (a.debugID.present()) { if (a.debugID.present()) {
traceBatch = { TraceBatch{} }; traceBatch = { TraceBatch{} };
@ -371,14 +371,15 @@ struct RocksDBKeyValueStore : IKeyValueStore {
a.debugID.get().first(), a.debugID.get().first(),
"Reader.Before"); //.detail("TaskID", g_network->getCurrentTask()); "Reader.Before"); //.detail("TaskID", g_network->getCurrentTask());
} }
if (now() - a.startTime > SERVER_KNOBS->ROCKSDB_READ_VALUE_PREFIX_TIMEOUT) { if (timer_monotonic() - a.startTime > SERVER_KNOBS->ROCKSDB_READ_VALUE_PREFIX_TIMEOUT) {
TraceEvent(SevError, "RocksDBError") TraceEvent(SevWarn, "RocksDBError")
.detail("Error", "Read value prefix request timedout") .detail("Error", "Read value prefix request timedout")
.detail("Method", "ReadValuePrefix") .detail("Method", "ReadValuePrefixAction")
.detail("Timeout value", SERVER_KNOBS->ROCKSDB_READ_VALUE_PREFIX_TIMEOUT); .detail("Timeout value", SERVER_KNOBS->ROCKSDB_READ_VALUE_PREFIX_TIMEOUT);
a.result.send(Optional<Value>()); a.result.sendError(transaction_too_old());
return; return;
} }
rocksdb::PinnableSlice value;
auto s = db->Get(getReadOptions(), db->DefaultColumnFamily(), toSlice(a.key), &value); auto s = db->Get(getReadOptions(), db->DefaultColumnFamily(), toSlice(a.key), &value);
if (a.debugID.present()) { if (a.debugID.present()) {
traceBatch.get().addEvent("GetValuePrefixDebug", traceBatch.get().addEvent("GetValuePrefixDebug",
@ -402,12 +403,22 @@ struct RocksDBKeyValueStore : IKeyValueStore {
struct ReadRangeAction : TypedAction<Reader, ReadRangeAction>, FastAllocated<ReadRangeAction> { struct ReadRangeAction : TypedAction<Reader, ReadRangeAction>, FastAllocated<ReadRangeAction> {
KeyRange keys; KeyRange keys;
int rowLimit, byteLimit; int rowLimit, byteLimit;
double startTime;
ThreadReturnPromise<RangeResult> result; ThreadReturnPromise<RangeResult> result;
ReadRangeAction(KeyRange keys, int rowLimit, int byteLimit) ReadRangeAction(KeyRange keys, int rowLimit, int byteLimit)
: keys(keys), rowLimit(rowLimit), byteLimit(byteLimit) {} : keys(keys), rowLimit(rowLimit), byteLimit(byteLimit), startTime(timer_monotonic()) {}
double getTimeEstimate() const override { return SERVER_KNOBS->READ_RANGE_TIME_ESTIMATE; } double getTimeEstimate() const override { return SERVER_KNOBS->READ_RANGE_TIME_ESTIMATE; }
}; };
void action(ReadRangeAction& a) { void action(ReadRangeAction& a) {
if (timer_monotonic() - a.startTime > SERVER_KNOBS->ROCKSDB_READ_RANGE_TIMEOUT) {
TraceEvent(SevWarn, "RocksDBError")
.detail("Error", "Read range request timedout")
.detail("Method", "ReadRangeAction")
.detail("Timeout value", SERVER_KNOBS->ROCKSDB_READ_RANGE_TIMEOUT);
a.result.sendError(transaction_too_old());
return;
}
RangeResult result; RangeResult result;
if (a.rowLimit == 0 || a.byteLimit == 0) { if (a.rowLimit == 0 || a.byteLimit == 0) {
a.result.send(result); a.result.send(result);