diff options
author | David Teigland <teigland@redhat.com> | 2012-01-24 10:24:14 -0600 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2012-01-24 10:24:14 -0600 |
commit | e2cca0c70c99a8738b948450bf3a4fab407b28c5 (patch) | |
tree | 1f2ffbd773df28a3273bb427df19025df378db02 | |
parent | 22df476ef97fbbc1d9efc00c43cc837f535ea7f2 (diff) | |
download | dct-stuff-e2cca0c70c99a8738b948450bf3a4fab407b28c5.tar.gz dct-stuff-e2cca0c70c99a8738b948450bf3a4fab407b28c5.tar.xz dct-stuff-e2cca0c70c99a8738b948450bf3a4fab407b28c5.zip |
dlm_master: more locks
-rw-r--r-- | dlm/dlm_master.c | 59 |
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); |