This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Tarantool -- an efficient key/value data store".
The branch core-config-reread has been updated
via 67f5d62cbcb6e2ae2b52c025bb2fd97e0f3998c0 (commit)
via 57f74e53d7968c117cc9b0e6b113b911adcf64df (commit)
from ae98f82feff9d9686a1b3a7cc8691be6e1a9d497 (commit)
Summary of changes:
cfg/tarantool_feeder_cfg.c | 156 +++++++++++++++-
cfg/tarantool_feeder_cfg.h | 6 +-
cfg/tarantool_silverbox_cfg.c | 434 +++++++++++++++++++++++++++++++++++++++--
cfg/tarantool_silverbox_cfg.h | 12 +-
core/tarantool.c | 46 ++++-
third_party/confetti/prscfg.h | 2 +
6 files changed, 628 insertions(+), 28 deletions(-)
commit 67f5d62cbcb6e2ae2b52c025bb2fd97e0f3998c0
Author: Roman Tokarev <[email protected]>
Date: Tue Dec 7 14:23:01 2010 +0300
[core] chkconfig: return 1 in case of bad config
diff --git a/core/tarantool.c b/core/tarantool.c
index cbf3131..8a6cf43 100644
--- a/core/tarantool.c
+++ b/core/tarantool.c
@@ -427,9 +427,12 @@ main(int argc, char **argv)
assert(cfg_out);
if (role == chkconfig) {
- if (fill_default_tarantool_cfg(&cfg) != 0 || load_cfg(&cfg, 0)
!= 0)
+ if (fill_default_tarantool_cfg(&cfg) != 0 || load_cfg(&cfg, 0)
!= 0) {
fprintf(stderr, "FAILED\n%.*s\n", cfg_out->len, (char
*)cfg_out->data);
+ return 1;
+ }
+
return 0;
}
commit 57f74e53d7968c117cc9b0e6b113b911adcf64df
Author: Roman Tokarev <[email protected]>
Date: Fri Dec 3 12:13:06 2010 +0300
[core] add more checks during config reloading
diff --git a/cfg/tarantool_feeder_cfg.c b/cfg/tarantool_feeder_cfg.c
index 188617c..31f1bbe 100644
--- a/cfg/tarantool_feeder_cfg.c
+++ b/cfg/tarantool_feeder_cfg.c
@@ -104,8 +104,9 @@ static NameAtom _name__custom_proc_title[] = {
{ "custom_proc_title", -1, NULL }
};
-#define ARRAYALLOC(x,n,t,_chk_ro) do { \
+#define ARRAYALLOC(x,n,t,_chk_ro) ({ \
int l = 0, ar; \
+ int was_realloced = 0; \
__typeof__(x) y = (x), t; \
if ( (n) <= 0 ) return CNF_WRONGINDEX; /* wrong index */ \
while(y && *y) { \
@@ -128,8 +129,10 @@ static NameAtom _name__custom_proc_title[] = {
if ( (ar = acceptDefault##t(*y)) != 0 ) return ar; \
y++; \
} \
+ was_realloced = 1; \
} \
-} while(0)
+ was_realloced; \
+})
static ConfettyError
acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) {
@@ -721,3 +724,152 @@ destroy_tarantool_cfg(tarantool_cfg* c) {
free(c->custom_proc_title);
}
+/************** Compare config **************/
+
+int
+confetti_strcmp(char *s1, char *s2) {
+ if (s1 == NULL || s2 == NULL) {
+ if (s1 != s2)
+ return s1 == NULL ? -1 : 1;
+ else
+ return 0;
+ }
+
+ return strcmp(s1, s2);
+}
+
+char *
+cmp_tarantool_cfg(tarantool_cfg* c1, tarantool_cfg* c2, int only_check_rdonly)
{
+ tarantool_cfg_iterator_t iterator1, iterator2, *i1 = &iterator1, *i2 =
&iterator2;
+ static char diff[PRINTBUFLEN];
+
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->username, c2->username) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->username");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (c1->coredump != c2->coredump) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->coredump");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->admin_port != c2->admin_port) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->admin_port");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->log_level != c2->log_level) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->log_level");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->slab_alloc_arena != c2->slab_alloc_arena) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->slab_alloc_arena");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->slab_alloc_minimal != c2->slab_alloc_minimal) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->slab_alloc_minimal");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->slab_alloc_factor != c2->slab_alloc_factor) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->slab_alloc_factor");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->work_dir, c2->work_dir) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->work_dir");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->pid_file, c2->pid_file) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->pid_file");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->logger, c2->logger) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->logger");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (c1->logger_nonblock != c2->logger_nonblock) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->logger_nonblock");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->io_collect_interval != c2->io_collect_interval) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->io_collect_interval");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->backlog != c2->backlog) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->backlog");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->readahead != c2->readahead) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->readahead");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->wal_feeder_bind_ipaddr,
c2->wal_feeder_bind_ipaddr) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->wal_feeder_bind_ipaddr");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (c1->wal_feeder_bind_port != c2->wal_feeder_bind_port) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->wal_feeder_bind_port");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->wal_feeder_dir, c2->wal_feeder_dir) !=
0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->wal_feeder_dir");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->custom_proc_title,
c2->custom_proc_title) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->custom_proc_title");
+
+ return diff;
+}
+ }
+
+ return 0;
+}
+
diff --git a/cfg/tarantool_feeder_cfg.h b/cfg/tarantool_feeder_cfg.h
index 3ecbad9..c8b81f3 100644
--- a/cfg/tarantool_feeder_cfg.h
+++ b/cfg/tarantool_feeder_cfg.h
@@ -9,6 +9,8 @@
*/
typedef struct tarantool_cfg {
+ unsigned char __confetti_flags;
+
/* username to switch to */
char* username;
@@ -86,7 +88,9 @@ int dup_tarantool_cfg(tarantool_cfg *dst, tarantool_cfg *src);
void destroy_tarantool_cfg(tarantool_cfg *c);
-typedef struct tarantool_cfg_iterator_t tarantool_cfg_iterator_t;
+char *cmp_tarantool_cfg(tarantool_cfg* c1, tarantool_cfg* c2, int
only_check_rdonly)
+
+;typedef struct tarantool_cfg_iterator_t tarantool_cfg_iterator_t;
tarantool_cfg_iterator_t* tarantool_cfg_iterator_init();
char* tarantool_cfg_iterator_next(tarantool_cfg_iterator_t* i, tarantool_cfg
*c, char **v);
diff --git a/cfg/tarantool_silverbox_cfg.c b/cfg/tarantool_silverbox_cfg.c
index 71cf41e..d0ca978 100644
--- a/cfg/tarantool_silverbox_cfg.c
+++ b/cfg/tarantool_silverbox_cfg.c
@@ -235,8 +235,9 @@ static NameAtom _name__namespace__index__key_field__type[]
= {
{ "type", -1, NULL }
};
-#define ARRAYALLOC(x,n,t,_chk_ro) do { \
+#define ARRAYALLOC(x,n,t,_chk_ro) ({ \
int l = 0, ar; \
+ int was_realloced = 0; \
__typeof__(x) y = (x), t; \
if ( (n) <= 0 ) return CNF_WRONGINDEX; /* wrong index */ \
while(y && *y) { \
@@ -259,8 +260,10 @@ static NameAtom _name__namespace__index__key_field__type[]
= {
if ( (ar = acceptDefault##t(*y)) != 0 ) return ar; \
y++; \
} \
+ was_realloced = 1; \
} \
-} while(0)
+ was_realloced; \
+})
static ConfettyError
acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) {
@@ -617,7 +620,10 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int
check_rdonly) {
else if ( cmpNameAtoms( opt->name, _name__namespace__enabled) ) {
if (opt->paramType != numberType )
return CNF_WRONGTYPE;
- ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0);
+ if (ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0) != 0)
+ c->namespace[opt->name->index]->__confetti_flags |=
CNF_FLAG_STRUCT_NEW;
+ if (c->namespace[opt->name->index]->__confetti_flags &
CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
errno = 0;
long int i32 = strtol(opt->paramValue.numberval, NULL, 10);
if (i32 == 0 && errno == EINVAL)
@@ -629,7 +635,10 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int
check_rdonly) {
else if ( cmpNameAtoms( opt->name, _name__namespace__cardinality) ) {
if (opt->paramType != numberType )
return CNF_WRONGTYPE;
- ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0);
+ if (ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0) != 0)
+ c->namespace[opt->name->index]->__confetti_flags |=
CNF_FLAG_STRUCT_NEW;
+ if (c->namespace[opt->name->index]->__confetti_flags &
CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
errno = 0;
long int i32 = strtol(opt->paramValue.numberval, NULL, 10);
if (i32 == 0 && errno == EINVAL)
@@ -641,7 +650,10 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int
check_rdonly) {
else if ( cmpNameAtoms( opt->name, _name__namespace__estimated_rows) ) {
if (opt->paramType != numberType )
return CNF_WRONGTYPE;
- ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0);
+ if (ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0) != 0)
+ c->namespace[opt->name->index]->__confetti_flags |=
CNF_FLAG_STRUCT_NEW;
+ if (c->namespace[opt->name->index]->__confetti_flags &
CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
errno = 0;
long int i32 = strtol(opt->paramValue.numberval, NULL, 10);
if (i32 == 0 && errno == EINVAL)
@@ -653,8 +665,14 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int
check_rdonly) {
else if ( cmpNameAtoms( opt->name, _name__namespace__index__type) ) {
if (opt->paramType != stringType )
return CNF_WRONGTYPE;
- ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0);
- ARRAYALLOC(c->namespace[opt->name->index]->index,
opt->name->next->index + 1, _name__namespace__index, 0);
+ if (ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0) != 0)
+ c->namespace[opt->name->index]->__confetti_flags |=
CNF_FLAG_STRUCT_NEW;
+ if (c->namespace[opt->name->index]->__confetti_flags &
CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
+ if (ARRAYALLOC(c->namespace[opt->name->index]->index,
opt->name->next->index + 1, _name__namespace__index, 0) != 0)
+
c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags
|= CNF_FLAG_STRUCT_NEW;
+ if
(c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags
& CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
errno = 0;
c->namespace[opt->name->index]->index[opt->name->next->index]->type =
(opt->paramValue.stringval) ? strdup(opt->paramValue.stringval) : NULL;
if (opt->paramValue.stringval &&
c->namespace[opt->name->index]->index[opt->name->next->index]->type == NULL)
@@ -663,8 +681,14 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int
check_rdonly) {
else if ( cmpNameAtoms( opt->name, _name__namespace__index__unique) ) {
if (opt->paramType != numberType )
return CNF_WRONGTYPE;
- ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0);
- ARRAYALLOC(c->namespace[opt->name->index]->index,
opt->name->next->index + 1, _name__namespace__index, 0);
+ if (ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0) != 0)
+ c->namespace[opt->name->index]->__confetti_flags |=
CNF_FLAG_STRUCT_NEW;
+ if (c->namespace[opt->name->index]->__confetti_flags &
CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
+ if (ARRAYALLOC(c->namespace[opt->name->index]->index,
opt->name->next->index + 1, _name__namespace__index, 0) != 0)
+
c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags
|= CNF_FLAG_STRUCT_NEW;
+ if
(c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags
& CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
errno = 0;
long int i32 = strtol(opt->paramValue.numberval, NULL, 10);
if (i32 == 0 && errno == EINVAL)
@@ -676,9 +700,18 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int
check_rdonly) {
else if ( cmpNameAtoms( opt->name,
_name__namespace__index__key_field__fieldno) ) {
if (opt->paramType != numberType )
return CNF_WRONGTYPE;
- ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0);
- ARRAYALLOC(c->namespace[opt->name->index]->index,
opt->name->next->index + 1, _name__namespace__index, 0);
-
ARRAYALLOC(c->namespace[opt->name->index]->index[opt->name->next->index]->key_field,
opt->name->next->next->index + 1, _name__namespace__index__key_field, 0);
+ if (ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0) != 0)
+ c->namespace[opt->name->index]->__confetti_flags |=
CNF_FLAG_STRUCT_NEW;
+ if (c->namespace[opt->name->index]->__confetti_flags &
CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
+ if (ARRAYALLOC(c->namespace[opt->name->index]->index,
opt->name->next->index + 1, _name__namespace__index, 0) != 0)
+
c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags
|= CNF_FLAG_STRUCT_NEW;
+ if
(c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags
& CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
+ if
(ARRAYALLOC(c->namespace[opt->name->index]->index[opt->name->next->index]->key_field,
opt->name->next->next->index + 1, _name__namespace__index__key_field, 0) != 0)
+
c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->__confetti_flags
|= CNF_FLAG_STRUCT_NEW;
+ if
(c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->__confetti_flags
& CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
errno = 0;
long int i32 = strtol(opt->paramValue.numberval, NULL, 10);
if (i32 == 0 && errno == EINVAL)
@@ -690,9 +723,18 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int
check_rdonly) {
else if ( cmpNameAtoms( opt->name,
_name__namespace__index__key_field__type) ) {
if (opt->paramType != stringType )
return CNF_WRONGTYPE;
- ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0);
- ARRAYALLOC(c->namespace[opt->name->index]->index,
opt->name->next->index + 1, _name__namespace__index, 0);
-
ARRAYALLOC(c->namespace[opt->name->index]->index[opt->name->next->index]->key_field,
opt->name->next->next->index + 1, _name__namespace__index__key_field, 0);
+ if (ARRAYALLOC(c->namespace, opt->name->index + 1,
_name__namespace, 0) != 0)
+ c->namespace[opt->name->index]->__confetti_flags |=
CNF_FLAG_STRUCT_NEW;
+ if (c->namespace[opt->name->index]->__confetti_flags &
CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
+ if (ARRAYALLOC(c->namespace[opt->name->index]->index,
opt->name->next->index + 1, _name__namespace__index, 0) != 0)
+
c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags
|= CNF_FLAG_STRUCT_NEW;
+ if
(c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags
& CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
+ if
(ARRAYALLOC(c->namespace[opt->name->index]->index[opt->name->next->index]->key_field,
opt->name->next->next->index + 1, _name__namespace__index__key_field, 0) != 0)
+
c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->__confetti_flags
|= CNF_FLAG_STRUCT_NEW;
+ if
(c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->__confetti_flags
& CNF_FLAG_STRUCT_NEW)
+ check_rdonly = 0;
errno = 0;
c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->type
= (opt->paramValue.stringval) ? strdup(opt->paramValue.stringval) : NULL;
if (opt->paramValue.stringval &&
c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->type
== NULL)
@@ -1582,3 +1624,365 @@ destroy_tarantool_cfg(tarantool_cfg* c) {
}
}
+/************** Compare config **************/
+
+int
+confetti_strcmp(char *s1, char *s2) {
+ if (s1 == NULL || s2 == NULL) {
+ if (s1 != s2)
+ return s1 == NULL ? -1 : 1;
+ else
+ return 0;
+ }
+
+ return strcmp(s1, s2);
+}
+
+char *
+cmp_tarantool_cfg(tarantool_cfg* c1, tarantool_cfg* c2, int only_check_rdonly)
{
+ tarantool_cfg_iterator_t iterator1, iterator2, *i1 = &iterator1, *i2 =
&iterator2;
+ static char diff[PRINTBUFLEN];
+
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->username, c2->username) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->username");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (c1->coredump != c2->coredump) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->coredump");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->admin_port != c2->admin_port) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->admin_port");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->log_level != c2->log_level) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->log_level");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->slab_alloc_arena != c2->slab_alloc_arena) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->slab_alloc_arena");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->slab_alloc_minimal != c2->slab_alloc_minimal) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->slab_alloc_minimal");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->slab_alloc_factor != c2->slab_alloc_factor) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->slab_alloc_factor");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->work_dir, c2->work_dir) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->work_dir");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->pid_file, c2->pid_file) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->pid_file");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->logger, c2->logger) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->logger");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (c1->logger_nonblock != c2->logger_nonblock) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->logger_nonblock");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->io_collect_interval != c2->io_collect_interval) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->io_collect_interval");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->backlog != c2->backlog) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->backlog");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->readahead != c2->readahead) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->readahead");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->snap_dir, c2->snap_dir) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->snap_dir");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->wal_dir, c2->wal_dir) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->wal_dir");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (c1->primary_port != c2->primary_port) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->primary_port");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->secondary_port != c2->secondary_port) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->secondary_port");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->too_long_threshold != c2->too_long_threshold) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->too_long_threshold");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->custom_proc_title,
c2->custom_proc_title) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->custom_proc_title");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (c1->memcached != c2->memcached) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->memcached");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->memcached_namespace != c2->memcached_namespace) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->memcached_namespace");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->memcached_expire_per_loop !=
c2->memcached_expire_per_loop) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->memcached_expire_per_loop");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->memcached_expire_full_sweep !=
c2->memcached_expire_full_sweep) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->memcached_expire_full_sweep");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->snap_io_rate_limit != c2->snap_io_rate_limit) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->snap_io_rate_limit");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->rows_per_wal != c2->rows_per_wal) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->rows_per_wal");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->wal_fsync_delay != c2->wal_fsync_delay) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->wal_fsync_delay");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->wal_writer_inbox_size != c2->wal_writer_inbox_size) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->wal_writer_inbox_size");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->local_hot_standby != c2->local_hot_standby) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->local_hot_standby");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->wal_dir_rescan_delay != c2->wal_dir_rescan_delay) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->wal_dir_rescan_delay");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->panic_on_snap_error != c2->panic_on_snap_error) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->panic_on_snap_error");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->panic_on_wal_error != c2->panic_on_wal_error) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->panic_on_wal_error");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->remote_hot_standby != c2->remote_hot_standby) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->remote_hot_standby");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (confetti_strcmp(c1->wal_feeder_ipaddr,
c2->wal_feeder_ipaddr) != 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->wal_feeder_ipaddr");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if (c1->wal_feeder_port != c2->wal_feeder_port) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->wal_feeder_port");
+
+ return diff;
+ }
+ }
+
+ i1->idx_name__namespace = 0;
+ i2->idx_name__namespace = 0;
+ while (c1->namespace != NULL && c1->namespace[i1->idx_name__namespace]
!= NULL && c2->namespace != NULL && c2->namespace[i2->idx_name__namespace] !=
NULL) {
+ if (!only_check_rdonly) {
+ if (c1->namespace[i1->idx_name__namespace]->enabled !=
c2->namespace[i2->idx_name__namespace]->enabled) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->namespace[]->enabled");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if (c1->namespace[i1->idx_name__namespace]->cardinality
!= c2->namespace[i2->idx_name__namespace]->cardinality) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->namespace[]->cardinality");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if
(c1->namespace[i1->idx_name__namespace]->estimated_rows !=
c2->namespace[i2->idx_name__namespace]->estimated_rows) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->namespace[]->estimated_rows");
+
+ return diff;
+ }
+ }
+
+ i1->idx_name__namespace__index = 0;
+ i2->idx_name__namespace__index = 0;
+ while (c1->namespace[i1->idx_name__namespace]->index != NULL &&
c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]
!= NULL && c2->namespace[i2->idx_name__namespace]->index != NULL &&
c2->namespace[i2->idx_name__namespace]->index[i2->idx_name__namespace__index]
!= NULL) {
+ if (!only_check_rdonly) {
+ if
(confetti_strcmp(c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]->type,
c2->namespace[i2->idx_name__namespace]->index[i2->idx_name__namespace__index]->type)
!= 0) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->namespace[]->index[]->type");
+
+ return diff;
+}
+ }
+ if (!only_check_rdonly) {
+ if
(c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]->unique
!=
c2->namespace[i2->idx_name__namespace]->index[i2->idx_name__namespace__index]->unique)
{
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->namespace[]->index[]->unique");
+
+ return diff;
+ }
+ }
+
+ i1->idx_name__namespace__index__key_field = 0;
+ i2->idx_name__namespace__index__key_field = 0;
+ while
(c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]->key_field
!= NULL &&
c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]->key_field[i1->idx_name__namespace__index__key_field]
!= NULL &&
c2->namespace[i2->idx_name__namespace]->index[i2->idx_name__namespace__index]->key_field
!= NULL &&
c2->namespace[i2->idx_name__namespace]->index[i2->idx_name__namespace__index]->key_field[i2->idx_name__namespace__index__key_field]
!= NULL) {
+ if (!only_check_rdonly) {
+ if
(c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]->key_field[i1->idx_name__namespace__index__key_field]->fieldno
!=
c2->namespace[i2->idx_name__namespace]->index[i2->idx_name__namespace__index]->key_field[i2->idx_name__namespace__index__key_field]->fieldno)
{
+ snprintf(diff, PRINTBUFLEN - 1,
"%s", "c->namespace[]->index[]->key_field[]->fieldno");
+
+ return diff;
+ }
+ }
+ if (!only_check_rdonly) {
+ if
(confetti_strcmp(c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]->key_field[i1->idx_name__namespace__index__key_field]->type,
c2->namespace[i2->idx_name__namespace]->index[i2->idx_name__namespace__index]->key_field[i2->idx_name__namespace__index__key_field]->type)
!= 0) {
+ snprintf(diff, PRINTBUFLEN - 1,
"%s", "c->namespace[]->index[]->key_field[]->type");
+
+ return diff;
+}
+ }
+
+ i1->idx_name__namespace__index__key_field++;
+ i2->idx_name__namespace__index__key_field++;
+ }
+ if (!only_check_rdonly) {
+ if
(!(c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]->key_field
==
c2->namespace[i2->idx_name__namespace]->index[i2->idx_name__namespace__index]->key_field
&&
c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]->key_field
== NULL) &&
(c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]->key_field
== NULL ||
c2->namespace[i2->idx_name__namespace]->index[i2->idx_name__namespace__index]->key_field
== NULL ||
c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]->key_field[i1->idx_name__namespace__index__key_field]
!= NULL ||
c2->namespace[i2->idx_name__namespace]->index[i2->idx_name__namespace__index]->key_field[i2->idx_name__namespace__index__key_field]
!= NULL)) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->namespace[]->index[]->key_field[]");
+
+ return diff;
+}
+ }
+
+ i1->idx_name__namespace__index++;
+ i2->idx_name__namespace__index++;
+ }
+ if (!only_check_rdonly) {
+ if (!(c1->namespace[i1->idx_name__namespace]->index ==
c2->namespace[i2->idx_name__namespace]->index &&
c1->namespace[i1->idx_name__namespace]->index == NULL) &&
(c1->namespace[i1->idx_name__namespace]->index == NULL ||
c2->namespace[i2->idx_name__namespace]->index == NULL ||
c1->namespace[i1->idx_name__namespace]->index[i1->idx_name__namespace__index]
!= NULL ||
c2->namespace[i2->idx_name__namespace]->index[i2->idx_name__namespace__index]
!= NULL)) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s",
"c->namespace[]->index[]");
+
+ return diff;
+}
+ }
+
+ i1->idx_name__namespace++;
+ i2->idx_name__namespace++;
+ }
+ if (!only_check_rdonly) {
+ if (!(c1->namespace == c2->namespace && c1->namespace == NULL)
&& (c1->namespace == NULL || c2->namespace == NULL ||
c1->namespace[i1->idx_name__namespace] != NULL ||
c2->namespace[i2->idx_name__namespace] != NULL)) {
+ snprintf(diff, PRINTBUFLEN - 1, "%s", "c->namespace[]");
+
+ return diff;
+}
+ }
+
+ return 0;
+}
+
diff --git a/cfg/tarantool_silverbox_cfg.h b/cfg/tarantool_silverbox_cfg.h
index d0cea04..1493766 100644
--- a/cfg/tarantool_silverbox_cfg.h
+++ b/cfg/tarantool_silverbox_cfg.h
@@ -9,17 +9,23 @@
*/
typedef struct tarantool_cfg_namespace_index_key_field {
+ unsigned char __confetti_flags;
+
int32_t fieldno;
char* type;
} tarantool_cfg_namespace_index_key_field;
typedef struct tarantool_cfg_namespace_index {
+ unsigned char __confetti_flags;
+
char* type;
int32_t unique;
tarantool_cfg_namespace_index_key_field** key_field;
} tarantool_cfg_namespace_index;
typedef struct tarantool_cfg_namespace {
+ unsigned char __confetti_flags;
+
int32_t enabled;
int32_t cardinality;
int32_t estimated_rows;
@@ -27,6 +33,8 @@ typedef struct tarantool_cfg_namespace {
} tarantool_cfg_namespace;
typedef struct tarantool_cfg {
+ unsigned char __confetti_flags;
+
/* username to switch to */
char* username;
@@ -164,7 +172,9 @@ int dup_tarantool_cfg(tarantool_cfg *dst, tarantool_cfg
*src);
void destroy_tarantool_cfg(tarantool_cfg *c);
-typedef struct tarantool_cfg_iterator_t tarantool_cfg_iterator_t;
+char *cmp_tarantool_cfg(tarantool_cfg* c1, tarantool_cfg* c2, int
only_check_rdonly)
+
+;typedef struct tarantool_cfg_iterator_t tarantool_cfg_iterator_t;
tarantool_cfg_iterator_t* tarantool_cfg_iterator_init();
char* tarantool_cfg_iterator_next(tarantool_cfg_iterator_t* i, tarantool_cfg
*c, char **v);
diff --git a/core/tarantool.c b/core/tarantool.c
index f1d9a22..cbf3131 100644
--- a/core/tarantool.c
+++ b/core/tarantool.c
@@ -92,29 +92,54 @@ load_cfg(struct tarantool_cfg *conf, i32 check_rdonly)
i32
reload_cfg(struct tbuf *out)
{
- struct tarantool_cfg new_cfg;
+ struct tarantool_cfg new_cfg1, new_cfg2;
i32 ret;
- if (dup_tarantool_cfg(&new_cfg, &cfg) != 0) {
- destroy_tarantool_cfg(&new_cfg);
+ // Load with checking readonly params
+ if (dup_tarantool_cfg(&new_cfg1, &cfg) != 0) {
+ destroy_tarantool_cfg(&new_cfg1);
return -1;
}
-
- ret = load_cfg(&new_cfg, 1);
+ ret = load_cfg(&new_cfg1, 1);
tbuf_append(out, cfg_out->data, cfg_out->len);
+ if (ret == -1) {
+ destroy_tarantool_cfg(&new_cfg1);
+ return -1;
+ }
+
+ // Load without checking readonly params
+ if (fill_default_tarantool_cfg(&new_cfg2) != 0) {
+ destroy_tarantool_cfg(&new_cfg2);
+
+ return -1;
+ }
+ ret = load_cfg(&new_cfg2, 0);
+ tbuf_append(out, cfg_out->data, cfg_out->len);
if (ret == -1) {
- destroy_tarantool_cfg(&new_cfg);
+ destroy_tarantool_cfg(&new_cfg1);
+
+ return -1;
+ }
+
+ // Compare only readonly params
+ char *diff = cmp_tarantool_cfg(&new_cfg1, &new_cfg2, 1);
+ if (diff != NULL) {
+ destroy_tarantool_cfg(&new_cfg1);
+ destroy_tarantool_cfg(&new_cfg2);
+
+ tbuf_printf(out, "\tCould not accept read only '%s' option\n",
diff);
return -1;
}
+ destroy_tarantool_cfg(&new_cfg1);
- mod_reloadconfig(&cfg, &new_cfg);
+ mod_reloadconfig(&cfg, &new_cfg2);
destroy_tarantool_cfg(&cfg);
- cfg = new_cfg;
+ cfg = new_cfg2;
return 0;
}
diff --git a/third_party/confetti/prscfg.h b/third_party/confetti/prscfg.h
index ceeeab4..7012260 100644
--- a/third_party/confetti/prscfg.h
+++ b/third_party/confetti/prscfg.h
@@ -49,4 +49,6 @@ typedef enum ConfettyError {
CNF_INTERNALERROR
} ConfettyError;
+#define CNF_FLAG_STRUCT_NEW 0x01
+
#endif
--
Tarantool -- an efficient key/value data store
_______________________________________________
Mailing list: https://launchpad.net/~tarantool-developers
Post to : [email protected]
Unsubscribe : https://launchpad.net/~tarantool-developers
More help : https://help.launchpad.net/ListHelp