mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-06 10:46:21 +08:00
Add trickle-sync for quick mode
This commit is contained in:
parent
ce58d69810
commit
87466fc7c8
@ -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,13 +101,17 @@ 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 );
|
||||
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;
|
||||
@ -116,6 +124,7 @@ int bdb_tool_entry_open(
|
||||
}
|
||||
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 )
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user