static ID bdb_tool_ix_id;
static Operation *bdb_tool_ix_op;
-static volatile int *bdb_tool_index_threads;
+static int *bdb_tool_index_threads, bdb_tool_index_tcount;
static void *bdb_tool_index_rec;
static struct bdb_info *bdb_tool_info;
static ldap_pvt_thread_mutex_t bdb_tool_index_mutex;
ldap_pvt_thread_cond_init( &bdb_tool_index_cond );
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 );
- ldap_pvt_thread_yield();
}
}
bdb_tool_info = bdb;
if ( bdb_tool_info ) {
slapd_shutdown = 1;
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 );
ldap_pvt_thread_mutex_unlock( &bdb_tool_index_mutex );
}
bdb_tool_ix_id = e->e_id;
bdb_tool_ix_op = op;
ldap_pvt_thread_mutex_lock( &bdb_tool_index_mutex );
+ /* Wait for all threads to be ready */
+ while ( bdb_tool_index_tcount ) {
+ ldap_pvt_thread_mutex_unlock( &bdb_tool_index_mutex );
+ ldap_pvt_thread_yield();
+ ldap_pvt_thread_mutex_lock( &bdb_tool_index_mutex );
+ }
for ( i=1; i<slap_tool_thread_max; i++ )
bdb_tool_index_threads[i] = LDAP_BUSY;
+ bdb_tool_index_tcount = slap_tool_thread_max - 1;
ldap_pvt_thread_cond_broadcast( &bdb_tool_index_cond );
ldap_pvt_thread_mutex_unlock( &bdb_tool_index_mutex );
rc = bdb_index_recrun( op, bdb, ir, e->e_id, 0 );
free( ptr );
while ( 1 ) {
ldap_pvt_thread_mutex_lock( &bdb_tool_index_mutex );
+ bdb_tool_index_tcount--;
ldap_pvt_thread_cond_wait( &bdb_tool_index_cond,
&bdb_tool_index_mutex );
ldap_pvt_thread_mutex_unlock( &bdb_tool_index_mutex );
int freetext = 0;
int do_retry = 1;
LDAPControl **ctrls = NULL;
+ /* FIXME: shouldn't this be null? */
+ const char *save_matched = rs->sr_matched;
lc = ldap_back_getconn( op, rs, LDAP_BACK_SENDERR );
if ( !lc || !ldap_back_dobind( lc, op, rs, LDAP_BACK_SENDERR ) ) {
rs->sr_ctrls = NULL;
}
- if ( rs->sr_matched != NULL ) {
+ if ( rs->sr_matched != NULL && rs->sr_matched != save_matched ) {
if ( rs->sr_matched != match.bv_val ) {
ber_memfree_x( (char *)rs->sr_matched, op->o_tmpmemctx );
} else {
LDAP_FREE( match.bv_val );
}
- rs->sr_matched = NULL;
+ rs->sr_matched = save_matched;
}
if ( !BER_BVISNULL( &filter ) && filter.bv_val != op->ors_filterstr.bv_val ) {
exit 0
fi
+rm -rf $TESTDIR
+
mkdir -p $TESTDIR $DBDIR1 $DBDIR2
echo "Running slapadd to build slapd database..."
echo PID $PID1
read foo
fi
+KILLPIDS="$PID1"
echo "Starting second slapd on TCP/IP port $PORT2..."
. $CONFFILTER $BACKEND $MONITORDB < $CHAINCONF2 > $CONF2
read foo
fi
-KILLPIDS="$PID1 $PID2"
+KILLPIDS="$KILLPIDS $PID2"
sleep 1
sleep 5
done
+if test $RC != 0 ; then
+ echo "ldapsearch failed ($RC)!"
+ test $KILLSERVERS != no && kill -HUP $KILLPIDS
+ exit $RC
+fi
+
echo "Using ldapsearch to check that second slapd is running..."
for i in 0 1 2 3 4 5; do
$LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT2 \
sleep 5
done
+if test $RC != 0 ; then
+ echo "ldapsearch failed ($RC)!"
+ test $KILLSERVERS != no && kill -HUP $KILLPIDS
+ exit $RC
+fi
+
for P in $PORT1 $PORT2 ; do
echo "Testing ldapsearch as anonymous for \"$BASEDN\" on port $P..."
$LDAPSEARCH -h $LOCALHOST -p $P -b "$BASEDN" -S "" \