static int
lload_monitor_subsystem_destroy( BackendDB *be, monitor_subsys_t *ms )
{
+ ch_free( ms->mss_dn.bv_val );
+ ch_free( ms->mss_ndn.bv_val );
+ return LDAP_SUCCESS;
+}
+
+static int
+lload_monitor_subsystem_free( BackendDB *be, monitor_subsys_t *ms )
+{
+ lload_monitor_subsystem_destroy( be, ms );
+ ch_free( ms );
return LDAP_SUCCESS;
}
monitor_extra_t *mbe;
int rc = LDAP_SUCCESS;
+ ms->mss_destroy = lload_monitor_subsystem_free;
+
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;
lload_monitor_tier_destroy( BackendDB *be, monitor_subsys_t *ms )
{
LloadTier *tier = ms->mss_private;
- monitor_extra_t *mbe;
- mbe = (monitor_extra_t *)be->bd_info->bi_extra;
- if ( tier->t_monitor ) {
- ms->mss_destroy = lload_monitor_subsystem_destroy;
+ assert( slapd_shutdown || ( tier && tier->t_monitor == ms ) );
+
+ ms->mss_destroy = lload_monitor_subsystem_free;
+
+ if ( !slapd_shutdown ) {
+ monitor_extra_t *mbe;
- assert( tier->t_monitor == ms );
tier->t_monitor = NULL;
+ mbe = (monitor_extra_t *)be->bd_info->bi_extra;
return mbe->unregister_entry( &ms->mss_ndn );
}
- return LDAP_SUCCESS;
+ return ms->mss_destroy( be, ms );
}
static void
#ifdef BALANCER_MODULE
if ( tier->t_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 = tier->t_monitor->mss_destroy( be, tier->t_monitor );
- assert( rc == LDAP_SUCCESS );
+ if ( slapd_shutdown ) {
+ /* Just drop backlink, back-monitor will call mss_destroy later */
+ assert( tier->t_monitor->mss_private == tier );
+ tier->t_monitor->mss_private = NULL;
+ } else {
+ BackendDB *be;
+ struct berval monitordn = BER_BVC("cn=monitor");
+ int rc;
+
+ be = select_backend( &monitordn, 0 );
+
+ rc = tier->t_monitor->mss_destroy( be, tier->t_monitor );
+ assert( rc == LDAP_SUCCESS );
+ }
}
#endif /* BALANCER_MODULE */
+ ch_free( tier->t_name.bv_val );
ch_free( tier );
return LDAP_SUCCESS;
}