From 90d106ef19662fbbb686dfacf051a83e243390cd Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Sun, 25 Sep 2011 19:37:00 +0000 Subject: Restart CLVMD with same cluster manager Add named cluster_ops to easily learn the name of the active cluster manager, so we are able to restart singlenode manager in testing. Add simple test for clvmd -S (restart) and -R (refresh) (though it needs some extensions). --- WHATS_NEW | 1 + daemons/clvmd/clvmd-cman.c | 1 + daemons/clvmd/clvmd-command.c | 10 ++++----- daemons/clvmd/clvmd-comms.h | 3 ++- daemons/clvmd/clvmd-corosync.c | 1 + daemons/clvmd/clvmd-openais.c | 1 + daemons/clvmd/clvmd-singlenode.c | 1 + test/t-clvmd-restart.sh | 44 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 test/t-clvmd-restart.sh diff --git a/WHATS_NEW b/WHATS_NEW index 7bdaaf26..94570e1d 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.89 - ================================== + Restart CLVMD with same cluster manager. Fix log_error() usage in raid and unknown segtype initialisation. Improve testing Makefile. Fix install_ocf make target when srcdir != builddir. (2.02.80) diff --git a/daemons/clvmd/clvmd-cman.c b/daemons/clvmd/clvmd-cman.c index c7a2b2d7..7e76dc44 100644 --- a/daemons/clvmd/clvmd-cman.c +++ b/daemons/clvmd/clvmd-cman.c @@ -479,6 +479,7 @@ static int _get_cluster_name(char *buf, int buflen) } static struct cluster_ops _cluster_cman_ops = { + .name = "cman", .cluster_init_completed = _cluster_init_completed, .cluster_send_message = _cluster_send_message, .name_from_csid = _name_from_csid, diff --git a/daemons/clvmd/clvmd-command.c b/daemons/clvmd/clvmd-command.c index 5857a30f..c1ee673f 100644 --- a/daemons/clvmd/clvmd-command.c +++ b/daemons/clvmd/clvmd-command.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2002-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -381,7 +381,7 @@ static int restart_clvmd(void) } while (hn); /* clvmd + locks (-E uuid) + debug (-d X) + NULL */ - if (!(argv = malloc((max_locks * 2 + 4) * sizeof(*argv)))) + if (!(argv = malloc((max_locks * 2 + 5) * sizeof(*argv)))) goto_out; /* @@ -396,10 +396,8 @@ static int restart_clvmd(void) argv[argc++] = debug_arg; } - /* - * FIXME: specify used cluster backend - * argv[argc++] = strdup("-Isinglenode"); - */ + argv[argc++] = "-I"; + argv[argc++] = clops->name; /* Now add the exclusively-open LVs */ hn = NULL; diff --git a/daemons/clvmd/clvmd-comms.h b/daemons/clvmd/clvmd-comms.h index 500bd575..7207334e 100644 --- a/daemons/clvmd/clvmd-comms.h +++ b/daemons/clvmd/clvmd-comms.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2002-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -23,6 +23,7 @@ struct local_client; struct cluster_ops { + const char *name; void (*cluster_init_completed) (void); int (*cluster_send_message) (const void *buf, int msglen, diff --git a/daemons/clvmd/clvmd-corosync.c b/daemons/clvmd/clvmd-corosync.c index 01ee09ff..e929681c 100644 --- a/daemons/clvmd/clvmd-corosync.c +++ b/daemons/clvmd/clvmd-corosync.c @@ -598,6 +598,7 @@ out: } static struct cluster_ops _cluster_corosync_ops = { + .name = "corosync", .cluster_init_completed = NULL, .cluster_send_message = _cluster_send_message, .name_from_csid = _name_from_csid, diff --git a/daemons/clvmd/clvmd-openais.c b/daemons/clvmd/clvmd-openais.c index 0cfb6375..a2fe69e2 100644 --- a/daemons/clvmd/clvmd-openais.c +++ b/daemons/clvmd/clvmd-openais.c @@ -667,6 +667,7 @@ static int _get_cluster_name(char *buf, int buflen) } static struct cluster_ops _cluster_openais_ops = { + .name = "openais", .cluster_init_completed = NULL, .cluster_send_message = _cluster_send_message, .name_from_csid = _name_from_csid, diff --git a/daemons/clvmd/clvmd-singlenode.c b/daemons/clvmd/clvmd-singlenode.c index 3a46fb60..0aa894e3 100644 --- a/daemons/clvmd/clvmd-singlenode.c +++ b/daemons/clvmd/clvmd-singlenode.c @@ -267,6 +267,7 @@ static int _get_cluster_name(char *buf, int buflen) } static struct cluster_ops _cluster_singlenode_ops = { + .name = "singlenode", .cluster_init_completed = NULL, .cluster_send_message = _cluster_send_message, .name_from_csid = _name_from_csid, diff --git a/test/t-clvmd-restart.sh b/test/t-clvmd-restart.sh new file mode 100644 index 00000000..9a5b1b9d --- /dev/null +++ b/test/t-clvmd-restart.sh @@ -0,0 +1,44 @@ +#!/bin/sh +# Copyright (C) 2011 Red Hat, Inc. All rights reserved. +# +# This copyrighted material is made available to anyone wishing to use, +# modify, copy, or redistribute it subject to the terms and conditions +# of the GNU General Public License v.2. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +export LVM_CLVMD_BINARY="lib/clvmd" +export LVM_BINARY="lib/lvm" + +. lib/test + +# only clvmd based test, skip otherwise +test -e LOCAL_CLVMD || skip + +aux prepare_devs 1 + +vgcreate --clustered y $vg $(cat DEVICES) + +lvcreate -an --zero n -n $lv1 -l1 $vg +lvcreate -an --zero n -n $lv2 -l1 $vg +lvcreate -l1 $vg + +lvchange -aey $vg/$lv1 +lvchange -aey $vg/$lv2 + +"$LVM_CLVMD_BINARY" -S +sleep .2 +# restarted clvmd has the same PID (no fork, only execve) +NEW_LOCAL_CLVMD=$(pgrep clvmd) +read LOCAL_CLVMD < LOCAL_CLVMD +test "$LOCAL_CLVMD" -eq "$NEW_LOCAL_CLVMD" + +# FIXME: Hmm - how could we test exclusivity is preserved in singlenode ? +lvchange -an $vg/$lv1 +lvchange -ay $vg/$lv1 + +lib/clvmd -R + +vgremove -ff $vg -- cgit