diff options
Diffstat (limited to 'ctdb/tests')
-rw-r--r-- | ctdb/tests/src/protocol_common.c | 39 | ||||
-rw-r--r-- | ctdb/tests/src/protocol_types_compat_test.c | 101 | ||||
-rw-r--r-- | ctdb/tests/src/protocol_types_test.c | 2 |
3 files changed, 137 insertions, 5 deletions
diff --git a/ctdb/tests/src/protocol_common.c b/ctdb/tests/src/protocol_common.c index 494e0e091c3..5b0d67d2b42 100644 --- a/ctdb/tests/src/protocol_common.c +++ b/ctdb/tests/src/protocol_common.c @@ -1231,8 +1231,24 @@ void fill_ctdb_db_statistics(TALLOC_CTX *mem_ctx, { int i; - fill_buffer(p, offsetof(struct ctdb_db_statistics, num_hot_keys)); - p->num_hot_keys = 10; + p->locks.num_calls = rand32(); + p->locks.num_current = rand32(); + p->locks.num_pending = rand32(); + p->locks.num_failed = rand32(); + fill_ctdb_latency_counter(&p->locks.latency); + for (i=0; i<MAX_COUNT_BUCKETS; i++) { + p->locks.buckets[i] = rand32(); + } + + fill_ctdb_latency_counter(&p->vacuum.latency); + + p->db_ro_delegations = rand32(); + p->db_ro_revokes = rand32(); + for (i=0; i<MAX_COUNT_BUCKETS; i++) { + p->hop_count_bucket[i] = rand32(); + } + + p->num_hot_keys = MAX_HOT_KEYS; for (i=0; i<p->num_hot_keys; i++) { p->hot_keys[i].count = rand32(); fill_tdb_data(mem_ctx, &p->hot_keys[i].key); @@ -1244,8 +1260,23 @@ void verify_ctdb_db_statistics(struct ctdb_db_statistics *p1, { int i; - verify_buffer(p1, p2, offsetof(struct ctdb_db_statistics, - num_hot_keys)); + assert(p1->locks.num_calls == p2->locks.num_calls); + assert(p1->locks.num_current == p2->locks.num_current); + assert(p1->locks.num_pending == p2->locks.num_pending); + assert(p1->locks.num_failed == p2->locks.num_failed); + verify_ctdb_latency_counter(&p1->locks.latency, &p2->locks.latency); + for (i=0; i<MAX_COUNT_BUCKETS; i++) { + assert(p1->locks.buckets[i] == p2->locks.buckets[i]); + } + + verify_ctdb_latency_counter(&p1->vacuum.latency, &p2->vacuum.latency); + + assert(p1->db_ro_delegations == p2->db_ro_delegations); + assert(p1->db_ro_revokes == p2->db_ro_revokes); + for (i=0; i<MAX_COUNT_BUCKETS; i++) { + assert(p1->hop_count_bucket[i] == p2->hop_count_bucket[i]); + } + assert(p1->num_hot_keys == p2->num_hot_keys); for (i=0; i<p1->num_hot_keys; i++) { assert(p1->hot_keys[i].count == p2->hot_keys[i].count); diff --git a/ctdb/tests/src/protocol_types_compat_test.c b/ctdb/tests/src/protocol_types_compat_test.c index cf9abf3b281..8599344d803 100644 --- a/ctdb/tests/src/protocol_types_compat_test.c +++ b/ctdb/tests/src/protocol_types_compat_test.c @@ -1977,6 +1977,105 @@ static int ctdb_key_data_pull_old(uint8_t *buf, size_t buflen, return 0; } +struct ctdb_db_statistics_wire { + struct ctdb_db_statistics dbstats; + char hot_keys_wire[1]; +}; + +static size_t ctdb_db_statistics_len_old(struct ctdb_db_statistics *in) +{ + size_t len; + int i; + + len = sizeof(struct ctdb_db_statistics); + for (i=0; i<MAX_HOT_KEYS; i++) { + len += in->hot_keys[i].key.dsize; + } + return len; +} + +static void ctdb_db_statistics_push_old(struct ctdb_db_statistics *in, + void *buf) +{ + struct ctdb_db_statistics_wire *wire = + (struct ctdb_db_statistics_wire *)buf; + size_t offset; + int i; + + in->num_hot_keys = MAX_HOT_KEYS; + memcpy(wire, in, sizeof(struct ctdb_db_statistics)); + + offset = 0; + for (i=0; i<MAX_HOT_KEYS; i++) { + memcpy(&wire->hot_keys_wire[offset], + in->hot_keys[i].key.dptr, + in->hot_keys[i].key.dsize); + offset += in->hot_keys[i].key.dsize; + } +} + +static int ctdb_db_statistics_pull_old(uint8_t *buf, size_t buflen, + TALLOC_CTX *mem_ctx, + struct ctdb_db_statistics **out) +{ + struct ctdb_db_statistics *val; + struct ctdb_db_statistics_wire *wire = + (struct ctdb_db_statistics_wire *)buf; + size_t offset; + int i; + + if (buflen < sizeof(struct ctdb_db_statistics)) { + return EMSGSIZE; + } + + offset = 0; + for (i=0; i<wire->dbstats.num_hot_keys; i++) { + if (wire->dbstats.hot_keys[i].key.dsize > buflen) { + return EMSGSIZE; + } + if (offset + wire->dbstats.hot_keys[i].key.dsize < offset) { + return EMSGSIZE; + } + offset += wire->dbstats.hot_keys[i].key.dsize; + if (offset > buflen) { + return EMSGSIZE; + } + } + if (sizeof(struct ctdb_db_statistics) + offset < + sizeof(struct ctdb_db_statistics)) { + return EMSGSIZE; + } + if (buflen < sizeof(struct ctdb_db_statistics) + offset) { + return EMSGSIZE; + } + + val = talloc(mem_ctx, struct ctdb_db_statistics); + if (val == NULL) { + return ENOMEM; + } + + memcpy(val, wire, sizeof(struct ctdb_db_statistics)); + + offset = 0; + for (i=0; i<wire->dbstats.num_hot_keys; i++) { + uint8_t *ptr; + size_t key_size; + + key_size = val->hot_keys[i].key.dsize; + ptr = talloc_memdup(mem_ctx, &wire->hot_keys_wire[offset], + key_size); + if (ptr == NULL) { + talloc_free(val); + return ENOMEM; + } + val->hot_keys[i].key.dptr = ptr; + offset += key_size; + } + + *out = val; + return 0; +} + COMPAT_TYPE3_TEST(struct ctdb_statistics, ctdb_statistics); COMPAT_TYPE3_TEST(struct ctdb_vnn_map, ctdb_vnn_map); @@ -2015,6 +2114,7 @@ COMPAT_TYPE3_TEST(struct ctdb_iface_list, ctdb_iface_list); COMPAT_TYPE3_TEST(struct ctdb_public_ip_info, ctdb_public_ip_info); COMPAT_TYPE3_TEST(struct ctdb_statistics_list, ctdb_statistics_list); COMPAT_TYPE3_TEST(struct ctdb_key_data, ctdb_key_data); +COMPAT_TYPE3_TEST(struct ctdb_db_statistics, ctdb_db_statistics); int main(int argc, char *argv[]) { @@ -2058,6 +2158,7 @@ int main(int argc, char *argv[]) COMPAT_TEST_FUNC(ctdb_public_ip_info)(); COMPAT_TEST_FUNC(ctdb_statistics_list)(); COMPAT_TEST_FUNC(ctdb_key_data)(); + COMPAT_TEST_FUNC(ctdb_db_statistics)(); return 0; } diff --git a/ctdb/tests/src/protocol_types_test.c b/ctdb/tests/src/protocol_types_test.c index d1227615386..4e1e6e2afc6 100644 --- a/ctdb/tests/src/protocol_types_test.c +++ b/ctdb/tests/src/protocol_types_test.c @@ -83,7 +83,7 @@ PROTOCOL_TYPE3_TEST(struct ctdb_iface_list, ctdb_iface_list); PROTOCOL_TYPE3_TEST(struct ctdb_public_ip_info, ctdb_public_ip_info); PROTOCOL_TYPE3_TEST(struct ctdb_statistics_list, ctdb_statistics_list); PROTOCOL_TYPE3_TEST(struct ctdb_key_data, ctdb_key_data); -DEFINE_TEST(struct ctdb_db_statistics, ctdb_db_statistics); +PROTOCOL_TYPE3_TEST(struct ctdb_db_statistics, ctdb_db_statistics); DEFINE_TEST(struct ctdb_election_message, ctdb_election_message); DEFINE_TEST(struct ctdb_srvid_message, ctdb_srvid_message); DEFINE_TEST(struct ctdb_disable_message, ctdb_disable_message); |