Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 930536 Details for
Bug 1108522
Various small fixes for RHEL 7.1 (corosync rebase)
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
votequorum: Add ring id to poll call
tmp.yiQnEzsIOj (text/plain), 8.34 KB, created by
Jan Friesse
on 2014-08-25 14:43:35 UTC
(
hide
)
Description:
votequorum: Add ring id to poll call
Filename:
MIME Type:
Creator:
Jan Friesse
Created:
2014-08-25 14:43:35 UTC
Size:
8.34 KB
patch
obsolete
>From b8902464d1b040326108ce7ec0934c1de5fe04ee Mon Sep 17 00:00:00 2001 >From: Jan Friesse <jfriesse@redhat.com> >Date: Wed, 30 Jul 2014 16:48:19 +0200 >Subject: [PATCH] votequorum: Add ring id to poll call > >If votequorum service receives incorrect (not current) ringid, call is >ignored and CS_ERR_MESSAGE_ERROR is returned. > >This and previous commits makes incompatible changes in votequorum >API/ABI, so library version is increased. > >Signed-off-by: Jan Friesse <jfriesse@redhat.com> >Reviewed-by: Christine Caulfield <ccaulfie@redhat.com> >--- > exec/votequorum.c | 9 +++++++ > include/corosync/ipc_votequorum.h | 9 +++++++ > include/corosync/votequorum.h | 3 +- > lib/libvotequorum.verso | 2 +- > lib/votequorum.c | 4 ++- > man/votequorum_qdevice_poll.3.in | 5 +++- > test/testvotequorum2.c | 47 ++++++++++++++++++++++++++++++++++-- > 7 files changed, 72 insertions(+), 7 deletions(-) > >diff --git a/exec/votequorum.c b/exec/votequorum.c >index 54b6fbe..dd5bea7 100644 >--- a/exec/votequorum.c >+++ b/exec/votequorum.c >@@ -2741,6 +2741,15 @@ static void message_handler_req_lib_votequorum_qdevice_poll (void *conn, > } > > if (us->flags & NODE_FLAGS_QDEVICE_REGISTERED) { >+ if (!(req_lib_votequorum_qdevice_poll->ring_id.nodeid == quorum_ringid.rep.nodeid && >+ req_lib_votequorum_qdevice_poll->ring_id.seq == quorum_ringid.seq)) { >+ log_printf(LOGSYS_LEVEL_DEBUG, "Received poll ring id (%u.%"PRIu64") != last sync " >+ "ring id (%u.%"PRIu64"). Ignoring poll call.", >+ req_lib_votequorum_qdevice_poll->ring_id.nodeid, req_lib_votequorum_qdevice_poll->ring_id.seq, >+ quorum_ringid.rep.nodeid, quorum_ringid.seq); >+ error = CS_ERR_MESSAGE_ERROR; >+ goto out; >+ } > if (strncmp(req_lib_votequorum_qdevice_poll->name, qdevice_name, VOTEQUORUM_QDEVICE_MAX_NAME_LEN)) { > error = CS_ERR_INVALID_PARAM; > goto out; >diff --git a/include/corosync/ipc_votequorum.h b/include/corosync/ipc_votequorum.h >index 0fdcd8b..c06814f 100644 >--- a/include/corosync/ipc_votequorum.h >+++ b/include/corosync/ipc_votequorum.h >@@ -86,6 +86,7 @@ struct req_lib_votequorum_qdevice_poll { > struct qb_ipc_request_header header __attribute__((aligned(8))); > char name[VOTEQUORUM_QDEVICE_MAX_NAME_LEN]; > int cast_vote; >+ struct mar_votequorum_ring_id ring_id __attribute__((aligned(8))); > }; > > struct req_lib_votequorum_qdevice_master_wins { >@@ -181,4 +182,12 @@ static inline void marshall_from_mar_votequorum_ring_id ( > dest->seq = src->seq; > }; > >+static inline void marshall_to_mar_votequorum_ring_id ( >+ struct mar_votequorum_ring_id *dest, >+ const votequorum_ring_id_t *src) >+{ >+ dest->nodeid = src->nodeid; >+ dest->seq = src->seq; >+}; >+ > #endif >diff --git a/include/corosync/votequorum.h b/include/corosync/votequorum.h >index bba964b..ef5294a 100644 >--- a/include/corosync/votequorum.h >+++ b/include/corosync/votequorum.h >@@ -211,7 +211,8 @@ cs_error_t votequorum_qdevice_update ( > cs_error_t votequorum_qdevice_poll ( > votequorum_handle_t handle, > const char *name, >- unsigned int cast_vote); >+ unsigned int cast_vote, >+ votequorum_ring_id_t ring_id); > > /** > * Allow qdevice to tell votequorum if master_wins can be enabled or not >diff --git a/lib/libvotequorum.verso b/lib/libvotequorum.verso >index 09b254e..66ce77b 100644 >--- a/lib/libvotequorum.verso >+++ b/lib/libvotequorum.verso >@@ -1 +1 @@ >-6.0.0 >+7.0.0 >diff --git a/lib/votequorum.c b/lib/votequorum.c >index 20843cf..be4ef43 100644 >--- a/lib/votequorum.c >+++ b/lib/votequorum.c >@@ -607,7 +607,8 @@ error_exit: > cs_error_t votequorum_qdevice_poll ( > votequorum_handle_t handle, > const char *name, >- unsigned int cast_vote) >+ unsigned int cast_vote, >+ votequorum_ring_id_t ring_id) > { > cs_error_t error; > struct votequorum_inst *votequorum_inst; >@@ -629,6 +630,7 @@ cs_error_t votequorum_qdevice_poll ( > req_lib_votequorum_qdevice_poll.header.id = MESSAGE_REQ_VOTEQUORUM_QDEVICE_POLL; > strcpy(req_lib_votequorum_qdevice_poll.name, name); > req_lib_votequorum_qdevice_poll.cast_vote = cast_vote; >+ marshall_to_mar_votequorum_ring_id(&req_lib_votequorum_qdevice_poll.ring_id, &ring_id); > > iov.iov_base = (char *)&req_lib_votequorum_qdevice_poll; > iov.iov_len = sizeof (struct req_lib_votequorum_qdevice_poll); >diff --git a/man/votequorum_qdevice_poll.3.in b/man/votequorum_qdevice_poll.3.in >index 348b84d..b8299df 100644 >--- a/man/votequorum_qdevice_poll.3.in >+++ b/man/votequorum_qdevice_poll.3.in >@@ -37,7 +37,7 @@ votequorum_qdevice_poll \- Tells votequorum the result of the quorum device poll > .SH SYNOPSIS > .B #include <corosync/votequorum.h> > .sp >-.BI "int votequorum_qdevice_poll(votequorum_handle_t " handle ", const char * " name ", unsigned int " cast_vote ");" >+.BI "int votequorum_qdevice_poll(votequorum_handle_t " handle ", const char * " name ", unsigned int " cast_vote ", votequorum_ring_id_t " ring_id ");" > .SH DESCRIPTION > The > .B votequorum_qdevice_poll >@@ -45,6 +45,9 @@ is called by the quorum device subsystem (not provided as part of votequorum) to > the voting system if the quorum device is present/active or not. If > .B cast_vote > is 1 then the votes for the device are included in the quorum calculation, otherwise not. >+Current >+.B ring_id >+must be set (one get in votequorum_notification_fn callback) otherwise poll is ignored. > This routine should be called at regular intervals to ensure that the device status > is always known to votequorum. If > .B votequorum_qdevice_poll >diff --git a/test/testvotequorum2.c b/test/testvotequorum2.c >index 3e4bd34..f545070 100644 >--- a/test/testvotequorum2.c >+++ b/test/testvotequorum2.c >@@ -35,6 +35,7 @@ > #include <config.h> > > #include <sys/types.h> >+#include <inttypes.h> > #include <stdio.h> > #include <stdint.h> > #include <string.h> >@@ -45,6 +46,8 @@ > > static votequorum_handle_t handle; > >+static votequorum_ring_id_t last_received_ring_id; >+ > static int print_info(int ok_to_fail) > { > struct votequorum_info info; >@@ -71,6 +74,22 @@ static int print_info(int ok_to_fail) > return 0; > } > >+static void votequorum_notification_fn( >+ votequorum_handle_t vq_handle, >+ uint64_t context, >+ uint32_t quorate, >+ votequorum_ring_id_t ring_id, >+ uint32_t node_list_entries, >+ votequorum_node_t node_list[]) >+{ >+ >+ printf("votequorum notification called \n"); >+ printf(" current ringid = (%u.%"PRIu64")\n", ring_id.nodeid, ring_id.seq); >+ printf("\n"); >+ >+ memcpy(&last_received_ring_id, &ring_id, sizeof(ring_id)); >+} >+ > static void usage(const char *command) > { > printf("%s [-p <num>] [-t <time>] [-n <name>] [-c] [-m]\n", command); >@@ -90,9 +109,13 @@ int main(int argc, char *argv[]) > int pollcount=0, polltime=1, quiet=0, once=0; > int err; > int opt; >+ votequorum_callbacks_t callbacks; > const char *devicename = "QDEVICE"; > const char *options = "n:p:t:cmq1h"; >- >+ >+ memset(&callbacks, 0, sizeof(callbacks)); >+ callbacks.votequorum_notify_fn = votequorum_notification_fn; >+ > while ((opt = getopt(argc, argv, options)) != -1) { > switch (opt) { > case 'm': >@@ -122,7 +145,7 @@ int main(int argc, char *argv[]) > } > } > >- if ( (err=votequorum_initialize(&handle, NULL)) != CS_OK) { >+ if ( (err=votequorum_initialize(&handle, &callbacks)) != CS_OK) { > fprintf(stderr, "votequorum_initialize FAILED: %d\n", err); > return -1; > } >@@ -141,6 +164,12 @@ int main(int argc, char *argv[]) > } > > if (argc >= 2) { >+ if ( (err = votequorum_trackstart(handle, handle, CS_TRACK_CHANGES)) != CS_OK) { >+ fprintf(stderr, "votequorum_trackstart FAILED: %d\n", err); >+ ret = -1; >+ goto out; >+ } >+ > if ( (err=votequorum_qdevice_register(handle, devicename)) != CS_OK) { > fprintf(stderr, "qdevice_register FAILED: %d\n", err); > ret = -1; >@@ -153,13 +182,25 @@ int main(int argc, char *argv[]) > goto out; > } > >+ > while (--pollcount) { >+ if (votequorum_dispatch(handle, CS_DISPATCH_ALL) != CS_OK) { >+ fprintf(stderr, "votequorum_dispatch error\n"); >+ ret = -1; >+ goto out; >+ } >+ > if (!quiet) print_info(0); >- if ((err=votequorum_qdevice_poll(handle, devicename, cast_vote)) != CS_OK) { >+ if ((err=votequorum_qdevice_poll(handle, devicename, cast_vote, last_received_ring_id)) != CS_OK && >+ err != CS_ERR_MESSAGE_ERROR) { > fprintf(stderr, "qdevice poll FAILED: %d\n", err); > ret = -1; > goto out; > } >+ if (err == CS_ERR_MESSAGE_ERROR) { >+ fprintf(stderr, "qdevice poll passed OLD ring_id\n"); >+ } >+ > if (!quiet) print_info(0); > sleep(polltime); > } >-- >1.7.1 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 1108522
:
907995
|
907996
|
907997
|
907998
|
907999
|
908004
|
908111
|
930505
|
930506
|
930507
|
930509
|
930510
|
930511
|
930512
|
930513
|
930514
|
930515
|
930516
|
930517
|
930518
|
930519
|
930527
|
930528
|
930529
|
930530
|
930531
|
930535
| 930536 |
930537
|
930538
|
930539
|
930540
|
931024