summaryrefslogtreecommitdiffstats
path: root/ctdb
diff options
context:
space:
mode:
authorAmitay Isaacs <amitay@gmail.com>2013-07-15 14:52:07 +1000
committerAmitay Isaacs <amitay@gmail.com>2013-07-29 16:00:46 +1000
commit854216236b398ba85cdd7b555f5ecd1b9cfdf87f (patch)
tree34c00beaf49158d566e4b77a1bf4dbd8bf7007eb /ctdb
parente14fa509416a5ea86d2309b1b64315c483ecf17a (diff)
downloadsamba-854216236b398ba85cdd7b555f5ecd1b9cfdf87f.tar.gz
samba-854216236b398ba85cdd7b555f5ecd1b9cfdf87f.tar.xz
samba-854216236b398ba85cdd7b555f5ecd1b9cfdf87f.zip
Revert "ctdbd: Remove incomplete ctdb_db_statistics_wire structure"
The structure cannot be removed without adding support for marshalling keys for hot records. This reverts commit 26a4653df594d351ca0dc1bd5f5b2f5b0eb0a9a5. Signed-off-by: Amitay Isaacs <amitay@gmail.com> (This used to be ctdb commit 023ca2e84f5ed064a288526b9c2bc7e06674dd81)
Diffstat (limited to 'ctdb')
-rw-r--r--ctdb/include/ctdb_private.h4
-rw-r--r--ctdb/include/ctdb_protocol.h7
-rw-r--r--ctdb/libctdb/control.c33
-rw-r--r--ctdb/server/ctdb_control.c15
-rw-r--r--ctdb/server/ctdb_ltdb_server.c52
5 files changed, 95 insertions, 16 deletions
diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h
index cbaff97d919..9c78440c2a7 100644
--- a/ctdb/include/ctdb_private.h
+++ b/ctdb/include/ctdb_private.h
@@ -1561,6 +1561,10 @@ 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 9e95f4db6ae..10f643bb7ff 100644
--- a/ctdb/include/ctdb_protocol.h
+++ b/ctdb/include/ctdb_protocol.h
@@ -733,6 +733,13 @@ 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 2a7db95787a..64cc80e3643 100644
--- a/ctdb/libctdb/control.c
+++ b/ctdb/libctdb/control.c
@@ -124,6 +124,10 @@ 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) {
@@ -133,16 +137,37 @@ 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, hot_keys)) {
+ if (reply->datalen < offsetof(struct ctdb_db_statistics_wire, 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;
}
- *stat = malloc(reply->datalen);
- if (*stat == NULL) {
+ 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) {
return false;
}
- memcpy(*stat, reply->data, reply->datalen);
+ 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;
return true;
}
diff --git a/ctdb/server/ctdb_control.c b/ctdb/server/ctdb_control.c
index 690608eef6b..a8771f31766 100644
--- a/ctdb/server/ctdb_control.c
+++ b/ctdb/server/ctdb_control.c
@@ -651,18 +651,9 @@ 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: {
- 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_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_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 57e0d68b71d..6ad1ff5de11 100644
--- a/ctdb/server/ctdb_ltdb_server.c
+++ b/ctdb/server/ctdb_ltdb_server.c
@@ -1502,3 +1502,55 @@ 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;
+}