]> git.sur5r.net Git - openldap/commitdiff
Add trickle-sync for quick mode
authorHoward Chu <hyc@openldap.org>
Sat, 7 Apr 2007 06:10:01 +0000 (06:10 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 7 Apr 2007 06:10:01 +0000 (06:10 +0000)
servers/slapd/back-bdb/tools.c

index f22a057ec9ade75e921edaf8c59f927186575015..65d947b379e5c6d94a326fe16abd6cfe6c1baa0f 100644 (file)
@@ -74,7 +74,11 @@ static ldap_pvt_thread_mutex_t bdb_tool_index_mutex;
 static ldap_pvt_thread_cond_t bdb_tool_index_cond_main;
 static ldap_pvt_thread_cond_t bdb_tool_index_cond_work;
 
+static ldap_pvt_thread_mutex_t bdb_tool_trickle_mutex;
+static ldap_pvt_thread_cond_t bdb_tool_trickle_cond;
+
 static void * bdb_tool_index_task( void *ctx, void *ptr );
+static void * bdb_tool_trickle_task( void *ctx, void *ptr );
 
 int bdb_tool_entry_open(
        BackendDB *be, int mode )
@@ -97,24 +101,29 @@ int bdb_tool_entry_open(
        }
 
        /* Set up for threaded slapindex */
-       if (( slapMode & (SLAP_TOOL_QUICK|SLAP_TOOL_READONLY)) == SLAP_TOOL_QUICK
-               && bdb->bi_nattrs ) {
+       if (( slapMode & (SLAP_TOOL_QUICK|SLAP_TOOL_READONLY)) == SLAP_TOOL_QUICK ) {
                if ( !bdb_tool_info ) {
-                       int i;
+                       ldap_pvt_thread_mutex_init( &bdb_tool_trickle_mutex );
+                       ldap_pvt_thread_cond_init( &bdb_tool_trickle_cond );
+                       ldap_pvt_thread_pool_submit( &connection_pool, bdb_tool_trickle_task, bdb->bi_dbenv );
+
                        ldap_pvt_thread_mutex_init( &bdb_tool_index_mutex );
                        ldap_pvt_thread_cond_init( &bdb_tool_index_cond_main );
                        ldap_pvt_thread_cond_init( &bdb_tool_index_cond_work );
-                       bdb_tool_index_threads = ch_malloc( slap_tool_thread_max * sizeof( int ));
-                       bdb_tool_index_rec = ch_malloc( bdb->bi_nattrs * sizeof( IndexRec ));
-                       bdb_tool_index_tcount = slap_tool_thread_max - 1;
-                       for (i=1; i<slap_tool_thread_max; i++) {
-                               int *ptr = ch_malloc( sizeof( int ));
-                               *ptr = i;
-                               ldap_pvt_thread_pool_submit( &connection_pool,
-                                       bdb_tool_index_task, ptr );
+                       if ( bdb->bi_nattrs ) {
+                               int i;
+                               bdb_tool_index_threads = ch_malloc( slap_tool_thread_max * sizeof( int ));
+                               bdb_tool_index_rec = ch_malloc( bdb->bi_nattrs * sizeof( IndexRec ));
+                               bdb_tool_index_tcount = slap_tool_thread_max - 1;
+                               for (i=1; i<slap_tool_thread_max; i++) {
+                                       int *ptr = ch_malloc( sizeof( int ));
+                                       *ptr = i;
+                                       ldap_pvt_thread_pool_submit( &connection_pool,
+                                               bdb_tool_index_task, ptr );
+                               }
                        }
+                       bdb_tool_info = bdb;
                }
-               bdb_tool_info = bdb;
        }
 
        return 0;
@@ -125,6 +134,9 @@ int bdb_tool_entry_close(
 {
        if ( bdb_tool_info ) {
                slapd_shutdown = 1;
+               ldap_pvt_thread_mutex_lock( &bdb_tool_trickle_mutex );
+               ldap_pvt_thread_cond_signal( &bdb_tool_trickle_cond );
+               ldap_pvt_thread_mutex_unlock( &bdb_tool_trickle_mutex );
                ldap_pvt_thread_mutex_lock( &bdb_tool_index_mutex );
                bdb_tool_index_tcount = slap_tool_thread_max - 1;
                ldap_pvt_thread_cond_broadcast( &bdb_tool_index_cond_work );
@@ -522,6 +534,12 @@ ID bdb_tool_entry_put(
                goto done;
        }
 
+       if (( slapMode & SLAP_TOOL_QUICK ) && (( e->e_id & 0xfff ) == 0xfff )) {
+               ldap_pvt_thread_mutex_lock( &bdb_tool_trickle_mutex );
+               ldap_pvt_thread_cond_signal( &bdb_tool_trickle_cond );
+               ldap_pvt_thread_mutex_unlock( &bdb_tool_trickle_mutex );
+       }
+
        if ( !bdb->bi_linear_index )
                rc = bdb_tool_index_add( &op, tid, e );
        if( rc != 0 ) {
@@ -1087,6 +1105,23 @@ int bdb_tool_idl_add(
 }
 #endif
 
+static void *
+bdb_tool_trickle_task( void *ctx, void *ptr )
+{
+       DB_ENV *env = ptr;
+       int wrote;
+
+       ldap_pvt_thread_mutex_lock( &bdb_tool_trickle_mutex );
+       while ( 1 ) {
+               ldap_pvt_thread_cond_wait( &bdb_tool_trickle_cond,
+                       &bdb_tool_trickle_mutex );
+               if ( slapd_shutdown )
+                       break;
+               env->memp_trickle( env, 30, &wrote );
+       }
+       ldap_pvt_thread_mutex_unlock( &bdb_tool_trickle_mutex );
+}
+
 static void *
 bdb_tool_index_task( void *ctx, void *ptr )
 {