diff --git a/doc/sphinx/book/configuration/cfg-binary_logging_snapshots.rst b/doc/sphinx/book/configuration/cfg-binary_logging_snapshots.rst index db7344fb8f7542f7b8c3a930753844426b5d684c..e6f3134446239178ce1ba35a39d0ac6859a7403a 100644 --- a/doc/sphinx/book/configuration/cfg-binary_logging_snapshots.rst +++ b/doc/sphinx/book/configuration/cfg-binary_logging_snapshots.rst @@ -60,5 +60,5 @@ files for the sake of replication or local hot standby. Type: float |br| - Default: 0.1 |br| + Default: 2 |br| Dynamic: **yes** |br| diff --git a/src/box/lua/load_cfg.lua b/src/box/lua/load_cfg.lua index 9937f9af616f9eedbab9b4f79f9654c926b2820c..e62f8a4abccaa069338ca8af200c048fa3a72d1e 100644 --- a/src/box/lua/load_cfg.lua +++ b/src/box/lua/load_cfg.lua @@ -47,7 +47,7 @@ local default_cfg = { too_long_threshold = 0.5, wal_mode = "write", rows_per_wal = 500000, - wal_dir_rescan_delay= 0.1, + wal_dir_rescan_delay= 2, panic_on_snap_error = true, panic_on_wal_error = true, replication_source = nil, diff --git a/src/box/recovery.cc b/src/box/recovery.cc index e94ca3e22e0218345753b5a2693f8bf9df477e0c..1333f19d681c5ca397b4523dd790be6bafcfc39f 100644 --- a/src/box/recovery.cc +++ b/src/box/recovery.cc @@ -451,19 +451,47 @@ recovery_finalize(struct recovery_state *r, enum wal_mode wal_mode, /* {{{ Local recovery: support of hot standby and replication relay */ -struct recovery_stat_data { +static void +recovery_stat_cb(ev_loop *loop, ev_stat *stat, int revents); + +class EvStat { +public: + struct ev_stat stat; struct fiber *f; - bool signaled; + bool *signaled; + char path[PATH_MAX + 1]; + + inline void start(const char *path_arg) + { + f = fiber(); + snprintf(path, sizeof(path), "%s", path_arg); + ev_stat_init(&stat, recovery_stat_cb, path, 0.0); + ev_stat_start(loop(), &stat); + } + inline void stop() + { + ev_stat_stop(loop(), &stat); + } + + EvStat(bool *signaled_arg) + :signaled(signaled_arg) + { + path[0] = '\0'; + ev_stat_init(&stat, recovery_stat_cb, path, 0.0); + stat.data = this; + } + ~EvStat() + { + stop(); + }; }; + static void -recovery_stat_cb(ev_loop *loop, ev_stat *stat, int revents) +recovery_stat_cb(ev_loop * /* loop */, ev_stat *stat, int /* revents */) { - (void) loop; - (void) revents; - struct recovery_stat_data *data = - (struct recovery_stat_data *) stat->data; - data->signaled = true; + EvStat *data = (EvStat *) stat->data; + *data->signaled = true; if (data->f->flags & FIBER_IS_CANCELLABLE) fiber_wakeup(data->f); } @@ -475,41 +503,34 @@ recovery_follow_f(va_list ap) ev_tstamp wal_dir_rescan_delay = va_arg(ap, ev_tstamp); fiber_set_user(fiber(), &admin_credentials); - char path[PATH_MAX] = { '\0' }; - struct recovery_stat_data data = { fiber(), false }; - struct ev_stat stat; - ev_stat_init(&stat, recovery_stat_cb, path, 0.0); - stat.data = &data; + bool signaled = false; + EvStat stat_dir(&signaled); + EvStat stat_file(&signaled); - auto evstat_guard = make_scoped_guard([&] { - ev_stat_stop(loop(), &stat); - }); + stat_dir.start(r->wal_dir.dirname); while (! fiber_is_cancelled()) { - data.signaled = false; recover_remaining_wals(r); - if (ev_is_active(&stat) && ((r->current_wal == NULL) || - (strcmp(r->current_wal->filename, stat.path) != 0))) - ev_stat_stop(loop(), &stat); + if (r->current_wal == NULL || + strcmp(r->current_wal->filename, stat_file.path) != 0) { - if (r->current_wal != NULL && !ev_is_active(&stat)) { - snprintf(path, sizeof(path), "%s", - r->current_wal->filename); - ev_stat_init(&stat, recovery_stat_cb, path, 0.0); - ev_stat_start(loop(), &stat); + stat_file.stop(); } - if (data.signaled) - continue; + if (r->current_wal != NULL && !ev_is_active(&stat_file.stat)) + stat_file.start(r->current_wal->filename); - /** - * Allow an immediate wakeup/break loop - * from recovery_stop_local(). - */ - fiber_set_cancellable(true); - fiber_yield_timeout(wal_dir_rescan_delay); - fiber_set_cancellable(false); + if (signaled == false) { + /** + * Allow an immediate wakeup/break loop + * from recovery_stop_local(). + */ + fiber_set_cancellable(true); + fiber_yield_timeout(wal_dir_rescan_delay); + fiber_set_cancellable(false); + } + signaled = false; } } diff --git a/test/app/cfg.test.lua b/test/app/cfg.test.lua index c20927158884e9dd90815ce067a68c24bec95067..a5c2a80d1c86b5f552444bb7af1f8a7b3162472e 100755 --- a/test/app/cfg.test.lua +++ b/test/app/cfg.test.lua @@ -72,7 +72,7 @@ test:is(box.cfg.panic_on_wal_error, true, "panic_on_wal_mode default value") box.cfg{panic_on_wal_error=false} test:is(box.cfg.panic_on_wal_error, false, "panic_on_wal_mode new value") -test:is(box.cfg.wal_dir_rescan_delay, 0.1, "wal_dir_rescan_delay default value") +test:is(box.cfg.wal_dir_rescan_delay, 2, "wal_dir_rescan_delay default value") box.cfg{wal_dir_rescan_delay=0.2} test:is(box.cfg.wal_dir_rescan_delay, 0.2, "wal_dir_rescan_delay new value") diff --git a/test/app/init_script.result b/test/app/init_script.result index dc7f846591c7a41d79e030e02046b727620f5385..072e1608910b0fad8b5102310ece2fbfb4737a36 100644 --- a/test/app/init_script.result +++ b/test/app/init_script.result @@ -25,7 +25,7 @@ box.cfg 20 readahead:16320 21 too_long_threshold:0.5 22 snapshot_period:0 -23 wal_dir_rescan_delay:0.1 +23 wal_dir_rescan_delay:2 -- -- Test insert from detached fiber -- diff --git a/test/box/admin.result b/test/box/admin.result index 7c3ef8b360bcc2325670073e00ddfb1d4922b1f2..ad426257b779309c61aaf84165ccbda469345d73 100644 --- a/test/box/admin.result +++ b/test/box/admin.result @@ -45,7 +45,7 @@ box.cfg pid_file: tarantool.pid rows_per_wal: 50 snapshot_period: 0 - wal_dir_rescan_delay: 0.1 + wal_dir_rescan_delay: 2 ... space:insert{1, 'tuple'} --- diff --git a/test/box/cfg.result b/test/box/cfg.result index 5ae566ae3322515f00133fb11edb94f5c77dc860..223e54d7938e4be6cff02680cc10e9485f72ede8 100644 --- a/test/box/cfg.result +++ b/test/box/cfg.result @@ -31,7 +31,7 @@ t - 'pid_file: tarantool.pid' - 'rows_per_wal: 50' - 'snapshot_period: 0' - - 'wal_dir_rescan_delay: 0.1' + - 'wal_dir_rescan_delay: 2' ... -- must be read-only box.cfg() @@ -65,7 +65,7 @@ t - 'pid_file: tarantool.pid' - 'rows_per_wal: 50' - 'snapshot_period: 0' - - 'wal_dir_rescan_delay: 0.1' + - 'wal_dir_rescan_delay: 2' ... -- check that cfg with unexpected parameter fails. box.cfg{sherlock = 'holmes'}