VBUCKET_CONFIG_DIFF* vbucket_compare(VBUCKET_CONFIG_HANDLE from, VBUCKET_CONFIG_HANDLE to) { VBUCKET_CONFIG_DIFF *rv = calloc(1, sizeof(VBUCKET_CONFIG_DIFF)); int num_servers = (from->num_servers > to->num_servers ? from->num_servers : to->num_servers) + 1; assert(rv); rv->servers_added = calloc(num_servers, sizeof(char*)); rv->servers_removed = calloc(num_servers, sizeof(char*)); /* Compute the added and removed servers */ compute_vb_list_diff(from, to, rv->servers_added); compute_vb_list_diff(to, from, rv->servers_removed); /* Verify the servers are equal in their positions */ if (to->num_servers == from->num_servers) { int i; rv->sequence_changed = false; for (i = 0; i < from->num_servers; i++) { rv->sequence_changed |= (0 != strcmp(vbucket_config_get_server(from, i), vbucket_config_get_server(to, i))); } } else { /* Just say yes */ rv->sequence_changed = true; } /* Consider the sequence changed if the auth credentials changed */ if (from->user != NULL && to->user != NULL) { rv->sequence_changed |= (strcmp(from->user, to->user) != 0); } else { rv->sequence_changed |= ((from->user != NULL) ^ (to->user != NULL)); } if (from->password != NULL && to->password != NULL) { rv->sequence_changed |= (strcmp(from->password, to->password) != 0); } else { rv->sequence_changed |= ((from->password != NULL) ^ (to->password != NULL)); } /* Count the number of vbucket differences */ if (to->num_vbuckets == from->num_vbuckets) { int i; for (i = 0; i < to->num_vbuckets; i++) { rv->n_vb_changes += (vbucket_get_master(from, i) == vbucket_get_master(to, i)) ? 0 : 1; } } else { rv->n_vb_changes = -1; } return rv; }
lcbvb_CONFIGDIFF * lcbvb_compare(lcbvb_CONFIG *from, lcbvb_CONFIG *to) { int nservers; lcbvb_CONFIGDIFF *ret; unsigned ii; ret = calloc(1, sizeof(*ret)); nservers = (from->nsrv > to->nsrv ? from->nsrv : to->nsrv) + 1; ret->servers_added = calloc(nservers, sizeof(*ret->servers_added)); ret->servers_removed = calloc(nservers, sizeof(*ret->servers_removed)); compute_vb_list_diff(from, to, ret->servers_added); compute_vb_list_diff(to, from, ret->servers_removed); if (to->nsrv == from->nsrv) { for (ii = 0; ii < from->nsrv; ii++) { const char *sa, *sb; sa = from->servers[ii].authority; sb = to->servers[ii].authority; ret->sequence_changed |= (0 != strcmp(sa, sb)); } } else { ret->sequence_changed = 1; } if (from->nvb == to->nvb) { for (ii = 0; ii < from->nvb; ii++) { lcbvb_VBUCKET *vba = from->vbuckets + ii, *vbb = to->vbuckets + ii; if (vba->servers[0] != vbb->servers[0]) { ret->n_vb_changes++; } } } else { ret->n_vb_changes = -1; } return ret; }