[tarantool-patches] [PATCH v2 4/9] box: fix on_replace_trigger_rollback routine

Kirill Shcherbatov kshcherbatov at tarantool.org
Wed Jan 30 11:59:11 MSK 2019


The function on_replace_trigger_rollback in the case of a replace
operation rollback was called with an incorrect argument, as a
result of which the used memory was freed.
---
 src/box/alter.cc         |  3 ++-
 test/sql/errinj.result   | 24 ++++++++++++++++++++++++
 test/sql/errinj.test.lua |  7 +++++++
 3 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/src/box/alter.cc b/src/box/alter.cc
index ab3dd2e22..eff3524cf 100644
--- a/src/box/alter.cc
+++ b/src/box/alter.cc
@@ -3591,7 +3591,8 @@ on_replace_dd_trigger(struct trigger * /* trigger */, void *event)
 			diag_raise();
 
 		on_commit->data = old_trigger;
-		on_rollback->data = new_trigger;
+		on_rollback->data =
+			old_tuple == NULL ? new_trigger : old_trigger;
 		new_trigger_guard.is_active = false;
 	}
 
diff --git a/test/sql/errinj.result b/test/sql/errinj.result
index c423c8bc6..acce52e8a 100644
--- a/test/sql/errinj.result
+++ b/test/sql/errinj.result
@@ -205,6 +205,30 @@ box.error.injection.set("ERRINJ_WAL_IO", true)
 ---
 - ok
 ...
+t = box.space._trigger:get('T1T')
+---
+...
+t_new = t:totable()
+---
+...
+t_new[3]['sql'] = 'CREATE TRIGGER t1t INSERT ON t1 BEGIN INSERT INTO t2 VALUES (2, 2); END;'
+---
+...
+_ = box.space._trigger:replace(t, t_new)
+---
+- error: Failed to write to disk
+...
+box.error.injection.set("ERRINJ_WAL_IO", false)
+---
+- ok
+...
+_ = box.space._trigger:replace(t, t_new)
+---
+...
+box.error.injection.set("ERRINJ_WAL_IO", true)
+---
+- ok
+...
 box.sql.execute("DROP TRIGGER t1t;")
 ---
 - error: Failed to write to disk
diff --git a/test/sql/errinj.test.lua b/test/sql/errinj.test.lua
index 8378c255c..fc19c859b 100644
--- a/test/sql/errinj.test.lua
+++ b/test/sql/errinj.test.lua
@@ -75,6 +75,13 @@ box.sql.execute("INSERT INTO t1 VALUES (3, 3);")
 box.sql.execute("SELECT * from t1");
 box.sql.execute("SELECT * from t2");
 box.error.injection.set("ERRINJ_WAL_IO", true)
+t = box.space._trigger:get('T1T')
+t_new = t:totable()
+t_new[3]['sql'] = 'CREATE TRIGGER t1t INSERT ON t1 BEGIN INSERT INTO t2 VALUES (2, 2); END;'
+_ = box.space._trigger:replace(t, t_new)
+box.error.injection.set("ERRINJ_WAL_IO", false)
+_ = box.space._trigger:replace(t, t_new)
+box.error.injection.set("ERRINJ_WAL_IO", true)
 box.sql.execute("DROP TRIGGER t1t;")
 box.error.injection.set("ERRINJ_WAL_IO", false)
 box.sql.execute("DELETE FROM t1;")
-- 
2.19.2





More information about the Tarantool-patches mailing list