@@ -145,6 +145,7 @@ struct WorkloadContext
145145 int nextTransactionId = thread_idx;
146146 int transactionId = -1 ;
147147 uint64_t prepare_timestamp = 0 ;
148+ uint64_t read_timestamp = 0 ;
148149 bool transactionIsPrepared = false ;
149150 bool transactionHasFailed = false ;
150151
@@ -231,6 +232,13 @@ struct WorkloadContext
231232 if (transactionId == -1 )
232233 ctx.unsupported ();
233234 int ret = session->rollback_transaction (session, nullptr );
235+ ctx.refine_op_end ();
236+ {
237+ std::unique_lock active_read_timestamps_lck{
238+ workload_context.active_read_timestamps_m };
239+ workload_context.active_read_timestamps .erase (this ->read_timestamp );
240+ this ->read_timestamp = 0 ;
241+ }
234242 ctx.op .n = " n" ;
235243 ctx.op .tid = transactionId;
236244 ctx.op ._did_abort = ret != 0 ;
@@ -239,6 +247,7 @@ struct WorkloadContext
239247 }
240248
241249 void perform_operation (Ctx<Storage::CommitPreparedTransaction> &ctx) {
250+ ctx.unsupported ();
242251 if (transactionId == -1 || !transactionIsPrepared ||
243252 transactionHasFailed) {
244253 ctx.unsupported ();
@@ -281,19 +290,28 @@ struct WorkloadContext
281290 std::shared_lock connection_lck{workload_context.connection_m };
282291 std::shared_lock stable_timestamp_lck{
283292 workload_context.stable_timestamp_m };
284- std::shared_lock active_read_timestamps_lck{
293+ uint64_t commit_timestamp;
294+ {
295+ std::shared_lock active_read_timestamps_lck{
285296 workload_context.active_read_timestamps_m };
286- auto commit_timestamp = find_timestamp_at ({
287- workload_context.stable_timestamp + 1 ,
288- max_active_read_timestamp_nolock () + 1 ,
289- });
297+ commit_timestamp = find_timestamp_at ({
298+ workload_context.stable_timestamp + 1 ,
299+ max_active_read_timestamp_nolock () + 1 ,
300+ });
301+ }
290302 int currTransactionId = transactionId;
291303 ctx.refine_op_start ();
292304 int ret = session->commit_transaction (
293305 session, config{
294306 {" commit_timestamp" , hex64 (commit_timestamp)},
295307 });
296308 ctx.refine_op_end ();
309+ {
310+ std::unique_lock active_read_timestamps_lck{
311+ workload_context.active_read_timestamps_m };
312+ workload_context.active_read_timestamps .erase (this ->read_timestamp );
313+ this ->read_timestamp = 0 ;
314+ }
297315 // unconditionally void the transaction, either it committed or rolled
298316 // back
299317 void_transaction ();
@@ -305,6 +323,7 @@ struct WorkloadContext
305323 }
306324
307325 void perform_operation (Ctx<Storage::PrepareTransaction> &ctx) {
326+ ctx.unsupported ();
308327 if (transactionId == -1 || transactionIsPrepared ||
309328 transactionHasFailed) {
310329 ctx.unsupported ();
@@ -337,6 +356,7 @@ struct WorkloadContext
337356 }
338357
339358 void perform_operation (Ctx<Storage::RollbackToStable> &ctx) {
359+ ctx.unsupported ();
340360 std::unique_lock connection_lck{workload_context.connection_m };
341361 std::unique_lock existing_kvs_lck{workload_context.existing_kvs_m };
342362 std::unique_lock oldest_timestamp_lck{
@@ -361,6 +381,7 @@ struct WorkloadContext
361381 }
362382
363383 void perform_operation (Ctx<Storage::SetOldestTimestamp> &ctx) {
384+ ctx.unsupported ();
364385 std::unique_lock connection_lck{workload_context.connection_m };
365386 std::unique_lock existing_kvs_lck{workload_context.existing_kvs_m };
366387 std::unique_lock oldest_timestamp_lck{
@@ -387,6 +408,7 @@ struct WorkloadContext
387408 }
388409
389410 void perform_operation (Ctx<Storage::SetStableTimestamp> &ctx) {
411+ ctx.unsupported ();
390412 std::unique_lock connection_lck{workload_context.connection_m };
391413 std::unique_lock existing_kvs_lck{workload_context.existing_kvs_m };
392414 std::unique_lock oldest_timestamp_lck{
@@ -433,6 +455,7 @@ struct WorkloadContext
433455 transactionHasFailed = false ;
434456 transactionIsPrepared = false ;
435457 chosenTransactionId = transactionId;
458+ this ->read_timestamp = read_timestamp;
436459 } else {
437460 std::unique_lock active_read_timestamps_lck{
438461 workload_context.active_read_timestamps_m };
0 commit comments