diff --git a/cfg/core_cfg.cfg_tmpl b/cfg/core_cfg.cfg_tmpl index f2383cb0c1858ee91a7b0c10d00b9fe4fc5fdcf4..b2b930d91892b63d1aa571caac9200e175402b7b 100644 --- a/cfg/core_cfg.cfg_tmpl +++ b/cfg/core_cfg.cfg_tmpl @@ -37,9 +37,6 @@ logger_nonblock=1 # delay between loop iteraions io_collect_interval=0.0 -# do not write snapshot faster then snap_io_rate_limit MBytes/sec -snap_io_rate_limit=0.0 - # size of listen backlog backlog=1024 diff --git a/cfg/tarantool_feeder_cfg.c b/cfg/tarantool_feeder_cfg.c index bb33f996722b115250b484daa8701278f74e3f15..3e48efce7485d063a53e976f90d25b0daca7d101 100644 --- a/cfg/tarantool_feeder_cfg.c +++ b/cfg/tarantool_feeder_cfg.c @@ -40,7 +40,6 @@ fill_default_tarantool_cfg(tarantool_cfg *c) { c->logger = NULL; c->logger_nonblock = 1; c->io_collect_interval = 0; - c->snap_io_rate_limit = 0; c->backlog = 1024; c->readahead = 16320; c->wal_feeder_bind_ipaddr = NULL; @@ -86,9 +85,6 @@ static NameAtom _name__logger_nonblock[] = { static NameAtom _name__io_collect_interval[] = { { "io_collect_interval", -1, NULL } }; -static NameAtom _name__snap_io_rate_limit[] = { - { "snap_io_rate_limit", -1, NULL } -}; static NameAtom _name__backlog[] = { { "backlog", -1, NULL } }; @@ -248,14 +244,6 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { if ( (c->io_collect_interval == 0 || c->io_collect_interval == -HUGE_VAL || c->io_collect_interval == HUGE_VAL) && errno == ERANGE) return CNF_WRONGRANGE; } - else if ( cmpNameAtoms( opt->name, _name__snap_io_rate_limit) ) { - if (opt->paramType != numberType ) - return CNF_WRONGTYPE; - errno = 0; - c->snap_io_rate_limit = strtod(opt->paramValue.numberval, NULL); - if ( (c->snap_io_rate_limit == 0 || c->snap_io_rate_limit == -HUGE_VAL || c->snap_io_rate_limit == HUGE_VAL) && errno == ERANGE) - return CNF_WRONGRANGE; - } else if ( cmpNameAtoms( opt->name, _name__backlog) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; @@ -421,7 +409,6 @@ typedef enum IteratorState { S_name__logger, S_name__logger_nonblock, S_name__io_collect_interval, - S_name__snap_io_rate_limit, S_name__backlog, S_name__readahead, S_name__wal_feeder_bind_ipaddr, @@ -578,17 +565,6 @@ tarantool_cfg_iterator_next(tarantool_cfg_iterator_t* i, tarantool_cfg *c, char } sprintf(*v, "%g", c->io_collect_interval); snprintf(buf, PRINTBUFLEN-1, "io_collect_interval"); - i->state = S_name__snap_io_rate_limit; - return buf; - case S_name__snap_io_rate_limit: - *v = malloc(32); - if (*v == NULL) { - free(i); - out_warning(CNF_NOMEMORY, "No memory to output value"); - return NULL; - } - sprintf(*v, "%g", c->snap_io_rate_limit); - snprintf(buf, PRINTBUFLEN-1, "snap_io_rate_limit"); i->state = S_name__backlog; return buf; case S_name__backlog: diff --git a/cfg/tarantool_feeder_cfg.cfg b/cfg/tarantool_feeder_cfg.cfg index 31d357f247ec27ad9fd4f1de1b0ea65acab6f621..f6c7690bdd38b73ad4c9aadaae7208fdeda82204 100644 --- a/cfg/tarantool_feeder_cfg.cfg +++ b/cfg/tarantool_feeder_cfg.cfg @@ -39,9 +39,6 @@ logger_nonblock = 1 # delay between loop iteraions io_collect_interval = 0 -# do not write snapshot faster then snap_io_rate_limit MBytes/sec -snap_io_rate_limit = 0 - # size of listen backlog backlog = 1024 diff --git a/cfg/tarantool_feeder_cfg.cfg_tmpl b/cfg/tarantool_feeder_cfg.cfg_tmpl index c3ce41678691dad8be0808a6ee3095b57cb01b95..c87a3980a1a4d85110054b9be70f25c0f598a697 100644 --- a/cfg/tarantool_feeder_cfg.cfg_tmpl +++ b/cfg/tarantool_feeder_cfg.cfg_tmpl @@ -42,9 +42,6 @@ logger_nonblock=1 # delay between loop iteraions io_collect_interval=0.0 -# do not write snapshot faster then snap_io_rate_limit MBytes/sec -snap_io_rate_limit=0.0 - # size of listen backlog backlog=1024 diff --git a/cfg/tarantool_feeder_cfg.h b/cfg/tarantool_feeder_cfg.h index 0efdbfa1b0f95f4d3bfd9cf5b2f4f5acf1e17945..0f279b3e364f0065657a4d4deb5828ed715223d0 100644 --- a/cfg/tarantool_feeder_cfg.h +++ b/cfg/tarantool_feeder_cfg.h @@ -54,9 +54,6 @@ typedef struct tarantool_cfg { /* delay between loop iteraions */ double io_collect_interval; - /* do not write snapshot faster then snap_io_rate_limit MBytes/sec */ - double snap_io_rate_limit; - /* size of listen backlog */ int32_t backlog; diff --git a/cfg/tarantool_silverbox_cfg.c b/cfg/tarantool_silverbox_cfg.c index caf93de716273b012481883fad04077c67807b05..361478850f5fde102e49a027ed5fd257098ed4bc 100644 --- a/cfg/tarantool_silverbox_cfg.c +++ b/cfg/tarantool_silverbox_cfg.c @@ -40,7 +40,6 @@ fill_default_tarantool_cfg(tarantool_cfg *c) { c->logger = NULL; c->logger_nonblock = 1; c->io_collect_interval = 0; - c->snap_io_rate_limit = 0; c->backlog = 1024; c->readahead = 16320; c->snap_dir = strdup("."); @@ -55,6 +54,7 @@ fill_default_tarantool_cfg(tarantool_cfg *c) { c->memcached_namespace = 23; c->memcached_expire_per_loop = 1024; c->memcached_expire_full_sweep = 3600; + c->snap_io_rate_limit = 0; c->rows_per_wal = 500000; c->wal_fsync_delay = 0; c->wal_writer_inbox_size = 128; @@ -129,9 +129,6 @@ static NameAtom _name__logger_nonblock[] = { static NameAtom _name__io_collect_interval[] = { { "io_collect_interval", -1, NULL } }; -static NameAtom _name__snap_io_rate_limit[] = { - { "snap_io_rate_limit", -1, NULL } -}; static NameAtom _name__backlog[] = { { "backlog", -1, NULL } }; @@ -168,6 +165,9 @@ static NameAtom _name__memcached_expire_per_loop[] = { static NameAtom _name__memcached_expire_full_sweep[] = { { "memcached_expire_full_sweep", -1, NULL } }; +static NameAtom _name__snap_io_rate_limit[] = { + { "snap_io_rate_limit", -1, NULL } +}; static NameAtom _name__rows_per_wal[] = { { "rows_per_wal", -1, NULL } }; @@ -367,14 +367,6 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { if ( (c->io_collect_interval == 0 || c->io_collect_interval == -HUGE_VAL || c->io_collect_interval == HUGE_VAL) && errno == ERANGE) return CNF_WRONGRANGE; } - else if ( cmpNameAtoms( opt->name, _name__snap_io_rate_limit) ) { - if (opt->paramType != numberType ) - return CNF_WRONGTYPE; - errno = 0; - c->snap_io_rate_limit = strtod(opt->paramValue.numberval, NULL); - if ( (c->snap_io_rate_limit == 0 || c->snap_io_rate_limit == -HUGE_VAL || c->snap_io_rate_limit == HUGE_VAL) && errno == ERANGE) - return CNF_WRONGRANGE; - } else if ( cmpNameAtoms( opt->name, _name__backlog) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; @@ -495,6 +487,14 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { return CNF_WRONGRANGE; c->memcached_expire_full_sweep = i32; } + else if ( cmpNameAtoms( opt->name, _name__snap_io_rate_limit) ) { + if (opt->paramType != numberType ) + return CNF_WRONGTYPE; + errno = 0; + c->snap_io_rate_limit = strtod(opt->paramValue.numberval, NULL); + if ( (c->snap_io_rate_limit == 0 || c->snap_io_rate_limit == -HUGE_VAL || c->snap_io_rate_limit == HUGE_VAL) && errno == ERANGE) + return CNF_WRONGRANGE; + } else if ( cmpNameAtoms( opt->name, _name__rows_per_wal) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; @@ -769,7 +769,6 @@ typedef enum IteratorState { S_name__logger, S_name__logger_nonblock, S_name__io_collect_interval, - S_name__snap_io_rate_limit, S_name__backlog, S_name__readahead, S_name__snap_dir, @@ -782,6 +781,7 @@ typedef enum IteratorState { S_name__memcached_namespace, S_name__memcached_expire_per_loop, S_name__memcached_expire_full_sweep, + S_name__snap_io_rate_limit, S_name__rows_per_wal, S_name__wal_fsync_delay, S_name__wal_writer_inbox_size, @@ -953,17 +953,6 @@ tarantool_cfg_iterator_next(tarantool_cfg_iterator_t* i, tarantool_cfg *c, char } sprintf(*v, "%g", c->io_collect_interval); snprintf(buf, PRINTBUFLEN-1, "io_collect_interval"); - i->state = S_name__snap_io_rate_limit; - return buf; - case S_name__snap_io_rate_limit: - *v = malloc(32); - if (*v == NULL) { - free(i); - out_warning(CNF_NOMEMORY, "No memory to output value"); - return NULL; - } - sprintf(*v, "%g", c->snap_io_rate_limit); - snprintf(buf, PRINTBUFLEN-1, "snap_io_rate_limit"); i->state = S_name__backlog; return buf; case S_name__backlog: @@ -1093,6 +1082,17 @@ tarantool_cfg_iterator_next(tarantool_cfg_iterator_t* i, tarantool_cfg *c, char } sprintf(*v, "%"PRId32, c->memcached_expire_full_sweep); snprintf(buf, PRINTBUFLEN-1, "memcached_expire_full_sweep"); + i->state = S_name__snap_io_rate_limit; + return buf; + case S_name__snap_io_rate_limit: + *v = malloc(32); + if (*v == NULL) { + free(i); + out_warning(CNF_NOMEMORY, "No memory to output value"); + return NULL; + } + sprintf(*v, "%g", c->snap_io_rate_limit); + snprintf(buf, PRINTBUFLEN-1, "snap_io_rate_limit"); i->state = S_name__rows_per_wal; return buf; case S_name__rows_per_wal: diff --git a/cfg/tarantool_silverbox_cfg.cfg b/cfg/tarantool_silverbox_cfg.cfg index 8a3668cdc5940f96f0a7727c0b2e2732d162c9a3..162e07540db3c17cfb22331f06a49e484d0008cb 100644 --- a/cfg/tarantool_silverbox_cfg.cfg +++ b/cfg/tarantool_silverbox_cfg.cfg @@ -39,9 +39,6 @@ logger_nonblock = 1 # delay between loop iteraions io_collect_interval = 0 -# do not write snapshot faster then snap_io_rate_limit MBytes/sec -snap_io_rate_limit = 0 - # size of listen backlog backlog = 1024 @@ -79,6 +76,9 @@ memcached_expire_per_loop = 1024 # tarantool will try iterate all rows within this time memcached_expire_full_sweep = 3600 +# do not write snapshot faster then snap_io_rate_limit MBytes/sec +snap_io_rate_limit = 0 + # Write no more rows in WAL rows_per_wal = 500000 diff --git a/cfg/tarantool_silverbox_cfg.cfg_tmpl b/cfg/tarantool_silverbox_cfg.cfg_tmpl index 264a62d751a3ac9f7acd952d9559e93a789b72e8..b59c1a6e558ba8c2c01707059ca7773ada53ec55 100644 --- a/cfg/tarantool_silverbox_cfg.cfg_tmpl +++ b/cfg/tarantool_silverbox_cfg.cfg_tmpl @@ -42,9 +42,6 @@ logger_nonblock=1 # delay between loop iteraions io_collect_interval=0.0 -# do not write snapshot faster then snap_io_rate_limit MBytes/sec -snap_io_rate_limit=0.0 - # size of listen backlog backlog=1024 @@ -79,6 +76,11 @@ memcached_expire_per_loop=1024 # tarantool will try iterate all rows within this time memcached_expire_full_sweep=3600 + +# do not write snapshot faster then snap_io_rate_limit MBytes/sec +snap_io_rate_limit=0.0 + + # Write no more rows in WAL rows_per_wal=500000 diff --git a/cfg/tarantool_silverbox_cfg.h b/cfg/tarantool_silverbox_cfg.h index b548b064cce9a9516066f82b2cf2916e93e6d90b..5178a74ce4badf33ffb9cc24d15ae31687ae017d 100644 --- a/cfg/tarantool_silverbox_cfg.h +++ b/cfg/tarantool_silverbox_cfg.h @@ -72,9 +72,6 @@ typedef struct tarantool_cfg { /* delay between loop iteraions */ double io_collect_interval; - /* do not write snapshot faster then snap_io_rate_limit MBytes/sec */ - double snap_io_rate_limit; - /* size of listen backlog */ int32_t backlog; @@ -114,6 +111,9 @@ typedef struct tarantool_cfg { /* tarantool will try iterate all rows within this time */ int32_t memcached_expire_full_sweep; + /* do not write snapshot faster then snap_io_rate_limit MBytes/sec */ + double snap_io_rate_limit; + /* Write no more rows in WAL */ int32_t rows_per_wal; diff --git a/core/log_io.c b/core/log_io.c index a3483070076d83b8c45c6fe75328b0db74323755..8061104cc30e3b52a9586fbb711086459e02a0b1 100644 --- a/core/log_io.c +++ b/core/log_io.c @@ -1281,7 +1281,7 @@ wal_write(struct recovery_state *r, i64 lsn, struct tbuf *data) struct recovery_state * recover_init(const char *snap_dirname, const char *wal_dirname, row_reader snap_row_reader, row_handler snap_row_handler, row_handler wal_row_handler, - int rows_per_file, double fsync_delay, double snap_io_rate_limit, + int rows_per_file, double fsync_delay, int inbox_size, int flags, void *data) { struct recovery_state *r = p0alloc(eter_pool, sizeof(*r)); @@ -1299,10 +1299,9 @@ recover_init(const char *snap_dirname, const char *wal_dirname, r->wal_prefered_class->rows_per_file = rows_per_file; r->wal_prefered_class->fsync_delay = fsync_delay; - if ((flags & RECOVER_READONLY) == 0) { + if ((flags & RECOVER_READONLY) == 0) r->wal_writer = spawn_child("wal_writer", inbox_size, write_to_disk, r); - r->snap_io_rate_limit = snap_io_rate_limit * 1024 * 1024; - } + return r; } diff --git a/include/log_io.h b/include/log_io.h index fe20ccf40f22638281f636ac9e3a1f18fa43bb65..02f75308a6f8d4d341580a443083606d6ce0f4d8 100644 --- a/include/log_io.h +++ b/include/log_io.h @@ -117,7 +117,7 @@ struct tbuf *convert_to_v11(struct tbuf *orig, i64 lsn); struct recovery_state *recover_init(const char *snap_dirname, const char *xlog_dirname, row_reader snap_row_reader, row_handler snap_row_handler, row_handler xlog_row_handler, int rows_per_file, - double fsync_delay, double snap_io_rate_limit, int inbox_size, + double fsync_delay, int inbox_size, int flags, void *data); int recover(struct recovery_state *, i64 lsn); void recover_follow(struct recovery_state *r, ev_tstamp wal_dir_rescan_delay); diff --git a/mod/silverbox/box.c b/mod/silverbox/box.c index cc246d5aaaae6a239f1f058c3251e994396c6528..c3e881c0965d0718024328cb350b6a9bf0878059 100644 --- a/mod/silverbox/box.c +++ b/mod/silverbox/box.c @@ -1770,10 +1770,12 @@ mod_init(void) recovery_state = recover_init(cfg.snap_dir, cfg.wal_dir, box_snap_reader, snap_apply, xlog_apply, - cfg.rows_per_wal, cfg.wal_fsync_delay, cfg.snap_io_rate_limit, + cfg.rows_per_wal, cfg.wal_fsync_delay, cfg.wal_writer_inbox_size, init_storage ? RECOVER_READONLY : 0, NULL); + recovery_state->snap_io_rate_limit = cfg.snap_io_rate_limit * 1024 * 1024; + /* initialize hashes _after_ starting wal writer */ if (cfg.memcached != 0) { int n = cfg.memcached_namespace > 0 ? cfg.memcached_namespace : MEMCACHED_NAMESPACE; diff --git a/mod/silverbox/box_cfg.cfg_tmpl b/mod/silverbox/box_cfg.cfg_tmpl index 54ca6ca3eeca6bad879afedf460f059f98f45907..c8d8d2544d0dfc60c51507e60fcfed8caa0b7ba5 100644 --- a/mod/silverbox/box_cfg.cfg_tmpl +++ b/mod/silverbox/box_cfg.cfg_tmpl @@ -28,6 +28,11 @@ memcached_expire_per_loop=1024 # tarantool will try iterate all rows within this time memcached_expire_full_sweep=3600 + +# do not write snapshot faster then snap_io_rate_limit MBytes/sec +snap_io_rate_limit=0.0 + + # Write no more rows in WAL rows_per_wal=500000