struct ctdb_dbid dbs[1];
};
-struct ctdb_client_id_list_old {
- uint32_t num;
- struct ctdb_client_id server_ids[1];
-};
-
/* the list of tcp tickles used by get/set tcp tickle list */
struct ctdb_tickle_list_old {
ctdb_sock_addr addr;
CTDB_CONTROL_KILL_TCP = 54, /* obsolete */
CTDB_CONTROL_GET_TCP_TICKLE_LIST = 55,
CTDB_CONTROL_SET_TCP_TICKLE_LIST = 56,
- CTDB_CONTROL_REGISTER_SERVER_ID = 57,
- CTDB_CONTROL_UNREGISTER_SERVER_ID = 58,
- CTDB_CONTROL_CHECK_SERVER_ID = 59,
- CTDB_CONTROL_GET_SERVER_ID_LIST = 60,
+ CTDB_CONTROL_REGISTER_SERVER_ID = 57, /* obsolete */
+ CTDB_CONTROL_UNREGISTER_SERVER_ID = 58, /* obsolete */
+ CTDB_CONTROL_CHECK_SERVER_ID = 59, /* obsolete */
+ CTDB_CONTROL_GET_SERVER_ID_LIST = 60, /* obsolete */
CTDB_CONTROL_DB_ATTACH_PERSISTENT = 61,
CTDB_CONTROL_PERSISTENT_STORE = 62, /* obsolete */
CTDB_CONTROL_UPDATE_RECORD = 63,
struct ctdb_connection *conn;
};
-enum ctdb_client_type {
- SERVER_TYPE_CTDB = 0,
- SERVER_TYPE_SAMBA = 1,
- SERVER_TYPE_NFSD = 2,
- SERVER_TYPE_ISCSID = 3
-};
-
-struct ctdb_client_id {
- enum ctdb_client_type type;
- uint32_t pnn;
- uint32_t server_id;
-};
-
-struct ctdb_client_id_list {
- uint32_t num;
- struct ctdb_client_id *cid;
-};
-
-struct ctdb_client_id_map {
- int count;
- struct ctdb_client_id_list *list;
-};
-
struct ctdb_addr_info {
ctdb_sock_addr addr;
uint32_t mask;
struct ctdb_tickle_list *tickles);
int ctdb_reply_control_set_tcp_tickle_list(struct ctdb_reply_control *reply);
-void ctdb_req_control_register_server_id(struct ctdb_req_control *request,
- struct ctdb_client_id *sid);
-int ctdb_reply_control_register_server_id(struct ctdb_reply_control *reply);
-
-void ctdb_req_control_unregister_server_id(struct ctdb_req_control *request,
- struct ctdb_client_id *sid);
-int ctdb_reply_control_unregister_server_id(struct ctdb_reply_control *reply);
-
-void ctdb_req_control_check_server_id(struct ctdb_req_control *request,
- struct ctdb_client_id *sid);
-int ctdb_reply_control_check_server_id(struct ctdb_reply_control *reply);
-
-void ctdb_req_control_get_server_id_list(struct ctdb_req_control *request);
-int ctdb_reply_control_get_server_id_list(struct ctdb_reply_control *reply,
- TALLOC_CTX *mem_ctx,
- struct ctdb_client_id_map **cid_map);
-
void ctdb_req_control_db_attach_persistent(struct ctdb_req_control *request,
const char *name,
uint32_t tdb_flags);
return ctdb_reply_control_generic(reply);
}
-/* CTDB_CONTROL_REGISTER_SERVER_ID */
-
-void ctdb_req_control_register_server_id(struct ctdb_req_control *request,
- struct ctdb_client_id *cid)
-{
- request->opcode = CTDB_CONTROL_REGISTER_SERVER_ID;
- request->pad = 0;
- request->srvid = 0;
- request->client_id = 0;
- request->flags = 0;
-
- request->rdata.opcode = CTDB_CONTROL_REGISTER_SERVER_ID;
- request->rdata.data.cid = cid;
-}
-
-int ctdb_reply_control_register_server_id(struct ctdb_reply_control *reply)
-{
- return ctdb_reply_control_generic(reply);
-}
-
-/* CTDB_CONTROL_UNREGISTER_SERVER_ID */
-
-void ctdb_req_control_unregister_server_id(struct ctdb_req_control *request,
- struct ctdb_client_id *cid)
-{
- request->opcode = CTDB_CONTROL_UNREGISTER_SERVER_ID;
- request->pad = 0;
- request->srvid = 0;
- request->client_id = 0;
- request->flags = 0;
-
- request->rdata.opcode = CTDB_CONTROL_UNREGISTER_SERVER_ID;
- request->rdata.data.cid = cid;
-}
-
-int ctdb_reply_control_unregister_server_id(struct ctdb_reply_control *reply)
-{
- return ctdb_reply_control_generic(reply);
-}
-
-/* CTDB_CONTROL_CHECK_SERVER_ID */
-
-void ctdb_req_control_check_server_id(struct ctdb_req_control *request,
- struct ctdb_client_id *cid)
-{
- request->opcode = CTDB_CONTROL_CHECK_SERVER_ID;
- request->pad = 0;
- request->srvid = 0;
- request->client_id = 0;
- request->flags = 0;
-
- request->rdata.opcode = CTDB_CONTROL_CHECK_SERVER_ID;
- request->rdata.data.cid = cid;
-}
-
-int ctdb_reply_control_check_server_id(struct ctdb_reply_control *reply)
-{
- return reply->status;
-}
-
-/* CTDB_CONTROL_GET_SERVER_ID_LIST */
-
-void ctdb_req_control_get_server_id_list(struct ctdb_req_control *request)
-{
- request->opcode = CTDB_CONTROL_GET_SERVER_ID_LIST;
- request->pad = 0;
- request->srvid = 0;
- request->client_id = 0;
- request->flags = 0;
-
- request->rdata.opcode = CTDB_CONTROL_GET_SERVER_ID_LIST;
-}
-
-int ctdb_reply_control_get_server_id_list(struct ctdb_reply_control *reply,
- TALLOC_CTX *mem_ctx,
- struct ctdb_client_id_map **cid_map)
-{
- if (reply->status == 0 &&
- reply->rdata.opcode == CTDB_CONTROL_GET_SERVER_ID_LIST) {
- *cid_map = talloc_steal(mem_ctx, reply->rdata.data.cid_map);
- }
- return reply->status;
-}
-
/* CTDB_CONTROL_DB_ATTACH_PERSISTENT */
void ctdb_req_control_db_attach_persistent(struct ctdb_req_control *request,
len = ctdb_tickle_list_len(cd->data.tickles);
break;
- case CTDB_CONTROL_REGISTER_SERVER_ID:
- len = ctdb_client_id_len(cd->data.cid);
- break;
-
- case CTDB_CONTROL_UNREGISTER_SERVER_ID:
- len = ctdb_client_id_len(cd->data.cid);
- break;
-
- case CTDB_CONTROL_CHECK_SERVER_ID:
- len = ctdb_client_id_len(cd->data.cid);
- break;
-
- case CTDB_CONTROL_GET_SERVER_ID_LIST:
- break;
-
case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
len = ctdb_string_len(cd->data.db_name);
break;
ctdb_tickle_list_push(cd->data.tickles, buf);
break;
- case CTDB_CONTROL_REGISTER_SERVER_ID:
- ctdb_client_id_push(cd->data.cid, buf);
- break;
-
- case CTDB_CONTROL_UNREGISTER_SERVER_ID:
- ctdb_client_id_push(cd->data.cid, buf);
- break;
-
- case CTDB_CONTROL_CHECK_SERVER_ID:
- ctdb_client_id_push(cd->data.cid, buf);
- break;
-
case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
ctdb_string_push(cd->data.db_name, buf);
break;
&cd->data.tickles);
break;
- case CTDB_CONTROL_REGISTER_SERVER_ID:
- ret = ctdb_client_id_pull(buf, buflen, mem_ctx,
- &cd->data.cid);
- break;
-
- case CTDB_CONTROL_UNREGISTER_SERVER_ID:
- ret = ctdb_client_id_pull(buf, buflen, mem_ctx,
- &cd->data.cid);
- break;
-
- case CTDB_CONTROL_CHECK_SERVER_ID:
- ret = ctdb_client_id_pull(buf, buflen, mem_ctx,
- &cd->data.cid);
- break;
-
case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
ret = ctdb_string_pull(buf, buflen, mem_ctx,
&cd->data.db_name);
case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
break;
- case CTDB_CONTROL_REGISTER_SERVER_ID:
- break;
-
- case CTDB_CONTROL_UNREGISTER_SERVER_ID:
- break;
-
- case CTDB_CONTROL_CHECK_SERVER_ID:
- break;
-
- case CTDB_CONTROL_GET_SERVER_ID_LIST:
- len = ctdb_client_id_map_len(cd->data.cid_map);
- break;
-
case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
len = ctdb_uint32_len(cd->data.db_id);
break;
ctdb_tickle_list_push(cd->data.tickles, buf);
break;
- case CTDB_CONTROL_GET_SERVER_ID_LIST:
- ctdb_client_id_map_push(cd->data.cid_map, buf);
- break;
-
case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
ctdb_uint32_push(cd->data.db_id, buf);
break;
&cd->data.tickles);
break;
- case CTDB_CONTROL_GET_SERVER_ID_LIST:
- ret = ctdb_client_id_map_pull(buf, buflen, mem_ctx,
- &cd->data.cid_map);
- break;
-
case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
ret = ctdb_uint32_pull(buf, buflen, mem_ctx,
&cd->data.db_id);
int ctdb_tickle_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
struct ctdb_tickle_list **out);
-size_t ctdb_client_id_len(struct ctdb_client_id *cid);
-void ctdb_client_id_push(struct ctdb_client_id *cid, uint8_t *buf);
-int ctdb_client_id_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
- struct ctdb_client_id **out);
-
-size_t ctdb_client_id_list_len(struct ctdb_client_id_list *cid_list);
-void ctdb_client_id_list_push(struct ctdb_client_id_list *cid_list,
- uint8_t *buf);
-int ctdb_client_id_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
- struct ctdb_client_id_list **out);
-
-size_t ctdb_client_id_map_len(struct ctdb_client_id_map *cid_map);
-void ctdb_client_id_map_push(struct ctdb_client_id_map *cid_map, uint8_t *buf);
-int ctdb_client_id_map_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
- struct ctdb_client_id_map **out);
-
size_t ctdb_addr_info_len(struct ctdb_addr_info *addr_info);
void ctdb_addr_info_push(struct ctdb_addr_info *addr_info, uint8_t *buf);
int ctdb_addr_info_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
return 0;
}
-size_t ctdb_client_id_len(struct ctdb_client_id *cid)
-{
- return sizeof(struct ctdb_client_id);
-}
-
-void ctdb_client_id_push(struct ctdb_client_id *cid, uint8_t *buf)
-{
- memcpy(buf, cid, sizeof(struct ctdb_client_id));
-}
-
-static int ctdb_client_id_pull_elems(uint8_t *buf, size_t buflen,
- TALLOC_CTX *mem_ctx,
- struct ctdb_client_id *out)
-{
- if (buflen < sizeof(struct ctdb_client_id)) {
- return EMSGSIZE;
- }
-
- memcpy(out, buf, sizeof(struct ctdb_client_id));
-
- return 0;
-}
-
-int ctdb_client_id_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
- struct ctdb_client_id **out)
-{
- struct ctdb_client_id *cid;
- int ret;
-
- cid = talloc(mem_ctx, struct ctdb_client_id);
- if (cid == NULL) {
- return ENOMEM;
- }
-
- ret = ctdb_client_id_pull_elems(buf, buflen, cid, cid);
- if (ret != 0) {
- TALLOC_FREE(cid);
- }
-
- *out = cid;
- return ret;
-}
-
-struct ctdb_client_id_list_wire {
- uint32_t num;
- struct ctdb_client_id cid[1];
-};
-
-size_t ctdb_client_id_list_len(struct ctdb_client_id_list *cid_list)
-{
- return sizeof(uint32_t) +
- cid_list->num * sizeof(struct ctdb_client_id);
-}
-
-void ctdb_client_id_list_push(struct ctdb_client_id_list *cid_list,
- uint8_t *buf)
-{
- struct ctdb_client_id_list_wire *wire =
- (struct ctdb_client_id_list_wire *)buf;
- size_t offset;
- int i;
-
- wire->num = cid_list->num;
-
- offset = offsetof(struct ctdb_client_id_list_wire, cid);
- for (i=0; i<cid_list->num; i++) {
- ctdb_client_id_push(&cid_list->cid[i], &buf[offset]);
- offset += ctdb_client_id_len(&cid_list->cid[i]);
- }
-}
-
-static int ctdb_client_id_list_pull_elems(uint8_t *buf, size_t buflen,
- TALLOC_CTX *mem_ctx,
- struct ctdb_client_id_list *out)
-{
- struct ctdb_client_id_list_wire *wire =
- (struct ctdb_client_id_list_wire *)buf;
- size_t offset;
- int i;
-
- if (buflen < sizeof(uint32_t)) {
- return EMSGSIZE;
- }
- if (buflen < sizeof(uint32_t) +
- wire->num * sizeof(struct ctdb_client_id)) {
- return EMSGSIZE;
- }
-
- out->num = wire->num;
- out->cid = talloc_array(mem_ctx, struct ctdb_client_id,
- wire->num);
- if (out->cid == NULL) {
- return ENOMEM;
- }
-
- offset = offsetof(struct ctdb_client_id_list_wire, cid);
- for (i=0; i<wire->num; i++) {
- bool ret;
- ret = ctdb_client_id_pull_elems(&buf[offset], buflen-offset,
- out->cid, &out->cid[i]);
- if (ret != 0) {
- return ret;
- }
- offset += ctdb_client_id_len(&out->cid[i]);
- }
-
- return 0;
-}
-
-int ctdb_client_id_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
- struct ctdb_client_id_list **out)
-{
- struct ctdb_client_id_list *cid_list;
- int ret;
-
- cid_list = talloc(mem_ctx, struct ctdb_client_id_list);
- if (cid_list == NULL) {
- return ENOMEM;
- }
-
- ret = ctdb_client_id_list_pull_elems(buf, buflen, cid_list, cid_list);
- if (ret != 0) {
- TALLOC_FREE(cid_list);
- }
-
- *out = cid_list;
- return ret;
-}
-
-struct ctdb_client_id_map_wire {
- int count;
- struct ctdb_client_id_list list[1];
-};
-
-size_t ctdb_client_id_map_len(struct ctdb_client_id_map *cid_map)
-{
- int i;
- size_t len;
-
- len = sizeof(int);
- for (i=0; i<cid_map->count; i++) {
- len += ctdb_client_id_list_len(&cid_map->list[i]);
- }
- return len;
-}
-
-void ctdb_client_id_map_push(struct ctdb_client_id_map *cid_map, uint8_t *buf)
-{
- struct ctdb_client_id_map_wire *wire =
- (struct ctdb_client_id_map_wire *)buf;
- size_t offset;
- int i;
-
- wire->count = cid_map->count;
-
- offset = sizeof(int);
- for (i=0; i<cid_map->count; i++) {
- ctdb_client_id_list_push(&cid_map->list[i], &buf[offset]);
- offset += ctdb_client_id_list_len(&cid_map->list[i]);
- }
-}
-
-int ctdb_client_id_map_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
- struct ctdb_client_id_map **out)
-{
- struct ctdb_client_id_map *cid_map;
- struct ctdb_client_id_map_wire *wire =
- (struct ctdb_client_id_map_wire *)buf;
- size_t offset;
- int i;
- bool ret;
-
- if (buflen < sizeof(int)) {
- return EMSGSIZE;
- }
- if (buflen < sizeof(int) +
- wire->count * sizeof(struct ctdb_client_id_list)) {
- return EMSGSIZE;
- }
-
- cid_map = talloc(mem_ctx, struct ctdb_client_id_map);
- if (cid_map == NULL) {
- return ENOMEM;
- }
-
- cid_map->count = wire->count;
- cid_map->list = talloc_array(cid_map, struct ctdb_client_id_list,
- wire->count);
- if (cid_map->list == NULL) {
- return ENOMEM;
- }
-
- offset = sizeof(int);
- for (i=0; i<wire->count; i++) {
- ret = ctdb_client_id_list_pull_elems(&buf[offset],
- buflen-offset,
- cid_map->list,
- &cid_map->list[i]);
- if (ret != 0) {
- talloc_free(cid_map);
- return ret;
- }
- offset += ctdb_client_id_list_len(&cid_map->list[i]);
- }
-
- *out = cid_map;
- return 0;
-}
-
struct ctdb_addr_info_wire {
ctdb_sock_addr addr;
uint32_t mask;
fill_ctdb_tickle_list(mem_ctx, cd->data.tickles);
break;
- case CTDB_CONTROL_REGISTER_SERVER_ID:
- cd->data.cid = talloc(mem_ctx, struct ctdb_client_id);
- assert(cd->data.cid != NULL);
- fill_ctdb_client_id(mem_ctx, cd->data.cid);
- break;
-
- case CTDB_CONTROL_UNREGISTER_SERVER_ID:
- cd->data.cid = talloc(mem_ctx, struct ctdb_client_id);
- assert(cd->data.cid != NULL);
- fill_ctdb_client_id(mem_ctx, cd->data.cid);
- break;
-
- case CTDB_CONTROL_CHECK_SERVER_ID:
- cd->data.cid = talloc(mem_ctx, struct ctdb_client_id);
- assert(cd->data.cid != NULL);
- fill_ctdb_client_id(mem_ctx, cd->data.cid);
- break;
-
- case CTDB_CONTROL_GET_SERVER_ID_LIST:
- break;
-
case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
fill_ctdb_string(mem_ctx, &cd->data.db_name);
assert(cd->data.db_name != NULL);
verify_ctdb_tickle_list(cd->data.tickles, cd2->data.tickles);
break;
- case CTDB_CONTROL_REGISTER_SERVER_ID:
- verify_ctdb_client_id(cd->data.cid, cd2->data.cid);
- break;
-
- case CTDB_CONTROL_UNREGISTER_SERVER_ID:
- verify_ctdb_client_id(cd->data.cid, cd2->data.cid);
- break;
-
- case CTDB_CONTROL_CHECK_SERVER_ID:
- verify_ctdb_client_id(cd->data.cid, cd2->data.cid);
- break;
-
- case CTDB_CONTROL_GET_SERVER_ID_LIST:
- break;
-
case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
verify_ctdb_string(cd->data.db_name, cd2->data.db_name);
break;
case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
break;
- case CTDB_CONTROL_REGISTER_SERVER_ID:
- break;
-
- case CTDB_CONTROL_UNREGISTER_SERVER_ID:
- break;
-
- case CTDB_CONTROL_CHECK_SERVER_ID:
- break;
-
- case CTDB_CONTROL_GET_SERVER_ID_LIST:
- cd->data.cid_map = talloc(mem_ctx, struct ctdb_client_id_map);
- assert(cd->data.cid_map != NULL);
- fill_ctdb_client_id_map(mem_ctx, cd->data.cid_map);
- break;
-
case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
break;
case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
break;
- case CTDB_CONTROL_REGISTER_SERVER_ID:
- break;
-
- case CTDB_CONTROL_UNREGISTER_SERVER_ID:
- break;
-
- case CTDB_CONTROL_CHECK_SERVER_ID:
- break;
-
- case CTDB_CONTROL_GET_SERVER_ID_LIST:
- verify_ctdb_client_id_map(cd->data.cid_map, cd2->data.cid_map);
- break;
-
case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
break;
}
}
-static void fill_ctdb_client_id(TALLOC_CTX *mem_ctx,
- struct ctdb_client_id *p)
-{
- p->type = rand8();
- p->pnn = rand32();
- p->server_id = rand32();
-}
-
-static void verify_ctdb_client_id(struct ctdb_client_id *p1,
- struct ctdb_client_id *p2)
-{
- assert(p1->type == p2->type);
- assert(p1->pnn == p2->pnn);
- assert(p1->server_id == p2->server_id);
-}
-
-static void fill_ctdb_client_id_list(TALLOC_CTX *mem_ctx,
- struct ctdb_client_id_list *p)
-{
- int i;
-
- p->num = rand_int(1000) + 1;
- p->cid = talloc_array(mem_ctx, struct ctdb_client_id, p->num);
- assert(p->cid != NULL);
- for (i=0; i<p->num; i++) {
- fill_ctdb_client_id(mem_ctx, &p->cid[i]);
- }
-}
-
-static void verify_ctdb_client_id_list(struct ctdb_client_id_list *p1,
- struct ctdb_client_id_list *p2)
-{
- int i;
-
- assert(p1->num == p2->num);
- for (i=0; i<p1->num; i++) {
- verify_ctdb_client_id(&p1->cid[i], &p2->cid[i]);
- }
-}
-
-static void fill_ctdb_client_id_map(TALLOC_CTX *mem_ctx,
- struct ctdb_client_id_map *p)
-{
- int i;
-
- p->count = rand_int(10) + 1;
- p->list = talloc_array(mem_ctx, struct ctdb_client_id_list, p->count);
- assert(p->list != NULL);
- for (i=0; i<p->count; i++) {
- fill_ctdb_client_id_list(mem_ctx, &p->list[i]);
- }
-}
-
-static void verify_ctdb_client_id_map(struct ctdb_client_id_map *p1,
- struct ctdb_client_id_map *p2)
-{
- int i;
-
- assert(p1->count == p2->count);
- for (i=0; i<p1->count; i++) {
- verify_ctdb_client_id_list(&p1->list[i], &p2->list[i]);
- }
-}
-
static void fill_ctdb_addr_info(TALLOC_CTX *mem_ctx, struct ctdb_addr_info *p)
{
fill_ctdb_sock_addr(mem_ctx, &p->addr);
DEFINE_TEST(struct ctdb_var_list, ctdb_var_list);
DEFINE_TEST(struct ctdb_tunable_list, ctdb_tunable_list);
DEFINE_TEST(struct ctdb_tickle_list, ctdb_tickle_list);
-DEFINE_TEST(struct ctdb_client_id, ctdb_client_id);
-DEFINE_TEST(struct ctdb_client_id_list, ctdb_client_id_list);
-DEFINE_TEST(struct ctdb_client_id_map, ctdb_client_id_map);
DEFINE_TEST(struct ctdb_addr_info, ctdb_addr_info);
DEFINE_TEST(struct ctdb_transdb, ctdb_transdb);
DEFINE_TEST(struct ctdb_uptime, ctdb_uptime);
TEST_FUNC(ctdb_var_list)();
TEST_FUNC(ctdb_tunable_list)();
TEST_FUNC(ctdb_tickle_list)();
- TEST_FUNC(ctdb_client_id)();
- TEST_FUNC(ctdb_client_id_list)();
- TEST_FUNC(ctdb_client_id_map)();
TEST_FUNC(ctdb_addr_info)();
TEST_FUNC(ctdb_transdb)();
TEST_FUNC(ctdb_uptime)();