]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/nextid.c
Change slapd/delete stats message for consistency.
[openldap] / servers / slapd / back-ldbm / nextid.c
index 594e542a21778ce8930bddb46519519e73518998..25841ca86d9fdef58247e9c85c8095ef987619c7 100644 (file)
@@ -82,13 +82,27 @@ next_id_write( Backend *be, ID id )
        return rc;
 }
 
+int
+next_id_save( Backend *be )
+{
+       struct ldbminfo *li = (struct ldbminfo *) be->be_private;
+       ID id = next_id_get( be );
+       int rc = next_id_write( be, id );
+
+       if (rc == 0) {
+               li->li_nextid_wrote = id;
+       }
+
+       return rc;
+}
+
 ID
 next_id( Backend *be )
 {
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
        ID              id;
 
-       pthread_mutex_lock( &li->li_nextid_mutex );
+       ldap_pvt_thread_mutex_lock( &li->li_nextid_mutex );
 
        /* first time in here since startup - try to read the nexid */
        if ( li->li_nextid == NOID ) {
@@ -97,31 +111,48 @@ next_id( Backend *be )
                if ( li->li_nextid == NOID ) {
                        li->li_nextid = 1;
                }
+
+#if SLAPD_NEXTID_CHUNK > 1
+               li->li_nextid_wrote = li->li_nextid;
+#endif
        }
 
        id = li->li_nextid++;
+
+#if SLAPD_NEXTID_CHUNK > 1
+       if ( li->li_nextid > li->li_nextid_wrote ) {
+               li->li_nextid_wrote += SLAPD_NEXTID_CHUNK;
+               (void) next_id_write( be, li->li_nextid_wrote );
+       }
+#else
        (void) next_id_write( be, li->li_nextid );
+#endif
 
-       pthread_mutex_unlock( &li->li_nextid_mutex );
+       ldap_pvt_thread_mutex_unlock( &li->li_nextid_mutex );
        return( id );
 }
 
 void
 next_id_return( Backend *be, ID id )
 {
+#ifdef SLAPD_NEXTID_RETURN
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
 
-       pthread_mutex_lock( &li->li_nextid_mutex );
+       ldap_pvt_thread_mutex_lock( &li->li_nextid_mutex );
 
        if ( id != li->li_nextid - 1 ) {
-               pthread_mutex_unlock( &li->li_nextid_mutex );
+               ldap_pvt_thread_mutex_unlock( &li->li_nextid_mutex );
                return;
        }
 
        li->li_nextid--;
+
+#if !( SLAPD_NEXTID_CHUCK > 1 )
        (void) next_id_write( be, li->li_nextid );
+#endif
 
-       pthread_mutex_unlock( &li->li_nextid_mutex );
+       ldap_pvt_thread_mutex_unlock( &li->li_nextid_mutex );
+#endif
 }
 
 ID
@@ -130,7 +161,7 @@ next_id_get( Backend *be )
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
        ID              id;
 
-       pthread_mutex_lock( &li->li_nextid_mutex );
+       ldap_pvt_thread_mutex_lock( &li->li_nextid_mutex );
 
        /* first time in here since startup - try to read the nexid */
        if ( li->li_nextid == NOID ) {
@@ -139,11 +170,15 @@ next_id_get( Backend *be )
                if ( li->li_nextid == NOID ) {
                        li->li_nextid = 1;
                }
+
+#if SLAPD_NEXTID_CHUNK > 1
+               li->li_nextid_wrote = li->li_nextid;
+#endif
        }
 
        id = li->li_nextid;
 
-       pthread_mutex_unlock( &li->li_nextid_mutex );
+       ldap_pvt_thread_mutex_unlock( &li->li_nextid_mutex );
 
        return( id );
 }