CTDB_CONTROL_DB_TRANSACTION_START = 143,
CTDB_CONTROL_DB_TRANSACTION_COMMIT = 144,
CTDB_CONTROL_DB_TRANSACTION_CANCEL = 145,
+ CTDB_CONTROL_DB_PULL = 146,
+ CTDB_CONTROL_DB_PUSH_START = 147,
+ CTDB_CONTROL_DB_PUSH_CONFIRM = 148,
};
#define CTDB_MONITORING_ACTIVE 0
struct ctdb_vnn_map *vnnmap;
uint32_t loglevel;
struct ctdb_pulldb *pulldb;
+ struct ctdb_pulldb_ext *pulldb_ext;
struct ctdb_rec_buffer *recbuf;
uint32_t recmode;
const char *db_name;
struct ctdb_uint8_array *u8_array;
struct ctdb_db_statistics *dbstats;
enum ctdb_runstate runstate;
+ uint32_t num_records;
} data;
};
uint32_t db_id);
int ctdb_reply_control_db_transaction_cancel(struct ctdb_reply_control *reply);
+void ctdb_req_control_db_pull(struct ctdb_req_control *request,
+ struct ctdb_pulldb_ext *pulldb_ext);
+int ctdb_reply_control_db_pull(struct ctdb_reply_control *reply,
+ uint32_t *num_records);
+
+void ctdb_req_control_db_push_start(struct ctdb_req_control *request,
+ struct ctdb_pulldb_ext *pulldb_ext);
+int ctdb_reply_control_db_push_start(struct ctdb_reply_control *reply);
+
+void ctdb_req_control_db_push_confirm(struct ctdb_req_control *request,
+ uint32_t db_id);
+int ctdb_reply_control_db_push_confirm(struct ctdb_reply_control *reply,
+ uint32_t *num_records);
+
/* From protocol/protocol_debug.c */
void ctdb_packet_print(uint8_t *buf, size_t buflen, FILE *fp);
{
return ctdb_reply_control_generic(reply);
}
+
+/* CTDB_CONTROL_DB_PULL */
+
+void ctdb_req_control_db_pull(struct ctdb_req_control *request,
+ struct ctdb_pulldb_ext *pulldb_ext)
+{
+ request->opcode = CTDB_CONTROL_DB_PULL;
+ request->pad = 0;
+ request->srvid = 0;
+ request->client_id = 0;
+ request->flags = 0;
+
+ request->rdata.opcode = CTDB_CONTROL_DB_PULL;
+ request->rdata.data.pulldb_ext = pulldb_ext;
+}
+
+int ctdb_reply_control_db_pull(struct ctdb_reply_control *reply,
+ uint32_t *num_records)
+{
+ if (reply->status == 0 &&
+ reply->rdata.opcode == CTDB_CONTROL_DB_PULL) {
+ *num_records = reply->rdata.data.num_records;
+ }
+ return reply->status;
+}
+
+/* CTDB_CONTROL_DB_PUSH_START */
+
+void ctdb_req_control_db_push_start(struct ctdb_req_control *request,
+ struct ctdb_pulldb_ext *pulldb_ext)
+{
+ request->opcode = CTDB_CONTROL_DB_PUSH_START;
+ request->pad = 0;
+ request->srvid = 0;
+ request->client_id = 0;
+ request->flags = 0;
+
+ request->rdata.opcode = CTDB_CONTROL_DB_PUSH_START;
+ request->rdata.data.pulldb_ext = pulldb_ext;
+}
+
+int ctdb_reply_control_db_push_start(struct ctdb_reply_control *reply)
+{
+ return ctdb_reply_control_generic(reply);
+}
+
+/* CTDB_CONTROL_DB_PUSH_CONFIRM */
+
+void ctdb_req_control_db_push_confirm(struct ctdb_req_control *request,
+ uint32_t db_id)
+{
+ request->opcode = CTDB_CONTROL_DB_PUSH_CONFIRM;
+ request->pad = 0;
+ request->srvid = 0;
+ request->client_id = 0;
+ request->flags = 0;
+
+ request->rdata.opcode = CTDB_CONTROL_DB_PUSH_CONFIRM;
+ request->rdata.data.db_id = db_id;
+}
+
+int ctdb_reply_control_db_push_confirm(struct ctdb_reply_control *reply,
+ uint32_t *num_records)
+{
+ if (reply->status == 0 &&
+ reply->rdata.opcode == CTDB_CONTROL_DB_PUSH_CONFIRM) {
+ *num_records = reply->rdata.data.num_records;
+ }
+ return reply->status;
+}
case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
len = ctdb_uint32_len(cd->data.db_id);
break;
+
+ case CTDB_CONTROL_DB_PULL:
+ len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_START:
+ len = ctdb_pulldb_ext_len(cd->data.pulldb_ext);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_CONFIRM:
+ len = ctdb_uint32_len(cd->data.db_id);
+ break;
}
return len;
case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
ctdb_uint32_push(cd->data.db_id, buf);
break;
+
+ case CTDB_CONTROL_DB_PULL:
+ ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_START:
+ ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_CONFIRM:
+ ctdb_uint32_push(cd->data.db_id, buf);
+ break;
}
}
ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
&cd->data.db_id);
break;
+
+ case CTDB_CONTROL_DB_PULL:
+ ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
+ &cd->data.pulldb_ext);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_START:
+ ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
+ &cd->data.pulldb_ext);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_CONFIRM:
+ ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
+ &cd->data.db_id);
+ break;
}
return ret;
case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
break;
+
+ case CTDB_CONTROL_DB_PULL:
+ len = ctdb_uint32_len(cd->data.num_records);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_START:
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_CONFIRM:
+ len = ctdb_uint32_len(cd->data.num_records);
+ break;
}
return len;
case CTDB_CONTROL_GET_NODES_FILE:
ctdb_node_map_push(cd->data.nodemap, buf);
break;
+
+ case CTDB_CONTROL_DB_PULL:
+ ctdb_uint32_push(cd->data.num_records, buf);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_CONFIRM:
+ ctdb_uint32_push(cd->data.num_records, buf);
+ break;
}
}
ret = ctdb_node_map_pull(buf, buflen, mem_ctx,
&cd->data.nodemap);
break;
+
+ case CTDB_CONTROL_DB_PULL:
+ ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
+ &cd->data.num_records);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_CONFIRM:
+ ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
+ &cd->data.num_records);
+ break;
}
return ret;
{ CTDB_CONTROL_DB_TRANSACTION_START, "DB_TRANSACTION_START" },
{ CTDB_CONTROL_DB_TRANSACTION_COMMIT, "DB_TRANSACTION_COMMIT" },
{ CTDB_CONTROL_DB_TRANSACTION_CANCEL, "DB_TRANSACTION_CANCEL" },
+ { CTDB_CONTROL_DB_PULL, "DB_PULL" },
+ { CTDB_CONTROL_DB_PUSH_START, "DB_PUSH_START" },
+ { CTDB_CONTROL_DB_PUSH_CONFIRM, "DB_PUSH_CONFIRM" },
{ MAP_END, "" },
};
case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
cd->data.db_id = rand32();
break;
+
+ case CTDB_CONTROL_DB_PULL:
+ cd->data.pulldb_ext = talloc(mem_ctx, struct ctdb_pulldb_ext);
+ assert(cd->data.pulldb_ext != NULL);
+ fill_ctdb_pulldb_ext(mem_ctx, cd->data.pulldb_ext);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_START:
+ cd->data.pulldb_ext = talloc(mem_ctx, struct ctdb_pulldb_ext);
+ assert(cd->data.pulldb_ext != NULL);
+ fill_ctdb_pulldb_ext(mem_ctx, cd->data.pulldb_ext);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_CONFIRM:
+ cd->data.db_id = rand32();
+ break;
+
}
}
case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
assert(cd->data.db_id == cd2->data.db_id);
break;
+
+ case CTDB_CONTROL_DB_PULL:
+ verify_ctdb_pulldb_ext(cd->data.pulldb_ext,
+ cd2->data.pulldb_ext);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_START:
+ verify_ctdb_pulldb_ext(cd->data.pulldb_ext,
+ cd2->data.pulldb_ext);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_CONFIRM:
+ assert(cd->data.db_id == cd2->data.db_id);
+ break;
+
}
}
fill_ctdb_node_map(mem_ctx, cd->data.nodemap);
break;
+ case CTDB_CONTROL_DB_PULL:
+ cd->data.num_records = rand32();
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_CONFIRM:
+ cd->data.num_records = rand32();
+ break;
+
}
}
verify_ctdb_node_map(cd->data.nodemap, cd2->data.nodemap);
break;
+ case CTDB_CONTROL_DB_PULL:
+ assert(cd->data.num_records == cd2->data.num_records);
+ break;
+
+ case CTDB_CONTROL_DB_PUSH_CONFIRM:
+ assert(cd->data.num_records == cd2->data.num_records);
+ break;
+
}
}
assert(p1->lmaster == p2->lmaster);
}
+static void fill_ctdb_pulldb_ext(TALLOC_CTX *mem_ctx,
+ struct ctdb_pulldb_ext *p)
+{
+ p->db_id = rand32();
+ p->lmaster = rand32();
+ p->srvid = rand64();
+}
+
+static void verify_ctdb_pulldb_ext(struct ctdb_pulldb_ext *p1,
+ struct ctdb_pulldb_ext *p2)
+{
+ assert(p1->db_id == p2->db_id);
+ assert(p1->lmaster == p2->lmaster);
+ assert(p1->srvid == p2->srvid);
+}
+
static void fill_ctdb_ltdb_header(TALLOC_CTX *mem_ctx,
struct ctdb_ltdb_header *p)
{
DEFINE_TEST(struct ctdb_vnn_map, ctdb_vnn_map);
DEFINE_TEST(struct ctdb_dbid_map, ctdb_dbid_map);
DEFINE_TEST(struct ctdb_pulldb, ctdb_pulldb);
+DEFINE_TEST(struct ctdb_pulldb_ext, ctdb_pulldb_ext);
DEFINE_TEST(struct ctdb_rec_data, ctdb_rec_data);
DEFINE_TEST(struct ctdb_rec_buffer, ctdb_rec_buffer);
DEFINE_TEST(struct ctdb_traverse_start, ctdb_traverse_start);
TEST_FUNC(ctdb_vnn_map)();
TEST_FUNC(ctdb_dbid_map)();
TEST_FUNC(ctdb_pulldb)();
+ TEST_FUNC(ctdb_pulldb_ext)();
TEST_FUNC(ctdb_rec_data)();
TEST_FUNC(ctdb_rec_buffer)();
TEST_FUNC(ctdb_traverse_start)();