summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2011-09-26 07:51:23 +0000
committerZdenek Kabelac <zkabelac@redhat.com>2011-09-26 07:51:23 +0000
commit7ae124743e94b6f93d92ffc7c599d0ea6d4980af (patch)
tree8574735bc7282362d97a088f34aa132bf60706a9
parent807a5a7b1333bf9fc857ec73c3ec0d827c1064f5 (diff)
downloadlvm2-7ae124743e94b6f93d92ffc7c599d0ea6d4980af.tar.gz
lvm2-7ae124743e94b6f93d92ffc7c599d0ea6d4980af.tar.xz
lvm2-7ae124743e94b6f93d92ffc7c599d0ea6d4980af.zip
Use execvp for clvmd restart
Since execve passed only NULL as environ, we had lost all environment vars on restart - thus actually running 'different' clvmd then the one at start. Preserving environ allows to restart clvmd with the same settings (i.e. LD_LIBRARY_PATH) Add test for second restart.
-rw-r--r--WHATS_NEW1
-rw-r--r--daemons/clvmd/clvmd-command.c2
-rw-r--r--test/t-clvmd-restart.sh19
3 files changed, 16 insertions, 6 deletions
diff --git a/WHATS_NEW b/WHATS_NEW
index 94570e1d..301f716c 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.89 -
==================================
+ Use execvp for CLVMD restart to preserve environment settings.
Restart CLVMD with same cluster manager.
Fix log_error() usage in raid and unknown segtype initialisation.
Improve testing Makefile.
diff --git a/daemons/clvmd/clvmd-command.c b/daemons/clvmd/clvmd-command.c
index c1ee673f..6d0506f7 100644
--- a/daemons/clvmd/clvmd-command.c
+++ b/daemons/clvmd/clvmd-command.c
@@ -418,7 +418,7 @@ static int restart_clvmd(void)
for (argc = 1; argv[argc]; argc++) DEBUGLOG("--- %d: %s\n", argc, argv[argc]);
/* NOTE: This will fail when downgrading! */
- execve(clvmd, (char **)argv, NULL);
+ execvp(clvmd, (char **)argv);
out:
/* We failed */
DEBUGLOG("Restart of clvmd failed.\n");
diff --git a/test/t-clvmd-restart.sh b/test/t-clvmd-restart.sh
index 9a5b1b9d..690fc583 100644
--- a/test/t-clvmd-restart.sh
+++ b/test/t-clvmd-restart.sh
@@ -9,13 +9,15 @@
# 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"
+# set before test's clvmd is started, so it's passed in environ
+export LVM_CLVMD_BINARY=clvmd
+export LVM_BINARY=lvm
. lib/test
# only clvmd based test, skip otherwise
test -e LOCAL_CLVMD || skip
+read LOCAL_CLVMD < LOCAL_CLVMD
aux prepare_devs 1
@@ -30,15 +32,22 @@ lvchange -aey $vg/$lv2
"$LVM_CLVMD_BINARY" -S
sleep .2
-# restarted clvmd has the same PID (no fork, only execve)
+# restarted clvmd has the same PID (no fork, only execvp)
+NEW_LOCAL_CLVMD=$(pgrep clvmd)
+test "$LOCAL_CLVMD" -eq "$NEW_LOCAL_CLVMD"
+
+# try restart once more
+
+"$LVM_CLVMD_BINARY" -S
+sleep .2
+# restarted clvmd has the same PID (no fork, only execvp)
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
+"$LVM_CLVMD_BINARY" -R
vgremove -ff $vg