From 15e7bb1940159996fdc3a3abaf390ab428268d5e Mon Sep 17 00:00:00 2001 From: Georgy Kirichenko <georgy@tarantool.org> Date: Fri, 7 Jun 2019 14:37:57 +0300 Subject: [PATCH] txn: handle fiber stop event at transaction level Get rid of duplicated fiber on stop logic. Prerequisites: #1254 --- src/box/memtx_engine.c | 5 ----- src/box/txn.c | 4 ++++ src/box/vinyl.c | 8 -------- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/box/memtx_engine.c b/src/box/memtx_engine.c index f4312484a1..cd763e5479 100644 --- a/src/box/memtx_engine.c +++ b/src/box/memtx_engine.c @@ -94,15 +94,12 @@ memtx_init_txn(struct txn *txn) trigger_create(&txn->fiber_on_yield, txn_on_yield, NULL, NULL); - trigger_create(&txn->fiber_on_stop, txn_on_stop, - NULL, NULL); /* * Memtx doesn't allow yields between statements of * a transaction. Set a trigger which would roll * back the transaction if there is a yield. */ trigger_add(&fiber->on_yield, &txn->fiber_on_yield); - trigger_add(&fiber->on_stop, &txn->fiber_on_stop); /* * This serves as a marker that the triggers are * initialized. @@ -379,7 +376,6 @@ memtx_engine_prepare(struct engine *engine, struct txn *txn) * on calls to trigger_create/trigger_clear. */ trigger_clear(&txn->fiber_on_yield); - trigger_clear(&txn->fiber_on_stop); if (txn->is_aborted) { diag_set(ClientError, ER_TRANSACTION_YIELD); diag_log(); @@ -458,7 +454,6 @@ memtx_engine_rollback(struct engine *engine, struct txn *txn) { if (txn->engine_tx != NULL) { trigger_clear(&txn->fiber_on_yield); - trigger_clear(&txn->fiber_on_stop); } struct txn_stmt *stmt; stailq_reverse(&txn->stmts); diff --git a/src/box/txn.c b/src/box/txn.c index d4627b554e..7a2c8cdafa 100644 --- a/src/box/txn.c +++ b/src/box/txn.c @@ -198,6 +198,8 @@ txn_begin(bool is_autocommit) txn->psql_txn = NULL; /* fiber_on_yield/fiber_on_stop initialized by engine on demand */ fiber_set_txn(fiber(), txn); + trigger_create(&txn->fiber_on_stop, txn_on_stop, NULL, NULL); + trigger_add(&fiber()->on_stop, &txn->fiber_on_stop); return txn; } @@ -421,6 +423,7 @@ txn_commit(struct txn *txn) if (engine_prepare(txn->engine, txn) != 0) goto fail; } + trigger_clear(&txn->fiber_on_stop); if (txn->n_new_rows + txn->n_applier_rows > 0) { txn->signature = txn_write_to_wal(txn); @@ -475,6 +478,7 @@ txn_rollback() struct txn *txn = in_txn(); if (txn == NULL) return; + trigger_clear(&txn->fiber_on_stop); if (txn->engine) engine_rollback(txn->engine, txn); /* Rollback triggers must not throw. */ diff --git a/src/box/vinyl.c b/src/box/vinyl.c index ecf1975230..814325da53 100644 --- a/src/box/vinyl.c +++ b/src/box/vinyl.c @@ -2420,10 +2420,6 @@ vinyl_engine_begin(struct engine *engine, struct txn *txn) txn->engine_tx = vy_tx_begin(env->xm); if (txn->engine_tx == NULL) return -1; - if (!txn->is_autocommit) { - trigger_create(&txn->fiber_on_stop, txn_on_stop, NULL, NULL); - trigger_add(&fiber()->on_stop, &txn->fiber_on_stop); - } return 0; } @@ -2493,8 +2489,6 @@ vinyl_engine_commit(struct engine *engine, struct txn *txn) vy_regulator_check_dump_watermark(&env->regulator); txn->engine_tx = NULL; - if (!txn->is_autocommit) - trigger_clear(&txn->fiber_on_stop); } static void @@ -2508,8 +2502,6 @@ vinyl_engine_rollback(struct engine *engine, struct txn *txn) vy_tx_rollback(tx); txn->engine_tx = NULL; - if (!txn->is_autocommit) - trigger_clear(&txn->fiber_on_stop); } static int -- GitLab