On Wed, 9 Apr 2008, [EMAIL PROTECTED] wrote:

> Does this help?  From my fiddling with ITS#5340 (REP_ENTRY_MODIFIABLE).
> I do not understand syncprov's handling of REP_ENTRY_MUSTRELEASE though.
> (For one thing it seems to assume that REP_ENTRY_MUSTRELEASE is set if
> and only if rs.sr_entry->e_private != NULL.  Which is possibly true with
> back-bdb but seems a shaky assumption in general.)

Almost, except that it triggers an abort..  Using be_entry_release_r() was 
not correct, as it ended up calling entry_free().  It works if I changes 
it to use overlay_entry_release_ov() instead, as in the alternative patch 
at the end.

I have put a test script that shows this deadlock on:

  ftp://ftp.openldap.org/incoming/test053-syncprov-glue

It deadlocks without this patch, it and the rest of the test suite succeed 
with it :-)  I haven't tested it in production though..

Rein

Index: OpenLDAP/servers/slapd/overlays/syncprov.c
diff -u OpenLDAP/servers/slapd/overlays/syncprov.c:1.1.1.14 
OpenLDAP/servers/slapd/overlays/syncprov.c:1.14
--- OpenLDAP/servers/slapd/overlays/syncprov.c:1.1.1.14 Thu Apr 10 17:31:24 2008
+++ OpenLDAP/servers/slapd/overlays/syncprov.c  Thu Apr 10 17:34:36 2008
@@ -2389,7 +2396,14 @@

                                if ( !ap ) {
                                        if ( !(rs->sr_flags & 
REP_ENTRY_MODIFIABLE) ) {
-                                               rs->sr_entry = entry_dup( 
rs->sr_entry );
+                                               Entry *new = entry_dup( 
rs->sr_entry );
+                                               if ( rs->sr_flags & 
REP_ENTRY_MUSTRELEASE ) {
+                                                       
overlay_entry_release_ov( op, rs->sr_entry, 0, (slap_overinst 
*)op->o_bd->bd_info );
+                                                       rs->sr_flags ^= 
REP_ENTRY_MUSTRELEASE;
+                                               } else if ( rs->sr_flags & 
REP_ENTRY_MUSTBEFREED ) {
+                                                       entry_free( 
rs->sr_entry );
+                                               }
+                                               rs->sr_entry = new;
                                                rs->sr_flags |=
                                                        
REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED;
                                                a = attr_find( 
rs->sr_entry->e_attrs,


Reply via email to