]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#8747 Do not observe an epoch while calling dispose_cb
authorOndřej Kuzník <ondra@mistotebe.net>
Fri, 8 Jan 2021 11:32:04 +0000 (05:32 -0600)
committerQuanah Gibson-Mount <quanah@openldap.org>
Mon, 10 May 2021 18:49:13 +0000 (18:49 +0000)
servers/lloadd/epoch.c

index dce030ce96b0c98636548da2d72de65f81877485..b46928369e59807b077054fa562fa3ad68e67c48 100644 (file)
@@ -112,6 +112,7 @@ epoch_join( void )
     epoch_t epoch;
     struct pending_ref *old, *ref = NULL;
 
+retry:
     /* TODO: make this completely lock-free */
     ldap_pvt_thread_rdwr_rlock( &epoch_mutex );
     epoch = current_epoch;
@@ -134,6 +135,19 @@ epoch_join( void )
     current_epoch = EPOCH_NEXT(epoch);
     ldap_pvt_thread_rdwr_wunlock( &epoch_mutex );
 
+    if ( !ref ) {
+        return epoch;
+    }
+
+    /*
+     * The below is now safe to free outside epochs and we don't want to make
+     * the current epoch last any longer than necessary.
+     *
+     * Looks like there might be fairness issues in massively parallel
+     * environments but they haven't been observed on 32-core machines.
+     */
+    epoch_leave( epoch );
+
     for ( old = ref; old; old = ref ) {
         ref = old->next;
 
@@ -141,7 +155,7 @@ epoch_join( void )
         ch_free( old );
     }
 
-    return epoch;
+    goto retry;
 }
 
 void