]> git.sur5r.net Git - openldap/blobdiff - tests/scripts/test058-syncrepl-asymmetric
Happy New Year
[openldap] / tests / scripts / test058-syncrepl-asymmetric
index 3730bcd4c9d0abebfbd1491088188ed7f5066bdf..91c4ba8e5d8bdd169feeee45e82efbef679e66bd 100755 (executable)
@@ -2,7 +2,7 @@
 # $OpenLDAP$
 ## This work is part of OpenLDAP Software <http://www.openldap.org/>.
 ##
-## Copyright 1998-2009 The OpenLDAP Foundation.
+## Copyright 1998-2013 The OpenLDAP Foundation.
 ## All rights reserved.
 ##
 ## Redistribution and use in source and binary forms, with or without
 # environment variable RACE_TESTS can be set to the number of race test
 # iterations the script should perform.
 
-case "$BACKEND" in
-bdb|hdb)
-       ;;
-*)
-       echo "This test does not support the $BACKEND backend"
-       exit 0;;
-esac
+if test "$BACKEND" = ldif ; then
+       echo "$BACKEND backend does not support access controls, test skipped"
+       exit 0
+fi
+
+#echo "Test 058 is currently disabled"
+#exit 0
 
 echo "running defines.sh"
 . $SRCDIR/scripts/defines.sh
@@ -134,6 +134,8 @@ SS1_DIR=$TESTDIR/ss1
 SS2_DIR=$TESTDIR/ss2
 SSC_DIR=$TESTDIR/ssc
 
+MNUM=1
+
 mkdir -p $TESTDIR
 
 for dir in $SMC_DIR $SM1_DIR $SM2_DIR $SS1_DIR $SS2_DIR $SSC_DIR; do
@@ -376,7 +378,7 @@ EOF
 dn: cn=module,cn=config
 objectClass: olcModuleList
 cn: module
-olcModulePath: ../../../servers/slapd/back-$BACKEND
+olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND
 olcModuleLoad: back_$BACKEND.la
 EOF
        RC=$?
@@ -393,7 +395,7 @@ if [ "$SYNCPROV" = syncprovmod ]; then
 dn: cn=module,cn=config
 objectClass: olcModuleList
 cn: module
-olcModulePath: ../../../servers/slapd/overlays
+olcModulePath: $TESTWD/../servers/slapd/overlays
 olcModuleLoad: syncprov.la
 
 EOF
@@ -405,12 +407,15 @@ EOF
        fi
 fi
 
+nullExclude="" nullOK="" wantNoObj=32
+test $BACKEND = null && nullExclude="# " nullOK="OK" wantNoObj=0
+
 $LDAPADD -D cn=config -H $URI1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
 dn: olcDatabase={1}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {1}$BACKEND
-olcDbDirectory: $SMC_DIR/db
+${nullExclude}olcDbDirectory: $SMC_DIR/db
 olcSuffix: $BASEDN
 olcRootDN: $MANAGERDN
 olcRootPW: $PASSWD
@@ -427,45 +432,45 @@ olcSpCheckpoint: 3 1
 
 dn: olcDatabase={1}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {1}$BACKEND
-olcDbDirectory: $SMC_DIR/ou1
+${nullExclude}olcDbDirectory: $SMC_DIR/ou1
 olcSubordinate: TRUE
 olcSuffix: ou=ou1,$BASEDN
 olcRootDN: $MANAGERDN
 
 dn: olcDatabase={2}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {2}$BACKEND
-olcDbDirectory: $SMC_DIR/ou2
+${nullExclude}olcDbDirectory: $SMC_DIR/ou2
 olcSubordinate: TRUE
 olcSuffix: ou=ou2,$BASEDN
 olcRootDN: $MANAGERDN
 
 dn: olcDatabase={3}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {3}$BACKEND
-olcDbDirectory: $SMC_DIR/sm1ou1
+${nullExclude}olcDbDirectory: $SMC_DIR/sm1ou1
 olcSubordinate: TRUE
 olcSuffix: ou=sm1ou1,$BASEDN
 olcRootDN: $UPDATEDN
 
 dn: olcDatabase={4}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {4}$BACKEND
-olcDbDirectory: $SMC_DIR/sm1ou2
+${nullExclude}olcDbDirectory: $SMC_DIR/sm1ou2
 olcSubordinate: TRUE
 olcSuffix: ou=sm1ou2,$BASEDN
 olcRootDN: $UPDATEDN
 
 dn: olcDatabase={5}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {5}$BACKEND
-olcDbDirectory: $SMC_DIR/sm2ou1
+${nullExclude}olcDbDirectory: $SMC_DIR/sm2ou1
 olcSubordinate: TRUE
 olcSuffix: ou=sm2ou1,$BASEDN
 olcRootDN: $UPDATEDN
@@ -484,7 +489,7 @@ if [ "$SYNCPROV" = syncprovmod ]; then
 dn: cn=module,cn=config
 objectClass: olcModuleList
 cn: module
-olcModulePath: ../../../servers/slapd/overlays
+olcModulePath: $TESTWD/../servers/slapd/overlays
 olcModuleLoad: syncprov.la
 
 EOF
@@ -499,9 +504,9 @@ fi
 $LDAPADD -D cn=config -H $URI2 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
 dn: olcDatabase={1}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {1}$BACKEND
-olcDbDirectory: $SM1_DIR/db
+${nullExclude}olcDbDirectory: $SM1_DIR/db
 olcSuffix: $BASEDN
 olcRootDN: $UPDATEDN
 
@@ -516,18 +521,18 @@ olcOverlay: {1}syncprov
 
 dn: olcDatabase={1}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {1}$BACKEND
-olcDbDirectory: $SM1_DIR/ou1
+${nullExclude}olcDbDirectory: $SM1_DIR/ou1
 olcSubordinate: TRUE
 olcSuffix: ou=ou1,$BASEDN
 olcRootDN: $UPDATEDN
 
 dn: olcDatabase={2}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {2}$BACKEND
-olcDbDirectory: $SM1_DIR/sm1ou1
+${nullExclude}olcDbDirectory: $SM1_DIR/sm1ou1
 olcSubordinate: TRUE
 olcSuffix: ou=sm1ou1,$BASEDN
 olcRootDN: ou=sm1ou1,$BASEDN
@@ -535,9 +540,9 @@ olcRootPW: $PASSWD
 
 dn: olcDatabase={3}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {3}$BACKEND
-olcDbDirectory: $SM1_DIR/sm1ou2
+${nullExclude}olcDbDirectory: $SM1_DIR/sm1ou2
 olcSubordinate: TRUE
 olcSuffix: ou=sm1ou2,$BASEDN
 olcRootDN: ou=sm1ou1,$BASEDN
@@ -557,7 +562,7 @@ if [ "$SYNCPROV" = syncprovmod ]; then
 dn: cn=module,cn=config
 objectClass: olcModuleList
 cn: module
-olcModulePath: ../../../servers/slapd/overlays
+olcModulePath: $TESTWD/../servers/slapd/overlays
 olcModuleLoad: syncprov.la
 
 EOF
@@ -572,9 +577,9 @@ fi
 $LDAPADD -D cn=config -H $URI3 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
 dn: olcDatabase={1}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {1}$BACKEND
-olcDbDirectory: $SM2_DIR/db
+${nullExclude}olcDbDirectory: $SM2_DIR/db
 olcSuffix: $BASEDN
 olcRootDN: $UPDATEDN
 
@@ -590,27 +595,27 @@ olcSpCheckpoint: 1 1
 
 dn: olcDatabase={1}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {1}$BACKEND
-olcDbDirectory: $SM2_DIR/ou2
+${nullExclude}olcDbDirectory: $SM2_DIR/ou2
 olcSubordinate: TRUE
 olcSuffix: ou=ou2,$BASEDN
 olcRootDN: $UPDATEDN
 
 dn: olcDatabase={2}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {2}$BACKEND
-olcDbDirectory: $SM2_DIR/sm1ou1
+${nullExclude}olcDbDirectory: $SM2_DIR/sm1ou1
 olcSubordinate: TRUE
 olcSuffix: ou=sm1ou1,$BASEDN
 olcRootDN: $UPDATEDN
 
 dn: olcDatabase={3}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {3}$BACKEND
-olcDbDirectory: $SM2_DIR/sm2ou1
+${nullExclude}olcDbDirectory: $SM2_DIR/sm2ou1
 olcSubordinate: TRUE
 olcSuffix: ou=sm2ou1,$BASEDN
 olcRootDN: ou=sm2ou1,$BASEDN
@@ -618,9 +623,9 @@ olcRootPW: $PASSWD
 
 dn: olcDatabase={4}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {4}$BACKEND
-olcDbDirectory: $SM2_DIR/sm2ou2
+${nullExclude}olcDbDirectory: $SM2_DIR/sm2ou2
 olcSubordinate: TRUE
 olcSuffix: ou=sm2ou2,$BASEDN
 olcRootDN: ou=sm2ou1,$BASEDN
@@ -722,9 +727,9 @@ echo "Adding database config on central search..."
 $LDAPADD -D cn=config -H $URI4 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
 dn: olcDatabase={1}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {1}$BACKEND
-olcDbDirectory: $SSC_DIR/db
+${nullExclude}olcDbDirectory: $SSC_DIR/db
 olcSuffix: $BASEDN
 olcRootDN: $UPDATEDN
 
@@ -740,9 +745,9 @@ echo "Adding database config on site1 search..."
 $LDAPADD -D cn=config -H $URI5 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
 dn: olcDatabase={1}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {1}$BACKEND
-olcDbDirectory: $SS1_DIR/db
+${nullExclude}olcDbDirectory: $SS1_DIR/db
 olcSuffix: $BASEDN
 olcRootDN: $UPDATEDN
 
@@ -758,9 +763,9 @@ echo "Adding database config on site2 search..."
 $LDAPADD -D cn=config -H $URI6 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
 dn: olcDatabase={1}$BACKEND,cn=config
 objectClass: olcDatabaseConfig
-objectClass: olc${BACKEND}Config
+${nullExclude}objectClass: olc${BACKEND}Config
 olcDatabase: {1}$BACKEND
-olcDbDirectory: $SS2_DIR/db
+${nullExclude}olcDbDirectory: $SS2_DIR/db
 olcSuffix: $BASEDN
 olcRootDN: $UPDATEDN
 
@@ -843,7 +848,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI2 \
                -s base -b "ou=ou1,$BASEDN" \
                '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -862,7 +867,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI3 \
                -s base -b "ou=ou1,$BASEDN" \
                '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -963,7 +968,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI1 \
                -s base -b "ou=sm2ou1,$BASEDN" \
                '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -976,6 +981,29 @@ if test $RC != 0 ; then
        exit $RC
 fi
 
+# Test for ITS#6716, modify on central master to ensure that the CSN
+# order is "sid2 < sid3 < sid1".  When site1 master starts it is likely
+# to sync with central master before it syncs with site1 master. When
+# central master syncs with site1 master they will share the sid1 and
+# sid3 CSNs, the additonal sid2 CSN hold by site1 master will be the
+# oldest. Central master will not receive the changes made on site1
+# master unless it completely ignores the CSNs presented by central
+# master.
+echo "Using ldapmodify to modify central master..."
+$LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD <<EOF >> $TESTOUT 2>&1
+dn: dc=example,dc=com
+changetype: modify
+add: description
+description: Modify$MNUM
+
+EOF
+RC=$?
+if test $RC != 0 ; then
+       echo "ldapmodify failed ($RC)!"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+       exit $RC
+fi
+
 if test -z "$SM1_PID" ; then
        echo "Restarting site1 master slapd on TCP/IP port $PORT2..."
        cd $SM1_DIR
@@ -1011,7 +1039,45 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI1 \
                -s base -b "ou=sm1ou1,$BASEDN" \
                '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
+               RC=0
+               break
+       fi
+       echo "Waiting $i seconds for syncrepl to receive changes..."
+       sleep $i
+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 site1 master received central master update..."
+RC=32
+for i in 1 2 3 4 5; do
+       RESULT=`$LDAPSEARCH -H $URI2 \
+               -s base -b "$BASEDN" \
+               "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
+       if test "x$RESULT$nullOK" = "xOK" ; then
+               RC=0
+               break
+       fi
+       echo "Waiting $i seconds for syncrepl to receive changes..."
+       sleep $i
+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 site2 master received central master update..."
+RC=32
+for i in 1 2 3 4 5; do
+       RESULT=`$LDAPSEARCH -H $URI3 \
+               -s base -b "$BASEDN" \
+               "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1084,7 +1150,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI4 \
                -s base -b "$BASEDN" \
                '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1103,7 +1169,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI5 \
                -s base -b "$BASEDN" \
                '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1122,7 +1188,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI6 \
                -s base -b "$BASEDN" \
                '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1508,14 +1574,14 @@ ERRORS=`expr $ERRORS + $CSN_ERRORS`
 
 EOF
 
+test $BACKEND = null && echo : > $TESTDIR/checkcsn.sh
+
 chmod +x $TESTDIR/checkcsn.sh
 
 
 echo "Checking contextCSN after initial replication..."
 . $TESTDIR/checkcsn.sh
 
-MNUM=1
-
 # TEST:
 # Test that updates to the first backend on central master, which should
 # be replicated to all servers actually is so, and that the contextCSN is
@@ -1542,7 +1608,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI4 \
                -s base -b "ou=ou1,$BASEDN" \
                "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1561,7 +1627,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI5 \
                -s base -b "ou=ou1,$BASEDN" \
                "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1580,7 +1646,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI6 \
                -s base -b "ou=ou1,$BASEDN" \
                "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1623,7 +1689,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI6 \
                -s base -b "ou=ou2,$BASEDN" \
                "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1692,7 +1758,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI5 \
                -s base -b "ou=sm1ou1,$BASEDN" \
                "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1711,7 +1777,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI3 \
                -s base -b "ou=sm1ou1,$BASEDN" \
                "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1781,7 +1847,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI5 \
                -s base -b "ou=sm1ou2,$BASEDN" \
                "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1838,7 +1904,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI1 \
                -s base -b "ou=sm2ou1,$BASEDN" \
                "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1857,7 +1923,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI6 \
                -s base -b "ou=sm2ou1,$BASEDN" \
                "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -1927,7 +1993,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI6 \
                -s base -b "ou=sm2ou2,$BASEDN" \
                "(description=Modify$MNUM)" 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -2057,7 +2123,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI3 \
                -s base -b "$BASEDN" \
                '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -2076,7 +2142,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI6 \
                -s base -b "$BASEDN" \
                '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -2128,7 +2194,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI1 \
                -s base -b "ou=sm1ou2,$BASEDN" \
                '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -2174,7 +2240,7 @@ if test $RC != 0 ; then
                RESULT=`$LDAPSEARCH -H $URI1 \
                        -s base -b "ou=sm1ou2,$BASEDN" \
                        '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-               if test "x$RESULT" = "xOK" ; then
+               if test "x$RESULT$nullOK" = "xOK" ; then
                        RC=0
                        break
                fi
@@ -2194,7 +2260,7 @@ for i in 1 2 3 4 5; do
        RESULT=`$LDAPSEARCH -H $URI4 \
                -s base -b "ou=sm1ou2,$BASEDN" \
                '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-       if test "x$RESULT" = "xOK" ; then
+       if test "x$RESULT$nullOK" = "xOK" ; then
                RC=0
                break
        fi
@@ -2240,7 +2306,7 @@ if test $RC != 0 ; then
                RESULT=`$LDAPSEARCH -H $URI4 \
                        -s base -b "ou=sm1ou2,$BASEDN" \
                        '(objectClass=*)' 2>&1 | awk '/^dn:/ {print "OK"}'`
-               if test "x$RESULT" = "xOK" ; then
+               if test "x$RESULT$nullOK" = "xOK" ; then
                        RC=0
                        break
                fi
@@ -2257,7 +2323,7 @@ fi
 
 # TEST:
 # Run race tests when more than one backend is replicated from the same
-# producer.  This will usually fail long before 100 iterations unless
+# provider.  This will usually fail long before 100 iterations unless
 # syncrepl stores the contextCSN in the suffix of its own database, and
 # that syncprov follows these rules before updating its own CSN when it
 # detects updates from syncrepl:
@@ -2354,11 +2420,16 @@ EOF
        for i in 1 2 3 4 5; do
                $LDAPSEARCH -s base -b "$SUB_DN" -H $URI1 > /dev/null 2>&1
                RC=$?
-               if test $RC != 0; then break; fi
+               if test $RC = $wantNoObj; then break; fi
                sleep $i
        done
 
-       if test $RC = 0; then
+       if test $RC != $wantNoObj; then
+               if test $RC != 0; then
+                       echo "ldapsearch failed ($RC)!"
+                       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+                       exit $RC
+               fi
                echo "ERROR: Entry not removed on central master!"
                RACE_ERROR=1
                break
@@ -2373,8 +2444,8 @@ EOF
                sleep $i
        done
 
-       if test $RC = 0; then
-               echo "ERROR: Entry not removed on central search!"
+       if test $RC != $wantNoObj; then
+               echo "ERROR: Entry not removed on central search! (RC=$RC)"
                RACE_ERROR=1
                break
        fi