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_nonnull(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_nonnull(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_nonnull(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_GET_PNN
:
258 case CTDB_CONTROL_SHUTDOWN
:
261 case CTDB_CONTROL_GET_MONMODE
:
264 case CTDB_CONTROL_TCP_CLIENT
:
265 cd
->data
.conn
= talloc(mem_ctx
, struct ctdb_connection
);
266 assert(cd
->data
.conn
!= NULL
);
267 fill_ctdb_connection(mem_ctx
, cd
->data
.conn
);
270 case CTDB_CONTROL_TCP_ADD
:
271 cd
->data
.conn
= talloc(mem_ctx
, struct ctdb_connection
);
272 assert(cd
->data
.conn
!= NULL
);
273 fill_ctdb_connection(mem_ctx
, cd
->data
.conn
);
276 case CTDB_CONTROL_TCP_REMOVE
:
277 cd
->data
.conn
= talloc(mem_ctx
, struct ctdb_connection
);
278 assert(cd
->data
.conn
!= NULL
);
279 fill_ctdb_connection(mem_ctx
, cd
->data
.conn
);
282 case CTDB_CONTROL_STARTUP
:
285 case CTDB_CONTROL_SET_TUNABLE
:
286 cd
->data
.tunable
= talloc(mem_ctx
, struct ctdb_tunable
);
287 assert(cd
->data
.tunable
!= NULL
);
288 fill_ctdb_tunable(mem_ctx
, cd
->data
.tunable
);
291 case CTDB_CONTROL_GET_TUNABLE
:
292 fill_ctdb_string(mem_ctx
, &cd
->data
.tun_var
);
293 assert(cd
->data
.tun_var
!= NULL
);
296 case CTDB_CONTROL_LIST_TUNABLES
:
299 case CTDB_CONTROL_MODIFY_FLAGS
:
300 cd
->data
.flag_change
= talloc(mem_ctx
, struct ctdb_node_flag_change
);
301 assert(cd
->data
.flag_change
!= NULL
);
302 fill_ctdb_node_flag_change(mem_ctx
, cd
->data
.flag_change
);
305 case CTDB_CONTROL_GET_ALL_TUNABLES
:
308 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
309 cd
->data
.addr
= talloc(mem_ctx
, ctdb_sock_addr
);
310 assert(cd
->data
.addr
!= NULL
);
311 fill_ctdb_sock_addr(mem_ctx
, cd
->data
.addr
);
314 case CTDB_CONTROL_SET_TCP_TICKLE_LIST
:
315 cd
->data
.tickles
= talloc(mem_ctx
, struct ctdb_tickle_list
);
316 assert(cd
->data
.tickles
!= NULL
);
317 fill_ctdb_tickle_list(mem_ctx
, cd
->data
.tickles
);
320 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
321 fill_ctdb_string(mem_ctx
, &cd
->data
.db_name
);
322 assert(cd
->data
.db_name
!= NULL
);
325 case CTDB_CONTROL_UPDATE_RECORD
:
326 cd
->data
.recbuf
= talloc(mem_ctx
, struct ctdb_rec_buffer
);
327 assert(cd
->data
.recbuf
!= NULL
);
328 fill_ctdb_rec_buffer(mem_ctx
, cd
->data
.recbuf
);
331 case CTDB_CONTROL_SEND_GRATUITOUS_ARP
:
332 cd
->data
.addr_info
= talloc(mem_ctx
, struct ctdb_addr_info
);
333 assert(cd
->data
.addr_info
!= NULL
);
334 fill_ctdb_addr_info(mem_ctx
, cd
->data
.addr_info
);
337 case CTDB_CONTROL_WIPE_DATABASE
:
338 cd
->data
.transdb
= talloc(mem_ctx
, struct ctdb_transdb
);
339 assert(cd
->data
.transdb
!= NULL
);
340 fill_ctdb_transdb(mem_ctx
, cd
->data
.transdb
);
343 case CTDB_CONTROL_UPTIME
:
346 case CTDB_CONTROL_START_RECOVERY
:
349 case CTDB_CONTROL_END_RECOVERY
:
352 case CTDB_CONTROL_RELOAD_NODES_FILE
:
355 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
356 cd
->data
.recbuf
= talloc(mem_ctx
, struct ctdb_rec_buffer
);
357 assert(cd
->data
.recbuf
!= NULL
);
358 fill_ctdb_rec_buffer(mem_ctx
, cd
->data
.recbuf
);
361 case CTDB_CONTROL_ENABLE_MONITOR
:
364 case CTDB_CONTROL_DISABLE_MONITOR
:
367 case CTDB_CONTROL_ADD_PUBLIC_IP
:
368 cd
->data
.addr_info
= talloc(mem_ctx
, struct ctdb_addr_info
);
369 assert(cd
->data
.addr_info
!= NULL
);
370 fill_ctdb_addr_info(mem_ctx
, cd
->data
.addr_info
);
373 case CTDB_CONTROL_DEL_PUBLIC_IP
:
374 cd
->data
.addr_info
= talloc(mem_ctx
, struct ctdb_addr_info
);
375 assert(cd
->data
.addr_info
!= NULL
);
376 fill_ctdb_addr_info(mem_ctx
, cd
->data
.addr_info
);
379 case CTDB_CONTROL_RUN_EVENTSCRIPTS
:
380 fill_ctdb_string(mem_ctx
, &cd
->data
.event_str
);
381 assert(cd
->data
.event_str
!= NULL
);
384 case CTDB_CONTROL_GET_CAPABILITIES
:
387 case CTDB_CONTROL_START_PERSISTENT_UPDATE
:
390 case CTDB_CONTROL_CANCEL_PERSISTENT_UPDATE
:
393 case CTDB_CONTROL_RECD_PING
:
396 case CTDB_CONTROL_RELEASE_IP
:
397 cd
->data
.pubip
= talloc(mem_ctx
, struct ctdb_public_ip
);
398 assert(cd
->data
.pubip
!= NULL
);
399 fill_ctdb_public_ip(mem_ctx
, cd
->data
.pubip
);
402 case CTDB_CONTROL_TAKEOVER_IP
:
403 cd
->data
.pubip
= talloc(mem_ctx
, struct ctdb_public_ip
);
404 assert(cd
->data
.pubip
!= NULL
);
405 fill_ctdb_public_ip(mem_ctx
, cd
->data
.pubip
);
408 case CTDB_CONTROL_GET_PUBLIC_IPS
:
411 case CTDB_CONTROL_GET_NODEMAP
:
414 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
415 cd
->data
.event
= rand_int(CTDB_EVENT_MAX
);
418 case CTDB_CONTROL_TRAVERSE_KILL
:
419 cd
->data
.traverse_start
= talloc(mem_ctx
, struct ctdb_traverse_start
);
420 assert(cd
->data
.traverse_start
!= NULL
);
421 fill_ctdb_traverse_start(mem_ctx
, cd
->data
.traverse_start
);
424 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
425 cd
->data
.reclock_latency
= rand_double();
428 case CTDB_CONTROL_GET_RECLOCK_FILE
:
431 case CTDB_CONTROL_STOP_NODE
:
434 case CTDB_CONTROL_CONTINUE_NODE
:
437 case CTDB_CONTROL_SET_LMASTERROLE
:
438 cd
->data
.role
= rand_int(2);
441 case CTDB_CONTROL_SET_RECMASTERROLE
:
442 cd
->data
.role
= rand_int(2);
445 case CTDB_CONTROL_ENABLE_SCRIPT
:
446 fill_ctdb_string(mem_ctx
, &cd
->data
.script
);
447 assert(cd
->data
.script
!= NULL
);
450 case CTDB_CONTROL_DISABLE_SCRIPT
:
451 fill_ctdb_string(mem_ctx
, &cd
->data
.script
);
452 assert(cd
->data
.script
!= NULL
);
455 case CTDB_CONTROL_SET_BAN_STATE
:
456 cd
->data
.ban_state
= talloc(mem_ctx
, struct ctdb_ban_state
);
457 assert(cd
->data
.ban_state
!= NULL
);
458 fill_ctdb_ban_state(mem_ctx
, cd
->data
.ban_state
);
461 case CTDB_CONTROL_GET_BAN_STATE
:
464 case CTDB_CONTROL_REGISTER_NOTIFY
:
465 cd
->data
.notify
= talloc(mem_ctx
, struct ctdb_notify_data
);
466 assert(cd
->data
.notify
!= NULL
);
467 fill_ctdb_notify_data(mem_ctx
, cd
->data
.notify
);
470 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
471 cd
->data
.srvid
= rand64();
474 case CTDB_CONTROL_TRANS3_COMMIT
:
475 cd
->data
.recbuf
= talloc(mem_ctx
, struct ctdb_rec_buffer
);
476 assert(cd
->data
.recbuf
!= NULL
);
477 fill_ctdb_rec_buffer(mem_ctx
, cd
->data
.recbuf
);
480 case CTDB_CONTROL_GET_DB_SEQNUM
:
481 cd
->data
.db_id
= rand32();
484 case CTDB_CONTROL_DB_SET_HEALTHY
:
485 cd
->data
.db_id
= rand32();
488 case CTDB_CONTROL_DB_GET_HEALTH
:
489 cd
->data
.db_id
= rand32();
492 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
493 cd
->data
.addr
= talloc(mem_ctx
, ctdb_sock_addr
);
494 assert(cd
->data
.addr
!= NULL
);
495 fill_ctdb_sock_addr(mem_ctx
, cd
->data
.addr
);
498 case CTDB_CONTROL_GET_IFACES
:
501 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
502 cd
->data
.iface
= talloc(mem_ctx
, struct ctdb_iface
);
503 assert(cd
->data
.iface
!= NULL
);
504 fill_ctdb_iface(mem_ctx
, cd
->data
.iface
);
507 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
508 cd
->data
.conn
= talloc(mem_ctx
, struct ctdb_connection
);
509 assert(cd
->data
.conn
!= NULL
);
510 fill_ctdb_connection(mem_ctx
, cd
->data
.conn
);
513 case CTDB_CONTROL_GET_STAT_HISTORY
:
516 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
517 cd
->data
.key
= talloc(mem_ctx
, struct ctdb_key_data
);
518 assert(cd
->data
.key
!= NULL
);
519 fill_ctdb_key_data(mem_ctx
, cd
->data
.key
);
522 case CTDB_CONTROL_SET_DB_READONLY
:
523 cd
->data
.db_id
= rand32();
526 case CTDB_CONTROL_CHECK_SRVIDS
:
527 cd
->data
.u64_array
= talloc(mem_ctx
, struct ctdb_uint64_array
);
528 assert(cd
->data
.u64_array
!= NULL
);
529 fill_ctdb_uint64_array(mem_ctx
, cd
->data
.u64_array
);
532 case CTDB_CONTROL_TRAVERSE_START_EXT
:
533 cd
->data
.traverse_start_ext
= talloc(mem_ctx
, struct ctdb_traverse_start_ext
);
534 assert(cd
->data
.traverse_start_ext
!= NULL
);
535 fill_ctdb_traverse_start_ext(mem_ctx
, cd
->data
.traverse_start_ext
);
538 case CTDB_CONTROL_GET_DB_STATISTICS
:
539 cd
->data
.db_id
= rand32();
542 case CTDB_CONTROL_SET_DB_STICKY
:
543 cd
->data
.db_id
= rand32();
546 case CTDB_CONTROL_RELOAD_PUBLIC_IPS
:
549 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
550 cd
->data
.traverse_all_ext
= talloc(mem_ctx
, struct ctdb_traverse_all_ext
);
551 assert(cd
->data
.traverse_all_ext
!= NULL
);
552 fill_ctdb_traverse_all_ext(mem_ctx
, cd
->data
.traverse_all_ext
);
555 case CTDB_CONTROL_RECEIVE_RECORDS
:
556 cd
->data
.recbuf
= talloc(mem_ctx
, struct ctdb_rec_buffer
);
557 assert(cd
->data
.recbuf
!= NULL
);
558 fill_ctdb_rec_buffer(mem_ctx
, cd
->data
.recbuf
);
561 case CTDB_CONTROL_IPREALLOCATED
:
564 case CTDB_CONTROL_GET_RUNSTATE
:
567 case CTDB_CONTROL_DB_DETACH
:
568 cd
->data
.db_id
= rand32();
571 case CTDB_CONTROL_GET_NODES_FILE
:
574 case CTDB_CONTROL_DB_FREEZE
:
575 cd
->data
.db_id
= rand32();
578 case CTDB_CONTROL_DB_THAW
:
579 cd
->data
.db_id
= rand32();
582 case CTDB_CONTROL_DB_TRANSACTION_START
:
583 cd
->data
.transdb
= talloc(mem_ctx
, struct ctdb_transdb
);
584 assert(cd
->data
.transdb
!= NULL
);
585 fill_ctdb_transdb(mem_ctx
, cd
->data
.transdb
);
588 case CTDB_CONTROL_DB_TRANSACTION_COMMIT
:
589 cd
->data
.transdb
= talloc(mem_ctx
, struct ctdb_transdb
);
590 assert(cd
->data
.transdb
!= NULL
);
591 fill_ctdb_transdb(mem_ctx
, cd
->data
.transdb
);
594 case CTDB_CONTROL_DB_TRANSACTION_CANCEL
:
595 cd
->data
.db_id
= rand32();
598 case CTDB_CONTROL_DB_PULL
:
599 cd
->data
.pulldb_ext
= talloc(mem_ctx
, struct ctdb_pulldb_ext
);
600 assert(cd
->data
.pulldb_ext
!= NULL
);
601 fill_ctdb_pulldb_ext(mem_ctx
, cd
->data
.pulldb_ext
);
604 case CTDB_CONTROL_DB_PUSH_START
:
605 cd
->data
.pulldb_ext
= talloc(mem_ctx
, struct ctdb_pulldb_ext
);
606 assert(cd
->data
.pulldb_ext
!= NULL
);
607 fill_ctdb_pulldb_ext(mem_ctx
, cd
->data
.pulldb_ext
);
610 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
611 cd
->data
.db_id
= rand32();
617 static void verify_ctdb_req_control_data(struct ctdb_req_control_data
*cd
,
618 struct ctdb_req_control_data
*cd2
)
620 assert(cd
->opcode
== cd2
->opcode
);
622 switch (cd
->opcode
) {
623 case CTDB_CONTROL_PROCESS_EXISTS
:
624 assert(cd
->data
.pid
== cd2
->data
.pid
);
627 case CTDB_CONTROL_STATISTICS
:
630 case CTDB_CONTROL_PING
:
633 case CTDB_CONTROL_GETDBPATH
:
634 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
637 case CTDB_CONTROL_GETVNNMAP
:
640 case CTDB_CONTROL_SETVNNMAP
:
641 verify_ctdb_vnn_map(cd
->data
.vnnmap
, cd2
->data
.vnnmap
);
644 case CTDB_CONTROL_GET_DEBUG
:
647 case CTDB_CONTROL_SET_DEBUG
:
648 assert(cd
->data
.loglevel
== cd2
->data
.loglevel
);
651 case CTDB_CONTROL_GET_DBMAP
:
654 case CTDB_CONTROL_PULL_DB
:
655 verify_ctdb_pulldb(cd
->data
.pulldb
, cd2
->data
.pulldb
);
658 case CTDB_CONTROL_PUSH_DB
:
659 verify_ctdb_rec_buffer(cd
->data
.recbuf
, cd2
->data
.recbuf
);
662 case CTDB_CONTROL_GET_RECMODE
:
665 case CTDB_CONTROL_SET_RECMODE
:
666 assert(cd
->data
.recmode
== cd2
->data
.recmode
);
669 case CTDB_CONTROL_STATISTICS_RESET
:
672 case CTDB_CONTROL_DB_ATTACH
:
673 verify_ctdb_string(cd
->data
.db_name
, cd2
->data
.db_name
);
676 case CTDB_CONTROL_SET_CALL
:
679 case CTDB_CONTROL_TRAVERSE_START
:
680 verify_ctdb_traverse_start(cd
->data
.traverse_start
,
681 cd2
->data
.traverse_start
);
684 case CTDB_CONTROL_TRAVERSE_ALL
:
685 verify_ctdb_traverse_all(cd
->data
.traverse_all
,
686 cd2
->data
.traverse_all
);
689 case CTDB_CONTROL_TRAVERSE_DATA
:
690 verify_ctdb_rec_data(cd
->data
.rec_data
, cd2
->data
.rec_data
);
693 case CTDB_CONTROL_REGISTER_SRVID
:
696 case CTDB_CONTROL_DEREGISTER_SRVID
:
699 case CTDB_CONTROL_GET_DBNAME
:
700 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
703 case CTDB_CONTROL_ENABLE_SEQNUM
:
704 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
707 case CTDB_CONTROL_UPDATE_SEQNUM
:
708 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
711 case CTDB_CONTROL_DUMP_MEMORY
:
714 case CTDB_CONTROL_GET_PID
:
717 case CTDB_CONTROL_GET_RECMASTER
:
720 case CTDB_CONTROL_SET_RECMASTER
:
721 assert(cd
->data
.recmaster
== cd2
->data
.recmaster
);
724 case CTDB_CONTROL_FREEZE
:
727 case CTDB_CONTROL_GET_PNN
:
730 case CTDB_CONTROL_SHUTDOWN
:
733 case CTDB_CONTROL_GET_MONMODE
:
736 case CTDB_CONTROL_TCP_CLIENT
:
737 verify_ctdb_connection(cd
->data
.conn
, cd2
->data
.conn
);
740 case CTDB_CONTROL_TCP_ADD
:
741 verify_ctdb_connection(cd
->data
.conn
, cd2
->data
.conn
);
744 case CTDB_CONTROL_TCP_REMOVE
:
745 verify_ctdb_connection(cd
->data
.conn
, cd2
->data
.conn
);
748 case CTDB_CONTROL_STARTUP
:
751 case CTDB_CONTROL_SET_TUNABLE
:
752 verify_ctdb_tunable(cd
->data
.tunable
, cd2
->data
.tunable
);
755 case CTDB_CONTROL_GET_TUNABLE
:
756 verify_ctdb_string(cd
->data
.tun_var
, cd2
->data
.tun_var
);
759 case CTDB_CONTROL_LIST_TUNABLES
:
762 case CTDB_CONTROL_MODIFY_FLAGS
:
763 verify_ctdb_node_flag_change(cd
->data
.flag_change
,
764 cd2
->data
.flag_change
);
767 case CTDB_CONTROL_GET_ALL_TUNABLES
:
770 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
771 verify_ctdb_sock_addr(cd
->data
.addr
, cd2
->data
.addr
);
774 case CTDB_CONTROL_SET_TCP_TICKLE_LIST
:
775 verify_ctdb_tickle_list(cd
->data
.tickles
, cd2
->data
.tickles
);
778 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
779 verify_ctdb_string(cd
->data
.db_name
, cd2
->data
.db_name
);
782 case CTDB_CONTROL_UPDATE_RECORD
:
783 verify_ctdb_rec_buffer(cd
->data
.recbuf
, cd2
->data
.recbuf
);
786 case CTDB_CONTROL_SEND_GRATUITOUS_ARP
:
787 verify_ctdb_addr_info(cd
->data
.addr_info
, cd2
->data
.addr_info
);
790 case CTDB_CONTROL_WIPE_DATABASE
:
791 verify_ctdb_transdb(cd
->data
.transdb
, cd2
->data
.transdb
);
794 case CTDB_CONTROL_UPTIME
:
797 case CTDB_CONTROL_START_RECOVERY
:
800 case CTDB_CONTROL_END_RECOVERY
:
803 case CTDB_CONTROL_RELOAD_NODES_FILE
:
806 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
807 verify_ctdb_rec_buffer(cd
->data
.recbuf
, cd2
->data
.recbuf
);
810 case CTDB_CONTROL_ENABLE_MONITOR
:
813 case CTDB_CONTROL_DISABLE_MONITOR
:
816 case CTDB_CONTROL_ADD_PUBLIC_IP
:
817 verify_ctdb_addr_info(cd
->data
.addr_info
, cd2
->data
.addr_info
);
820 case CTDB_CONTROL_DEL_PUBLIC_IP
:
821 verify_ctdb_addr_info(cd
->data
.addr_info
, cd2
->data
.addr_info
);
824 case CTDB_CONTROL_RUN_EVENTSCRIPTS
:
825 verify_ctdb_string(cd
->data
.event_str
, cd2
->data
.event_str
);
828 case CTDB_CONTROL_GET_CAPABILITIES
:
831 case CTDB_CONTROL_START_PERSISTENT_UPDATE
:
834 case CTDB_CONTROL_CANCEL_PERSISTENT_UPDATE
:
837 case CTDB_CONTROL_RECD_PING
:
840 case CTDB_CONTROL_RELEASE_IP
:
841 verify_ctdb_public_ip(cd
->data
.pubip
, cd2
->data
.pubip
);
844 case CTDB_CONTROL_TAKEOVER_IP
:
845 verify_ctdb_public_ip(cd
->data
.pubip
, cd2
->data
.pubip
);
848 case CTDB_CONTROL_GET_PUBLIC_IPS
:
851 case CTDB_CONTROL_GET_NODEMAP
:
854 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
855 assert(cd
->data
.event
== cd2
->data
.event
);
858 case CTDB_CONTROL_TRAVERSE_KILL
:
859 verify_ctdb_traverse_start(cd
->data
.traverse_start
,
860 cd2
->data
.traverse_start
);
863 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
864 assert(cd
->data
.reclock_latency
== cd2
->data
.reclock_latency
);
867 case CTDB_CONTROL_GET_RECLOCK_FILE
:
870 case CTDB_CONTROL_STOP_NODE
:
873 case CTDB_CONTROL_CONTINUE_NODE
:
876 case CTDB_CONTROL_SET_LMASTERROLE
:
877 assert(cd
->data
.role
== cd2
->data
.role
);
880 case CTDB_CONTROL_SET_RECMASTERROLE
:
881 assert(cd
->data
.role
== cd2
->data
.role
);
884 case CTDB_CONTROL_ENABLE_SCRIPT
:
885 verify_ctdb_string(cd
->data
.script
, cd2
->data
.script
);
888 case CTDB_CONTROL_DISABLE_SCRIPT
:
889 verify_ctdb_string(cd
->data
.script
, cd2
->data
.script
);
892 case CTDB_CONTROL_SET_BAN_STATE
:
893 verify_ctdb_ban_state(cd
->data
.ban_state
, cd2
->data
.ban_state
);
896 case CTDB_CONTROL_GET_BAN_STATE
:
899 case CTDB_CONTROL_REGISTER_NOTIFY
:
900 verify_ctdb_notify_data(cd
->data
.notify
, cd2
->data
.notify
);
903 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
904 assert(cd
->data
.srvid
== cd2
->data
.srvid
);
907 case CTDB_CONTROL_TRANS3_COMMIT
:
908 verify_ctdb_rec_buffer(cd
->data
.recbuf
, cd2
->data
.recbuf
);
911 case CTDB_CONTROL_GET_DB_SEQNUM
:
912 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
915 case CTDB_CONTROL_DB_SET_HEALTHY
:
916 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
919 case CTDB_CONTROL_DB_GET_HEALTH
:
920 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
923 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
924 verify_ctdb_sock_addr(cd
->data
.addr
, cd2
->data
.addr
);
927 case CTDB_CONTROL_GET_IFACES
:
930 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
931 verify_ctdb_iface(cd
->data
.iface
, cd2
->data
.iface
);
934 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
935 verify_ctdb_connection(cd
->data
.conn
, cd2
->data
.conn
);
938 case CTDB_CONTROL_GET_STAT_HISTORY
:
941 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
942 verify_ctdb_key_data(cd
->data
.key
, cd2
->data
.key
);
945 case CTDB_CONTROL_SET_DB_READONLY
:
946 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
949 case CTDB_CONTROL_CHECK_SRVIDS
:
950 verify_ctdb_uint64_array(cd
->data
.u64_array
,
951 cd2
->data
.u64_array
);
954 case CTDB_CONTROL_TRAVERSE_START_EXT
:
955 verify_ctdb_traverse_start_ext(cd
->data
.traverse_start_ext
,
956 cd2
->data
.traverse_start_ext
);
959 case CTDB_CONTROL_GET_DB_STATISTICS
:
960 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
963 case CTDB_CONTROL_SET_DB_STICKY
:
964 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
967 case CTDB_CONTROL_RELOAD_PUBLIC_IPS
:
970 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
971 verify_ctdb_traverse_all_ext(cd
->data
.traverse_all_ext
,
972 cd2
->data
.traverse_all_ext
);
975 case CTDB_CONTROL_RECEIVE_RECORDS
:
976 verify_ctdb_rec_buffer(cd
->data
.recbuf
, cd2
->data
.recbuf
);
979 case CTDB_CONTROL_IPREALLOCATED
:
982 case CTDB_CONTROL_GET_RUNSTATE
:
985 case CTDB_CONTROL_DB_DETACH
:
986 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
989 case CTDB_CONTROL_GET_NODES_FILE
:
992 case CTDB_CONTROL_DB_FREEZE
:
993 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
996 case CTDB_CONTROL_DB_THAW
:
997 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
1000 case CTDB_CONTROL_DB_TRANSACTION_START
:
1001 verify_ctdb_transdb(cd
->data
.transdb
, cd2
->data
.transdb
);
1004 case CTDB_CONTROL_DB_TRANSACTION_COMMIT
:
1005 verify_ctdb_transdb(cd
->data
.transdb
, cd2
->data
.transdb
);
1008 case CTDB_CONTROL_DB_TRANSACTION_CANCEL
:
1009 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
1012 case CTDB_CONTROL_DB_PULL
:
1013 verify_ctdb_pulldb_ext(cd
->data
.pulldb_ext
,
1014 cd2
->data
.pulldb_ext
);
1017 case CTDB_CONTROL_DB_PUSH_START
:
1018 verify_ctdb_pulldb_ext(cd
->data
.pulldb_ext
,
1019 cd2
->data
.pulldb_ext
);
1022 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
1023 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
1029 static void fill_ctdb_req_control(TALLOC_CTX
*mem_ctx
,
1030 struct ctdb_req_control
*c
,
1035 c
->srvid
= rand64();
1036 c
->client_id
= rand32();
1037 c
->flags
= rand32();
1039 fill_ctdb_req_control_data(mem_ctx
, &c
->rdata
, opcode
);
1042 static void verify_ctdb_req_control(struct ctdb_req_control
*c
,
1043 struct ctdb_req_control
*c2
)
1045 assert(c
->opcode
== c2
->opcode
);
1046 assert(c
->pad
== c2
->pad
);
1047 assert(c
->srvid
== c2
->srvid
);
1048 assert(c
->client_id
== c2
->client_id
);
1049 assert(c
->flags
== c2
->flags
);
1051 verify_ctdb_req_control_data(&c
->rdata
, &c2
->rdata
);
1054 static void fill_ctdb_reply_control_data(TALLOC_CTX
*mem_ctx
,
1055 struct ctdb_reply_control_data
*cd
,
1058 cd
->opcode
= opcode
;
1061 case CTDB_CONTROL_PROCESS_EXISTS
:
1064 case CTDB_CONTROL_STATISTICS
:
1065 cd
->data
.stats
= talloc(mem_ctx
, struct ctdb_statistics
);
1066 assert(cd
->data
.stats
!= NULL
);
1067 fill_ctdb_statistics(mem_ctx
, cd
->data
.stats
);
1070 case CTDB_CONTROL_PING
:
1073 case CTDB_CONTROL_GETDBPATH
:
1074 fill_ctdb_string(mem_ctx
, &cd
->data
.db_path
);
1075 assert(cd
->data
.db_path
!= NULL
);
1078 case CTDB_CONTROL_GETVNNMAP
:
1079 cd
->data
.vnnmap
= talloc(mem_ctx
, struct ctdb_vnn_map
);
1080 assert(cd
->data
.vnnmap
!= NULL
);
1081 fill_ctdb_vnn_map(mem_ctx
, cd
->data
.vnnmap
);
1084 case CTDB_CONTROL_SETVNNMAP
:
1087 case CTDB_CONTROL_GET_DEBUG
:
1088 cd
->data
.loglevel
= rand_int(5);
1091 case CTDB_CONTROL_SET_DEBUG
:
1094 case CTDB_CONTROL_GET_DBMAP
:
1095 cd
->data
.dbmap
= talloc(mem_ctx
, struct ctdb_dbid_map
);
1096 assert(cd
->data
.dbmap
!= NULL
);
1097 fill_ctdb_dbid_map(mem_ctx
, cd
->data
.dbmap
);
1100 case CTDB_CONTROL_PULL_DB
:
1101 cd
->data
.recbuf
= talloc(mem_ctx
, struct ctdb_rec_buffer
);
1102 assert(cd
->data
.recbuf
!= NULL
);
1103 fill_ctdb_rec_buffer(mem_ctx
, cd
->data
.recbuf
);
1106 case CTDB_CONTROL_PUSH_DB
:
1109 case CTDB_CONTROL_GET_RECMODE
:
1112 case CTDB_CONTROL_SET_RECMODE
:
1115 case CTDB_CONTROL_STATISTICS_RESET
:
1118 case CTDB_CONTROL_DB_ATTACH
:
1119 cd
->data
.db_id
= rand32();
1122 case CTDB_CONTROL_SET_CALL
:
1125 case CTDB_CONTROL_TRAVERSE_START
:
1128 case CTDB_CONTROL_TRAVERSE_ALL
:
1131 case CTDB_CONTROL_TRAVERSE_DATA
:
1134 case CTDB_CONTROL_REGISTER_SRVID
:
1137 case CTDB_CONTROL_DEREGISTER_SRVID
:
1140 case CTDB_CONTROL_GET_DBNAME
:
1141 fill_ctdb_string(mem_ctx
, &cd
->data
.db_name
);
1142 assert(cd
->data
.db_name
);
1145 case CTDB_CONTROL_ENABLE_SEQNUM
:
1148 case CTDB_CONTROL_UPDATE_SEQNUM
:
1151 case CTDB_CONTROL_DUMP_MEMORY
:
1152 fill_ctdb_string(mem_ctx
, &cd
->data
.mem_str
);
1153 assert(cd
->data
.mem_str
);
1156 case CTDB_CONTROL_GET_PID
:
1159 case CTDB_CONTROL_GET_RECMASTER
:
1162 case CTDB_CONTROL_SET_RECMASTER
:
1165 case CTDB_CONTROL_FREEZE
:
1168 case CTDB_CONTROL_GET_PNN
:
1171 case CTDB_CONTROL_SHUTDOWN
:
1174 case CTDB_CONTROL_GET_MONMODE
:
1177 case CTDB_CONTROL_TCP_CLIENT
:
1180 case CTDB_CONTROL_TCP_ADD
:
1183 case CTDB_CONTROL_TCP_REMOVE
:
1186 case CTDB_CONTROL_STARTUP
:
1189 case CTDB_CONTROL_SET_TUNABLE
:
1192 case CTDB_CONTROL_GET_TUNABLE
:
1193 cd
->data
.tun_value
= rand32();
1196 case CTDB_CONTROL_LIST_TUNABLES
:
1197 cd
->data
.tun_var_list
= talloc(mem_ctx
, struct ctdb_var_list
);
1198 assert(cd
->data
.tun_var_list
!= NULL
);
1199 fill_ctdb_var_list(mem_ctx
, cd
->data
.tun_var_list
);
1202 case CTDB_CONTROL_MODIFY_FLAGS
:
1205 case CTDB_CONTROL_GET_ALL_TUNABLES
:
1206 cd
->data
.tun_list
= talloc(mem_ctx
, struct ctdb_tunable_list
);
1207 assert(cd
->data
.tun_list
!= NULL
);
1208 fill_ctdb_tunable_list(mem_ctx
, cd
->data
.tun_list
);
1211 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
1212 cd
->data
.tickles
= talloc(mem_ctx
, struct ctdb_tickle_list
);
1213 assert(cd
->data
.tickles
!= NULL
);
1214 fill_ctdb_tickle_list(mem_ctx
, cd
->data
.tickles
);
1217 case CTDB_CONTROL_SET_TCP_TICKLE_LIST
:
1220 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
1223 case CTDB_CONTROL_UPDATE_RECORD
:
1226 case CTDB_CONTROL_SEND_GRATUITOUS_ARP
:
1229 case CTDB_CONTROL_WIPE_DATABASE
:
1232 case CTDB_CONTROL_UPTIME
:
1233 cd
->data
.uptime
= talloc(mem_ctx
, struct ctdb_uptime
);
1234 assert(cd
->data
.uptime
!= NULL
);
1235 fill_ctdb_uptime(mem_ctx
, cd
->data
.uptime
);
1238 case CTDB_CONTROL_START_RECOVERY
:
1241 case CTDB_CONTROL_END_RECOVERY
:
1244 case CTDB_CONTROL_RELOAD_NODES_FILE
:
1247 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
1248 cd
->data
.recbuf
= talloc(mem_ctx
, struct ctdb_rec_buffer
);
1249 assert(cd
->data
.recbuf
!= NULL
);
1250 fill_ctdb_rec_buffer(mem_ctx
, cd
->data
.recbuf
);
1253 case CTDB_CONTROL_ENABLE_MONITOR
:
1256 case CTDB_CONTROL_DISABLE_MONITOR
:
1259 case CTDB_CONTROL_ADD_PUBLIC_IP
:
1262 case CTDB_CONTROL_DEL_PUBLIC_IP
:
1265 case CTDB_CONTROL_RUN_EVENTSCRIPTS
:
1268 case CTDB_CONTROL_GET_CAPABILITIES
:
1269 cd
->data
.caps
= rand32();
1272 case CTDB_CONTROL_START_PERSISTENT_UPDATE
:
1275 case CTDB_CONTROL_CANCEL_PERSISTENT_UPDATE
:
1278 case CTDB_CONTROL_RECD_PING
:
1281 case CTDB_CONTROL_RELEASE_IP
:
1284 case CTDB_CONTROL_TAKEOVER_IP
:
1287 case CTDB_CONTROL_GET_PUBLIC_IPS
:
1288 cd
->data
.pubip_list
= talloc(mem_ctx
, struct ctdb_public_ip_list
);
1289 assert(cd
->data
.pubip_list
!= NULL
);
1290 fill_ctdb_public_ip_list(mem_ctx
, cd
->data
.pubip_list
);
1293 case CTDB_CONTROL_GET_NODEMAP
:
1294 cd
->data
.nodemap
= talloc(mem_ctx
, struct ctdb_node_map
);
1295 assert(cd
->data
.nodemap
!= NULL
);
1296 fill_ctdb_node_map(mem_ctx
, cd
->data
.nodemap
);
1299 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
1300 cd
->data
.script_list
= talloc(mem_ctx
, struct ctdb_script_list
);
1301 assert(cd
->data
.script_list
!= NULL
);
1302 fill_ctdb_script_list(mem_ctx
, cd
->data
.script_list
);
1305 case CTDB_CONTROL_TRAVERSE_KILL
:
1308 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
1311 case CTDB_CONTROL_GET_RECLOCK_FILE
:
1312 fill_ctdb_string(mem_ctx
, &cd
->data
.reclock_file
);
1313 assert(cd
->data
.reclock_file
!= NULL
);
1316 case CTDB_CONTROL_STOP_NODE
:
1319 case CTDB_CONTROL_CONTINUE_NODE
:
1322 case CTDB_CONTROL_SET_LMASTERROLE
:
1325 case CTDB_CONTROL_SET_RECMASTERROLE
:
1328 case CTDB_CONTROL_ENABLE_SCRIPT
:
1331 case CTDB_CONTROL_DISABLE_SCRIPT
:
1334 case CTDB_CONTROL_SET_BAN_STATE
:
1337 case CTDB_CONTROL_GET_BAN_STATE
:
1338 cd
->data
.ban_state
= talloc(mem_ctx
, struct ctdb_ban_state
);
1339 assert(cd
->data
.ban_state
!= NULL
);
1340 fill_ctdb_ban_state(mem_ctx
, cd
->data
.ban_state
);
1343 case CTDB_CONTROL_REGISTER_NOTIFY
:
1346 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
1349 case CTDB_CONTROL_TRANS3_COMMIT
:
1352 case CTDB_CONTROL_GET_DB_SEQNUM
:
1353 cd
->data
.seqnum
= rand64();
1356 case CTDB_CONTROL_DB_SET_HEALTHY
:
1359 case CTDB_CONTROL_DB_GET_HEALTH
:
1360 fill_ctdb_string(mem_ctx
, &cd
->data
.reason
);
1361 assert(cd
->data
.reason
!= NULL
);
1364 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
1365 cd
->data
.ipinfo
= talloc(mem_ctx
, struct ctdb_public_ip_info
);
1366 assert(cd
->data
.ipinfo
!= NULL
);
1367 fill_ctdb_public_ip_info(mem_ctx
, cd
->data
.ipinfo
);
1370 case CTDB_CONTROL_GET_IFACES
:
1371 cd
->data
.iface_list
= talloc(mem_ctx
, struct ctdb_iface_list
);
1372 assert(cd
->data
.iface_list
!= NULL
);
1373 fill_ctdb_iface_list(mem_ctx
, cd
->data
.iface_list
);
1376 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
1379 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
1382 case CTDB_CONTROL_GET_STAT_HISTORY
:
1383 cd
->data
.stats_list
= talloc(mem_ctx
, struct ctdb_statistics_list
);
1384 assert(cd
->data
.stats_list
!= NULL
);
1385 fill_ctdb_statistics_list(mem_ctx
, cd
->data
.stats_list
);
1388 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
1391 case CTDB_CONTROL_SET_DB_READONLY
:
1394 case CTDB_CONTROL_CHECK_SRVIDS
:
1395 cd
->data
.u8_array
= talloc(mem_ctx
, struct ctdb_uint8_array
);
1396 assert(cd
->data
.u8_array
!= NULL
);
1397 fill_ctdb_uint8_array(mem_ctx
, cd
->data
.u8_array
);
1400 case CTDB_CONTROL_TRAVERSE_START_EXT
:
1403 case CTDB_CONTROL_GET_DB_STATISTICS
:
1404 cd
->data
.dbstats
= talloc(mem_ctx
, struct ctdb_db_statistics
);
1405 assert(cd
->data
.dbstats
!= NULL
);
1406 fill_ctdb_db_statistics(mem_ctx
, cd
->data
.dbstats
);
1409 case CTDB_CONTROL_SET_DB_STICKY
:
1412 case CTDB_CONTROL_RELOAD_PUBLIC_IPS
:
1415 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
1418 case CTDB_CONTROL_RECEIVE_RECORDS
:
1419 cd
->data
.recbuf
= talloc(mem_ctx
, struct ctdb_rec_buffer
);
1420 assert(cd
->data
.recbuf
!= NULL
);
1421 fill_ctdb_rec_buffer(mem_ctx
, cd
->data
.recbuf
);
1424 case CTDB_CONTROL_IPREALLOCATED
:
1427 case CTDB_CONTROL_GET_RUNSTATE
:
1428 cd
->data
.runstate
= rand32();
1431 case CTDB_CONTROL_DB_DETACH
:
1434 case CTDB_CONTROL_GET_NODES_FILE
:
1435 cd
->data
.nodemap
= talloc(mem_ctx
, struct ctdb_node_map
);
1436 assert(cd
->data
.nodemap
!= NULL
);
1437 fill_ctdb_node_map(mem_ctx
, cd
->data
.nodemap
);
1440 case CTDB_CONTROL_DB_PULL
:
1441 cd
->data
.num_records
= rand32();
1444 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
1445 cd
->data
.num_records
= rand32();
1451 static void verify_ctdb_reply_control_data(struct ctdb_reply_control_data
*cd
,
1452 struct ctdb_reply_control_data
*cd2
)
1454 assert(cd
->opcode
== cd2
->opcode
);
1456 switch (cd
->opcode
) {
1457 case CTDB_CONTROL_PROCESS_EXISTS
:
1460 case CTDB_CONTROL_STATISTICS
:
1461 verify_ctdb_statistics(cd
->data
.stats
, cd2
->data
.stats
);
1464 case CTDB_CONTROL_PING
:
1467 case CTDB_CONTROL_GETDBPATH
:
1468 verify_ctdb_string(cd
->data
.db_path
, cd2
->data
.db_path
);
1471 case CTDB_CONTROL_GETVNNMAP
:
1472 verify_ctdb_vnn_map(cd
->data
.vnnmap
, cd2
->data
.vnnmap
);
1475 case CTDB_CONTROL_SETVNNMAP
:
1478 case CTDB_CONTROL_GET_DEBUG
:
1479 assert(cd
->data
.loglevel
== cd2
->data
.loglevel
);
1482 case CTDB_CONTROL_SET_DEBUG
:
1485 case CTDB_CONTROL_GET_DBMAP
:
1486 verify_ctdb_dbid_map(cd
->data
.dbmap
, cd2
->data
.dbmap
);
1489 case CTDB_CONTROL_PULL_DB
:
1490 verify_ctdb_rec_buffer(cd
->data
.recbuf
, cd2
->data
.recbuf
);
1493 case CTDB_CONTROL_PUSH_DB
:
1496 case CTDB_CONTROL_GET_RECMODE
:
1499 case CTDB_CONTROL_SET_RECMODE
:
1502 case CTDB_CONTROL_STATISTICS_RESET
:
1505 case CTDB_CONTROL_DB_ATTACH
:
1506 assert(cd
->data
.db_id
== cd2
->data
.db_id
);
1509 case CTDB_CONTROL_SET_CALL
:
1512 case CTDB_CONTROL_TRAVERSE_START
:
1515 case CTDB_CONTROL_TRAVERSE_ALL
:
1518 case CTDB_CONTROL_TRAVERSE_DATA
:
1521 case CTDB_CONTROL_REGISTER_SRVID
:
1524 case CTDB_CONTROL_DEREGISTER_SRVID
:
1527 case CTDB_CONTROL_GET_DBNAME
:
1528 verify_ctdb_string(cd
->data
.db_name
, cd2
->data
.db_name
);
1531 case CTDB_CONTROL_ENABLE_SEQNUM
:
1534 case CTDB_CONTROL_UPDATE_SEQNUM
:
1537 case CTDB_CONTROL_DUMP_MEMORY
:
1538 verify_ctdb_string(cd
->data
.mem_str
, cd2
->data
.mem_str
);
1541 case CTDB_CONTROL_GET_PID
:
1544 case CTDB_CONTROL_GET_RECMASTER
:
1547 case CTDB_CONTROL_SET_RECMASTER
:
1550 case CTDB_CONTROL_FREEZE
:
1553 case CTDB_CONTROL_GET_PNN
:
1556 case CTDB_CONTROL_SHUTDOWN
:
1559 case CTDB_CONTROL_GET_MONMODE
:
1562 case CTDB_CONTROL_TCP_CLIENT
:
1565 case CTDB_CONTROL_TCP_ADD
:
1568 case CTDB_CONTROL_TCP_REMOVE
:
1571 case CTDB_CONTROL_STARTUP
:
1574 case CTDB_CONTROL_SET_TUNABLE
:
1577 case CTDB_CONTROL_GET_TUNABLE
:
1578 assert(cd
->data
.tun_value
== cd2
->data
.tun_value
);
1581 case CTDB_CONTROL_LIST_TUNABLES
:
1582 verify_ctdb_var_list(cd
->data
.tun_var_list
,
1583 cd2
->data
.tun_var_list
);
1586 case CTDB_CONTROL_MODIFY_FLAGS
:
1589 case CTDB_CONTROL_GET_ALL_TUNABLES
:
1590 verify_ctdb_tunable_list(cd
->data
.tun_list
, cd2
->data
.tun_list
);
1593 case CTDB_CONTROL_GET_TCP_TICKLE_LIST
:
1594 verify_ctdb_tickle_list(cd
->data
.tickles
, cd2
->data
.tickles
);
1597 case CTDB_CONTROL_SET_TCP_TICKLE_LIST
:
1600 case CTDB_CONTROL_DB_ATTACH_PERSISTENT
:
1603 case CTDB_CONTROL_UPDATE_RECORD
:
1606 case CTDB_CONTROL_SEND_GRATUITOUS_ARP
:
1609 case CTDB_CONTROL_WIPE_DATABASE
:
1612 case CTDB_CONTROL_UPTIME
:
1613 verify_ctdb_uptime(cd
->data
.uptime
, cd2
->data
.uptime
);
1616 case CTDB_CONTROL_START_RECOVERY
:
1619 case CTDB_CONTROL_END_RECOVERY
:
1622 case CTDB_CONTROL_RELOAD_NODES_FILE
:
1625 case CTDB_CONTROL_TRY_DELETE_RECORDS
:
1626 verify_ctdb_rec_buffer(cd
->data
.recbuf
, cd2
->data
.recbuf
);
1629 case CTDB_CONTROL_ENABLE_MONITOR
:
1632 case CTDB_CONTROL_DISABLE_MONITOR
:
1635 case CTDB_CONTROL_ADD_PUBLIC_IP
:
1638 case CTDB_CONTROL_DEL_PUBLIC_IP
:
1641 case CTDB_CONTROL_RUN_EVENTSCRIPTS
:
1644 case CTDB_CONTROL_GET_CAPABILITIES
:
1645 assert(cd
->data
.caps
== cd2
->data
.caps
);
1648 case CTDB_CONTROL_RECD_PING
:
1651 case CTDB_CONTROL_RELEASE_IP
:
1654 case CTDB_CONTROL_TAKEOVER_IP
:
1657 case CTDB_CONTROL_GET_PUBLIC_IPS
:
1658 verify_ctdb_public_ip_list(cd
->data
.pubip_list
,
1659 cd2
->data
.pubip_list
);
1662 case CTDB_CONTROL_GET_NODEMAP
:
1663 verify_ctdb_node_map(cd
->data
.nodemap
, cd2
->data
.nodemap
);
1666 case CTDB_CONTROL_GET_EVENT_SCRIPT_STATUS
:
1667 verify_ctdb_script_list(cd
->data
.script_list
,
1668 cd2
->data
.script_list
);
1671 case CTDB_CONTROL_TRAVERSE_KILL
:
1674 case CTDB_CONTROL_RECD_RECLOCK_LATENCY
:
1677 case CTDB_CONTROL_GET_RECLOCK_FILE
:
1678 verify_ctdb_string(cd
->data
.reclock_file
,
1679 cd2
->data
.reclock_file
);
1682 case CTDB_CONTROL_STOP_NODE
:
1685 case CTDB_CONTROL_CONTINUE_NODE
:
1688 case CTDB_CONTROL_SET_LMASTERROLE
:
1691 case CTDB_CONTROL_SET_RECMASTERROLE
:
1694 case CTDB_CONTROL_ENABLE_SCRIPT
:
1697 case CTDB_CONTROL_DISABLE_SCRIPT
:
1700 case CTDB_CONTROL_SET_BAN_STATE
:
1703 case CTDB_CONTROL_GET_BAN_STATE
:
1704 verify_ctdb_ban_state(cd
->data
.ban_state
, cd2
->data
.ban_state
);
1707 case CTDB_CONTROL_REGISTER_NOTIFY
:
1710 case CTDB_CONTROL_DEREGISTER_NOTIFY
:
1713 case CTDB_CONTROL_TRANS3_COMMIT
:
1716 case CTDB_CONTROL_GET_DB_SEQNUM
:
1717 assert(cd
->data
.seqnum
== cd2
->data
.seqnum
);
1720 case CTDB_CONTROL_DB_SET_HEALTHY
:
1723 case CTDB_CONTROL_DB_GET_HEALTH
:
1724 verify_ctdb_string(cd
->data
.reason
, cd2
->data
.reason
);
1727 case CTDB_CONTROL_GET_PUBLIC_IP_INFO
:
1728 verify_ctdb_public_ip_info(cd
->data
.ipinfo
, cd2
->data
.ipinfo
);
1731 case CTDB_CONTROL_GET_IFACES
:
1732 verify_ctdb_iface_list(cd
->data
.iface_list
,
1733 cd2
->data
.iface_list
);
1736 case CTDB_CONTROL_SET_IFACE_LINK_STATE
:
1739 case CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE
:
1742 case CTDB_CONTROL_GET_STAT_HISTORY
:
1743 verify_ctdb_statistics_list(cd
->data
.stats_list
,
1744 cd2
->data
.stats_list
);
1747 case CTDB_CONTROL_SCHEDULE_FOR_DELETION
:
1750 case CTDB_CONTROL_SET_DB_READONLY
:
1753 case CTDB_CONTROL_CHECK_SRVIDS
:
1754 verify_ctdb_uint8_array(cd
->data
.u8_array
, cd2
->data
.u8_array
);
1757 case CTDB_CONTROL_TRAVERSE_START_EXT
:
1760 case CTDB_CONTROL_GET_DB_STATISTICS
:
1761 verify_ctdb_db_statistics(cd
->data
.dbstats
, cd2
->data
.dbstats
);
1764 case CTDB_CONTROL_SET_DB_STICKY
:
1767 case CTDB_CONTROL_RELOAD_PUBLIC_IPS
:
1770 case CTDB_CONTROL_TRAVERSE_ALL_EXT
:
1773 case CTDB_CONTROL_RECEIVE_RECORDS
:
1774 verify_ctdb_rec_buffer(cd
->data
.recbuf
, cd2
->data
.recbuf
);
1777 case CTDB_CONTROL_IPREALLOCATED
:
1780 case CTDB_CONTROL_GET_RUNSTATE
:
1781 assert(cd
->data
.runstate
== cd2
->data
.runstate
);
1784 case CTDB_CONTROL_DB_DETACH
:
1787 case CTDB_CONTROL_GET_NODES_FILE
:
1788 verify_ctdb_node_map(cd
->data
.nodemap
, cd2
->data
.nodemap
);
1791 case CTDB_CONTROL_DB_PULL
:
1792 assert(cd
->data
.num_records
== cd2
->data
.num_records
);
1795 case CTDB_CONTROL_DB_PUSH_CONFIRM
:
1796 assert(cd
->data
.num_records
== cd2
->data
.num_records
);
1802 static void fill_ctdb_reply_control(TALLOC_CTX
*mem_ctx
,
1803 struct ctdb_reply_control
*c
,
1806 c
->status
= -rand_int(2);
1807 if (c
->status
== 0) {
1809 fill_ctdb_reply_control_data(mem_ctx
, &c
->rdata
, opcode
);
1811 fill_ctdb_string(mem_ctx
, &c
->errmsg
);
1815 static void verify_ctdb_reply_control(struct ctdb_reply_control
*c
,
1816 struct ctdb_reply_control
*c2
)
1818 assert(c
->status
== c2
->status
);
1819 verify_ctdb_string(c
->errmsg
, c2
->errmsg
);
1820 if (c
->status
== 0) {
1821 verify_ctdb_reply_control_data(&c
->rdata
, &c2
->rdata
);
1825 static void fill_ctdb_req_message_data(TALLOC_CTX
*mem_ctx
,
1826 struct ctdb_req_message_data
*c
)
1828 c
->srvid
= rand64();
1829 fill_tdb_data(mem_ctx
, &c
->data
);
1832 static void verify_ctdb_req_message_data(struct ctdb_req_message_data
*c
,
1833 struct ctdb_req_message_data
*c2
)
1835 assert(c
->srvid
== c2
->srvid
);
1836 verify_tdb_data(&c
->data
, &c2
->data
);
1840 * Functions to test marshalling
1843 static void test_ctdb_req_header(void)
1845 TALLOC_CTX
*mem_ctx
;
1848 struct ctdb_req_header h
, h2
;
1851 printf("ctdb_req_header\n");
1854 mem_ctx
= talloc_new(NULL
);
1855 assert(mem_ctx
!= NULL
);
1857 ctdb_req_header_fill(&h
, GENERATION
, OPERATION
, DESTNODE
, SRCNODE
,
1860 ret
= ctdb_allocate_pkt(mem_ctx
, ctdb_req_header_len(&h
),
1863 assert(pkt
!= NULL
);
1864 assert(pkt_len
>= ctdb_req_header_len(&h
));
1866 ctdb_req_header_push(&h
, pkt
);
1868 ret
= ctdb_req_header_pull(pkt
, pkt_len
, &h2
);
1871 verify_ctdb_req_header(&h
, &h2
);
1873 talloc_free(mem_ctx
);
1876 static void test_req_call_test(void)
1878 TALLOC_CTX
*mem_ctx
;
1880 size_t datalen
, pkt_len
, len
;
1882 struct ctdb_req_header h
, h2
;
1883 struct ctdb_req_call c
, c2
;
1885 printf("ctdb_req_call\n");
1888 mem_ctx
= talloc_new(NULL
);
1889 assert(mem_ctx
!= NULL
);
1891 ctdb_req_header_fill(&h
, GENERATION
, CTDB_REQ_CALL
,
1892 DESTNODE
, SRCNODE
, REQID
);
1894 fill_ctdb_req_call(mem_ctx
, &c
);
1895 datalen
= ctdb_req_call_len(&h
, &c
);
1896 ret
= ctdb_allocate_pkt(mem_ctx
, datalen
, &pkt
, &pkt_len
);
1898 assert(pkt
!= NULL
);
1899 assert(pkt_len
>= datalen
);
1901 ret
= ctdb_req_call_push(&h
, &c
, pkt
, &len
);
1902 assert(ret
== EMSGSIZE
);
1903 assert(len
== datalen
);
1904 ret
= ctdb_req_call_push(&h
, &c
, pkt
, &pkt_len
);
1906 ret
= ctdb_req_call_pull(pkt
, pkt_len
, &h2
, mem_ctx
, &c2
);
1908 verify_ctdb_req_header(&h
, &h2
);
1909 assert(h2
.length
== pkt_len
);
1910 verify_ctdb_req_call(&c
, &c2
);
1912 talloc_free(mem_ctx
);
1915 static void test_reply_call_test(void)
1917 TALLOC_CTX
*mem_ctx
;
1919 size_t datalen
, pkt_len
, len
;
1921 struct ctdb_req_header h
, h2
;
1922 struct ctdb_reply_call c
, c2
;
1924 printf("ctdb_reply_call\n");
1927 mem_ctx
= talloc_new(NULL
);
1928 assert(mem_ctx
!= NULL
);
1930 ctdb_req_header_fill(&h
, GENERATION
, CTDB_REPLY_CALL
,
1931 DESTNODE
, SRCNODE
, REQID
);
1933 fill_ctdb_reply_call(mem_ctx
, &c
);
1934 datalen
= ctdb_reply_call_len(&h
, &c
);
1935 ret
= ctdb_allocate_pkt(mem_ctx
, datalen
, &pkt
, &pkt_len
);
1937 assert(pkt
!= NULL
);
1938 assert(pkt_len
>= datalen
);
1940 ret
= ctdb_reply_call_push(&h
, &c
, pkt
, &len
);
1941 assert(ret
== EMSGSIZE
);
1942 assert(len
== datalen
);
1943 ret
= ctdb_reply_call_push(&h
, &c
, pkt
, &pkt_len
);
1945 ret
= ctdb_reply_call_pull(pkt
, pkt_len
, &h2
, mem_ctx
, &c2
);
1947 verify_ctdb_req_header(&h
, &h2
);
1948 assert(h2
.length
== pkt_len
);
1949 verify_ctdb_reply_call(&c
, &c2
);
1951 talloc_free(mem_ctx
);
1954 static void test_reply_error_test(void)
1956 TALLOC_CTX
*mem_ctx
;
1958 size_t datalen
, pkt_len
, len
;
1960 struct ctdb_req_header h
, h2
;
1961 struct ctdb_reply_error c
, c2
;
1963 printf("ctdb_reply_error\n");
1966 mem_ctx
= talloc_new(NULL
);
1967 assert(mem_ctx
!= NULL
);
1969 ctdb_req_header_fill(&h
, GENERATION
, CTDB_REPLY_ERROR
,
1970 DESTNODE
, SRCNODE
, REQID
);
1972 fill_ctdb_reply_error(mem_ctx
, &c
);
1973 datalen
= ctdb_reply_error_len(&h
, &c
);
1974 ret
= ctdb_allocate_pkt(mem_ctx
, datalen
, &pkt
, &pkt_len
);
1976 assert(pkt
!= NULL
);
1977 assert(pkt_len
>= datalen
);
1979 ret
= ctdb_reply_error_push(&h
, &c
, pkt
, &len
);
1980 assert(ret
== EMSGSIZE
);
1981 assert(len
== datalen
);
1982 ret
= ctdb_reply_error_push(&h
, &c
, pkt
, &pkt_len
);
1984 ret
= ctdb_reply_error_pull(pkt
, pkt_len
, &h2
, mem_ctx
, &c2
);
1986 verify_ctdb_req_header(&h
, &h2
);
1987 assert(h2
.length
== pkt_len
);
1988 verify_ctdb_reply_error(&c
, &c2
);
1990 talloc_free(mem_ctx
);
1993 static void test_req_dmaster_test(void)
1995 TALLOC_CTX
*mem_ctx
;
1997 size_t datalen
, pkt_len
, len
;
1999 struct ctdb_req_header h
, h2
;
2000 struct ctdb_req_dmaster c
, c2
;
2002 printf("ctdb_req_dmaster\n");
2005 mem_ctx
= talloc_new(NULL
);
2006 assert(mem_ctx
!= NULL
);
2008 ctdb_req_header_fill(&h
, GENERATION
, CTDB_REQ_DMASTER
,
2009 DESTNODE
, SRCNODE
, REQID
);
2011 fill_ctdb_req_dmaster(mem_ctx
, &c
);
2012 datalen
= ctdb_req_dmaster_len(&h
, &c
);
2013 ret
= ctdb_allocate_pkt(mem_ctx
, datalen
, &pkt
, &pkt_len
);
2015 assert(pkt
!= NULL
);
2016 assert(pkt_len
>= datalen
);
2018 ret
= ctdb_req_dmaster_push(&h
, &c
, pkt
, &len
);
2019 assert(ret
== EMSGSIZE
);
2020 assert(len
== datalen
);
2021 ret
= ctdb_req_dmaster_push(&h
, &c
, pkt
, &pkt_len
);
2023 ret
= ctdb_req_dmaster_pull(pkt
, pkt_len
, &h2
, mem_ctx
, &c2
);
2025 verify_ctdb_req_header(&h
, &h2
);
2026 assert(h2
.length
== pkt_len
);
2027 verify_ctdb_req_dmaster(&c
, &c2
);
2029 talloc_free(mem_ctx
);
2032 static void test_reply_dmaster_test(void)
2034 TALLOC_CTX
*mem_ctx
;
2036 size_t datalen
, pkt_len
, len
;
2038 struct ctdb_req_header h
, h2
;
2039 struct ctdb_reply_dmaster c
, c2
;
2041 printf("ctdb_reply_dmaster\n");
2044 mem_ctx
= talloc_new(NULL
);
2045 assert(mem_ctx
!= NULL
);
2047 ctdb_req_header_fill(&h
, GENERATION
, CTDB_REPLY_DMASTER
,
2048 DESTNODE
, SRCNODE
, REQID
);
2050 fill_ctdb_reply_dmaster(mem_ctx
, &c
);
2051 datalen
= ctdb_reply_dmaster_len(&h
, &c
);
2052 ret
= ctdb_allocate_pkt(mem_ctx
, datalen
, &pkt
, &pkt_len
);
2054 assert(pkt
!= NULL
);
2055 assert(pkt_len
>= datalen
);
2057 ret
= ctdb_reply_dmaster_push(&h
, &c
, pkt
, &len
);
2058 assert(ret
== EMSGSIZE
);
2059 assert(len
== datalen
);
2060 ret
= ctdb_reply_dmaster_push(&h
, &c
, pkt
, &pkt_len
);
2062 ret
= ctdb_reply_dmaster_pull(pkt
, pkt_len
, &h2
, mem_ctx
, &c2
);
2064 verify_ctdb_req_header(&h
, &h2
);
2065 assert(h2
.length
== pkt_len
);
2066 verify_ctdb_reply_dmaster(&c
, &c2
);
2068 talloc_free(mem_ctx
);
2071 #define NUM_CONTROLS 149
2073 static void test_req_control_data_test(void)
2075 TALLOC_CTX
*mem_ctx
;
2078 struct ctdb_req_control_data cd
, cd2
;
2081 printf("ctdb_req_control_data\n");
2084 for (opcode
=0; opcode
<NUM_CONTROLS
; opcode
++) {
2085 mem_ctx
= talloc_new(NULL
);
2086 assert(mem_ctx
!= NULL
);
2088 printf("%u.. ", opcode
);
2090 fill_ctdb_req_control_data(mem_ctx
, &cd
, opcode
);
2091 buflen
= ctdb_req_control_data_len(&cd
);
2092 ctdb_req_control_data_push(&cd
, BUFFER
);
2093 ret
= ctdb_req_control_data_pull(BUFFER
, buflen
, opcode
, mem_ctx
, &cd2
);
2095 verify_ctdb_req_control_data(&cd
, &cd2
);
2096 talloc_free(mem_ctx
);
2103 static void test_reply_control_data_test(void)
2105 TALLOC_CTX
*mem_ctx
;
2108 struct ctdb_reply_control_data cd
, cd2
;
2111 printf("ctdb_reply_control_data\n");
2114 for (opcode
=0; opcode
<NUM_CONTROLS
; opcode
++) {
2115 mem_ctx
= talloc_new(NULL
);
2116 assert(mem_ctx
!= NULL
);
2118 printf("%u.. ", opcode
);
2120 fill_ctdb_reply_control_data(mem_ctx
, &cd
, opcode
);
2121 buflen
= ctdb_reply_control_data_len(&cd
);
2122 ctdb_reply_control_data_push(&cd
, BUFFER
);
2123 ret
= ctdb_reply_control_data_pull(BUFFER
, buflen
, opcode
, mem_ctx
, &cd2
);
2125 verify_ctdb_reply_control_data(&cd
, &cd2
);
2126 talloc_free(mem_ctx
);
2133 static void test_req_control_test(void)
2135 TALLOC_CTX
*mem_ctx
;
2137 size_t datalen
, pkt_len
, len
;
2139 struct ctdb_req_header h
, h2
;
2140 struct ctdb_req_control c
, c2
;
2143 printf("ctdb_req_control\n");
2146 ctdb_req_header_fill(&h
, GENERATION
, CTDB_REQ_CONTROL
,
2147 DESTNODE
, SRCNODE
, REQID
);
2149 for (opcode
=0; opcode
<NUM_CONTROLS
; opcode
++) {
2150 mem_ctx
= talloc_new(NULL
);
2151 assert(mem_ctx
!= NULL
);
2153 printf("%u.. ", opcode
);
2155 fill_ctdb_req_control(mem_ctx
, &c
, opcode
);
2156 datalen
= ctdb_req_control_len(&h
, &c
);
2157 ret
= ctdb_allocate_pkt(mem_ctx
, datalen
, &pkt
, &pkt_len
);
2159 assert(pkt
!= NULL
);
2160 assert(pkt_len
>= datalen
);
2162 ret
= ctdb_req_control_push(&h
, &c
, pkt
, &len
);
2163 assert(ret
== EMSGSIZE
);
2164 assert(len
== datalen
);
2165 ret
= ctdb_req_control_push(&h
, &c
, pkt
, &pkt_len
);
2167 ret
= ctdb_req_control_pull(pkt
, pkt_len
, &h2
, mem_ctx
, &c2
);
2169 verify_ctdb_req_header(&h
, &h2
);
2170 assert(h2
.length
== pkt_len
);
2171 verify_ctdb_req_control(&c
, &c2
);
2173 talloc_free(mem_ctx
);
2180 static void test_reply_control_test(void)
2182 TALLOC_CTX
*mem_ctx
;
2184 size_t datalen
, pkt_len
, len
;
2186 struct ctdb_req_header h
, h2
;
2187 struct ctdb_reply_control c
, c2
;
2190 printf("ctdb_reply_control\n");
2193 ctdb_req_header_fill(&h
, GENERATION
, CTDB_REPLY_CONTROL
,
2194 DESTNODE
, SRCNODE
, REQID
);
2196 for (opcode
=0; opcode
<NUM_CONTROLS
; opcode
++) {
2197 mem_ctx
= talloc_new(NULL
);
2198 assert(mem_ctx
!= NULL
);
2200 printf("%u.. ", opcode
);
2202 fill_ctdb_reply_control(mem_ctx
, &c
, opcode
);
2203 datalen
= ctdb_reply_control_len(&h
, &c
);
2204 ret
= ctdb_allocate_pkt(mem_ctx
, datalen
, &pkt
, &pkt_len
);
2206 assert(pkt
!= NULL
);
2207 assert(pkt_len
>= datalen
);
2209 ret
= ctdb_reply_control_push(&h
, &c
, pkt
, &len
);
2210 assert(ret
== EMSGSIZE
);
2211 assert(len
== datalen
);
2212 ret
= ctdb_reply_control_push(&h
, &c
, pkt
, &pkt_len
);
2214 ret
= ctdb_reply_control_pull(pkt
, pkt_len
, opcode
, &h2
, mem_ctx
, &c2
);
2216 verify_ctdb_req_header(&h
, &h2
);
2217 assert(h2
.length
== pkt_len
);
2218 verify_ctdb_reply_control(&c
, &c2
);
2220 talloc_free(mem_ctx
);
2227 static void test_req_message_test(void)
2229 TALLOC_CTX
*mem_ctx
;
2231 size_t datalen
, pkt_len
, len
;
2233 struct ctdb_req_header h
, h2
;
2234 struct ctdb_req_message_data c
, c2
;
2236 printf("ctdb_req_message\n");
2239 mem_ctx
= talloc_new(NULL
);
2240 assert(mem_ctx
!= NULL
);
2242 ctdb_req_header_fill(&h
, GENERATION
, CTDB_REQ_MESSAGE
,
2243 DESTNODE
, SRCNODE
, REQID
);
2245 fill_ctdb_req_message_data(mem_ctx
, &c
);
2246 datalen
= ctdb_req_message_data_len(&h
, &c
);
2247 ret
= ctdb_allocate_pkt(mem_ctx
, datalen
, &pkt
, &pkt_len
);
2249 assert(pkt
!= NULL
);
2250 assert(pkt_len
>= datalen
);
2252 ret
= ctdb_req_message_data_push(&h
, &c
, pkt
, &len
);
2253 assert(ret
== EMSGSIZE
);
2254 assert(len
== datalen
);
2255 ret
= ctdb_req_message_data_push(&h
, &c
, pkt
, &pkt_len
);
2257 ret
= ctdb_req_message_data_pull(pkt
, pkt_len
, &h2
, mem_ctx
, &c2
);
2259 verify_ctdb_req_header(&h
, &h2
);
2260 assert(h2
.length
== pkt_len
);
2261 verify_ctdb_req_message_data(&c
, &c2
);
2263 talloc_free(mem_ctx
);
2266 int main(int argc
, char *argv
[])
2269 int seed
= atoi(argv
[1]);
2273 test_ctdb_req_header();
2275 test_req_call_test();
2276 test_reply_call_test();
2277 test_reply_error_test();
2278 test_req_dmaster_test();
2279 test_reply_dmaster_test();
2281 test_req_control_data_test();
2282 test_reply_control_data_test();
2284 test_req_control_test();
2285 test_reply_control_test();
2287 test_req_message_test();