]> git.sur5r.net Git - openldap/commitdiff
During the refresh phase the sync filter needs to be adjusted (skipping
authorRalf Haferkamp <ralf@openldap.org>
Thu, 20 May 2010 17:08:28 +0000 (17:08 +0000)
committerRalf Haferkamp <ralf@openldap.org>
Thu, 20 May 2010 17:08:28 +0000 (17:08 +0000)
the "(entrycsn>=cookie)" part that was inserted) when checking whether a
change needs to be replicated, otherwise we lose DELETES that happen during
the refresh phase (ITS#6555).

servers/slapd/overlays/syncprov.c

index 160c3bf94f44b7e93ab7afc8253bf085dbf9544b..4c2a0868a946ab2e396935268029e9b254e5b2b9 100644 (file)
@@ -1302,7 +1302,15 @@ syncprov_matchops( Operation *op, opcookie *opc, int saveit )
                        op2.o_hdr = &oh;
                        op2.o_extra = op->o_extra;
                        op2.o_callback = NULL;
-                       rc = test_filter( &op2, e, ss->s_op->ors_filter );
+                       ldap_pvt_thread_mutex_lock( &ss->s_mutex );
+                       if (ss->s_flags & PS_FIX_FILTER) {
+                               /* Skip the AND/GE clause that we stuck on in front. We
+                                  would lose deletes/mods that happen during the refresh
+                                  phase otherwise (ITS#6555) */
+                               op2.ors_filter = ss->s_op->ors_filter->f_and->f_next;
+                       }
+                       ldap_pvt_thread_mutex_unlock( &ss->s_mutex );
+                       rc = test_filter( &op2, e, op2.ors_filter );
                }
 
                Debug( LDAP_DEBUG_TRACE, "syncprov_matchops: sid %03x fscope %d rc %d\n",