[PATCH] schema: fix box.func cleanup after a function is dropped

Vladimir Davydov vdavydov.dev at gmail.com
Mon Jul 1 14:19:24 MSK 2019


Fixes commit abf5ef4fead9 ("box: export registered functions in box.func
folder").
---
 src/box/lua/call.c          |  2 +-
 src/box/schema.h            | 30 +++++++++++++++---------------
 test/box/function1.result   | 16 ++++++++++++++++
 test/box/function1.test.lua |  4 ++++
 4 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/src/box/lua/call.c b/src/box/lua/call.c
index a236325b..38f2f696 100644
--- a/src/box/lua/call.c
+++ b/src/box/lua/call.c
@@ -712,7 +712,7 @@ lbox_func_new_or_delete(struct trigger *trigger, void *event)
 {
 	struct lua_State *L = (struct lua_State *) trigger->data;
 	struct func *func = (struct func *)event;
-	if (func != NULL)
+	if (func_by_id(func->def->fid) != NULL)
 		lbox_func_new(L, func);
 	else
 		lbox_func_delete(L, func);
diff --git a/src/box/schema.h b/src/box/schema.h
index f0039b29..30366382 100644
--- a/src/box/schema.h
+++ b/src/box/schema.h
@@ -41,6 +41,8 @@
 extern "C" {
 #endif /* defined(__cplusplus) */
 
+struct func;
+
 extern uint32_t schema_version;
 extern uint32_t space_cache_version;
 
@@ -89,6 +91,19 @@ space_cache_find(uint32_t id)
 	return NULL;
 }
 
+/**
+ * Insert a new function object in the function cache.
+ * @param func Function object to insert.
+ */
+void
+func_cache_insert(struct func *func);
+
+void
+func_cache_delete(uint32_t fid);
+
+struct func *
+func_by_id(uint32_t fid);
+
 struct func *
 func_by_name(const char *name, uint32_t name_len);
 
@@ -162,21 +177,6 @@ schema_free();
 
 struct space *schema_space(uint32_t id);
 
-/**
- * Insert a new function object in the function cache.
- * @param func Function object to insert.
- */
-void
-func_cache_insert(struct func *func);
-
-void
-func_cache_delete(uint32_t fid);
-
-struct func;
-
-struct func *
-func_by_id(uint32_t fid);
-
 static inline struct func *
 func_cache_find(uint32_t fid)
 {
diff --git a/test/box/function1.result b/test/box/function1.result
index 99006926..439e19e9 100644
--- a/test/box/function1.result
+++ b/test/box/function1.result
@@ -79,6 +79,10 @@ box.func["function1.args"]:call({ 15 })
 box.schema.func.drop("function1.args")
 ---
 ...
+box.func["function1.args"]
+---
+- null
+...
 box.schema.func.create('function1.multi_inc', {language = "C"})
 ---
 ...
@@ -377,6 +381,10 @@ func.drop()
 ---
 - error: 'builtin/box/schema.lua: Use func:drop(...) instead of func.drop(...)'
 ...
+box.func.divide
+---
+- null
+...
 func:drop()
 ---
 - error: Function 'divide' does not exist
@@ -422,6 +430,10 @@ func:call({4, 2, 1})
 func:drop()
 ---
 ...
+box.func["function1.divide"]
+---
+- null
+...
 func
 ---
 - language: C
@@ -471,6 +483,10 @@ func:call({{1, 2, 99, 3, -1}})
 func:drop()
 ---
 ...
+box.func.minmax
+---
+- null
+...
 -- Test access checks for registered functions.
 function secret() return 1 end
 ---
diff --git a/test/box/function1.test.lua b/test/box/function1.test.lua
index 25966b91..4ec9c04a 100644
--- a/test/box/function1.test.lua
+++ b/test/box/function1.test.lua
@@ -26,6 +26,7 @@ box.func["function1.args"]:call()
 box.func["function1.args"]:call({ "xx" })
 box.func["function1.args"]:call({ 15 })
 box.schema.func.drop("function1.args")
+box.func["function1.args"]
 
 box.schema.func.create('function1.multi_inc', {language = "C"})
 box.schema.user.grant('guest', 'execute', 'function', 'function1.multi_inc')
@@ -132,6 +133,7 @@ func:call({4, 2, 1})
 func:drop()
 func
 func.drop()
+box.func.divide
 func:drop()
 func:call({4, 2})
 box.internal.func_call('divide', 4, 2)
@@ -145,6 +147,7 @@ func:call({4})
 func:call({4, 2})
 func:call({4, 2, 1})
 func:drop()
+box.func["function1.divide"]
 func
 func:drop()
 func:call({4, 2})
@@ -165,6 +168,7 @@ box.schema.func.create("minmax")
 func = box.func.minmax
 func:call({{1, 2, 99, 3, -1}})
 func:drop()
+box.func.minmax
 
 -- Test access checks for registered functions.
 function secret() return 1 end
-- 
2.11.0




More information about the Tarantool-patches mailing list