]> git.sur5r.net Git - openldap/commitdiff
ITS#6545 Update accesslog format and syncrepl consumer
authorOndřej Kuzník <ondra@mistotebe.net>
Tue, 4 Apr 2017 17:24:57 +0000 (18:24 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Fri, 7 Apr 2017 21:39:07 +0000 (14:39 -0700)
Make two successive modifications of the same attribute separate. This
lets the consumer interpret the log entry the same way as the server
that produced it.

Still depends on the log entry attributes being read in the same order
as they were written.

servers/slapd/overlays/accesslog.c
servers/slapd/syncrepl.c
tests/scripts/test043-delta-syncrepl
tests/scripts/test063-delta-multimaster

index fb5d88989a0ada7b63391f7172a172a7d5945256..50aaa116e873f6730e330d0bf40cd86331e997ce 100644 (file)
@@ -1586,7 +1586,7 @@ static int accesslog_response(Operation *op, SlapReply *rs) {
 
        case LOG_EN_MODRDN:
        case LOG_EN_MODIFY:
-               /* count all the mods */
+               /* count all the mods + attributes (ITS#6545) */
                i = 0;
                for ( m = op->orm_modlist; m; m = m->sml_next ) {
                        if ( m->sml_values ) {
@@ -1596,6 +1596,9 @@ static int accesslog_response(Operation *op, SlapReply *rs) {
                        {
                                i++;
                        }
+                       if ( m->sml_next && m->sml_desc == m->sml_next->sml_desc ) {
+                               i++;
+                       }
                }
                vals = ch_malloc( (i+1) * sizeof( struct berval ));
                i = 0;
@@ -1666,6 +1669,12 @@ static int accesslog_response(Operation *op, SlapReply *rs) {
                                *ptr = '\0';
                                i++;
                        }
+                       /* ITS#6545: when the same attribute is edited multiple times,
+                        * record the transition */
+                       if ( m->sml_next && m->sml_desc == m->sml_next->sml_desc ) {
+                               ber_str2bv( ":", STRLENOF(":"), 1, &vals[i] );
+                               i++;
+                       }
                }
 
                if ( i > 0 ) {
index e0dfbc9670941af2dd7b13872cd8389687b7df85..91f4d3a6b75e73bf4ea498e83e2e4cb4e7a320e0 100644 (file)
@@ -1795,6 +1795,11 @@ syncrepl_accesslog_mods(
                if ( !colon ) {
                        /* Invalid */
                        continue;
+               } else if ( colon == bv.bv_val ) {
+                       /* ITS#6545: An empty attribute signals that a new mod
+                        * is about to start */
+                       mod = NULL;
+                       continue;
                }
 
                bv.bv_len = colon - bv.bv_val;
index b0e6eb43039041290728b83062e0b9fb448da0ea..368181d33102d635fc712a089ed9536fae9f05cb 100755 (executable)
@@ -308,6 +308,9 @@ cn: Rosco P. Coltrane
 dn: cn=Mark Elliot,ou=Alumni Association,ou=People,dc=example,dc=com
 changetype: modify
 replace: drink
+drink: Red Wine
+-
+replace: drink
 
 dn: cn=All Staff,ou=Groups,dc=example,dc=com
 changetype: modrdn
index e4e158fc1b2a044a3e389a936f25a73d8a58b550..5e5247055b0414c29391c3d5ee93f4ae2e9da897 100755 (executable)
@@ -473,6 +473,23 @@ if test $RC != 0 ; then
        exit $RC
 fi
 
+$LDAPMODIFY -D "$MANAGERDN" -H $URI1 -w $PASSWD \
+       >> $TESTOUT 2>&1 << EOF
+dn: $THEDN
+changetype: modify
+replace: sn
+sn: Replaced later
+-
+replace: sn
+sn: Surname
+EOF
+RC=$?
+if test $RC != 0 ; then
+       echo "ldapmodify failed for server 1 database ($RC)!"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+       exit $RC
+fi
+
 echo "Restoring replication between server 1 and 2..."
 n=1
 while [ $n -le $MMR ]; do