This is a multi-part message in MIME format.
--------------090602010509010401080002
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit

I saw that the master is lost some changes of the my original patch 
(that was early attached to ITS).

Please see attached diff.
I think it is a race condition around si_cookieState inside for-loop.

--------------090602010509010401080002
Content-Type: text/x-patch;
 name="its#7968-lost.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="its#7968-lost.patch"

diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c
--- a/servers/slapd/syncrepl.c
+++ b/servers/slapd/syncrepl.c
@@ -958,15 +958,17 @@ do_syncrep2(
                                                                
ldap_pvt_thread_yield();
                                                }
 
+                                               ldap_pvt_thread_mutex_lock( 
&si->si_cookieState->cs_mutex );
                                                for ( i =0; 
i<si->si_cookieState->cs_pnum; i++ ) {
                                                        if ( sid < 
si->si_cookieState->cs_psids[i] )
                                                                break;
                                                        if ( 
si->si_cookieState->cs_psids[i] == sid ) {
                                                                if ( ber_bvcmp( 
syncCookie.ctxcsn, &si->si_cookieState->cs_pvals[i] ) <= 0 ) {
-                                                                       
ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_pmutex );
                                                                        
bdn.bv_val[bdn.bv_len] = '\0';
                                                                        Debug( 
LDAP_DEBUG_SYNC, "do_syncrep2: %s CSN pending, ignoring %s (%s)\n",
                                                                                
si->si_ridtxt, syncCookie.ctxcsn->bv_val, bdn.bv_val );
+                                                                       
ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_mutex );
+                                                                       
ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_pmutex );
                                                                        
ldap_controls_free( rctrls );
                                                                        rc = 0;
                                                                        goto 
done;
@@ -983,6 +985,7 @@ do_syncrep2(
                                                                (struct 
sync_cookie *)&si->si_cookieState->cs_pvals,
                                                                i, sid, 
syncCookie.ctxcsn );
                                                }
+                                               ldap_pvt_thread_mutex_unlock( 
&si->si_cookieState->cs_mutex );
                                                assert( punlock < 0 );
                                                punlock = i;
                                        } else if (si->si_too_old) {

--------------090602010509010401080002--



Reply via email to