]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Implement runtime monitor (un)registration
authorOndřej Kuzník <okuznik@symas.com>
Fri, 23 Mar 2018 16:16:44 +0000 (16:16 +0000)
committerOndřej Kuzník <okuznik@symas.com>
Tue, 17 Nov 2020 17:58:15 +0000 (17:58 +0000)
Unregistration is a hack and we shoould either make the subsystems into
an entry (if monitor allows subentry generation) or implement subsystem
unregistration in back-monitor.

servers/lloadd/backend.c
servers/lloadd/daemon.c
servers/lloadd/lload.h
servers/lloadd/monitor.c
servers/lloadd/proto-lload.h

index d180d246b92b54922cc82614667240f5f5392077..ddc3df3f10f04e1c2a88f39fcf0e27cd7a7e6b13 100644 (file)
@@ -503,6 +503,20 @@ lload_backend_destroy( LloadBackend *b )
         current_backend = next;
     }
 
+#ifdef BALANCER_MODULE
+    if ( b->b_monitor ) {
+        BackendDB *be;
+        struct berval monitordn = BER_BVC("cn=monitor");
+        int rc;
+
+        be = select_backend( &monitordn, 0 );
+
+        /* FIXME: implement proper subsys shutdown in back-monitor or make
+         * backend just an entry, not a subsys */
+        rc = b->b_monitor->mss_destroy( be, b->b_monitor );
+        assert( rc == LDAP_SUCCESS );
+    }
+#endif /* BALANCER_MODULE */
     ldap_pvt_thread_mutex_destroy( &b->b_mutex );
 
     event_del( b->b_retry_event );
index 771f4f38cf3b3a20220f9c9d3aa00bd6a34696f0..e2b2ef2d38b9399321c3fa64a777d49985c70ffc 100644 (file)
@@ -1460,6 +1460,15 @@ lload_handle_backend_invalidation( LloadChange *change )
     assert( change->object == LLOAD_BACKEND );
 
     if ( change->type == LDAP_REQ_ADD ) {
+        BackendInfo *mi = backend_info( "monitor" );
+
+        if ( mi ) {
+            monitor_extra_t *mbe = mi->bi_extra;
+            if ( mbe->is_configured() ) {
+                lload_monitor_backend_init( mi, b );
+            }
+        }
+
         if ( !current_backend ) {
             current_backend = b;
         }
index 80156ccef4ae9396910d5ffcedd38a3e0c70a0a4..f764add16c3cf84a5b584473c39e47c3c82cca44 100644 (file)
@@ -208,6 +208,10 @@ struct LloadBackend {
 
     lload_counters_t b_counters[LLOAD_STATS_OPS_LAST];
 
+#ifdef BALANCER_MODULE
+    monitor_subsys_t *b_monitor;
+#endif /* BALANCER_MODULE */
+
     LDAP_CIRCLEQ_ENTRY(LloadBackend) b_next;
 };
 
index 8efe3d7b48ea9152c86519a6168258ba2edaadb4..176a33d4a908b807bf5d06f134cb361d3f68f428 100644 (file)
@@ -269,6 +269,28 @@ lload_monitor_subsystem_destroy( BackendDB *be, monitor_subsys_t *ms )
     return LDAP_SUCCESS;
 }
 
+static int
+lload_monitor_backend_destroy( BackendDB *be, monitor_subsys_t *ms )
+{
+    LloadBackend *b = ms->mss_private;
+    monitor_extra_t *mbe;
+    int rc = LDAP_SUCCESS;
+
+    mbe = (monitor_extra_t *)be->bd_info->bi_extra;
+    if ( b->b_monitor ) {
+        ms->mss_destroy = lload_monitor_subsystem_destroy;
+
+        assert( b->b_monitor == ms );
+        b->b_monitor = NULL;
+
+        rc = mbe->unregister_entry( &ms->mss_ndn );
+        ber_memfree( ms->mss_dn.bv_val );
+        ber_memfree( ms->mss_ndn.bv_val );
+    }
+
+    return rc;
+}
+
 static void
 lload_monitor_balancer_dispose( void **priv )
 {
@@ -803,8 +825,46 @@ lload_monitor_backend_open( BackendDB *be, monitor_subsys_t *ms )
                 e->e_name.bv_val );
         goto done;
     }
+
+    b->b_monitor = ms;
+    ms->mss_destroy = lload_monitor_backend_destroy;
+
 done:
     entry_free( e );
+    return rc;
+}
+
+int
+lload_monitor_backend_init( BackendInfo *bi, LloadBackend *b )
+{
+    monitor_extra_t *mbe;
+    monitor_subsys_t *bk_mss;
+
+    mbe = (monitor_extra_t *)bi->bi_extra;
+
+    /* FIXME: With back-monitor as it works now, there is no way to know when
+     * this can be safely freed so we leak it on shutdown */
+    bk_mss = ch_calloc( 1, sizeof(monitor_subsys_t) );
+    bk_mss->mss_rdn.bv_len = sizeof("cn=") + b->b_name.bv_len;
+    bk_mss->mss_rdn.bv_val = ch_malloc( bk_mss->mss_rdn.bv_len );
+    bk_mss->mss_rdn.bv_len = snprintf( bk_mss->mss_rdn.bv_val,
+            bk_mss->mss_rdn.bv_len, "cn=%s", b->b_name.bv_val );
+
+    ber_str2bv( LLOAD_MONITOR_BACKENDS_DN, 0, 0, &bk_mss->mss_dn );
+    bk_mss->mss_name = b->b_name.bv_val;
+    bk_mss->mss_flags = MONITOR_F_VOLATILE_CH;
+    bk_mss->mss_open = lload_monitor_backend_open;
+    bk_mss->mss_create = lload_monitor_up_conn_create;
+    bk_mss->mss_destroy = lload_monitor_subsystem_destroy;
+    bk_mss->mss_update = NULL;
+    bk_mss->mss_private = b;
+
+    if ( mbe->register_subsys_late( bk_mss ) ) {
+        Debug( LDAP_DEBUG_ANY, "lload_monitor_backend_init: "
+                "failed to register backend %s\n",
+                bk_mss->mss_name );
+        return -1;
+    }
     return LDAP_SUCCESS;
 }
 
@@ -843,27 +903,8 @@ lload_monitor_backends_init( BackendDB *be, monitor_subsys_t *ms )
     }
 
     LDAP_CIRCLEQ_FOREACH ( b, &backend, b_next ) {
-        monitor_subsys_t *bk_mss = ch_calloc( 1, sizeof(monitor_subsys_t) );
-
-        bk_mss->mss_rdn.bv_len = sizeof("cn=") + b->b_name.bv_len;
-        bk_mss->mss_rdn.bv_val = ch_malloc( bk_mss->mss_rdn.bv_len );
-        bk_mss->mss_rdn.bv_len = snprintf( bk_mss->mss_rdn.bv_val,
-                bk_mss->mss_rdn.bv_len, "cn=%s", b->b_name.bv_val );
-
-        ber_str2bv( LLOAD_MONITOR_BACKENDS_DN, 0, 0, &bk_mss->mss_dn );
-        bk_mss->mss_name = b->b_name.bv_val;
-        bk_mss->mss_flags = MONITOR_F_VOLATILE_CH;
-        bk_mss->mss_open = lload_monitor_backend_open;
-        bk_mss->mss_create = lload_monitor_up_conn_create;
-        bk_mss->mss_destroy = lload_monitor_subsystem_destroy;
-        bk_mss->mss_update = NULL;
-        bk_mss->mss_private = b;
-
-        if ( mbe->register_subsys_late( bk_mss ) ) {
-            Debug( LDAP_DEBUG_ANY, "lload_monitor_backends_init: "
-                    "failed to register %s subsystem",
-                    bk_mss->mss_name );
-            return -1;
+        if ( (rc = lload_monitor_backend_init( be->bd_info, b )) ) {
+            break;
         }
     }
 done:
index e3fd5b421875ae565057945274f622ae0235f7fd..835708fcd1f0d7d7e32a9205283bda7dc8ea3911 100644 (file)
@@ -151,6 +151,7 @@ LDAP_SLAPD_F (void) lload_libevent_destroy( void );
  * monitor.c
  */
 LDAP_SLAPD_F (int) lload_monitor_open( void );
+LDAP_SLAPD_F (int) lload_monitor_backend_init( BackendInfo *bi, LloadBackend *b );
 #endif /* BALANCER_MODULE */
 
 /*