]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#8707 systemd notifications from lloadd
authorOndřej Kuzník <ondra@mistotebe.net>
Wed, 7 Apr 2021 14:49:19 +0000 (15:49 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Tue, 20 Apr 2021 22:54:19 +0000 (22:54 +0000)
servers/lloadd/Makefile_server.in
servers/lloadd/daemon.c
servers/lloadd/module_init.c

index 2e01aa512ec05a024a39b6995a86c77871deb8d3..f942916244e92168975f33c0b8b446e817060099 100644 (file)
@@ -33,7 +33,7 @@ all-local-srv:        $(PROGRAMS) all-cffiles
 
 # $(LTHREAD_LIBS) must be last!
 XLIBS = $(LLOADD_L)
-XXLIBS = $(LLOADD_LIBS) $(SECURITY_LIBS) $(LUTIL_LIBS)
+XXLIBS = $(LLOADD_LIBS) $(SECURITY_LIBS) $(LUTIL_LIBS) $(SYSTEMD_LIBS)
 XXXLIBS = $(LTHREAD_LIBS)
 
 NT_DEPENDS = slapd.exp
index 20993b0637aa0efd8e912b69153ab407ff8c1d93..3ddee5dee4084ac28391c73566d4abd2d19527f0 100644 (file)
 
 #include "ldap_rq.h"
 
+#ifdef HAVE_SYSTEMD_SD_DAEMON_H
+#include <systemd/sd-daemon.h>
+#endif
+
 #ifdef LDAP_PF_LOCAL
 #include <sys/stat.h>
 /* this should go in <ldap.h> as soon as it is accepted */
@@ -1303,7 +1307,18 @@ lloadd_daemon( struct event_base *daemon_base )
         event_add( event, lload_timeout_api );
     }
 
+    checked_lock( &lload_wait_mutex );
     lloadd_inited = 1;
+    ldap_pvt_thread_cond_signal( &lload_wait_cond );
+    checked_unlock( &lload_wait_mutex );
+#if !defined(BALANCER_MODULE) && defined(HAVE_SYSTEMD)
+    rc = sd_notify( 1, "READY=1" );
+    if ( rc < 0 ) {
+        Debug( LDAP_DEBUG_ANY, "lloadd startup: "
+            "systemd sd_notify failed (%d)\n", rc );
+    }
+#endif /* !BALANCER_MODULE && HAVE_SYSTEMD */
+
     rc = event_base_dispatch( daemon_base );
     Debug( LDAP_DEBUG_ANY, "lloadd shutdown: "
             "Main event loop finished: rc=%d\n",
@@ -1361,7 +1376,9 @@ lloadd_daemon( struct event_base *daemon_base )
 
     /* If we're a slapd module, let the thread that initiated the shut down
      * know we've finished */
+    checked_lock( &lload_wait_mutex );
     ldap_pvt_thread_cond_signal( &lload_wait_cond );
+    checked_unlock( &lload_wait_mutex );
 
     return 0;
 }
index 0a30d18827ab5bfa45afed2d003b031d9359ee3c..61b1b351ee55d93a906f34217fb1addb14e7a382 100644 (file)
@@ -53,10 +53,17 @@ lload_start_daemon( void *arg )
         Debug( LDAP_DEBUG_ANY, "lload_start_daemon: "
                 "main event base allocation failed\n" );
         rc = 1;
-        return (void *)(uintptr_t)rc;
+        goto done;
     }
 
     rc = lloadd_daemon( daemon_base );
+done:
+    if ( rc != LDAP_SUCCESS ) {
+        assert( lloadd_inited == 0 );
+        checked_lock( &lload_wait_mutex );
+        ldap_pvt_thread_cond_signal( &lload_wait_cond );
+        checked_unlock( &lload_wait_mutex );
+    }
     return (void *)(uintptr_t)rc;
 }
 
@@ -81,6 +88,8 @@ lload_unpause_cb( BackendInfo *bi )
 int
 lload_back_open( BackendInfo *bi )
 {
+    int rc = 0;
+
     if ( slapMode & SLAP_TOOL_MODE ) {
         return 0;
     }
@@ -99,8 +108,18 @@ lload_back_open( BackendInfo *bi )
 
     assert( lloadd_get_listeners() );
 
-    return ldap_pvt_thread_create(
-            &lloadd_main_thread, 0, lload_start_daemon, NULL );
+    checked_lock( &lload_wait_mutex );
+    rc = ldap_pvt_thread_create( &lloadd_main_thread,
+            0, lload_start_daemon, NULL );
+    if ( !rc ) {
+        ldap_pvt_thread_cond_wait( &lload_wait_cond, &lload_wait_mutex );
+        if ( lloadd_inited != 1 ) {
+            ldap_pvt_thread_join( lloadd_main_thread, (void *)NULL );
+            rc = -1;
+        }
+    }
+    checked_unlock( &lload_wait_mutex );
+    return rc;
 }
 
 int
@@ -110,6 +129,8 @@ lload_back_close( BackendInfo *bi )
         return 0;
     }
 
+    assert( lloadd_inited == 1 );
+
     checked_lock( &lload_wait_mutex );
     event_base_loopexit( daemon_base, NULL );
     ldap_pvt_thread_cond_wait( &lload_wait_cond, &lload_wait_mutex );