summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2012-01-24 10:24:14 -0600
committerDavid Teigland <teigland@redhat.com>2012-01-24 10:24:14 -0600
commite2cca0c70c99a8738b948450bf3a4fab407b28c5 (patch)
tree1f2ffbd773df28a3273bb427df19025df378db02
parent22df476ef97fbbc1d9efc00c43cc837f535ea7f2 (diff)
downloaddct-stuff-e2cca0c70c99a8738b948450bf3a4fab407b28c5.tar.gz
dct-stuff-e2cca0c70c99a8738b948450bf3a4fab407b28c5.tar.xz
dct-stuff-e2cca0c70c99a8738b948450bf3a4fab407b28c5.zip
dlm_master: more locks
-rw-r--r--dlm/dlm_master.c59
1 files changed, 41 insertions, 18 deletions
diff --git a/dlm/dlm_master.c b/dlm/dlm_master.c
index de4c801..2afe190 100644
--- a/dlm/dlm_master.c
+++ b/dlm/dlm_master.c
@@ -32,7 +32,6 @@
#define MAX_NODES 16
-static uint32_t lkids[MAX_NODES];
static int nodes[MAX_NODES];
static int nodes_count;
static int our_nodeid;
@@ -41,7 +40,7 @@ static dlm_lshandle_t *dh;
static int openclose = 0;
static int quiet = 0;
static int verbose = 0;
-static int sleep_sec = 1;
+static int sleep_msec = 1000;
#define log_debug(fmt, args...) \
do { \
@@ -81,17 +80,20 @@ static const char *mode_str(int mode)
return "??";
}
-static void do_master(void)
+static void do_master(int acquire_mode, char *suffix)
{
struct dlm_lksb lksb;
char name[DLM_RESNAME_MAXLEN];
int rv;
- snprintf(name, sizeof(name), "nodeid%d", our_nodeid);
+ snprintf(name, sizeof(name), "nodeid%d-%s", our_nodeid, suffix);
memset(&lksb, 0, sizeof(lksb));
- rv = dlm_ls_lock_wait(dh, LKM_CRMODE, &lksb, 0,
+ printf("master \"%s\" ", name);
+ fflush(stdout);
+
+ rv = dlm_ls_lock_wait(dh, acquire_mode, &lksb, 0,
name, strlen(name),
0, NULL, NULL, NULL);
@@ -100,11 +102,11 @@ static void do_master(void)
return;
}
- printf("master \"%s\" 0x%08x %s\n", name, lksb.sb_lkid,
- mode_str(LKM_CRMODE));
+ printf("0x%08x %s\n", lksb.sb_lkid, mode_str(acquire_mode));
}
-static void ping_masters(int acquire_mode, int convert_mode)
+static void ping_masters(int acquire_mode, int convert_mode, char *suffix,
+ uint32_t *lkids)
{
struct dlm_lksb lksb;
char name[DLM_RESNAME_MAXLEN];
@@ -114,12 +116,13 @@ static void ping_masters(int acquire_mode, int convert_mode)
if (nodes[i] == our_nodeid)
continue;
- snprintf(name, sizeof(name), "nodeid%d", nodes[i]);
+ snprintf(name, sizeof(name), "nodeid%d-%s", nodes[i], suffix);
memset(&lksb, 0, sizeof(lksb));
if (acquire_mode > -1) {
- rv = dlm_ls_lock_wait(dh, acquire_mode, &lksb, 0,
+ rv = dlm_ls_lock_wait(dh, acquire_mode, &lksb,
+ LKF_NOQUEUE,
name, strlen(name),
0, NULL, NULL, NULL);
if (rv < 0) {
@@ -142,7 +145,7 @@ static void ping_masters(int acquire_mode, int convert_mode)
fflush(stdout);
rv = dlm_ls_lock_wait(dh, convert_mode, &lksb,
- LKF_CONVERT,
+ LKF_NOQUEUE | LKF_CONVERT,
name, strlen(name),
0, NULL, NULL, NULL);
if (rv < 0)
@@ -214,6 +217,7 @@ static void print_usage(void)
printf("dlm_master [ping]\n");
printf("Options:\n");
printf("\n");
+ printf(" -s <ms> Sleep milliseconds\n");
printf(" -o Open/close existing lockspace\n");
printf(" -v Verbose output\n");
printf(" -q Quiet output\n");
@@ -230,7 +234,7 @@ static void decode_arguments(int argc, char **argv)
switch (optchar) {
case 's':
- sleep_sec = atoi(optarg);
+ sleep_msec = atoi(optarg);
break;
case 'o':
@@ -275,6 +279,9 @@ static void decode_arguments(int argc, char **argv)
int main(int argc, char *argv[])
{
+ uint32_t *lkids_A;
+ uint32_t *lkids_B;
+ uint32_t *lkids_C;
int rv, quit = 0;
int do_ping = 0;
@@ -284,6 +291,10 @@ int main(int argc, char *argv[])
argv++;
}
+ lkids_A = malloc(sizeof(uint32_t) * MAX_NODES);
+ lkids_B = malloc(sizeof(uint32_t) * MAX_NODES);
+ lkids_C = malloc(sizeof(uint32_t) * MAX_NODES);
+
decode_arguments(argc, argv);
if (openclose) {
@@ -314,17 +325,29 @@ int main(int argc, char *argv[])
setup_nodes();
+ /* We do both upconvert/downconvert on A/B for each cycle because
+ the downconvert does not include a reply from the master and we
+ want there to be messages back and forth for each cycle. */
+
if (do_ping) {
- ping_masters(LKM_NLMODE, -1);
+ ping_masters(LKM_NLMODE, -1, "A", lkids_A);
+ ping_masters(LKM_PRMODE, -1, "B", lkids_B);
+ ping_masters(LKM_NLMODE, -1, "C", lkids_C);
while (1) {
- sleep(sleep_sec);
- ping_masters(-1, LKM_PRMODE);
- sleep(sleep_sec);
- ping_masters(-1, LKM_NLMODE);
+ usleep(sleep_msec*1000);
+ ping_masters(-1, LKM_PRMODE, "A", lkids_A);
+ ping_masters(-1, LKM_NLMODE, "B", lkids_B);
+ ping_masters(-1, LKM_EXMODE, "C", lkids_C);
+ usleep(sleep_msec*1000);
+ ping_masters(-1, LKM_PRMODE, "B", lkids_B);
+ ping_masters(-1, LKM_NLMODE, "A", lkids_A);
+ ping_masters(-1, LKM_EXMODE, "C", lkids_C);
}
} else {
- do_master();
+ do_master(LKM_CRMODE, "A");
+ do_master(LKM_CRMODE, "B");
+ do_master(LKM_EXMODE, "C");
while (1) {
sleep(10);