Merge pull request #8416 from sfc-gh-anoyes/anoyes/retrying-on-timeouts-is-hard-to-get-right
Make ApiWorkload::clearData tx self-conflicting
This commit is contained in:
commit
0ae38ba3f4
|
@ -198,6 +198,10 @@ void ApiWorkload::clearTenantData(TTaskFct cont, std::optional<int> tenantId) {
|
|||
void ApiWorkload::clearData(TTaskFct cont) {
|
||||
execTransaction(
|
||||
[this](auto ctx) {
|
||||
// Make this self-conflicting, so that if we're retrying on timeouts
|
||||
// once we get a successful commit all previous attempts are no
|
||||
// longer in-flight.
|
||||
ctx->tx().addReadConflictRange(keyPrefix, keyPrefix + fdb::Key(1, '\xff'));
|
||||
ctx->tx().clearRange(keyPrefix, keyPrefix + fdb::Key(1, '\xff'));
|
||||
ctx->commit();
|
||||
},
|
||||
|
|
|
@ -662,6 +662,13 @@ public:
|
|||
void clearRange(KeyRef begin, KeyRef end) {
|
||||
native::fdb_transaction_clear_range(tr.get(), begin.data(), intSize(begin), end.data(), intSize(end));
|
||||
}
|
||||
|
||||
void addReadConflictRange(KeyRef begin, KeyRef end) {
|
||||
if (auto err = Error(native::fdb_transaction_add_conflict_range(
|
||||
tr.get(), begin.data(), intSize(begin), end.data(), intSize(end), FDB_CONFLICT_RANGE_TYPE_READ))) {
|
||||
throwError("fdb_transaction_add_conflict_range returned error: ", err);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class Tenant final {
|
||||
|
|
|
@ -1331,6 +1331,11 @@ public:
|
|||
ACTOR static void simulateTimeoutInFlightCommit(ReadYourWritesTransaction* ryw_) {
|
||||
state Reference<ReadYourWritesTransaction> ryw = Reference<ReadYourWritesTransaction>::addRef(ryw_);
|
||||
ASSERT(ryw->options.timeoutInSeconds > 0);
|
||||
// An actual in-flight commit (i.e. one that's past the point where cancelling the transaction would stop it)
|
||||
// would already have a read version. We need to get a read version too, otherwise committing a conflicting
|
||||
// transaction may not ensure this transaction is no longer in-flight, since this transaction could get a read
|
||||
// version _after_.
|
||||
wait(success(ryw->getReadVersion()));
|
||||
if (!ryw->resetPromise.isSet())
|
||||
ryw->resetPromise.sendError(transaction_timed_out());
|
||||
wait(delay(deterministicRandom()->random01() * 5));
|
||||
|
|
Loading…
Reference in New Issue