From 74a2160eb02aa18a04b66ad204fd207cad7095aa Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko <pmwkaa@gmail.com> Date: Thu, 30 Oct 2014 18:39:01 +0400 Subject: [PATCH] sophia-gh-577: refactor txn engine statements --- src/box/alter.cc | 2 +- src/box/engine.h | 15 ++++++-------- src/box/engine_memtx.cc | 2 +- src/box/engine_sophia.cc | 2 +- src/box/key_def.cc | 2 +- src/box/lua/call.cc | 1 + src/box/request.cc | 1 + src/box/txn.cc | 44 +++++++++------------------------------- src/box/txn.h | 4 ++-- 9 files changed, 24 insertions(+), 49 deletions(-) diff --git a/src/box/alter.cc b/src/box/alter.cc index 7a1b19296c..297b50b097 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -512,7 +512,7 @@ ModifySpace::prepare(struct alter_space *alter) } EngineFactory *factory = alter->old_space->engine->factory; - if (def.temporary && !engine_can_be_temporary(factory->id)) { + if (def.temporary && !engine_can_be_temporary(factory->flags)) { tnt_raise(ClientError, ER_ALTER_SPACE, (unsigned) def.id, "space does not support temporary flag"); diff --git a/src/box/engine.h b/src/box/engine.h index 1fdfe489f0..affabcd796 100644 --- a/src/box/engine.h +++ b/src/box/engine.h @@ -186,24 +186,21 @@ EngineFactory *engine_find_id(uint32_t); void engine_shutdown(); static inline bool -engine_transactional(uint32_t id) +engine_transactional(uint32_t flags) { - assert(id); - return engine_flags[id] & ENGINE_TRANSACTIONAL; + return flags & ENGINE_TRANSACTIONAL; } static inline bool -engine_no_yield(uint32_t id) +engine_no_yield(uint32_t flags) { - assert(id); - return engine_flags[id] & ENGINE_NO_YIELD; + return flags & ENGINE_NO_YIELD; } static inline bool -engine_can_be_temporary(uint32_t id) +engine_can_be_temporary(uint32_t flags) { - assert(id); - return engine_flags[id] & ENGINE_CAN_BE_TEMPORARY; + return flags & ENGINE_CAN_BE_TEMPORARY; } static inline uint32_t diff --git a/src/box/engine_memtx.cc b/src/box/engine_memtx.cc index f1c363fa6a..a9dd47e1db 100644 --- a/src/box/engine_memtx.cc +++ b/src/box/engine_memtx.cc @@ -26,10 +26,10 @@ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -#include "txn.h" #include "tuple.h" #include "engine.h" #include "engine_memtx.h" +#include "txn.h" #include "index.h" #include "hash_index.h" #include "tree_index.h" diff --git a/src/box/engine_sophia.cc b/src/box/engine_sophia.cc index 7b8cea78fb..d6959c4f74 100644 --- a/src/box/engine_sophia.cc +++ b/src/box/engine_sophia.cc @@ -28,11 +28,11 @@ */ #include "cfg.h" #include "xrow.h" -#include "txn.h" #include "tuple.h" #include "scoped_guard.h" #include "engine.h" #include "engine_sophia.h" +#include "txn.h" #include "index.h" #include "sophia_index.h" #include "space.h" diff --git a/src/box/key_def.cc b/src/box/key_def.cc index 42283d80ae..311e1e2d39 100644 --- a/src/box/key_def.cc +++ b/src/box/key_def.cc @@ -227,7 +227,7 @@ space_def_check(struct space_def *def, uint32_t namelen, uint32_t engine_namelen if (def->temporary) { EngineFactory *factory = engine_find(def->engine_name); - if (! engine_can_be_temporary(factory->id)) + if (! engine_can_be_temporary(factory->flags)) tnt_raise(ClientError, ER_ALTER_SPACE, (unsigned) def->id, "space does not support temporary flag"); diff --git a/src/box/lua/call.cc b/src/box/lua/call.cc index 538bbe2945..e1683d7557 100644 --- a/src/box/lua/call.cc +++ b/src/box/lua/call.cc @@ -46,6 +46,7 @@ #include "box/box.h" #include "box/port.h" #include "box/request.h" +#include "box/engine.h" #include "box/txn.h" #include "box/access.h" #include "box/schema.h" diff --git a/src/box/request.cc b/src/box/request.cc index 909d568330..5cf0bb9ed4 100644 --- a/src/box/request.cc +++ b/src/box/request.cc @@ -27,6 +27,7 @@ * SUCH DAMAGE. */ #include "request.h" +#include "engine.h" #include "txn.h" #include "tuple.h" #include "index.h" diff --git a/src/box/txn.cc b/src/box/txn.cc index c81d5f5606..25ade4a04c 100644 --- a/src/box/txn.cc +++ b/src/box/txn.cc @@ -26,6 +26,7 @@ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ +#include "engine.h" #include "txn.h" #include "box.h" #include "tuple.h" @@ -95,7 +96,7 @@ txn_replace(struct txn *txn, struct space *space, */ if (txn->autocommit == false) { if (txn->n_stmts == 1) { - if (engine_no_yield(txn->engine)) { + if (engine_no_yield(txn->engine->flags)) { trigger_add(&fiber()->on_yield, &txn->fiber_on_yield); trigger_add(&fiber()->on_stop, @@ -173,47 +174,20 @@ txn_engine_begin_stmt(struct txn *txn, struct space *space) */ EngineFactory *factory = space->engine->factory; if (txn->n_stmts == 1) { - txn->engine = factory->id; + txn->engine = factory; if (txn->autocommit == false) { - if (! engine_transactional(txn->engine)) + if (! engine_transactional(txn->engine->flags)) tnt_raise(ClientError, ER_UNSUPPORTED, space->def.engine_name, "transactions"); } factory->begin(txn, space); return; } - if (txn->engine != engine_id(space->engine)) + if (txn->engine->id != engine_id(space->engine)) tnt_raise(ClientError, ER_CROSS_ENGINE_TRANSACTION); factory->begin_stmt(txn, space); } -static inline void -txn_engine_commit(struct txn *txn) -{ - if (txn->engine == 0) - return; - EngineFactory *factory = engine_find_id(txn->engine); - factory->commit(txn); -} - -static inline void -txn_engine_rollback(struct txn *txn) -{ - if (txn->engine == 0) - return; - EngineFactory *factory = engine_find_id(txn->engine); - factory->rollback(txn); -} - -static inline void -txn_engine_finish_stmt(struct txn *txn, struct txn_stmt *stmt) -{ - if (txn->engine == 0) - return; - EngineFactory *factory = engine_find_id(txn->engine); - factory->finish_stmt(stmt); -} - void txn_commit_stmt(struct txn *txn, struct port *port) { @@ -262,7 +236,8 @@ txn_commit(struct txn *txn) if (res) tnt_raise(LoggedError, ER_WAL_IO); } - txn_engine_commit(txn); + if (txn->engine) + txn->engine->commit(txn); trigger_run(&txn->on_commit, txn); /* must not throw. */ } @@ -273,7 +248,7 @@ txn_finish(struct txn *txn) rlist_foreach_entry(stmt, &txn->stmts, next) { if (stmt->old_tuple) tuple_unref(stmt->old_tuple); - txn_engine_finish_stmt(txn, stmt); + txn->engine->finish_stmt(stmt); } TRASH(txn); /** Free volatile txn memory. */ @@ -313,7 +288,8 @@ txn_rollback() struct txn *txn = in_txn(); if (txn == NULL) return; - txn_engine_rollback(txn); + if (txn->engine) + txn->engine->rollback(txn); trigger_run(&txn->on_rollback, txn); /* must not throw. */ struct txn_stmt *stmt; rlist_foreach_entry(stmt, &txn->stmts, next) { diff --git a/src/box/txn.h b/src/box/txn.h index 89fe565596..6477374ac8 100644 --- a/src/box/txn.h +++ b/src/box/txn.h @@ -67,8 +67,8 @@ struct txn { * (statement end causes an automatic transaction commit). */ bool autocommit; - /** Id of the engine involved in multi-statement transaction. */ - uint8_t engine; + /** Engine involved in multi-statement transaction. */ + EngineFactory *engine; /** Triggers on fiber yield and stop to abort transaction for in-memory engine */ struct trigger fiber_on_yield, fiber_on_stop; }; -- GitLab