diff options
| author | Amitay Isaacs <amitay@gmail.com> | 2013-06-25 15:25:16 +1000 |
|---|---|---|
| committer | Amitay Isaacs <amitay@gmail.com> | 2013-07-10 14:33:18 +1000 |
| commit | d36aa928fd3bbdd55d429bb5abe4a67c0f875a8d (patch) | |
| tree | ce37e71241216c5cb8cd29749e3021ef17eb4062 | |
| parent | c0798dfb6429ab8665db0ee69140ff881506384d (diff) | |
| download | samba-d36aa928fd3bbdd55d429bb5abe4a67c0f875a8d.tar.gz samba-d36aa928fd3bbdd55d429bb5abe4a67c0f875a8d.tar.xz samba-d36aa928fd3bbdd55d429bb5abe4a67c0f875a8d.zip | |
ctdbd: Remove incomplete ctdb_db_statistics_wire structure
Send the ctdb_db_statistics directly instead of first copying it to
duplicate ctdb_db_statistics_wire structure. This simplifies the
implementation of the control to get database statistics.
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
(This used to be ctdb commit 26a4653df594d351ca0dc1bd5f5b2f5b0eb0a9a5)
| -rw-r--r-- | ctdb/include/ctdb_private.h | 4 | ||||
| -rw-r--r-- | ctdb/include/ctdb_protocol.h | 7 | ||||
| -rw-r--r-- | ctdb/libctdb/control.c | 33 | ||||
| -rw-r--r-- | ctdb/server/ctdb_control.c | 15 | ||||
| -rw-r--r-- | ctdb/server/ctdb_ltdb_server.c | 52 |
5 files changed, 16 insertions, 95 deletions
diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index 17b8933553..b7f6db7ec8 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -1561,10 +1561,6 @@ int ctdb_fetch_func(struct ctdb_call_info *call); int ctdb_fetch_with_header_func(struct ctdb_call_info *call); -int32_t ctdb_control_get_db_statistics(struct ctdb_context *ctdb, - uint32_t db_id, - TDB_DATA *outdata); - int ctdb_set_db_sticky(struct ctdb_context *ctdb, struct ctdb_db_context *ctdb_db); /* diff --git a/ctdb/include/ctdb_protocol.h b/ctdb/include/ctdb_protocol.h index 10f643bb7f..9e95f4db6a 100644 --- a/ctdb/include/ctdb_protocol.h +++ b/ctdb/include/ctdb_protocol.h @@ -733,13 +733,6 @@ struct ctdb_db_statistics { uint32_t num_hot_keys; struct ctdb_db_hot_key hot_keys[MAX_HOT_KEYS]; }; -struct ctdb_db_statistics_wire { - uint32_t db_ro_delegations; - uint32_t db_ro_revokes; - uint32_t hop_count_bucket[MAX_COUNT_BUCKETS]; - uint32_t num_hot_keys; - char hot_keys[1]; -}; /* * wire format for interface list diff --git a/ctdb/libctdb/control.c b/ctdb/libctdb/control.c index 64cc80e364..2a7db95787 100644 --- a/ctdb/libctdb/control.c +++ b/ctdb/libctdb/control.c @@ -124,10 +124,6 @@ bool ctdb_getdbstat_recv(struct ctdb_connection *ctdb, struct ctdb_db_statistics **stat) { struct ctdb_reply_control *reply; - struct ctdb_db_statistics *s; - struct ctdb_db_statistics_wire *wire; - int i; - char *ptr; reply = unpack_reply_control(req, CTDB_CONTROL_GET_DB_STATISTICS); if (!reply) { @@ -137,37 +133,16 @@ bool ctdb_getdbstat_recv(struct ctdb_connection *ctdb, DEBUG(ctdb, LOG_ERR, "ctdb_getpnn_recv: status -1"); return false; } - if (reply->datalen < offsetof(struct ctdb_db_statistics_wire, hot_keys)) { + if (reply->datalen < offsetof(struct ctdb_db_statistics, hot_keys)) { DEBUG(ctdb, LOG_ERR, "ctdb_getdbstat_recv: returned data is %d bytes but should be >= %d", reply->datalen, (int)sizeof(struct ctdb_db_statistics)); return false; } - wire = (struct ctdb_db_statistics_wire *)reply->data; - - s = malloc(offsetof(struct ctdb_db_statistics, hot_keys) + sizeof(struct ctdb_db_hot_key) * wire->num_hot_keys); - if (!s) { + *stat = malloc(reply->datalen); + if (*stat == NULL) { return false; } - s->db_ro_delegations = wire->db_ro_delegations; - s->db_ro_revokes = wire->db_ro_revokes; - for (i = 0; i < MAX_COUNT_BUCKETS; i++) { - s->hop_count_bucket[i] = wire->hop_count_bucket[i]; - } - s->num_hot_keys = wire->num_hot_keys; - ptr = &wire->hot_keys[0]; - for (i = 0; i < wire->num_hot_keys; i++) { - s->hot_keys[i].count = *(uint32_t *)ptr; - ptr += 4; - - s->hot_keys[i].key.dsize = *(uint32_t *)ptr; - ptr += 4; - - s->hot_keys[i].key.dptr = malloc(s->hot_keys[i].key.dsize); - memcpy(s->hot_keys[i].key.dptr, ptr, s->hot_keys[i].key.dsize); - ptr += s->hot_keys[i].key.dsize; - } - - *stat = s; + memcpy(*stat, reply->data, reply->datalen); return true; } diff --git a/ctdb/server/ctdb_control.c b/ctdb/server/ctdb_control.c index a8771f3176..690608eef6 100644 --- a/ctdb/server/ctdb_control.c +++ b/ctdb/server/ctdb_control.c @@ -651,9 +651,18 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb, CHECK_CONTROL_DATA_SIZE(size); return ctdb_control_schedule_for_deletion(ctdb, indata); } - case CTDB_CONTROL_GET_DB_STATISTICS: - CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t)); - return ctdb_control_get_db_statistics(ctdb, *(uint32_t *)indata.dptr, outdata); + case CTDB_CONTROL_GET_DB_STATISTICS: { + uint32_t db_id; + struct ctdb_db_context *ctdb_db; + + CHECK_CONTROL_DATA_SIZE(sizeof(db_id)); + db_id = *(uint32_t *)indata.dptr; + ctdb_db = find_ctdb_db(ctdb, db_id); + if (ctdb_db == NULL) return -1; + outdata->dptr = (uint8_t *)&ctdb_db->statistics; + outdata->dsize = sizeof(ctdb_db->statistics); + return 0; + } case CTDB_CONTROL_RELOAD_PUBLIC_IPS: CHECK_CONTROL_DATA_SIZE(0); diff --git a/ctdb/server/ctdb_ltdb_server.c b/ctdb/server/ctdb_ltdb_server.c index d7f741b62c..c8715ee425 100644 --- a/ctdb/server/ctdb_ltdb_server.c +++ b/ctdb/server/ctdb_ltdb_server.c @@ -1498,55 +1498,3 @@ int ctdb_set_db_sticky(struct ctdb_context *ctdb, struct ctdb_db_context *ctdb_d return 0; } - -int32_t ctdb_control_get_db_statistics(struct ctdb_context *ctdb, - uint32_t db_id, - TDB_DATA *outdata) -{ - struct ctdb_db_context *ctdb_db; - struct ctdb_db_statistics_wire *stats; - int i; - int len; - char *ptr; - - ctdb_db = find_ctdb_db(ctdb, db_id); - if (!ctdb_db) { - DEBUG(DEBUG_ERR,("Unknown db_id 0x%x in get_db_statistics\n", db_id)); - return -1; - } - - len = offsetof(struct ctdb_db_statistics_wire, hot_keys); - for (i = 0; i < MAX_HOT_KEYS; i++) { - len += 8 + ctdb_db->statistics.hot_keys[i].key.dsize; - } - - stats = talloc_size(outdata, len); - if (stats == NULL) { - DEBUG(DEBUG_ERR,("Failed to allocate db statistics wire structure\n")); - return -1; - } - - stats->db_ro_delegations = ctdb_db->statistics.db_ro_delegations; - stats->db_ro_revokes = ctdb_db->statistics.db_ro_revokes; - for (i = 0; i < MAX_COUNT_BUCKETS; i++) { - stats->hop_count_bucket[i] = ctdb_db->statistics.hop_count_bucket[i]; - } - stats->num_hot_keys = MAX_HOT_KEYS; - - ptr = &stats->hot_keys[0]; - for (i = 0; i < MAX_HOT_KEYS; i++) { - *(uint32_t *)ptr = ctdb_db->statistics.hot_keys[i].count; - ptr += 4; - - *(uint32_t *)ptr = ctdb_db->statistics.hot_keys[i].key.dsize; - ptr += 4; - - memcpy(ptr, ctdb_db->statistics.hot_keys[i].key.dptr, ctdb_db->statistics.hot_keys[i].key.dsize); - ptr += ctdb_db->statistics.hot_keys[i].key.dsize; - } - - outdata->dptr = (uint8_t *)stats; - outdata->dsize = len; - - return 0; -} |
