s4: Update/Set local USN only on attribute that have been modified/created
authorMatthieu Patou <mat@matws.net>
Tue, 5 Apr 2011 10:49:05 +0000 (14:49 +0400)
committerAndrew Tridgell <tridge@samba.org>
Wed, 6 Apr 2011 03:57:06 +0000 (05:57 +0200)
Signed-off-by: Andrew Tridgell <tridge@samba.org>
source4/dsdb/samdb/ldb_modules/repl_meta_data.c

index 6180dfc09a644586509ac8b89769c6d8fd42704f..06c63a88350fa0b2ad8707b7363cb8d7f236d1a4 100644 (file)
@@ -3455,6 +3455,7 @@ static int replmd_replicated_apply_merge(struct replmd_replicated_request *ar)
                ni++;
        }
 
+       ar->seq_num = 0;
        /* now merge in the new meta data */
        for (i=0; i < rmd->ctr.ctr1.count; i++) {
                bool found = false;
@@ -3471,6 +3472,13 @@ static int replmd_replicated_apply_merge(struct replmd_replicated_request *ar)
                        if (cmp) {
                                /* replace the entry */
                                nmd.ctr.ctr1.array[j] = rmd->ctr.ctr1.array[i];
+                               if (ar->seq_num == 0) {
+                                       ret = ldb_sequence_number(ldb, LDB_SEQ_NEXT, &ar->seq_num);
+                                       if (ret != LDB_SUCCESS) {
+                                               return replmd_replicated_request_error(ar, ret);
+                                       }
+                               }
+                               nmd.ctr.ctr1.array[j].local_usn = ar->seq_num;
                                found = true;
                                break;
                        }
@@ -3493,6 +3501,13 @@ static int replmd_replicated_apply_merge(struct replmd_replicated_request *ar)
                if (found) continue;
 
                nmd.ctr.ctr1.array[ni] = rmd->ctr.ctr1.array[i];
+               if (ar->seq_num == 0) {
+                       ret = ldb_sequence_number(ldb, LDB_SEQ_NEXT, &ar->seq_num);
+                       if (ret != LDB_SUCCESS) {
+                               return replmd_replicated_request_error(ar, ret);
+                       }
+               }
+               nmd.ctr.ctr1.array[ni].local_usn = ar->seq_num;
                ni++;
        }
 
@@ -3527,15 +3542,6 @@ static int replmd_replicated_apply_merge(struct replmd_replicated_request *ar)
        ldb_debug(ldb, LDB_DEBUG_TRACE, "replmd_replicated_apply_merge[%u]: replace %u attributes\n",
                  ar->index_current, msg->num_elements);
 
-       ret = ldb_sequence_number(ldb, LDB_SEQ_NEXT, &ar->seq_num);
-       if (ret != LDB_SUCCESS) {
-               return replmd_replicated_request_error(ar, ret);
-       }
-
-       for (i=0; i<ni; i++) {
-               nmd.ctr.ctr1.array[i].local_usn = ar->seq_num;
-       }
-
        /* create the meta data value */
        ndr_err = ndr_push_struct_blob(&nmd_value, msg, &nmd,
                                       (ndr_push_flags_fn_t)ndr_push_replPropertyMetaDataBlob);