From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 4926D2E1A7 for ; Sun, 9 Jun 2019 16:44:51 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oUgcc3mF29I6 for ; Sun, 9 Jun 2019 16:44:51 -0400 (EDT) Received: from smtp39.i.mail.ru (smtp39.i.mail.ru [94.100.177.99]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 4F04A2E1C0 for ; Sun, 9 Jun 2019 16:44:50 -0400 (EDT) From: Georgy Kirichenko Subject: [tarantool-patches] [PATCH v3 01/14] txn: Fire a trigger after a transaction finalization Date: Sun, 9 Jun 2019 23:44:30 +0300 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: tarantool-patches@freelists.org Cc: Georgy Kirichenko Fire transaction trigger after a transaction finalization. This allows to not to view the transaction dismissed changes in case of rollback. Fixes: #4276 --- src/box/txn.c | 16 ++++++++-------- test/box/ddl.result | 37 +++++++++++++++++++++++++++++++++++++ test/box/ddl.test.lua | 15 +++++++++++++++ 3 files changed, 60 insertions(+), 8 deletions(-) diff --git a/src/box/txn.c b/src/box/txn.c index da749d7cc..1d8271e51 100644 --- a/src/box/txn.c +++ b/src/box/txn.c @@ -410,6 +410,12 @@ txn_commit(struct txn *txn) if (txn->signature < 0) goto fail; } + /* + * Engine can be NULL if transaction contains IPROTO_NOP + * statements only. + */ + if (txn->engine != NULL) + engine_commit(txn->engine, txn); /* * The transaction is in the binary log. No action below * may throw. In case an error has happened, there is @@ -421,12 +427,6 @@ txn_commit(struct txn *txn) unreachable(); panic("commit trigger failed"); } - /* - * Engine can be NULL if transaction contains IPROTO_NOP - * statements only. - */ - if (txn->engine != NULL) - engine_commit(txn->engine, txn); struct txn_stmt *stmt; stailq_foreach_entry(stmt, &txn->stmts, next) @@ -458,6 +458,8 @@ txn_rollback() struct txn *txn = in_txn(); if (txn == NULL) return; + if (txn->engine) + engine_rollback(txn->engine, txn); /* Rollback triggers must not throw. */ if (txn->has_triggers && trigger_run(&txn->on_rollback, txn) != 0) { @@ -465,8 +467,6 @@ txn_rollback() unreachable(); panic("rollback trigger failed"); } - if (txn->engine) - engine_rollback(txn->engine, txn); struct txn_stmt *stmt; stailq_foreach_entry(stmt, &txn->stmts, next) diff --git a/test/box/ddl.result b/test/box/ddl.result index b995b1493..9c82ce2b2 100644 --- a/test/box/ddl.result +++ b/test/box/ddl.result @@ -1208,3 +1208,40 @@ _ = c:get() test_latch:drop() -- this is where everything stops --- ... +-- gh-4276 - check grant privilege rollback +_ = box.schema.user.create('testg') +--- +... +_ = box.schema.space.create('testg'):create_index('pk') +--- +... +box.error.injection.set('ERRINJ_WAL_IO', true) +--- +- ok +... +-- the grant operation above fails and test hasn't any space test permissions +box.schema.user.grant('testg', 'read,write', 'space', 'testg') +--- +- error: Failed to write to disk +... +-- switch user and check they couldn't select +box.session.su('testg') +--- +... +box.space.testg:select() +--- +- error: Read access to space 'testg' is denied for user 'testg' +... +box.session.su('admin') +--- +... +box.error.injection.set('ERRINJ_WAL_IO', false) +--- +- ok +... +box.schema.user.drop('testg') +--- +... +box.space.testg:drop() +--- +... diff --git a/test/box/ddl.test.lua b/test/box/ddl.test.lua index 101bc6f9b..301f7e6c1 100644 --- a/test/box/ddl.test.lua +++ b/test/box/ddl.test.lua @@ -270,3 +270,18 @@ box.rollback() _ = c:get() test_latch:drop() -- this is where everything stops + +-- gh-4276 - check grant privilege rollback +_ = box.schema.user.create('testg') +_ = box.schema.space.create('testg'):create_index('pk') + +box.error.injection.set('ERRINJ_WAL_IO', true) +-- the grant operation above fails and test hasn't any space test permissions +box.schema.user.grant('testg', 'read,write', 'space', 'testg') +-- switch user and check they couldn't select +box.session.su('testg') +box.space.testg:select() +box.session.su('admin') +box.error.injection.set('ERRINJ_WAL_IO', false) +box.schema.user.drop('testg') +box.space.testg:drop() -- 2.21.0