* [PATCH] box: add on_schema_init trigger
@ 2019-03-02 12:31 Serge Petrenko
2019-03-05 7:54 ` [tarantool-patches] " Konstantin Osipov
0 siblings, 1 reply; 3+ messages in thread
From: Serge Petrenko @ 2019-03-02 12:31 UTC (permalink / raw)
To: vdavydov.dev, kostja; +Cc: tarantool-patches, Serge Petrenko
This patch introduces an on_schema_init trigger. The trigger may be set
before box.cfg() is called and is called during box.cfg() right after
prototypes of system spaces, such as _space, are created. This allows to
set triggers on system spaces before any other non-system data is
recovered. For example, it is possible to set an on_replace trigger on
_space, which will work even during recovery.
Part of #3159
@TarantoolBot document
Title: document box.ctl.on_schema_init triggers
on_schema_init triggers are set before the first call to box.cfg() and
are fired during box.cfg() before user data recovery start.
To set the trigger, say
```
box.ctl.on_schema_init(new_trig, old_trig)
```
where `old_trig` may be omitted. This will replace `old_trig` with `new_trig`.
Such triggers let you, for example, set triggers on system spaces before
recovery of any data, so that the triggers are fired even during
recovery.
---
https://github.com/tarantool/tarantool/tree/sp/gh-3159-on-schema-init
https://github.com/tarantool/tarantool/issues/3159
The trigger name is open for discussion, I believe there are some other good
variants: box.ctl.on_bootstrap_start / box.ctl.on_recovery_start
I've put the tests in a new file because I intend to use it later for other
box.ctl. triggers.
src/box/lua/ctl.c | 8 ++++++
src/box/schema.cc | 9 +++++++
src/box/schema.h | 1 +
test/box-tap/ctl_on_schema_init.test.lua | 31 ++++++++++++++++++++++++
4 files changed, 49 insertions(+)
create mode 100755 test/box-tap/ctl_on_schema_init.test.lua
diff --git a/src/box/lua/ctl.c b/src/box/lua/ctl.c
index 7010be138..0767cf476 100644
--- a/src/box/lua/ctl.c
+++ b/src/box/lua/ctl.c
@@ -40,6 +40,7 @@
#include "lua/trigger.h"
#include "box/box.h"
+#include "box/schema.h" /* on_schema_init triggers */
static int
lbox_ctl_wait_ro(struct lua_State *L)
@@ -71,10 +72,17 @@ lbox_ctl_on_shutdown(struct lua_State *L)
return lbox_trigger_reset(L, 2, &box_on_shutdown, NULL, NULL);
}
+static int
+lbox_ctl_on_schema_init(struct lua_State *L)
+{
+ return lbox_trigger_reset(L, 2, &on_schema_init, NULL, NULL);
+}
+
static const struct luaL_Reg lbox_ctl_lib[] = {
{"wait_ro", lbox_ctl_wait_ro},
{"wait_rw", lbox_ctl_wait_rw},
{"on_shutdown", lbox_ctl_on_shutdown},
+ {"on_schema_init", lbox_ctl_on_schema_init},
{NULL, NULL}
};
diff --git a/src/box/schema.cc b/src/box/schema.cc
index 8625d92ea..b1c7c6059 100644
--- a/src/box/schema.cc
+++ b/src/box/schema.cc
@@ -69,6 +69,9 @@ uint32_t schema_version = 0;
*/
uint32_t space_cache_version = 0;
+/** Triggers invoked after schema initialization. */
+struct rlist on_schema_init = RLIST_HEAD_INITIALIZER(on_schema_init);
+
struct rlist on_alter_space = RLIST_HEAD_INITIALIZER(on_alter_space);
struct rlist on_alter_sequence = RLIST_HEAD_INITIALIZER(on_alter_sequence);
@@ -500,6 +503,12 @@ schema_init()
init_system_space(space);
trigger_run_xc(&on_alter_space, space);
}
+
+ /*
+ * Run the triggers right after creating all the system
+ * space stubs.
+ */
+ trigger_run(&on_schema_init, NULL);
}
void
diff --git a/src/box/schema.h b/src/box/schema.h
index f3df08b48..a2897cfab 100644
--- a/src/box/schema.h
+++ b/src/box/schema.h
@@ -43,6 +43,7 @@ extern "C" {
extern uint32_t schema_version;
extern uint32_t space_cache_version;
+extern struct rlist on_schema_init;
/**
* Lock of schema modification
diff --git a/test/box-tap/ctl_on_schema_init.test.lua b/test/box-tap/ctl_on_schema_init.test.lua
new file mode 100755
index 000000000..51b28ea08
--- /dev/null
+++ b/test/box-tap/ctl_on_schema_init.test.lua
@@ -0,0 +1,31 @@
+#!/usr/bin/env tarantool
+
+--
+-- gh-3159: test on_schema_init trigger
+--
+local tap = require('tap')
+local test = tap.test('on_schema_init')
+local str = ''
+test:plan(7)
+
+function testing_trig()
+ test:istable(box.space._space, 'system spaces are accessible')
+ test:is(type(box.space._space.before_replace), 'function', 'before_replace triggers')
+ test:is(type(box.space._space.on_replace), 'function', 'on_replace triggers')
+ test:is(type(box.space._space:on_replace(function() str = str.."_space:on_replace" end)),
+ 'function', 'set on_replace trigger')
+ str = str..'on_schema_init'
+end
+
+trig = box.ctl.on_schema_init(testing_trig)
+test:is(type(trig), 'function', 'on_schema_init trigger set')
+
+box.cfg{log = 'tarantool.log'}
+test:like(str, 'on_schema_init', 'on_schema_init trigger works')
+str = ''
+box.schema.space.create("test")
+-- test that _space.on_replace trigger may be set in on_schema_init
+test:like(str, '_space:on_replace', 'can set on_replace')
+test:check()
+box.space.test:drop()
+os.exit(0)
--
2.17.2 (Apple Git-113)
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [tarantool-patches] [PATCH] box: add on_schema_init trigger
2019-03-02 12:31 [PATCH] box: add on_schema_init trigger Serge Petrenko
@ 2019-03-05 7:54 ` Konstantin Osipov
2019-03-05 10:34 ` Vladimir Davydov
0 siblings, 1 reply; 3+ messages in thread
From: Konstantin Osipov @ 2019-03-05 7:54 UTC (permalink / raw)
To: tarantool-patches; +Cc: vdavydov.dev, Serge Petrenko
* Serge Petrenko <sergepetrenko@tarantool.org> [19/03/03 23:25]:
> This patch introduces an on_schema_init trigger. The trigger may be set
> before box.cfg() is called and is called during box.cfg() right after
> prototypes of system spaces, such as _space, are created. This allows to
> set triggers on system spaces before any other non-system data is
> recovered. For example, it is possible to set an on_replace trigger on
> _space, which will work even during recovery.
>
> Part of #3159
>
> @TarantoolBot document
> Title: document box.ctl.on_schema_init triggers
> on_schema_init triggers are set before the first call to box.cfg() and
> are fired during box.cfg() before user data recovery start.
Please explain in the docbot request why we're adding this with
an example: provide the docs team with a full example how to use
these triggers to easily change space engine type in replication events
or make a space on a replicate "terminate" in replication by
changing its group id to GROUP_LOCAL.
>
> diff --git a/src/box/lua/ctl.c b/src/box/lua/ctl.c
> index 7010be138..0767cf476 100644
> --- a/src/box/lua/ctl.c
> +++ b/src/box/lua/ctl.c
> @@ -40,6 +40,7 @@
> #include "lua/trigger.h"
>
> #include "box/box.h"
> +#include "box/schema.h" /* on_schema_init triggers */
Please move the declaration to a more suitable place (box/box.h?)
to avoid polluting the include list.
> +trig = box.ctl.on_schema_init(testing_trig)
> +test:is(type(trig), 'function', 'on_schema_init trigger set')
> +
> +box.cfg{log = 'tarantool.log'}
> +test:like(str, 'on_schema_init', 'on_schema_init trigger works')
> +str = ''
> +box.schema.space.create("test")
> +-- test that _space.on_replace trigger may be set in on_schema_init
> +test:like(str, '_space:on_replace', 'can set on_replace')
> +test:check()
> +box.space.test:drop()
> +os.exit(0)
Please write a full test for changed storage engine on replica *in
addition to* this unit test. Another test for replica-local spaces
on replica won't hurt.
--
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.io - www.twitter.com/kostja_osipov
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [tarantool-patches] [PATCH] box: add on_schema_init trigger
2019-03-05 7:54 ` [tarantool-patches] " Konstantin Osipov
@ 2019-03-05 10:34 ` Vladimir Davydov
0 siblings, 0 replies; 3+ messages in thread
From: Vladimir Davydov @ 2019-03-05 10:34 UTC (permalink / raw)
To: Konstantin Osipov; +Cc: tarantool-patches, Serge Petrenko
On Tue, Mar 05, 2019 at 10:54:54AM +0300, Konstantin Osipov wrote:
> * Serge Petrenko <sergepetrenko@tarantool.org> [19/03/03 23:25]:
> > This patch introduces an on_schema_init trigger. The trigger may be set
> > before box.cfg() is called and is called during box.cfg() right after
> > prototypes of system spaces, such as _space, are created. This allows to
> > set triggers on system spaces before any other non-system data is
> > recovered. For example, it is possible to set an on_replace trigger on
> > _space, which will work even during recovery.
> >
> > Part of #3159
> >
> > @TarantoolBot document
> > Title: document box.ctl.on_schema_init triggers
> > on_schema_init triggers are set before the first call to box.cfg() and
> > are fired during box.cfg() before user data recovery start.
>
> Please explain in the docbot request why we're adding this with
> an example: provide the docs team with a full example how to use
> these triggers to easily change space engine type in replication events
> or make a space on a replicate "terminate" in replication by
> changing its group id to GROUP_LOCAL.
>
> >
> > diff --git a/src/box/lua/ctl.c b/src/box/lua/ctl.c
> > index 7010be138..0767cf476 100644
> > --- a/src/box/lua/ctl.c
> > +++ b/src/box/lua/ctl.c
> > @@ -40,6 +40,7 @@
> > #include "lua/trigger.h"
> >
> > #include "box/box.h"
> > +#include "box/schema.h" /* on_schema_init triggers */
>
>
> Please move the declaration to a more suitable place (box/box.h?)
> to avoid polluting the include list.
IMO having on_schema_init defined in schema.cc (we can't move it to
box.cc) and declared in box.h would look confusing.
>
> > +trig = box.ctl.on_schema_init(testing_trig)
> > +test:is(type(trig), 'function', 'on_schema_init trigger set')
> > +
> > +box.cfg{log = 'tarantool.log'}
> > +test:like(str, 'on_schema_init', 'on_schema_init trigger works')
> > +str = ''
> > +box.schema.space.create("test")
> > +-- test that _space.on_replace trigger may be set in on_schema_init
> > +test:like(str, '_space:on_replace', 'can set on_replace')
> > +test:check()
> > +box.space.test:drop()
> > +os.exit(0)
>
> Please write a full test for changed storage engine on replica *in
> addition to* this unit test. Another test for replica-local spaces
> on replica won't hurt.
Nit: I'd also rename the test from box-tap/ctl_on_schema_init.test.lua
to box-tap/on_schema_init.test.lua.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2019-03-05 10:34 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-02 12:31 [PATCH] box: add on_schema_init trigger Serge Petrenko
2019-03-05 7:54 ` [tarantool-patches] " Konstantin Osipov
2019-03-05 10:34 ` Vladimir Davydov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox