[lvm-devel] [PATCH] sd_notify(3) support in clvmd

Jacek Konieczny jajcus at jajcus.net
Sat Nov 3 18:38:40 UTC 2012


Use sd_notify() function from the libsystemd-daemon library to
report startup progress of clvmd.

This fearture can be disabled via the configure script.

Signed-off-by: Jacek Konieczny <jajcus at jajcus.net>
---
 configure.in              |   28 ++++++++++++++++++++++++++++
 daemons/clvmd/Makefile.in |    7 +++++++
 daemons/clvmd/clvmd.c     |   32 ++++++++++++++++++++++++++++++++
 lib/misc/configure.h.in   |    3 +++
 4 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/configure.in b/configure.in
index 75e0d84..7cb7664 100644
--- a/configure.in
+++ b/configure.in
@@ -757,6 +757,34 @@ if test "x$CLVMD" != xnone; then
 fi
 
 ################################################################################
+dnl -- Disable sd_notify
+AC_MSG_CHECKING(whether to enable sd_notify)
+AC_ARG_ENABLE([sd_notify],
+	      AC_HELP_STRING([--disable-sd-notify], 
+	      [disable sd_notify support in clvmd]),
+	      [SD_NOTIFY=$enableval], [SD_NOTIFY=auto])
+AC_MSG_RESULT($SD_NOTIFY)
+
+if test x$SD_NOTIFY != xno ; then
+	if test x$PKGCONFIG_INIT != x1; then
+		pkg_config_init
+	fi
+	PKG_CHECK_MODULES([LIBSYSTEMD_DAEMON], [libsystemd-daemon],
+		[SD_NOTIFY=yes], [
+		   	if test x$SD_NOTIFY = yes ; then
+				AC_MSG_ERROR([bailing out])
+			else
+				SD_NOTIFY=no
+			fi
+		])
+fi
+AC_SUBST([SD_NOTIFY])
+if test x$SD_NOTIFY = xyes; then
+	AC_DEFINE([ENABLE_SD_NOTIFY], [1],
+		  [Define to 1 to include sd_notify() support in clvmd])
+fi
+
+################################################################################
 dnl -- Build cluster mirror log daemon
 AC_MSG_CHECKING(whether to build cluster mirror log daemon)
 AC_ARG_ENABLE(cmirrord,
diff --git a/daemons/clvmd/Makefile.in b/daemons/clvmd/Makefile.in
index 9ca11ba..a81f52e 100644
--- a/daemons/clvmd/Makefile.in
+++ b/daemons/clvmd/Makefile.in
@@ -29,6 +29,8 @@ QUORUM_LIBS = @QUORUM_LIBS@
 QUORUM_CFLAGS = @QUORUM_CFLAGS@
 SALCK_LIBS = @SALCK_LIBS@
 SALCK_CFLAGS = @SALCK_CFLAGS@
+LIBSYSTEMD_DAEMON_LIBS = @LIBSYSTEMD_DAEMON_LIBS@
+LIBSYSTEMD_DAEMON_CFLAGS = @LIBSYSTEMD_DAEMON_CFLAGS@
 
 SOURCES = \
 	clvmd-command.c  \
@@ -81,6 +83,11 @@ LVMLIBS = $(LVMINTERNAL_LIBS)
 ifeq ("@DMEVENTD@", "yes")
 	LVMLIBS += -ldevmapper-event
 endif
+
+ifeq ("@SD_NOTIFY@", "yes")
+	LMLIBS += $(LIBSYSTEMD_DAEMON_LIBS)
+	CFLAGS += $(LIBSYSTEMD_DAEMON_CFLAGS)
+endif
  
 include $(top_builddir)/make.tmpl
 
diff --git a/daemons/clvmd/clvmd.c b/daemons/clvmd/clvmd.c
index eb0bffd..dd2ab6b 100644
--- a/daemons/clvmd/clvmd.c
+++ b/daemons/clvmd/clvmd.c
@@ -41,6 +41,10 @@
 #include <sys/un.h>
 #include <sys/utsname.h>
 
+#ifdef ENABLE_SD_NOTIFY
+#include <systemd/sd-daemon.h>
+#endif
+
 #ifndef TRUE
 #define TRUE 1
 #endif
@@ -483,6 +487,9 @@ int main(int argc, char *argv[])
 	   but the cluster is not ready yet */
 	local_sock = open_local_sock();
 	if (local_sock < 0) {
+#ifdef ENABLE_SD_NOTIFY
+		sd_notify(0, "STATUS=clvmd could not create local socket");
+#endif
 		child_init_signal_and_exit(DFAIL_LOCAL_SOCK);
 		/* NOTREACHED */
 	}
@@ -514,6 +521,10 @@ int main(int argc, char *argv[])
 	pthread_barrier_init(&lvm_start_barrier, NULL, 2);
 	init_lvhash();
 
+#ifdef ENABLE_SD_NOTIFY
+	sd_notify(0, "STATUS=Starting the cluster interface");
+#endif
+
 	/* Start the cluster interface */
 	if (cluster_iface == IF_AUTO)
 		cluster_iface = get_cluster_type();
@@ -557,10 +568,16 @@ int main(int argc, char *argv[])
 	if (!clops) {
 		DEBUGLOG("Can't initialise cluster interface\n");
 		log_error("Can't initialise cluster interface\n");
+#ifdef ENABLE_SD_NOTIFY
+		sd_notify(0, "STATUS=Can't initialise cluster interface");
+#endif
 		child_init_signal_and_exit(DFAIL_CLUSTER_IF);
 		/* NOTREACHED */
 	}
 	DEBUGLOG("Cluster ready, doing some more initialisation\n");
+#ifdef ENABLE_SD_NOTIFY
+	sd_notify(0, "STATUS=Cluster ready, doing some more initialisation");
+#endif
 
 	/* Save our CSID */
 	clops->get_our_csid(our_csid);
@@ -573,6 +590,9 @@ int main(int argc, char *argv[])
 	/* Add the local socket to the list */
 	newfd = malloc(sizeof(struct local_client));
 	if (!newfd) {
+#ifdef ENABLE_SD_NOTIFY
+		sd_notify(0, "STATUS=clvmd failed, not enough memory");
+#endif
 		child_init_signal_and_exit(DFAIL_MALLOC);
 		/* NOTREACHED */
 	}
@@ -599,6 +619,9 @@ int main(int argc, char *argv[])
 		clops->cluster_init_completed();
 
 	DEBUGLOG("clvmd ready for work\n");
+#ifdef ENABLE_SD_NOTIFY
+	sd_notify(0, "READY=1\nSTATUS=clvmd ready for work");
+#endif
 	child_init_signal(SUCCESS);
 
 	/* Try to shutdown neatly */
@@ -608,6 +631,10 @@ int main(int argc, char *argv[])
 	/* Do some work */
 	main_loop(local_sock, cmd_timeout);
 
+#ifdef ENABLE_SD_NOTIFY
+	sd_notify(0, "STATUS=Shutting down");
+#endif
+
 	pthread_mutex_lock(&lvm_thread_mutex);
 	pthread_cond_signal(&lvm_thread_cond);
 	pthread_mutex_unlock(&lvm_thread_mutex);
@@ -632,6 +659,11 @@ int main(int argc, char *argv[])
 	}
 
 	ret = 0;
+
+#ifdef ENABLE_SD_NOTIFY
+	sd_notify(0, "STATUS=Finished");
+#endif
+
 out:
 	dm_hash_destroy(lvm_params.excl_uuid);
 
diff --git a/lib/misc/configure.h.in b/lib/misc/configure.h.in
index fdc5a26..5a78f80 100644
--- a/lib/misc/configure.h.in
+++ b/lib/misc/configure.h.in
@@ -77,6 +77,9 @@
 /* Library version */
 #undef DM_LIB_VERSION
 
+/* Define to 1 to include sd_notify() support in clvmd */
+#undef ENABLE_SD_NOTIFY
+
 /* Define to 1 if you have `alloca', as a function or macro. */
 #undef HAVE_ALLOCA
 
-- 
1.7.7.4




More information about the lvm-devel mailing list