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

Reply via email to