corosync
lib/votequorum.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2009-2012 Red Hat, Inc.
3 *
4 * All rights reserved.
5 *
6 * Author: Christine Caulfield (ccaulfie@redhat.com)
7 *
8 * This software licensed under BSD license, the text of which follows:
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions are met:
12 *
13 * - Redistributions of source code must retain the above copyright notice,
14 * this list of conditions and the following disclaimer.
15 * - Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
18 * - Neither the name of the MontaVista Software, Inc. nor the names of its
19 * contributors may be used to endorse or promote products derived from this
20 * software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32 * THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35/*
36 * Provides a quorum API using the corosync executive
37 */
38
39#include <config.h>
40
41#include <stdio.h>
42#include <stdlib.h>
43#include <string.h>
44#include <unistd.h>
45#include <sys/types.h>
46#include <sys/socket.h>
47#include <sys/uio.h>
48#include <errno.h>
49
50#include <qb/qbdefs.h>
51#include <qb/qbipcc.h>
52
53#include <corosync/corotypes.h>
54#include <corosync/corodefs.h>
55#include <corosync/hdb.h>
56
57#include <corosync/votequorum.h>
59
60#include "util.h"
61
68
69static void votequorum_inst_free (void *inst);
70
72
89
91 votequorum_handle_t *handle,
92 const votequorum_model_v1_data_t *model)
93{
96
97 error = hdb_error_to_cs(hdb_handle_create (&votequorum_handle_t_db, sizeof (struct votequorum_inst), handle));
98 if (error != CS_OK) {
100 }
101
102 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, *handle, (void *)&votequorum_inst));
103 if (error != CS_OK) {
104 goto error_destroy;
105 }
106
109 if (votequorum_inst->c == NULL) {
112 }
113
114 if (model)
115 memcpy(&votequorum_inst->callbacks, model, sizeof (*model));
116 else
117 memset(&votequorum_inst->callbacks, 0, sizeof (*model));
118
119 hdb_handle_put (&votequorum_handle_t_db, *handle);
120
121 return (CS_OK);
122
124 hdb_handle_put (&votequorum_handle_t_db, *handle);
126 hdb_handle_destroy (&votequorum_handle_t_db, *handle);
128 return (error);
129}
130
131static void votequorum_inst_free (void *inst)
132{
133 struct votequorum_inst *vq_inst = (struct votequorum_inst *)inst;
135}
136
138 votequorum_handle_t handle)
139{
142
143 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
144 if (error != CS_OK) {
145 return (error);
146 }
147
148 /*
149 * Another thread has already started finalizing
150 */
152 hdb_handle_put (&votequorum_handle_t_db, handle);
153 return (CS_ERR_BAD_HANDLE);
154 }
155
157
158 hdb_handle_destroy (&votequorum_handle_t_db, handle);
159
160 hdb_handle_put (&votequorum_handle_t_db, handle);
161
162 return (CS_OK);
163}
164
165
167 votequorum_handle_t handle,
168 unsigned int nodeid,
169 struct votequorum_info *info)
170{
173 struct iovec iov;
176
177 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
178 if (error != CS_OK) {
179 return (error);
180 }
181
182 req_lib_votequorum_getinfo.header.size = sizeof (struct req_lib_votequorum_getinfo);
185
186 iov.iov_base = (char *)&req_lib_votequorum_getinfo;
187 iov.iov_len = sizeof (struct req_lib_votequorum_getinfo);
188
191 &iov,
192 1,
195
196 if (error != CS_OK) {
197 goto error_exit;
198 }
199
200 error = res_lib_votequorum_getinfo.header.error;
201
205 info->node_expected_votes = res_lib_votequorum_getinfo.expected_votes;
213
215 hdb_handle_put (&votequorum_handle_t_db, handle);
216
217 return (error);
218}
219
221 votequorum_handle_t handle,
222 unsigned int expected_votes)
223{
226 struct iovec iov;
229
230 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
231 if (error != CS_OK) {
232 return (error);
233 }
234
235
239
240 iov.iov_base = (char *)&req_lib_votequorum_setexpected;
241 iov.iov_len = sizeof (struct req_lib_votequorum_setexpected);
242
245 &iov,
246 1,
249
250 if (error != CS_OK) {
251 goto error_exit;
252 }
253
254 error = res_lib_votequorum_status.header.error;
255
257 hdb_handle_put (&votequorum_handle_t_db, handle);
258
259 return (error);
260}
261
263 votequorum_handle_t handle,
264 unsigned int nodeid,
265 unsigned int votes)
266{
269 struct iovec iov;
272
273 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
274 if (error != CS_OK) {
275 return (error);
276 }
277
278 req_lib_votequorum_setvotes.header.size = sizeof (struct req_lib_votequorum_setvotes);
282
283 iov.iov_base = (char *)&req_lib_votequorum_setvotes;
284 iov.iov_len = sizeof (struct req_lib_votequorum_setvotes);
285
288 &iov,
289 1,
292
293 if (error != CS_OK) {
294 goto error_exit;
295 }
296
297 error = res_lib_votequorum_status.header.error;
298
300 hdb_handle_put (&votequorum_handle_t_db, handle);
301
302 return (error);
303}
304
306 votequorum_handle_t handle,
307 uint64_t context,
308 unsigned int flags)
309{
312 struct iovec iov;
315
316 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
317 if (error != CS_OK) {
318 return (error);
319 }
320
325
326 iov.iov_base = (char *)&req_lib_votequorum_trackstart;
327 iov.iov_len = sizeof (struct req_lib_votequorum_trackstart);
328
331 &iov,
332 1,
335
336 if (error != CS_OK) {
337 goto error_exit;
338 }
339
340 error = res_lib_votequorum_status.header.error;
341
343 hdb_handle_put (&votequorum_handle_t_db, handle);
344
345 return (error);
346}
347
349 votequorum_handle_t handle)
350{
353 struct iovec iov;
356
357 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
358 if (error != CS_OK) {
359 return (error);
360 }
361
362 req_lib_votequorum_general.header.size = sizeof (struct req_lib_votequorum_general);
364
365 iov.iov_base = (char *)&req_lib_votequorum_general;
366 iov.iov_len = sizeof (struct req_lib_votequorum_general);
367
370 &iov,
371 1,
374
375 if (error != CS_OK) {
376 goto error_exit;
377 }
378
379 error = res_lib_votequorum_status.header.error;
380
382 hdb_handle_put (&votequorum_handle_t_db, handle);
383
384 return (error);
385}
386
387
389 votequorum_handle_t handle,
390 void **context)
391{
394
395 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
396 if (error != CS_OK) {
397 return (error);
398 }
399
401
402 hdb_handle_put (&votequorum_handle_t_db, handle);
403
404 return (CS_OK);
405}
406
408 votequorum_handle_t handle,
409 void *context)
410{
413
414 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
415 if (error != CS_OK) {
416 return (error);
417 }
418
420
421 hdb_handle_put (&votequorum_handle_t_db, handle);
422
423 return (CS_OK);
424}
425
426
428 votequorum_handle_t handle,
429 int *fd)
430{
433
434 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
435 if (error != CS_OK) {
436 return (error);
437 }
438
440
441 (void)hdb_handle_put (&votequorum_handle_t_db, handle);
442
443 return (error);
444}
445
447 votequorum_handle_t handle,
449{
450 int timeout = -1;
452 int cont = 1; /* always continue do loop except when set to 0 */
462
467
468 return (CS_ERR_INVALID_PARAM);
469 }
470
471 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle,
472 (void *)&votequorum_inst));
473 if (error != CS_OK) {
474 return (error);
475 }
476
477 /*
478 * Timeout instantly for CS_DISPATCH_ONE_NONBLOCKING or CS_DISPATCH_ALL and
479 * wait indefinately for CS_DISPATCH_ONE or CS_DISPATCH_BLOCKING
480 */
482 timeout = 0;
483 }
484
486 do {
491 timeout));
492 if (error == CS_ERR_BAD_HANDLE) {
493 error = CS_OK;
494 goto error_put;
495 }
496 if (error == CS_ERR_TRY_AGAIN) {
498 /*
499 * Don't mask error
500 */
501 goto error_put;
502 }
503 error = CS_OK;
505 break; /* exit do while cont is 1 loop */
506 } else {
507 continue; /* next poll */
508 }
509 }
510 if (error != CS_OK) {
511 goto error_put;
512 }
513
514 /*
515 * Make copy of callbacks, message data, unlock instance, and call callback
516 * A risk of this dispatch method is that the callback routines may
517 * operate at the same time that votequorum_finalize has been called in another thread.
518 */
520
521 /*
522 * Dispatch incoming message
523 */
524 switch (dispatch_data->id) {
525
527 if (callbacks.votequorum_quorum_notify_fn == NULL) {
528 break;
529 }
531
532 callbacks.votequorum_quorum_notify_fn ( handle,
537 break;
538
540 if (callbacks.votequorum_nodelist_notify_fn == NULL) {
541 break;
542 }
544 marshall_from_mar_votequorum_ring_id (&ring_id, &res_lib_votequorum_nodelist_notification->ring_id);
545
546 callbacks.votequorum_nodelist_notify_fn ( handle,
548 ring_id,
551 break;
552
554 if (callbacks.votequorum_expectedvotes_notify_fn == NULL) {
555 break;
556 }
558
559 callbacks.votequorum_expectedvotes_notify_fn ( handle,
562 break;
563
565 if (callbacks.votequorum_qdevice_extra_info_fn == NULL) {
566 break;
567 }
569
570 callbacks.votequorum_qdevice_extra_info_fn(handle,
575 break;
576
577 default:
579 goto error_put;
580 break;
581 }
583 /*
584 * If the finalize has been called then get out of the dispatch.
585 */
587 goto error_put;
588 }
589
590 /*
591 * Determine if more messages should be processed
592 */
594 cont = 0;
595 }
596 } while (cont);
597
598
600 hdb_handle_put (&votequorum_handle_t_db, handle);
601 return (error);
602}
603
605 votequorum_handle_t handle,
606 const char *name)
607{
610 struct iovec iov;
613
614 if ((strlen(name) == 0) ||
617 }
618
619 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
620 if (error != CS_OK) {
621 return (error);
622 }
623
624
628
629 iov.iov_base = (char *)&req_lib_votequorum_qdevice_register;
630 iov.iov_len = sizeof (struct req_lib_votequorum_qdevice_register);
631
634 &iov,
635 1,
638
639 if (error != CS_OK) {
640 goto error_exit;
641 }
642
643 error = res_lib_votequorum_status.header.error;
644
646 hdb_handle_put (&votequorum_handle_t_db, handle);
647
648 return (error);
649}
650
652 votequorum_handle_t handle,
653 const char *name,
654 unsigned int cast_vote,
656{
659 struct iovec iov;
662
663 if ((strlen(name) == 0) ||
666 }
667
668 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
669 if (error != CS_OK) {
670 return (error);
671 }
672
677 marshall_to_mar_votequorum_ring_id(&req_lib_votequorum_qdevice_poll.ring_id, &ring_id);
678
679 iov.iov_base = (char *)&req_lib_votequorum_qdevice_poll;
680 iov.iov_len = sizeof (struct req_lib_votequorum_qdevice_poll);
681
684 &iov,
685 1,
688
689 if (error != CS_OK) {
690 goto error_exit;
691 }
692
693 error = res_lib_votequorum_status.header.error;
694
696 hdb_handle_put (&votequorum_handle_t_db, handle);
697
698 return (error);
699}
700
702 votequorum_handle_t handle,
703 const char *name,
704 unsigned int allow)
705{
708 struct iovec iov;
711
712 if ((strlen(name) == 0) ||
715 }
716
717 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
718 if (error != CS_OK) {
719 return (error);
720 }
721
726
728 iov.iov_len = sizeof (struct req_lib_votequorum_qdevice_master_wins);
729
732 &iov,
733 1,
736
737 if (error != CS_OK) {
738 goto error_exit;
739 }
740
741 error = res_lib_votequorum_status.header.error;
742
744 hdb_handle_put (&votequorum_handle_t_db, handle);
745
746 return (error);
747}
748
750 votequorum_handle_t handle,
751 const char *oldname,
752 const char *newname)
753{
756 struct iovec iov;
759
760 if ((strlen(oldname) == 0) ||
762 (strlen(newname) == 0) ||
765 }
766
767 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
768 if (error != CS_OK) {
769 return (error);
770 }
771
776
777 iov.iov_base = (char *)&req_lib_votequorum_qdevice_update;
778 iov.iov_len = sizeof (struct req_lib_votequorum_qdevice_update);
779
782 &iov,
783 1,
786
787 if (error != CS_OK) {
788 goto error_exit;
789 }
790
791 error = res_lib_votequorum_status.header.error;
792
794 hdb_handle_put (&votequorum_handle_t_db, handle);
795
796 return (error);
797}
798
800 votequorum_handle_t handle,
801 const char *name)
802{
805 struct iovec iov;
808
809 if ((strlen(name) == 0) ||
812 }
813
814 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&votequorum_inst));
815 if (error != CS_OK) {
816 return (error);
817 }
818
822
823 iov.iov_base = (char *)&req_lib_votequorum_qdevice_unregister;
824 iov.iov_len = sizeof (struct req_lib_votequorum_qdevice_unregister);
825
828 &iov,
829 1,
832
833 if (error != CS_OK) {
834 goto error_exit;
835 }
836
837 error = res_lib_votequorum_status.header.error;
838
840 hdb_handle_put (&votequorum_handle_t_db, handle);
841
842 return (error);
843}
844
846 votequorum_handle_t handle,
847 unsigned int nodeid,
849 void *extra_info)
850{
851 if (!ei_size || !extra_info) {
853 }
855 struct votequorum_inst *inst;
856 struct iovec iov;
858
862
863 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&inst));
864 if (error != CS_OK) {
865 return (error);
866 }
867
871
873 iov.iov_len = sizeof (struct req_lib_votequorum_get_qdevice_extra_info);
874
876 inst->c,
877 &iov,
878 1,
879 buf,
881
882 if (error != CS_OK) {
883 goto error_exit;
884 }
885
891
893 hdb_handle_put (&votequorum_handle_t_db, handle);
894 return (error);
895}
896
897
899 votequorum_handle_t handle,
901 const void *extra_info)
902{
904 struct votequorum_inst *inst;
905 struct iovec iov;
910
911 error = hdb_error_to_cs(hdb_handle_get (&votequorum_handle_t_db, handle, (void *)&inst));
912 if (error != CS_OK) {
913 return (error);
914 }
915
916 if(!extra_info) { // Force NULL to mean zero size
917 ei_size = 0;
918 }
919
922 }
923
924 req_lib_votequorum_set_qdevice_extra_info->header.size = sizeof(*req_lib_votequorum_set_qdevice_extra_info) + ei_size;
927 if(extra_info) {
929 }
930
931 iov.iov_base = buf;
932 iov.iov_len = req_lib_votequorum_set_qdevice_extra_info->header.size;
933
935 inst->c,
936 &iov,
937 1,
940
941 if (error != CS_OK) {
942 goto error_exit;
943 }
944
945 error = res_lib_votequorum_status.header.error;
946
948 hdb_handle_put (&votequorum_handle_t_db, handle);
949 return (error);
950}
unsigned int nodeid
the ID of the node whose info needs updating
Definition coroapi.h:0
cs_dispatch_flags_t
The cs_dispatch_flags_t enum.
Definition corotypes.h:84
@ CS_DISPATCH_BLOCKING
Definition corotypes.h:87
@ CS_DISPATCH_ONE
Definition corotypes.h:85
@ CS_DISPATCH_ONE_NONBLOCKING
Definition corotypes.h:88
@ CS_DISPATCH_ALL
Definition corotypes.h:86
cs_error_t qb_to_cs_error(int result)
qb_to_cs_error
cs_error_t
The cs_error_t enum.
Definition corotypes.h:98
@ CS_ERR_BAD_HANDLE
Definition corotypes.h:107
@ CS_ERR_TRY_AGAIN
Definition corotypes.h:104
@ CS_OK
Definition corotypes.h:99
@ CS_ERR_INVALID_PARAM
Definition corotypes.h:105
@ CS_ERR_LIBRARY
Definition corotypes.h:100
#define CS_IPC_TIMEOUT_MS
Definition corotypes.h:131
char oldname[VOTEQUORUM_QDEVICE_MAX_NAME_LEN]
uint32_t flags
char extra_info[]
char newname[VOTEQUORUM_QDEVICE_MAX_NAME_LEN]
uint32_t votes
uint32_t expected_votes
uint32_t ei_size
length of the extra info
#define DECLARE_HDB_DATABASE
Definition hdb.h:98
uint64_t votequorum_handle_t
votequorum_handle_t
#define VOTEQUORUM_QDEVICE_EXTRA_NODEINFO_MAXSIZE
@ MESSAGE_RES_VOTEQUORUM_NODELIST_NOTIFICATION
@ MESSAGE_RES_VOTEQUORUM_EXPECTEDVOTES_NOTIFICATION
@ MESSAGE_RES_VOTEQUORUM_QDEVICE_EXTRA_INFO_NOTIFICATION
@ MESSAGE_RES_VOTEQUORUM_QUORUM_NOTIFICATION
@ MESSAGE_REQ_VOTEQUORUM_TRACKSTART
@ MESSAGE_REQ_VOTEQUORUM_GETINFO
@ MESSAGE_REQ_VOTEQUORUM_QDEVICE_UNREGISTER
@ MESSAGE_REQ_VOTEQUORUM_QDEVICE_REGISTER
@ MESSAGE_REQ_VOTEQUORUM_TRACKSTOP
@ MESSAGE_REQ_VOTEQUORUM_SETEXPECTED
@ MESSAGE_REQ_VOTEQUORUM_QDEVICE_GET_EXTRA_INFO
@ MESSAGE_REQ_VOTEQUORUM_QDEVICE_UPDATE
@ MESSAGE_REQ_VOTEQUORUM_SETVOTES
@ MESSAGE_REQ_VOTEQUORUM_QDEVICE_MASTER_WINS
@ MESSAGE_REQ_VOTEQUORUM_QDEVICE_POLL
@ MESSAGE_REQ_VOTEQUORUM_QDEVICE_SET_EXTRA_INFO
#define VOTEQUORUM_QDEVICE_MAX_NAME_LEN
#define IPC_REQUEST_SIZE
Definition lib/util.h:49
cs_error_t hdb_error_to_cs(int res)
#define IPC_DISPATCH_SIZE
Definition lib/util.h:51
cs_error_t votequorum_qdevice_register(votequorum_handle_t handle, const char *name)
Register a quorum device.
cs_error_t votequorum_setvotes(votequorum_handle_t handle, unsigned int nodeid, unsigned int votes)
set votes for a node
cs_error_t votequorum_qdevice_master_wins(votequorum_handle_t handle, const char *name, unsigned int allow)
Allow qdevice to tell votequorum if master_wins can be enabled or not.
cs_error_t votequorum_qdevice_poll(votequorum_handle_t handle, const char *name, unsigned int cast_vote, votequorum_ring_id_t ring_id)
Poll a quorum device.
cs_error_t votequorum_context_get(votequorum_handle_t handle, void **context)
Save and retrieve private data/context.
cs_error_t votequorum_set_qdevice_extra_info(votequorum_handle_t handle, uint32_t ei_size, const void *extra_info)
set the current extra_info for this node, should only be used by the qdevice
cs_error_t votequorum_finalize(votequorum_handle_t handle)
Close the quorum handle.
cs_error_t votequorum_trackstop(votequorum_handle_t handle)
votequorum_trackstop
cs_error_t votequorum_qdevice_unregister(votequorum_handle_t handle, const char *name)
Unregister a quorum device.
cs_error_t votequorum_fd_get(votequorum_handle_t handle, int *fd)
Get a file descriptor on which to poll.
cs_error_t votequorum_model_initialize(votequorum_handle_t *handle, const votequorum_model_v1_data_t *model)
Create a new quorum connection.
cs_error_t votequorum_get_qdevice_extra_info(votequorum_handle_t handle, unsigned int nodeid, uint32_t *ei_size, void *extra_info)
request the current extra_info for a node
cs_error_t votequorum_context_set(votequorum_handle_t handle, void *context)
votequorum_context_set
cs_error_t votequorum_trackstart(votequorum_handle_t handle, uint64_t context, unsigned int flags)
Track node and quorum changes.
cs_error_t votequorum_qdevice_update(votequorum_handle_t handle, const char *oldname, const char *newname)
Update registered name of a quorum device.
cs_error_t votequorum_dispatch(votequorum_handle_t handle, cs_dispatch_flags_t dispatch_types)
Dispatch messages and configuration changes.
cs_error_t votequorum_getinfo(votequorum_handle_t handle, unsigned int nodeid, struct votequorum_info *info)
Get quorum information.
cs_error_t votequorum_setexpected(votequorum_handle_t handle, unsigned int expected_votes)
set expected_votes
cs_error_t votequorum_initialize(votequorum_handle_t *handle, votequorum_callbacks_t *callbacks)
Create a new quorum connection.
The req_lib_votequorum_general struct.
The req_lib_votequorum_getinfo struct.
The req_lib_votequorum_qdevice_master_wins struct.
char name[VOTEQUORUM_QDEVICE_MAX_NAME_LEN]
The req_lib_votequorum_qdevice_poll struct.
char name[VOTEQUORUM_QDEVICE_MAX_NAME_LEN]
The req_lib_votequorum_qdevice_register struct.
char name[VOTEQUORUM_QDEVICE_MAX_NAME_LEN]
The req_lib_votequorum_qdevice_unregister struct.
char name[VOTEQUORUM_QDEVICE_MAX_NAME_LEN]
The req_lib_votequorum_qdevice_update struct.
char newname[VOTEQUORUM_QDEVICE_MAX_NAME_LEN]
char oldname[VOTEQUORUM_QDEVICE_MAX_NAME_LEN]
The req_lib_votequorum_setexpected struct.
The req_lib_votequorum_setvotes struct.
The req_lib_votequorum_trackstart struct.
The res_lib_votequorum_expectedvotes_notification struct.
The res_lib_votequorum_getinfo struct.
char qdevice_name[VOTEQUORUM_QDEVICE_MAX_NAME_LEN]
The res_lib_votequorum_quorum_notification struct.
The res_lib_votequorum_status struct.
The votequorum_callbacks_t struct.
votequorum_nodelist_notification_fn_t votequorum_nodelist_notify_fn
votequorum_expectedvotes_notification_fn_t votequorum_expectedvotes_notify_fn
votequorum_quorum_notification_fn_t votequorum_quorum_notify_fn
The votequorum_info struct.
qb_ipcc_connection_t * c
votequorum_model_v1_data_t callbacks
votequorum_nodelist_notification_fn_t votequorum_nodelist_notify_fn
votequorum_qdevice_extra_info_fn_t votequorum_qdevice_extra_info_fn
votequorum_expectedvotes_notification_fn_t votequorum_expectedvotes_notify_fn
votequorum_quorum_notification_fn_t votequorum_quorum_notify_fn
The votequorum_node_t struct.
The votequorum_ring_id_t struct.
struct memb_ring_id ring_id
Definition totemsrp.c:4