From 7ae124743e94b6f93d92ffc7c599d0ea6d4980af Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Mon, 26 Sep 2011 07:51:23 +0000 Subject: [PATCH] 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. --- WHATS_NEW | 1 + daemons/clvmd/clvmd-command.c | 2 +- test/t-clvmd-restart.sh | 19 ++++++++++++++----- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 94570e1d8..301f716cb 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 c1ee673f0..6d0506f7a 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 9a5b1b9d5..690fc5835 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 -- 2.43.5