4 Copyright (C) Amitay Isaacs 2015
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, see <http://www.gnu.org/licenses/>.
21 #include "system/network.h"
27 #include "protocol_types_test.c"
30 #define GENERATION 0xabcdef12
31 #define OPERATION CTDB_REQ_KEEPALIVE
32 #define REQID 0x34567890
37 * Functions to fill and verify protocol structures
40 static void verify_ctdb_req_header(struct ctdb_req_header *h,
41 struct ctdb_req_header *h2)
43 verify_buffer(h, h2, ctdb_req_header_len(h));
46 static void fill_ctdb_req_call(TALLOC_CTX *mem_ctx,
47 struct ctdb_req_call *c)
52 c->hopcount = rand32();
53 fill_tdb_data(mem_ctx, &c->key);
54 fill_tdb_data(mem_ctx, &c->calldata);
57 static void verify_ctdb_req_call(struct ctdb_req_call *c,
58 struct ctdb_req_call *c2)
60 assert(c->flags == c2->flags);
61 assert(c->db_id == c2->db_id);
62 assert(c->callid == c2->callid);
63 assert(c->hopcount == c2->hopcount);
64 verify_tdb_data(&c->key, &c2->key);
65 verify_tdb_data(&c->calldata, &c2->calldata);
68 static void fill_ctdb_reply_call(TALLOC_CTX *mem_ctx,
69 struct ctdb_reply_call *c)
72 fill_tdb_data(mem_ctx, &c->data);
75 static void verify_ctdb_reply_call(struct ctdb_reply_call *c,
76 struct ctdb_reply_call *c2)
78 assert(c->status == c2->status);
79 verify_tdb_data(&c->data, &c2->data);
82 static void fill_ctdb_reply_error(TALLOC_CTX *mem_ctx,
83 struct ctdb_reply_error *c)
86 fill_tdb_data(mem_ctx, &c->msg);
89 static void verify_ctdb_reply_error(struct ctdb_reply_error *c,
90 struct ctdb_reply_error *c2)
92 assert(c->status == c2->status);
93 verify_tdb_data(&c->msg, &c2->msg);
96 static void fill_ctdb_req_dmaster(TALLOC_CTX *mem_ctx,
97 struct ctdb_req_dmaster *c)
101 c->dmaster = rand32();
102 fill_tdb_data(mem_ctx, &c->key);
103 fill_tdb_data(mem_ctx, &c->data);
106 static void verify_ctdb_req_dmaster(struct ctdb_req_dmaster *c,
107 struct ctdb_req_dmaster *c2)
109 assert(c->db_id == c2->db_id);
110 assert(c->rsn == c2->rsn);
111 assert(c->dmaster == c2->dmaster);
112 verify_tdb_data(&c->key, &c2->key);
113 verify_tdb_data(&c->data, &c2->data);
116 static void fill_ctdb_reply_dmaster(TALLOC_CTX *mem_ctx,
117 struct ctdb_reply_dmaster *c)
121 fill_tdb_data(mem_ctx, &c->key);
122 fill_tdb_data(mem_ctx, &c->data);
125 static void verify_ctdb_reply_dmaster(struct ctdb_reply_dmaster *c,
126 struct ctdb_reply_dmaster *c2)
128 assert(c->db_id == c2->db_id);
129 assert(c->rsn == c2->rsn);
130 verify_tdb_data(&c->key, &c2->key);
131 verify_tdb_data(&c->data, &c2->data);
134 static void fill_ctdb_req_control_data(TALLOC_CTX *mem_ctx,
135 struct ctdb_req_control_data *cd,
140 case CTDB_CONTROL_PROCESS_EXISTS:
141 cd->data.pid = rand32();
144 case CTDB_CONTROL_STATISTICS:
147 case CTDB_CONTROL_PING:
150 case CTDB_CONTROL_GETDBPATH:
151 cd->data.db_id = rand32();
154 case CTDB_CONTROL_GETVNNMAP:
157 case CTDB_CONTROL_SETVNNMAP:
158 cd->data.vnnmap = talloc(mem_ctx, struct ctdb_vnn_map);
159 assert(cd->data.vnnmap != NULL);
160 fill_ctdb_vnn_map(mem_ctx, cd->data.vnnmap);
163 case CTDB_CONTROL_GET_DEBUG:
166 case CTDB_CONTROL_SET_DEBUG:
167 cd->data.loglevel = rand_int(5);
170 case CTDB_CONTROL_GET_DBMAP:
173 case CTDB_CONTROL_PULL_DB:
174 cd->data.pulldb = talloc(mem_ctx, struct ctdb_pulldb);
175 assert(cd->data.pulldb != NULL);
176 fill_ctdb_pulldb(mem_ctx, cd->data.pulldb);
179 case CTDB_CONTROL_PUSH_DB:
180 cd->data.recbuf = talloc(mem_ctx, struct ctdb_rec_buffer);
181 assert(cd->data.recbuf != NULL);
182 fill_ctdb_rec_buffer(mem_ctx, cd->data.recbuf);
185 case CTDB_CONTROL_GET_RECMODE:
188 case CTDB_CONTROL_SET_RECMODE:
189 cd->data.recmode = rand_int(2);
192 case CTDB_CONTROL_STATISTICS_RESET:
195 case CTDB_CONTROL_DB_ATTACH:
196 fill_ctdb_string(mem_ctx, &cd->data.db_name);
197 assert(cd->data.db_name != NULL);
200 case CTDB_CONTROL_SET_CALL:
203 case CTDB_CONTROL_TRAVERSE_START:
204 cd->data.traverse_start = talloc(mem_ctx, struct ctdb_traverse_start);
205 assert(cd->data.traverse_start != NULL);
206 fill_ctdb_traverse_start(mem_ctx, cd->data.traverse_start);
209 case CTDB_CONTROL_TRAVERSE_ALL:
210 cd->data.traverse_all = talloc(mem_ctx, struct ctdb_traverse_all);
211 assert(cd->data.traverse_all != NULL);
212 fill_ctdb_traverse_all(mem_ctx, cd->data.traverse_all);
215 case CTDB_CONTROL_TRAVERSE_DATA:
216 cd->data.rec_data = talloc(mem_ctx, struct ctdb_rec_data);
217 assert(cd->data.rec_data != NULL);
218 fill_ctdb_rec_data(mem_ctx, cd->data.rec_data);
221 case CTDB_CONTROL_REGISTER_SRVID:
224 case CTDB_CONTROL_DEREGISTER_SRVID:
227 case CTDB_CONTROL_GET_DBNAME:
228 cd->data.db_id = rand32();
231 case CTDB_CONTROL_ENABLE_SEQNUM:
232 cd->data.db_id = rand32();
235 case CTDB_CONTROL_UPDATE_SEQNUM:
236 cd->data.db_id = rand32();
239 case CTDB_CONTROL_DUMP_MEMORY:
242 case CTDB_CONTROL_GET_PID:
245 case CTDB_CONTROL_GET_RECMASTER:
248 case CTDB_CONTROL_SET_RECMASTER:
249 cd->data.recmaster = rand_int(32);
252 case CTDB_CONTROL_FREEZE:
255 case CTDB_CONTROL_THAW:
258 case CTDB_CONTROL_GET_PNN:
261 case CTDB_CONTROL_SHUTDOWN:
264 case CTDB_CONTROL_GET_MONMODE:
267 case CTDB_CONTROL_TCP_CLIENT:
268 cd->data.conn = talloc(mem_ctx, struct ctdb_connection);
269 assert(cd->data.conn != NULL);
270 fill_ctdb_connection(mem_ctx, cd->data.conn);
273 case CTDB_CONTROL_TCP_ADD:
274 cd->data.conn = talloc(mem_ctx, struct ctdb_connection);
275 assert(cd->data.conn != NULL);
276 fill_ctdb_connection(mem_ctx, cd->data.conn);
279 case CTDB_CONTROL_TCP_REMOVE:
280 cd->data.conn = talloc(mem_ctx, struct ctdb_connection);
281 assert(cd->data.conn != NULL);
282 fill_ctdb_connection(mem_ctx, cd->data.conn);
285 case CTDB_CONTROL_STARTUP:
288 case CTDB_CONTROL_SET_TUNABLE:
289 cd->data.tunable = talloc(mem_ctx, struct ctdb_tunable);
290 assert(cd->data.tunable != NULL);
291 fill_ctdb_tunable(mem_ctx, cd->data.tunable);
294 case CTDB_CONTROL_GET_TUNABLE:
295 fill_ctdb_string(mem_ctx, &cd->data.tun_var);
296 assert(cd->data.tun_var != NULL);
299 case CTDB_CONTROL_LIST_TUNABLES:
302 case CTDB_CONTROL_MODIFY_FLAGS:
303 cd->data.flag_change = talloc(mem_ctx, struct ctdb_node_flag_change);
304 assert(cd->data.flag_change != NULL);
305 fill_ctdb_node_flag_change(mem_ctx, cd->data.flag_change);
308 case CTDB_CONTROL_GET_ALL_TUNABLES:
311 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
312 cd->data.addr = talloc(mem_ctx, ctdb_sock_addr);
313 assert(cd->data.addr != NULL);
314 fill_ctdb_sock_addr(mem_ctx, cd->data.addr);
317 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
318 cd->data.tickles = talloc(mem_ctx, struct ctdb_tickle_list);
319 assert(cd->data.tickles != NULL);
320 fill_ctdb_tickle_list(mem_ctx, cd->data.tickles);
323 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
324 fill_ctdb_string(mem_ctx, &cd->data.db_name);
325 assert(cd->data.db_name != NULL);
328 case CTDB_CONTROL_UPDATE_RECORD:
329 cd->data.recbuf = talloc(mem_ctx, struct ctdb_rec_buffer);
330 assert(cd->data.recbuf != NULL);
331 fill_ctdb_rec_buffer(mem_ctx, cd->data.recbuf);
334 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
335 cd->data.addr_info = talloc(mem_ctx, struct ctdb_addr_info);
336 assert(cd->data.addr_info != NULL);
337 fill_ctdb_addr_info(mem_ctx, cd->data.addr_info);
340 case CTDB_CONTROL_TRANSACTION_START:
341 cd->data.tid = rand32();
344 case CTDB_CONTROL_TRANSACTION_COMMIT:
345 cd->data.tid = rand32();
348 case CTDB_CONTROL_WIPE_DATABASE:
349 cd->data.transdb = talloc(mem_ctx, struct ctdb_transdb);
350 assert(cd->data.transdb != NULL);
351 fill_ctdb_transdb(mem_ctx, cd->data.transdb);
354 case CTDB_CONTROL_UPTIME:
357 case CTDB_CONTROL_START_RECOVERY:
360 case CTDB_CONTROL_END_RECOVERY:
363 case CTDB_CONTROL_RELOAD_NODES_FILE:
366 case CTDB_CONTROL_TRY_DELETE_RECORDS:
367 cd->data.recbuf = talloc(mem_ctx, struct ctdb_rec_buffer);
368 assert(cd->data.recbuf != NULL);
369 fill_ctdb_rec_buffer(mem_ctx, cd->data.recbuf);
372 case CTDB_CONTROL_ENABLE_MONITOR:
375 case CTDB_CONTROL_DISABLE_MONITOR:
378 case CTDB_CONTROL_ADD_PUBLIC_IP:
379 cd->data.addr_info = talloc(mem_ctx, struct ctdb_addr_info);
380 assert(cd->data.addr_info != NULL);
381 fill_ctdb_addr_info(mem_ctx, cd->data.addr_info);
384 case CTDB_CONTROL_DEL_PUBLIC_IP:
385 cd->data.addr_info = talloc(mem_ctx, struct ctdb_addr_info);
386 assert(cd->data.addr_info != NULL);
387 fill_ctdb_addr_info(mem_ctx, cd->data.addr_info);
390 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
391 fill_ctdb_string(mem_ctx, &cd->data.event_str);
392 assert(cd->data.event_str != NULL);
395 case CTDB_CONTROL_GET_CAPABILITIES:
398 case CTDB_CONTROL_START_PERSISTENT_UPDATE:
401 case CTDB_CONTROL_CANCEL_PERSISTENT_UPDATE:
404 case CTDB_CONTROL_RECD_PING:
407 case CTDB_CONTROL_RELEASE_IP:
408 cd->data.pubip = talloc(mem_ctx, struct ctdb_public_ip);
409 assert(cd->data.pubip != NULL);
410 fill_ctdb_public_ip(mem_ctx, cd->data.pubip);
413 case CTDB_CONTROL_TAKEOVER_IP:
414 cd->data.pubip = talloc(mem_ctx, struct ctdb_public_ip);
415 assert(cd->data.pubip != NULL);
416 fill_ctdb_public_ip(mem_ctx, cd->data.pubip);
419 case CTDB_CONTROL_GET_PUBLIC_IPS:
422 case CTDB_CONTROL_GET_NODEMAP:
425 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
426 cd->data.event = rand_int(CTDB_EVENT_MAX);
429 case CTDB_CONTROL_TRAVERSE_KILL:
430 cd->data.traverse_start = talloc(mem_ctx, struct ctdb_traverse_start);
431 assert(cd->data.traverse_start != NULL);
432 fill_ctdb_traverse_start(mem_ctx, cd->data.traverse_start);
435 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
436 cd->data.reclock_latency = rand_double();
439 case CTDB_CONTROL_GET_RECLOCK_FILE:
442 case CTDB_CONTROL_STOP_NODE:
445 case CTDB_CONTROL_CONTINUE_NODE:
448 case CTDB_CONTROL_SET_LMASTERROLE:
449 cd->data.role = rand_int(2);
452 case CTDB_CONTROL_SET_RECMASTERROLE:
453 cd->data.role = rand_int(2);
456 case CTDB_CONTROL_ENABLE_SCRIPT:
457 fill_ctdb_string(mem_ctx, &cd->data.script);
458 assert(cd->data.script != NULL);
461 case CTDB_CONTROL_DISABLE_SCRIPT:
462 fill_ctdb_string(mem_ctx, &cd->data.script);
463 assert(cd->data.script != NULL);
466 case CTDB_CONTROL_SET_BAN_STATE:
467 cd->data.ban_state = talloc(mem_ctx, struct ctdb_ban_state);
468 assert(cd->data.ban_state != NULL);
469 fill_ctdb_ban_state(mem_ctx, cd->data.ban_state);
472 case CTDB_CONTROL_GET_BAN_STATE:
475 case CTDB_CONTROL_SET_DB_PRIORITY:
476 cd->data.db_prio = talloc(mem_ctx, struct ctdb_db_priority);
477 assert(cd->data.db_prio != NULL);
478 fill_ctdb_db_priority(mem_ctx, cd->data.db_prio);
481 case CTDB_CONTROL_GET_DB_PRIORITY:
482 cd->data.db_prio = talloc(mem_ctx, struct ctdb_db_priority);
483 assert(cd->data.db_prio != NULL);
484 fill_ctdb_db_priority(mem_ctx, cd->data.db_prio);
487 case CTDB_CONTROL_TRANSACTION_CANCEL:
490 case CTDB_CONTROL_REGISTER_NOTIFY:
491 cd->data.notify = talloc(mem_ctx, struct ctdb_notify_data);
492 assert(cd->data.notify != NULL);
493 fill_ctdb_notify_data(mem_ctx, cd->data.notify);
496 case CTDB_CONTROL_DEREGISTER_NOTIFY:
497 cd->data.srvid = rand64();
500 case CTDB_CONTROL_TRANS3_COMMIT:
501 cd->data.recbuf = talloc(mem_ctx, struct ctdb_rec_buffer);
502 assert(cd->data.recbuf != NULL);
503 fill_ctdb_rec_buffer(mem_ctx, cd->data.recbuf);
506 case CTDB_CONTROL_GET_DB_SEQNUM:
507 cd->data.db_id = rand32();
510 case CTDB_CONTROL_DB_SET_HEALTHY:
511 cd->data.db_id = rand32();
514 case CTDB_CONTROL_DB_GET_HEALTH:
515 cd->data.db_id = rand32();
518 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
519 cd->data.addr = talloc(mem_ctx, ctdb_sock_addr);
520 assert(cd->data.addr != NULL);
521 fill_ctdb_sock_addr(mem_ctx, cd->data.addr);
524 case CTDB_CONTROL_GET_IFACES:
527 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
528 cd->data.iface = talloc(mem_ctx, struct ctdb_iface);
529 assert(cd->data.iface != NULL);
530 fill_ctdb_iface(mem_ctx, cd->data.iface);
533 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
534 cd->data.conn = talloc(mem_ctx, struct ctdb_connection);
535 assert(cd->data.conn != NULL);
536 fill_ctdb_connection(mem_ctx, cd->data.conn);
539 case CTDB_CONTROL_GET_STAT_HISTORY:
542 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
543 cd->data.key = talloc(mem_ctx, struct ctdb_key_data);
544 assert(cd->data.key != NULL);
545 fill_ctdb_key_data(mem_ctx, cd->data.key);
548 case CTDB_CONTROL_SET_DB_READONLY:
549 cd->data.db_id = rand32();
552 case CTDB_CONTROL_CHECK_SRVIDS:
553 cd->data.u64_array = talloc(mem_ctx, struct ctdb_uint64_array);
554 assert(cd->data.u64_array != NULL);
555 fill_ctdb_uint64_array(mem_ctx, cd->data.u64_array);
558 case CTDB_CONTROL_TRAVERSE_START_EXT:
559 cd->data.traverse_start_ext = talloc(mem_ctx, struct ctdb_traverse_start_ext);
560 assert(cd->data.traverse_start_ext != NULL);
561 fill_ctdb_traverse_start_ext(mem_ctx, cd->data.traverse_start_ext);
564 case CTDB_CONTROL_GET_DB_STATISTICS:
565 cd->data.db_id = rand32();
568 case CTDB_CONTROL_SET_DB_STICKY:
569 cd->data.db_id = rand32();
572 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
575 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
576 cd->data.traverse_all_ext = talloc(mem_ctx, struct ctdb_traverse_all_ext);
577 assert(cd->data.traverse_all_ext != NULL);
578 fill_ctdb_traverse_all_ext(mem_ctx, cd->data.traverse_all_ext);
581 case CTDB_CONTROL_RECEIVE_RECORDS:
582 cd->data.recbuf = talloc(mem_ctx, struct ctdb_rec_buffer);
583 assert(cd->data.recbuf != NULL);
584 fill_ctdb_rec_buffer(mem_ctx, cd->data.recbuf);
587 case CTDB_CONTROL_IPREALLOCATED:
590 case CTDB_CONTROL_GET_RUNSTATE:
593 case CTDB_CONTROL_DB_DETACH:
594 cd->data.db_id = rand32();
597 case CTDB_CONTROL_GET_NODES_FILE:
600 case CTDB_CONTROL_DB_FREEZE:
601 cd->data.db_id = rand32();
604 case CTDB_CONTROL_DB_THAW:
605 cd->data.db_id = rand32();
608 case CTDB_CONTROL_DB_TRANSACTION_START:
609 cd->data.transdb = talloc(mem_ctx, struct ctdb_transdb);
610 assert(cd->data.transdb != NULL);
611 fill_ctdb_transdb(mem_ctx, cd->data.transdb);
614 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
615 cd->data.transdb = talloc(mem_ctx, struct ctdb_transdb);
616 assert(cd->data.transdb != NULL);
617 fill_ctdb_transdb(mem_ctx, cd->data.transdb);
620 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
621 cd->data.db_id = rand32();
624 case CTDB_CONTROL_DB_PULL:
625 cd->data.pulldb_ext = talloc(mem_ctx, struct ctdb_pulldb_ext);
626 assert(cd->data.pulldb_ext != NULL);
627 fill_ctdb_pulldb_ext(mem_ctx, cd->data.pulldb_ext);
630 case CTDB_CONTROL_DB_PUSH_START:
631 cd->data.pulldb_ext = talloc(mem_ctx, struct ctdb_pulldb_ext);
632 assert(cd->data.pulldb_ext != NULL);
633 fill_ctdb_pulldb_ext(mem_ctx, cd->data.pulldb_ext);
636 case CTDB_CONTROL_DB_PUSH_CONFIRM:
637 cd->data.db_id = rand32();
643 static void verify_ctdb_req_control_data(struct ctdb_req_control_data *cd,
644 struct ctdb_req_control_data *cd2)
646 assert(cd->opcode == cd2->opcode);
648 switch (cd->opcode) {
649 case CTDB_CONTROL_PROCESS_EXISTS:
650 assert(cd->data.pid == cd2->data.pid);
653 case CTDB_CONTROL_STATISTICS:
656 case CTDB_CONTROL_PING:
659 case CTDB_CONTROL_GETDBPATH:
660 assert(cd->data.db_id == cd2->data.db_id);
663 case CTDB_CONTROL_GETVNNMAP:
666 case CTDB_CONTROL_SETVNNMAP:
667 verify_ctdb_vnn_map(cd->data.vnnmap, cd2->data.vnnmap);
670 case CTDB_CONTROL_GET_DEBUG:
673 case CTDB_CONTROL_SET_DEBUG:
674 assert(cd->data.loglevel == cd2->data.loglevel);
677 case CTDB_CONTROL_GET_DBMAP:
680 case CTDB_CONTROL_PULL_DB:
681 verify_ctdb_pulldb(cd->data.pulldb, cd2->data.pulldb);
684 case CTDB_CONTROL_PUSH_DB:
685 verify_ctdb_rec_buffer(cd->data.recbuf, cd2->data.recbuf);
688 case CTDB_CONTROL_GET_RECMODE:
691 case CTDB_CONTROL_SET_RECMODE:
692 assert(cd->data.recmode == cd2->data.recmode);
695 case CTDB_CONTROL_STATISTICS_RESET:
698 case CTDB_CONTROL_DB_ATTACH:
699 verify_ctdb_string(cd->data.db_name, cd2->data.db_name);
702 case CTDB_CONTROL_SET_CALL:
705 case CTDB_CONTROL_TRAVERSE_START:
706 verify_ctdb_traverse_start(cd->data.traverse_start,
707 cd2->data.traverse_start);
710 case CTDB_CONTROL_TRAVERSE_ALL:
711 verify_ctdb_traverse_all(cd->data.traverse_all,
712 cd2->data.traverse_all);
715 case CTDB_CONTROL_TRAVERSE_DATA:
716 verify_ctdb_rec_data(cd->data.rec_data, cd2->data.rec_data);
719 case CTDB_CONTROL_REGISTER_SRVID:
722 case CTDB_CONTROL_DEREGISTER_SRVID:
725 case CTDB_CONTROL_GET_DBNAME:
726 assert(cd->data.db_id == cd2->data.db_id);
729 case CTDB_CONTROL_ENABLE_SEQNUM:
730 assert(cd->data.db_id == cd2->data.db_id);
733 case CTDB_CONTROL_UPDATE_SEQNUM:
734 assert(cd->data.db_id == cd2->data.db_id);
737 case CTDB_CONTROL_DUMP_MEMORY:
740 case CTDB_CONTROL_GET_PID:
743 case CTDB_CONTROL_GET_RECMASTER:
746 case CTDB_CONTROL_SET_RECMASTER:
747 assert(cd->data.recmaster == cd2->data.recmaster);
750 case CTDB_CONTROL_FREEZE:
753 case CTDB_CONTROL_THAW:
756 case CTDB_CONTROL_GET_PNN:
759 case CTDB_CONTROL_SHUTDOWN:
762 case CTDB_CONTROL_GET_MONMODE:
765 case CTDB_CONTROL_TCP_CLIENT:
766 verify_ctdb_connection(cd->data.conn, cd2->data.conn);
769 case CTDB_CONTROL_TCP_ADD:
770 verify_ctdb_connection(cd->data.conn, cd2->data.conn);
773 case CTDB_CONTROL_TCP_REMOVE:
774 verify_ctdb_connection(cd->data.conn, cd2->data.conn);
777 case CTDB_CONTROL_STARTUP:
780 case CTDB_CONTROL_SET_TUNABLE:
781 verify_ctdb_tunable(cd->data.tunable, cd2->data.tunable);
784 case CTDB_CONTROL_GET_TUNABLE:
785 verify_ctdb_string(cd->data.tun_var, cd2->data.tun_var);
788 case CTDB_CONTROL_LIST_TUNABLES:
791 case CTDB_CONTROL_MODIFY_FLAGS:
792 verify_ctdb_node_flag_change(cd->data.flag_change,
793 cd2->data.flag_change);
796 case CTDB_CONTROL_GET_ALL_TUNABLES:
799 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
800 verify_ctdb_sock_addr(cd->data.addr, cd2->data.addr);
803 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
804 verify_ctdb_tickle_list(cd->data.tickles, cd2->data.tickles);
807 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
808 verify_ctdb_string(cd->data.db_name, cd2->data.db_name);
811 case CTDB_CONTROL_UPDATE_RECORD:
812 verify_ctdb_rec_buffer(cd->data.recbuf, cd2->data.recbuf);
815 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
816 verify_ctdb_addr_info(cd->data.addr_info, cd2->data.addr_info);
819 case CTDB_CONTROL_TRANSACTION_START:
820 assert(cd->data.tid == cd2->data.tid);
823 case CTDB_CONTROL_TRANSACTION_COMMIT:
824 assert(cd->data.tid == cd2->data.tid);
827 case CTDB_CONTROL_WIPE_DATABASE:
828 verify_ctdb_transdb(cd->data.transdb, cd2->data.transdb);
831 case CTDB_CONTROL_UPTIME:
834 case CTDB_CONTROL_START_RECOVERY:
837 case CTDB_CONTROL_END_RECOVERY:
840 case CTDB_CONTROL_RELOAD_NODES_FILE:
843 case CTDB_CONTROL_TRY_DELETE_RECORDS:
844 verify_ctdb_rec_buffer(cd->data.recbuf, cd2->data.recbuf);
847 case CTDB_CONTROL_ENABLE_MONITOR:
850 case CTDB_CONTROL_DISABLE_MONITOR:
853 case CTDB_CONTROL_ADD_PUBLIC_IP:
854 verify_ctdb_addr_info(cd->data.addr_info, cd2->data.addr_info);
857 case CTDB_CONTROL_DEL_PUBLIC_IP:
858 verify_ctdb_addr_info(cd->data.addr_info, cd2->data.addr_info);
861 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
862 verify_ctdb_string(cd->data.event_str, cd2->data.event_str);
865 case CTDB_CONTROL_GET_CAPABILITIES:
868 case CTDB_CONTROL_START_PERSISTENT_UPDATE:
871 case CTDB_CONTROL_CANCEL_PERSISTENT_UPDATE:
874 case CTDB_CONTROL_RECD_PING:
877 case CTDB_CONTROL_RELEASE_IP:
878 verify_ctdb_public_ip(cd->data.pubip, cd2->data.pubip);
881 case CTDB_CONTROL_TAKEOVER_IP:
882 verify_ctdb_public_ip(cd->data.pubip, cd2->data.pubip);
885 case CTDB_CONTROL_GET_PUBLIC_IPS:
888 case CTDB_CONTROL_GET_NODEMAP:
891 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
892 assert(cd->data.event == cd2->data.event);
895 case CTDB_CONTROL_TRAVERSE_KILL:
896 verify_ctdb_traverse_start(cd->data.traverse_start,
897 cd2->data.traverse_start);
900 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
901 assert(cd->data.reclock_latency == cd2->data.reclock_latency);
904 case CTDB_CONTROL_GET_RECLOCK_FILE:
907 case CTDB_CONTROL_STOP_NODE:
910 case CTDB_CONTROL_CONTINUE_NODE:
913 case CTDB_CONTROL_SET_LMASTERROLE:
914 assert(cd->data.role == cd2->data.role);
917 case CTDB_CONTROL_SET_RECMASTERROLE:
918 assert(cd->data.role == cd2->data.role);
921 case CTDB_CONTROL_ENABLE_SCRIPT:
922 verify_ctdb_string(cd->data.script, cd2->data.script);
925 case CTDB_CONTROL_DISABLE_SCRIPT:
926 verify_ctdb_string(cd->data.script, cd2->data.script);
929 case CTDB_CONTROL_SET_BAN_STATE:
930 verify_ctdb_ban_state(cd->data.ban_state, cd2->data.ban_state);
933 case CTDB_CONTROL_GET_BAN_STATE:
936 case CTDB_CONTROL_SET_DB_PRIORITY:
937 verify_ctdb_db_priority(cd->data.db_prio, cd2->data.db_prio);
940 case CTDB_CONTROL_GET_DB_PRIORITY:
941 assert(cd->data.db_id == cd2->data.db_id);
944 case CTDB_CONTROL_TRANSACTION_CANCEL:
947 case CTDB_CONTROL_REGISTER_NOTIFY:
948 verify_ctdb_notify_data(cd->data.notify, cd2->data.notify);
951 case CTDB_CONTROL_DEREGISTER_NOTIFY:
952 assert(cd->data.srvid == cd2->data.srvid);
955 case CTDB_CONTROL_TRANS3_COMMIT:
956 verify_ctdb_rec_buffer(cd->data.recbuf, cd2->data.recbuf);
959 case CTDB_CONTROL_GET_DB_SEQNUM:
960 assert(cd->data.db_id == cd2->data.db_id);
963 case CTDB_CONTROL_DB_SET_HEALTHY:
964 assert(cd->data.db_id == cd2->data.db_id);
967 case CTDB_CONTROL_DB_GET_HEALTH:
968 assert(cd->data.db_id == cd2->data.db_id);
971 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
972 verify_ctdb_sock_addr(cd->data.addr, cd2->data.addr);
975 case CTDB_CONTROL_GET_IFACES:
978 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
979 verify_ctdb_iface(cd->data.iface, cd2->data.iface);
982 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
983 verify_ctdb_connection(cd->data.conn, cd2->data.conn);
986 case CTDB_CONTROL_GET_STAT_HISTORY:
989 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
990 verify_ctdb_key_data(cd->data.key, cd2->data.key);
993 case CTDB_CONTROL_SET_DB_READONLY:
994 assert(cd->data.db_id == cd2->data.db_id);
997 case CTDB_CONTROL_CHECK_SRVIDS:
998 verify_ctdb_uint64_array(cd->data.u64_array,
999 cd2->data.u64_array);
1002 case CTDB_CONTROL_TRAVERSE_START_EXT:
1003 verify_ctdb_traverse_start_ext(cd->data.traverse_start_ext,
1004 cd2->data.traverse_start_ext);
1007 case CTDB_CONTROL_GET_DB_STATISTICS:
1008 assert(cd->data.db_id == cd2->data.db_id);
1011 case CTDB_CONTROL_SET_DB_STICKY:
1012 assert(cd->data.db_id == cd2->data.db_id);
1015 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
1018 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1019 verify_ctdb_traverse_all_ext(cd->data.traverse_all_ext,
1020 cd2->data.traverse_all_ext);
1023 case CTDB_CONTROL_RECEIVE_RECORDS:
1024 verify_ctdb_rec_buffer(cd->data.recbuf, cd2->data.recbuf);
1027 case CTDB_CONTROL_IPREALLOCATED:
1030 case CTDB_CONTROL_GET_RUNSTATE:
1033 case CTDB_CONTROL_DB_DETACH:
1034 assert(cd->data.db_id == cd2->data.db_id);
1037 case CTDB_CONTROL_GET_NODES_FILE:
1040 case CTDB_CONTROL_DB_FREEZE:
1041 assert(cd->data.db_id == cd2->data.db_id);
1044 case CTDB_CONTROL_DB_THAW:
1045 assert(cd->data.db_id == cd2->data.db_id);
1048 case CTDB_CONTROL_DB_TRANSACTION_START:
1049 verify_ctdb_transdb(cd->data.transdb, cd2->data.transdb);
1052 case CTDB_CONTROL_DB_TRANSACTION_COMMIT:
1053 verify_ctdb_transdb(cd->data.transdb, cd2->data.transdb);
1056 case CTDB_CONTROL_DB_TRANSACTION_CANCEL:
1057 assert(cd->data.db_id == cd2->data.db_id);
1060 case CTDB_CONTROL_DB_PULL:
1061 verify_ctdb_pulldb_ext(cd->data.pulldb_ext,
1062 cd2->data.pulldb_ext);
1065 case CTDB_CONTROL_DB_PUSH_START:
1066 verify_ctdb_pulldb_ext(cd->data.pulldb_ext,
1067 cd2->data.pulldb_ext);
1070 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1071 assert(cd->data.db_id == cd2->data.db_id);
1077 static void fill_ctdb_req_control(TALLOC_CTX *mem_ctx,
1078 struct ctdb_req_control *c,
1083 c->srvid = rand64();
1084 c->client_id = rand32();
1085 c->flags = rand32();
1087 fill_ctdb_req_control_data(mem_ctx, &c->rdata, opcode);
1090 static void verify_ctdb_req_control(struct ctdb_req_control *c,
1091 struct ctdb_req_control *c2)
1093 assert(c->opcode == c2->opcode);
1094 assert(c->pad == c2->pad);
1095 assert(c->srvid == c2->srvid);
1096 assert(c->client_id == c2->client_id);
1097 assert(c->flags == c2->flags);
1099 verify_ctdb_req_control_data(&c->rdata, &c2->rdata);
1102 static void fill_ctdb_reply_control_data(TALLOC_CTX *mem_ctx,
1103 struct ctdb_reply_control_data *cd,
1106 cd->opcode = opcode;
1109 case CTDB_CONTROL_PROCESS_EXISTS:
1112 case CTDB_CONTROL_STATISTICS:
1113 cd->data.stats = talloc(mem_ctx, struct ctdb_statistics);
1114 assert(cd->data.stats != NULL);
1115 fill_ctdb_statistics(mem_ctx, cd->data.stats);
1118 case CTDB_CONTROL_PING:
1121 case CTDB_CONTROL_GETDBPATH:
1122 fill_ctdb_string(mem_ctx, &cd->data.db_path);
1123 assert(cd->data.db_path != NULL);
1126 case CTDB_CONTROL_GETVNNMAP:
1127 cd->data.vnnmap = talloc(mem_ctx, struct ctdb_vnn_map);
1128 assert(cd->data.vnnmap != NULL);
1129 fill_ctdb_vnn_map(mem_ctx, cd->data.vnnmap);
1132 case CTDB_CONTROL_SETVNNMAP:
1135 case CTDB_CONTROL_GET_DEBUG:
1136 cd->data.loglevel = rand_int(5);
1139 case CTDB_CONTROL_SET_DEBUG:
1142 case CTDB_CONTROL_GET_DBMAP:
1143 cd->data.dbmap = talloc(mem_ctx, struct ctdb_dbid_map);
1144 assert(cd->data.dbmap != NULL);
1145 fill_ctdb_dbid_map(mem_ctx, cd->data.dbmap);
1148 case CTDB_CONTROL_PULL_DB:
1149 cd->data.recbuf = talloc(mem_ctx, struct ctdb_rec_buffer);
1150 assert(cd->data.recbuf != NULL);
1151 fill_ctdb_rec_buffer(mem_ctx, cd->data.recbuf);
1154 case CTDB_CONTROL_PUSH_DB:
1157 case CTDB_CONTROL_GET_RECMODE:
1160 case CTDB_CONTROL_SET_RECMODE:
1163 case CTDB_CONTROL_STATISTICS_RESET:
1166 case CTDB_CONTROL_DB_ATTACH:
1167 cd->data.db_id = rand32();
1170 case CTDB_CONTROL_SET_CALL:
1173 case CTDB_CONTROL_TRAVERSE_START:
1176 case CTDB_CONTROL_TRAVERSE_ALL:
1179 case CTDB_CONTROL_TRAVERSE_DATA:
1182 case CTDB_CONTROL_REGISTER_SRVID:
1185 case CTDB_CONTROL_DEREGISTER_SRVID:
1188 case CTDB_CONTROL_GET_DBNAME:
1189 fill_ctdb_string(mem_ctx, &cd->data.db_name);
1190 assert(cd->data.db_name);
1193 case CTDB_CONTROL_ENABLE_SEQNUM:
1196 case CTDB_CONTROL_UPDATE_SEQNUM:
1199 case CTDB_CONTROL_DUMP_MEMORY:
1200 fill_ctdb_string(mem_ctx, &cd->data.mem_str);
1201 assert(cd->data.mem_str);
1204 case CTDB_CONTROL_GET_PID:
1207 case CTDB_CONTROL_GET_RECMASTER:
1210 case CTDB_CONTROL_SET_RECMASTER:
1213 case CTDB_CONTROL_FREEZE:
1216 case CTDB_CONTROL_THAW:
1219 case CTDB_CONTROL_GET_PNN:
1222 case CTDB_CONTROL_SHUTDOWN:
1225 case CTDB_CONTROL_GET_MONMODE:
1228 case CTDB_CONTROL_TCP_CLIENT:
1231 case CTDB_CONTROL_TCP_ADD:
1234 case CTDB_CONTROL_TCP_REMOVE:
1237 case CTDB_CONTROL_STARTUP:
1240 case CTDB_CONTROL_SET_TUNABLE:
1243 case CTDB_CONTROL_GET_TUNABLE:
1244 cd->data.tun_value = rand32();
1247 case CTDB_CONTROL_LIST_TUNABLES:
1248 cd->data.tun_var_list = talloc(mem_ctx, struct ctdb_var_list);
1249 assert(cd->data.tun_var_list != NULL);
1250 fill_ctdb_var_list(mem_ctx, cd->data.tun_var_list);
1253 case CTDB_CONTROL_MODIFY_FLAGS:
1256 case CTDB_CONTROL_GET_ALL_TUNABLES:
1257 cd->data.tun_list = talloc(mem_ctx, struct ctdb_tunable_list);
1258 assert(cd->data.tun_list != NULL);
1259 fill_ctdb_tunable_list(mem_ctx, cd->data.tun_list);
1262 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1263 cd->data.tickles = talloc(mem_ctx, struct ctdb_tickle_list);
1264 assert(cd->data.tickles != NULL);
1265 fill_ctdb_tickle_list(mem_ctx, cd->data.tickles);
1268 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
1271 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1274 case CTDB_CONTROL_UPDATE_RECORD:
1277 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
1280 case CTDB_CONTROL_TRANSACTION_START:
1283 case CTDB_CONTROL_TRANSACTION_COMMIT:
1286 case CTDB_CONTROL_WIPE_DATABASE:
1289 case CTDB_CONTROL_UPTIME:
1290 cd->data.uptime = talloc(mem_ctx, struct ctdb_uptime);
1291 assert(cd->data.uptime != NULL);
1292 fill_ctdb_uptime(mem_ctx, cd->data.uptime);
1295 case CTDB_CONTROL_START_RECOVERY:
1298 case CTDB_CONTROL_END_RECOVERY:
1301 case CTDB_CONTROL_RELOAD_NODES_FILE:
1304 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1305 cd->data.recbuf = talloc(mem_ctx, struct ctdb_rec_buffer);
1306 assert(cd->data.recbuf != NULL);
1307 fill_ctdb_rec_buffer(mem_ctx, cd->data.recbuf);
1310 case CTDB_CONTROL_ENABLE_MONITOR:
1313 case CTDB_CONTROL_DISABLE_MONITOR:
1316 case CTDB_CONTROL_ADD_PUBLIC_IP:
1319 case CTDB_CONTROL_DEL_PUBLIC_IP:
1322 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
1325 case CTDB_CONTROL_GET_CAPABILITIES:
1326 cd->data.caps = rand32();
1329 case CTDB_CONTROL_START_PERSISTENT_UPDATE:
1332 case CTDB_CONTROL_CANCEL_PERSISTENT_UPDATE:
1335 case CTDB_CONTROL_RECD_PING:
1338 case CTDB_CONTROL_RELEASE_IP:
1341 case CTDB_CONTROL_TAKEOVER_IP:
1344 case CTDB_CONTROL_GET_PUBLIC_IPS:
1345 cd->data.pubip_list = talloc(mem_ctx, struct ctdb_public_ip_list);
1346 assert(cd->data.pubip_list != NULL);
1347 fill_ctdb_public_ip_list(mem_ctx, cd->data.pubip_list);
1350 case CTDB_CONTROL_GET_NODEMAP:
1351 cd->data.nodemap = talloc(mem_ctx, struct ctdb_node_map);
1352 assert(cd->data.nodemap != NULL);
1353 fill_ctdb_node_map(mem_ctx, cd->data.nodemap);
1356 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
1357 cd->data.script_list = talloc(mem_ctx, struct ctdb_script_list);
1358 assert(cd->data.script_list != NULL);
1359 fill_ctdb_script_list(mem_ctx, cd->data.script_list);
1362 case CTDB_CONTROL_TRAVERSE_KILL:
1365 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
1368 case CTDB_CONTROL_GET_RECLOCK_FILE:
1369 fill_ctdb_string(mem_ctx, &cd->data.reclock_file);
1370 assert(cd->data.reclock_file != NULL);
1373 case CTDB_CONTROL_STOP_NODE:
1376 case CTDB_CONTROL_CONTINUE_NODE:
1379 case CTDB_CONTROL_SET_LMASTERROLE:
1382 case CTDB_CONTROL_SET_RECMASTERROLE:
1385 case CTDB_CONTROL_ENABLE_SCRIPT:
1388 case CTDB_CONTROL_DISABLE_SCRIPT:
1391 case CTDB_CONTROL_SET_BAN_STATE:
1394 case CTDB_CONTROL_GET_BAN_STATE:
1395 cd->data.ban_state = talloc(mem_ctx, struct ctdb_ban_state);
1396 assert(cd->data.ban_state != NULL);
1397 fill_ctdb_ban_state(mem_ctx, cd->data.ban_state);
1400 case CTDB_CONTROL_SET_DB_PRIORITY:
1403 case CTDB_CONTROL_GET_DB_PRIORITY:
1406 case CTDB_CONTROL_TRANSACTION_CANCEL:
1409 case CTDB_CONTROL_REGISTER_NOTIFY:
1412 case CTDB_CONTROL_DEREGISTER_NOTIFY:
1415 case CTDB_CONTROL_TRANS3_COMMIT:
1418 case CTDB_CONTROL_GET_DB_SEQNUM:
1419 cd->data.seqnum = rand64();
1422 case CTDB_CONTROL_DB_SET_HEALTHY:
1425 case CTDB_CONTROL_DB_GET_HEALTH:
1426 fill_ctdb_string(mem_ctx, &cd->data.reason);
1427 assert(cd->data.reason != NULL);
1430 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1431 cd->data.ipinfo = talloc(mem_ctx, struct ctdb_public_ip_info);
1432 assert(cd->data.ipinfo != NULL);
1433 fill_ctdb_public_ip_info(mem_ctx, cd->data.ipinfo);
1436 case CTDB_CONTROL_GET_IFACES:
1437 cd->data.iface_list = talloc(mem_ctx, struct ctdb_iface_list);
1438 assert(cd->data.iface_list != NULL);
1439 fill_ctdb_iface_list(mem_ctx, cd->data.iface_list);
1442 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
1445 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
1448 case CTDB_CONTROL_GET_STAT_HISTORY:
1449 cd->data.stats_list = talloc(mem_ctx, struct ctdb_statistics_list);
1450 assert(cd->data.stats_list != NULL);
1451 fill_ctdb_statistics_list(mem_ctx, cd->data.stats_list);
1454 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
1457 case CTDB_CONTROL_SET_DB_READONLY:
1460 case CTDB_CONTROL_CHECK_SRVIDS:
1461 cd->data.u8_array = talloc(mem_ctx, struct ctdb_uint8_array);
1462 assert(cd->data.u8_array != NULL);
1463 fill_ctdb_uint8_array(mem_ctx, cd->data.u8_array);
1466 case CTDB_CONTROL_TRAVERSE_START_EXT:
1469 case CTDB_CONTROL_GET_DB_STATISTICS:
1470 cd->data.dbstats = talloc(mem_ctx, struct ctdb_db_statistics);
1471 assert(cd->data.dbstats != NULL);
1472 fill_ctdb_db_statistics(mem_ctx, cd->data.dbstats);
1475 case CTDB_CONTROL_SET_DB_STICKY:
1478 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
1481 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1484 case CTDB_CONTROL_RECEIVE_RECORDS:
1485 cd->data.recbuf = talloc(mem_ctx, struct ctdb_rec_buffer);
1486 assert(cd->data.recbuf != NULL);
1487 fill_ctdb_rec_buffer(mem_ctx, cd->data.recbuf);
1490 case CTDB_CONTROL_IPREALLOCATED:
1493 case CTDB_CONTROL_GET_RUNSTATE:
1494 cd->data.runstate = rand32();
1497 case CTDB_CONTROL_DB_DETACH:
1500 case CTDB_CONTROL_GET_NODES_FILE:
1501 cd->data.nodemap = talloc(mem_ctx, struct ctdb_node_map);
1502 assert(cd->data.nodemap != NULL);
1503 fill_ctdb_node_map(mem_ctx, cd->data.nodemap);
1506 case CTDB_CONTROL_DB_PULL:
1507 cd->data.num_records = rand32();
1510 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1511 cd->data.num_records = rand32();
1517 static void verify_ctdb_reply_control_data(struct ctdb_reply_control_data *cd,
1518 struct ctdb_reply_control_data *cd2)
1520 assert(cd->opcode == cd2->opcode);
1522 switch (cd->opcode) {
1523 case CTDB_CONTROL_PROCESS_EXISTS:
1526 case CTDB_CONTROL_STATISTICS:
1527 verify_ctdb_statistics(cd->data.stats, cd2->data.stats);
1530 case CTDB_CONTROL_PING:
1533 case CTDB_CONTROL_GETDBPATH:
1534 verify_ctdb_string(cd->data.db_path, cd2->data.db_path);
1537 case CTDB_CONTROL_GETVNNMAP:
1538 verify_ctdb_vnn_map(cd->data.vnnmap, cd2->data.vnnmap);
1541 case CTDB_CONTROL_SETVNNMAP:
1544 case CTDB_CONTROL_GET_DEBUG:
1545 assert(cd->data.loglevel == cd2->data.loglevel);
1548 case CTDB_CONTROL_SET_DEBUG:
1551 case CTDB_CONTROL_GET_DBMAP:
1552 verify_ctdb_dbid_map(cd->data.dbmap, cd2->data.dbmap);
1555 case CTDB_CONTROL_PULL_DB:
1556 verify_ctdb_rec_buffer(cd->data.recbuf, cd2->data.recbuf);
1559 case CTDB_CONTROL_PUSH_DB:
1562 case CTDB_CONTROL_GET_RECMODE:
1565 case CTDB_CONTROL_SET_RECMODE:
1568 case CTDB_CONTROL_STATISTICS_RESET:
1571 case CTDB_CONTROL_DB_ATTACH:
1572 assert(cd->data.db_id == cd2->data.db_id);
1575 case CTDB_CONTROL_SET_CALL:
1578 case CTDB_CONTROL_TRAVERSE_START:
1581 case CTDB_CONTROL_TRAVERSE_ALL:
1584 case CTDB_CONTROL_TRAVERSE_DATA:
1587 case CTDB_CONTROL_REGISTER_SRVID:
1590 case CTDB_CONTROL_DEREGISTER_SRVID:
1593 case CTDB_CONTROL_GET_DBNAME:
1594 verify_ctdb_string(cd->data.db_name, cd2->data.db_name);
1597 case CTDB_CONTROL_ENABLE_SEQNUM:
1600 case CTDB_CONTROL_UPDATE_SEQNUM:
1603 case CTDB_CONTROL_DUMP_MEMORY:
1604 verify_ctdb_string(cd->data.mem_str, cd2->data.mem_str);
1607 case CTDB_CONTROL_GET_PID:
1610 case CTDB_CONTROL_GET_RECMASTER:
1613 case CTDB_CONTROL_SET_RECMASTER:
1616 case CTDB_CONTROL_FREEZE:
1619 case CTDB_CONTROL_THAW:
1622 case CTDB_CONTROL_GET_PNN:
1625 case CTDB_CONTROL_SHUTDOWN:
1628 case CTDB_CONTROL_GET_MONMODE:
1631 case CTDB_CONTROL_TCP_CLIENT:
1634 case CTDB_CONTROL_TCP_ADD:
1637 case CTDB_CONTROL_TCP_REMOVE:
1640 case CTDB_CONTROL_STARTUP:
1643 case CTDB_CONTROL_SET_TUNABLE:
1646 case CTDB_CONTROL_GET_TUNABLE:
1647 assert(cd->data.tun_value == cd2->data.tun_value);
1650 case CTDB_CONTROL_LIST_TUNABLES:
1651 verify_ctdb_var_list(cd->data.tun_var_list,
1652 cd2->data.tun_var_list);
1655 case CTDB_CONTROL_MODIFY_FLAGS:
1658 case CTDB_CONTROL_GET_ALL_TUNABLES:
1659 verify_ctdb_tunable_list(cd->data.tun_list, cd2->data.tun_list);
1662 case CTDB_CONTROL_GET_TCP_TICKLE_LIST:
1663 verify_ctdb_tickle_list(cd->data.tickles, cd2->data.tickles);
1666 case CTDB_CONTROL_SET_TCP_TICKLE_LIST:
1669 case CTDB_CONTROL_DB_ATTACH_PERSISTENT:
1672 case CTDB_CONTROL_UPDATE_RECORD:
1675 case CTDB_CONTROL_SEND_GRATUITOUS_ARP:
1678 case CTDB_CONTROL_TRANSACTION_START:
1681 case CTDB_CONTROL_TRANSACTION_COMMIT:
1684 case CTDB_CONTROL_WIPE_DATABASE:
1687 case CTDB_CONTROL_UPTIME:
1688 verify_ctdb_uptime(cd->data.uptime, cd2->data.uptime);
1691 case CTDB_CONTROL_START_RECOVERY:
1694 case CTDB_CONTROL_END_RECOVERY:
1697 case CTDB_CONTROL_RELOAD_NODES_FILE:
1700 case CTDB_CONTROL_TRY_DELETE_RECORDS:
1701 verify_ctdb_rec_buffer(cd->data.recbuf, cd2->data.recbuf);
1704 case CTDB_CONTROL_ENABLE_MONITOR:
1707 case CTDB_CONTROL_DISABLE_MONITOR:
1710 case CTDB_CONTROL_ADD_PUBLIC_IP:
1713 case CTDB_CONTROL_DEL_PUBLIC_IP:
1716 case CTDB_CONTROL_RUN_EVENTSCRIPTS:
1719 case CTDB_CONTROL_GET_CAPABILITIES:
1720 assert(cd->data.caps == cd2->data.caps);
1723 case CTDB_CONTROL_RECD_PING:
1726 case CTDB_CONTROL_RELEASE_IP:
1729 case CTDB_CONTROL_TAKEOVER_IP:
1732 case CTDB_CONTROL_GET_PUBLIC_IPS:
1733 verify_ctdb_public_ip_list(cd->data.pubip_list,
1734 cd2->data.pubip_list);
1737 case CTDB_CONTROL_GET_NODEMAP:
1738 verify_ctdb_node_map(cd->data.nodemap, cd2->data.nodemap);
1741 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS:
1742 verify_ctdb_script_list(cd->data.script_list,
1743 cd2->data.script_list);
1746 case CTDB_CONTROL_TRAVERSE_KILL:
1749 case CTDB_CONTROL_RECD_RECLOCK_LATENCY:
1752 case CTDB_CONTROL_GET_RECLOCK_FILE:
1753 verify_ctdb_string(cd->data.reclock_file,
1754 cd2->data.reclock_file);
1757 case CTDB_CONTROL_STOP_NODE:
1760 case CTDB_CONTROL_CONTINUE_NODE:
1763 case CTDB_CONTROL_SET_LMASTERROLE:
1766 case CTDB_CONTROL_SET_RECMASTERROLE:
1769 case CTDB_CONTROL_ENABLE_SCRIPT:
1772 case CTDB_CONTROL_DISABLE_SCRIPT:
1775 case CTDB_CONTROL_SET_BAN_STATE:
1778 case CTDB_CONTROL_GET_BAN_STATE:
1779 verify_ctdb_ban_state(cd->data.ban_state, cd2->data.ban_state);
1782 case CTDB_CONTROL_SET_DB_PRIORITY:
1785 case CTDB_CONTROL_GET_DB_PRIORITY:
1788 case CTDB_CONTROL_TRANSACTION_CANCEL:
1791 case CTDB_CONTROL_REGISTER_NOTIFY:
1794 case CTDB_CONTROL_DEREGISTER_NOTIFY:
1797 case CTDB_CONTROL_TRANS3_COMMIT:
1800 case CTDB_CONTROL_GET_DB_SEQNUM:
1801 assert(cd->data.seqnum == cd2->data.seqnum);
1804 case CTDB_CONTROL_DB_SET_HEALTHY:
1807 case CTDB_CONTROL_DB_GET_HEALTH:
1808 verify_ctdb_string(cd->data.reason, cd2->data.reason);
1811 case CTDB_CONTROL_GET_PUBLIC_IP_INFO:
1812 verify_ctdb_public_ip_info(cd->data.ipinfo, cd2->data.ipinfo);
1815 case CTDB_CONTROL_GET_IFACES:
1816 verify_ctdb_iface_list(cd->data.iface_list,
1817 cd2->data.iface_list);
1820 case CTDB_CONTROL_SET_IFACE_LINK_STATE:
1823 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE:
1826 case CTDB_CONTROL_GET_STAT_HISTORY:
1827 verify_ctdb_statistics_list(cd->data.stats_list,
1828 cd2->data.stats_list);
1831 case CTDB_CONTROL_SCHEDULE_FOR_DELETION:
1834 case CTDB_CONTROL_SET_DB_READONLY:
1837 case CTDB_CONTROL_CHECK_SRVIDS:
1838 verify_ctdb_uint8_array(cd->data.u8_array, cd2->data.u8_array);
1841 case CTDB_CONTROL_TRAVERSE_START_EXT:
1844 case CTDB_CONTROL_GET_DB_STATISTICS:
1845 verify_ctdb_db_statistics(cd->data.dbstats, cd2->data.dbstats);
1848 case CTDB_CONTROL_SET_DB_STICKY:
1851 case CTDB_CONTROL_RELOAD_PUBLIC_IPS:
1854 case CTDB_CONTROL_TRAVERSE_ALL_EXT:
1857 case CTDB_CONTROL_RECEIVE_RECORDS:
1858 verify_ctdb_rec_buffer(cd->data.recbuf, cd2->data.recbuf);
1861 case CTDB_CONTROL_IPREALLOCATED:
1864 case CTDB_CONTROL_GET_RUNSTATE:
1865 assert(cd->data.runstate == cd2->data.runstate);
1868 case CTDB_CONTROL_DB_DETACH:
1871 case CTDB_CONTROL_GET_NODES_FILE:
1872 verify_ctdb_node_map(cd->data.nodemap, cd2->data.nodemap);
1875 case CTDB_CONTROL_DB_PULL:
1876 assert(cd->data.num_records == cd2->data.num_records);
1879 case CTDB_CONTROL_DB_PUSH_CONFIRM:
1880 assert(cd->data.num_records == cd2->data.num_records);
1886 static void fill_ctdb_reply_control(TALLOC_CTX *mem_ctx,
1887 struct ctdb_reply_control *c,
1890 c->status = -rand_int(2);
1891 if (c->status == 0) {
1893 fill_ctdb_reply_control_data(mem_ctx, &c->rdata, opcode);
1895 fill_ctdb_string(mem_ctx, &c->errmsg);
1899 static void verify_ctdb_reply_control(struct ctdb_reply_control *c,
1900 struct ctdb_reply_control *c2)
1902 assert(c->status == c2->status);
1903 verify_ctdb_string(c->errmsg, c2->errmsg);
1904 if (c->status == 0) {
1905 verify_ctdb_reply_control_data(&c->rdata, &c2->rdata);
1909 static void fill_ctdb_req_message_data(TALLOC_CTX *mem_ctx,
1910 struct ctdb_req_message_data *c)
1912 c->srvid = rand64();
1913 fill_tdb_data(mem_ctx, &c->data);
1916 static void verify_ctdb_req_message_data(struct ctdb_req_message_data *c,
1917 struct ctdb_req_message_data *c2)
1919 assert(c->srvid == c2->srvid);
1920 verify_tdb_data(&c->data, &c2->data);
1924 * Functions to test marshalling
1927 static void test_ctdb_req_header(void)
1929 TALLOC_CTX *mem_ctx;
1932 struct ctdb_req_header h, h2;
1935 printf("ctdb_req_header\n");
1938 mem_ctx = talloc_new(NULL);
1939 assert(mem_ctx != NULL);
1941 ctdb_req_header_fill(&h, GENERATION, OPERATION, DESTNODE, SRCNODE,
1944 ret = ctdb_allocate_pkt(mem_ctx, ctdb_req_header_len(&h),
1947 assert(pkt != NULL);
1948 assert(pkt_len >= ctdb_req_header_len(&h));
1950 ctdb_req_header_push(&h, pkt);
1952 ret = ctdb_req_header_pull(pkt, pkt_len, &h2);
1955 verify_ctdb_req_header(&h, &h2);
1957 talloc_free(mem_ctx);
1960 static void test_req_call_test(void)
1962 TALLOC_CTX *mem_ctx;
1964 size_t datalen, pkt_len, len;
1966 struct ctdb_req_header h, h2;
1967 struct ctdb_req_call c, c2;
1969 printf("ctdb_req_call\n");
1972 mem_ctx = talloc_new(NULL);
1973 assert(mem_ctx != NULL);
1975 ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_CALL,
1976 DESTNODE, SRCNODE, REQID);
1978 fill_ctdb_req_call(mem_ctx, &c);
1979 datalen = ctdb_req_call_len(&h, &c);
1980 ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
1982 assert(pkt != NULL);
1983 assert(pkt_len >= datalen);
1985 ret = ctdb_req_call_push(&h, &c, pkt, &len);
1986 assert(ret == EMSGSIZE);
1987 assert(len == datalen);
1988 ret = ctdb_req_call_push(&h, &c, pkt, &pkt_len);
1990 ret = ctdb_req_call_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
1992 verify_ctdb_req_header(&h, &h2);
1993 assert(h2.length == pkt_len);
1994 verify_ctdb_req_call(&c, &c2);
1996 talloc_free(mem_ctx);
1999 static void test_reply_call_test(void)
2001 TALLOC_CTX *mem_ctx;
2003 size_t datalen, pkt_len, len;
2005 struct ctdb_req_header h, h2;
2006 struct ctdb_reply_call c, c2;
2008 printf("ctdb_reply_call\n");
2011 mem_ctx = talloc_new(NULL);
2012 assert(mem_ctx != NULL);
2014 ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_CALL,
2015 DESTNODE, SRCNODE, REQID);
2017 fill_ctdb_reply_call(mem_ctx, &c);
2018 datalen = ctdb_reply_call_len(&h, &c);
2019 ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
2021 assert(pkt != NULL);
2022 assert(pkt_len >= datalen);
2024 ret = ctdb_reply_call_push(&h, &c, pkt, &len);
2025 assert(ret == EMSGSIZE);
2026 assert(len == datalen);
2027 ret = ctdb_reply_call_push(&h, &c, pkt, &pkt_len);
2029 ret = ctdb_reply_call_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
2031 verify_ctdb_req_header(&h, &h2);
2032 assert(h2.length == pkt_len);
2033 verify_ctdb_reply_call(&c, &c2);
2035 talloc_free(mem_ctx);
2038 static void test_reply_error_test(void)
2040 TALLOC_CTX *mem_ctx;
2042 size_t datalen, pkt_len, len;
2044 struct ctdb_req_header h, h2;
2045 struct ctdb_reply_error c, c2;
2047 printf("ctdb_reply_error\n");
2050 mem_ctx = talloc_new(NULL);
2051 assert(mem_ctx != NULL);
2053 ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_ERROR,
2054 DESTNODE, SRCNODE, REQID);
2056 fill_ctdb_reply_error(mem_ctx, &c);
2057 datalen = ctdb_reply_error_len(&h, &c);
2058 ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
2060 assert(pkt != NULL);
2061 assert(pkt_len >= datalen);
2063 ret = ctdb_reply_error_push(&h, &c, pkt, &len);
2064 assert(ret == EMSGSIZE);
2065 assert(len == datalen);
2066 ret = ctdb_reply_error_push(&h, &c, pkt, &pkt_len);
2068 ret = ctdb_reply_error_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
2070 verify_ctdb_req_header(&h, &h2);
2071 assert(h2.length == pkt_len);
2072 verify_ctdb_reply_error(&c, &c2);
2074 talloc_free(mem_ctx);
2077 static void test_req_dmaster_test(void)
2079 TALLOC_CTX *mem_ctx;
2081 size_t datalen, pkt_len, len;
2083 struct ctdb_req_header h, h2;
2084 struct ctdb_req_dmaster c, c2;
2086 printf("ctdb_req_dmaster\n");
2089 mem_ctx = talloc_new(NULL);
2090 assert(mem_ctx != NULL);
2092 ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_DMASTER,
2093 DESTNODE, SRCNODE, REQID);
2095 fill_ctdb_req_dmaster(mem_ctx, &c);
2096 datalen = ctdb_req_dmaster_len(&h, &c);
2097 ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
2099 assert(pkt != NULL);
2100 assert(pkt_len >= datalen);
2102 ret = ctdb_req_dmaster_push(&h, &c, pkt, &len);
2103 assert(ret == EMSGSIZE);
2104 assert(len == datalen);
2105 ret = ctdb_req_dmaster_push(&h, &c, pkt, &pkt_len);
2107 ret = ctdb_req_dmaster_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
2109 verify_ctdb_req_header(&h, &h2);
2110 assert(h2.length == pkt_len);
2111 verify_ctdb_req_dmaster(&c, &c2);
2113 talloc_free(mem_ctx);
2116 static void test_reply_dmaster_test(void)
2118 TALLOC_CTX *mem_ctx;
2120 size_t datalen, pkt_len, len;
2122 struct ctdb_req_header h, h2;
2123 struct ctdb_reply_dmaster c, c2;
2125 printf("ctdb_reply_dmaster\n");
2128 mem_ctx = talloc_new(NULL);
2129 assert(mem_ctx != NULL);
2131 ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_DMASTER,
2132 DESTNODE, SRCNODE, REQID);
2134 fill_ctdb_reply_dmaster(mem_ctx, &c);
2135 datalen = ctdb_reply_dmaster_len(&h, &c);
2136 ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
2138 assert(pkt != NULL);
2139 assert(pkt_len >= datalen);
2141 ret = ctdb_reply_dmaster_push(&h, &c, pkt, &len);
2142 assert(ret == EMSGSIZE);
2143 assert(len == datalen);
2144 ret = ctdb_reply_dmaster_push(&h, &c, pkt, &pkt_len);
2146 ret = ctdb_reply_dmaster_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
2148 verify_ctdb_req_header(&h, &h2);
2149 assert(h2.length == pkt_len);
2150 verify_ctdb_reply_dmaster(&c, &c2);
2152 talloc_free(mem_ctx);
2155 #define NUM_CONTROLS 149
2157 static void test_req_control_data_test(void)
2159 TALLOC_CTX *mem_ctx;
2162 struct ctdb_req_control_data cd, cd2;
2165 printf("ctdb_req_control_data\n");
2168 for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
2169 mem_ctx = talloc_new(NULL);
2170 assert(mem_ctx != NULL);
2172 printf("%u.. ", opcode);
2174 fill_ctdb_req_control_data(mem_ctx, &cd, opcode);
2175 buflen = ctdb_req_control_data_len(&cd);
2176 ctdb_req_control_data_push(&cd, BUFFER);
2177 ret = ctdb_req_control_data_pull(BUFFER, buflen, opcode, mem_ctx, &cd2);
2179 verify_ctdb_req_control_data(&cd, &cd2);
2180 talloc_free(mem_ctx);
2187 static void test_reply_control_data_test(void)
2189 TALLOC_CTX *mem_ctx;
2192 struct ctdb_reply_control_data cd, cd2;
2195 printf("ctdb_reply_control_data\n");
2198 for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
2199 mem_ctx = talloc_new(NULL);
2200 assert(mem_ctx != NULL);
2202 printf("%u.. ", opcode);
2204 fill_ctdb_reply_control_data(mem_ctx, &cd, opcode);
2205 buflen = ctdb_reply_control_data_len(&cd);
2206 ctdb_reply_control_data_push(&cd, BUFFER);
2207 ret = ctdb_reply_control_data_pull(BUFFER, buflen, opcode, mem_ctx, &cd2);
2209 verify_ctdb_reply_control_data(&cd, &cd2);
2210 talloc_free(mem_ctx);
2217 static void test_req_control_test(void)
2219 TALLOC_CTX *mem_ctx;
2221 size_t datalen, pkt_len, len;
2223 struct ctdb_req_header h, h2;
2224 struct ctdb_req_control c, c2;
2227 printf("ctdb_req_control\n");
2230 ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_CONTROL,
2231 DESTNODE, SRCNODE, REQID);
2233 for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
2234 mem_ctx = talloc_new(NULL);
2235 assert(mem_ctx != NULL);
2237 printf("%u.. ", opcode);
2239 fill_ctdb_req_control(mem_ctx, &c, opcode);
2240 datalen = ctdb_req_control_len(&h, &c);
2241 ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
2243 assert(pkt != NULL);
2244 assert(pkt_len >= datalen);
2246 ret = ctdb_req_control_push(&h, &c, pkt, &len);
2247 assert(ret == EMSGSIZE);
2248 assert(len == datalen);
2249 ret = ctdb_req_control_push(&h, &c, pkt, &pkt_len);
2251 ret = ctdb_req_control_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
2253 verify_ctdb_req_header(&h, &h2);
2254 assert(h2.length == pkt_len);
2255 verify_ctdb_req_control(&c, &c2);
2257 talloc_free(mem_ctx);
2264 static void test_reply_control_test(void)
2266 TALLOC_CTX *mem_ctx;
2268 size_t datalen, pkt_len, len;
2270 struct ctdb_req_header h, h2;
2271 struct ctdb_reply_control c, c2;
2274 printf("ctdb_reply_control\n");
2277 ctdb_req_header_fill(&h, GENERATION, CTDB_REPLY_CONTROL,
2278 DESTNODE, SRCNODE, REQID);
2280 for (opcode=0; opcode<NUM_CONTROLS; opcode++) {
2281 mem_ctx = talloc_new(NULL);
2282 assert(mem_ctx != NULL);
2284 printf("%u.. ", opcode);
2286 fill_ctdb_reply_control(mem_ctx, &c, opcode);
2287 datalen = ctdb_reply_control_len(&h, &c);
2288 ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
2290 assert(pkt != NULL);
2291 assert(pkt_len >= datalen);
2293 ret = ctdb_reply_control_push(&h, &c, pkt, &len);
2294 assert(ret == EMSGSIZE);
2295 assert(len == datalen);
2296 ret = ctdb_reply_control_push(&h, &c, pkt, &pkt_len);
2298 ret = ctdb_reply_control_pull(pkt, pkt_len, opcode, &h2, mem_ctx, &c2);
2300 verify_ctdb_req_header(&h, &h2);
2301 assert(h2.length == pkt_len);
2302 verify_ctdb_reply_control(&c, &c2);
2304 talloc_free(mem_ctx);
2311 static void test_req_message_test(void)
2313 TALLOC_CTX *mem_ctx;
2315 size_t datalen, pkt_len, len;
2317 struct ctdb_req_header h, h2;
2318 struct ctdb_req_message_data c, c2;
2320 printf("ctdb_req_message\n");
2323 mem_ctx = talloc_new(NULL);
2324 assert(mem_ctx != NULL);
2326 ctdb_req_header_fill(&h, GENERATION, CTDB_REQ_MESSAGE,
2327 DESTNODE, SRCNODE, REQID);
2329 fill_ctdb_req_message_data(mem_ctx, &c);
2330 datalen = ctdb_req_message_data_len(&h, &c);
2331 ret = ctdb_allocate_pkt(mem_ctx, datalen, &pkt, &pkt_len);
2333 assert(pkt != NULL);
2334 assert(pkt_len >= datalen);
2336 ret = ctdb_req_message_data_push(&h, &c, pkt, &len);
2337 assert(ret == EMSGSIZE);
2338 assert(len == datalen);
2339 ret = ctdb_req_message_data_push(&h, &c, pkt, &pkt_len);
2341 ret = ctdb_req_message_data_pull(pkt, pkt_len, &h2, mem_ctx, &c2);
2343 verify_ctdb_req_header(&h, &h2);
2344 assert(h2.length == pkt_len);
2345 verify_ctdb_req_message_data(&c, &c2);
2347 talloc_free(mem_ctx);
2350 int main(int argc, char *argv[])
2353 int seed = atoi(argv[1]);
2357 test_ctdb_req_header();
2359 test_req_call_test();
2360 test_reply_call_test();
2361 test_reply_error_test();
2362 test_req_dmaster_test();
2363 test_reply_dmaster_test();
2365 test_req_control_data_test();
2366 test_reply_control_data_test();
2368 test_req_control_test();
2369 test_reply_control_test();
2371 test_req_message_test();