r12642: only do push notifications when something changed
authorStefan Metzmacher <metze@samba.org>
Sat, 31 Dec 2005 09:44:04 +0000 (09:44 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:49:33 +0000 (13:49 -0500)
metze

source/wrepl_server/wrepl_out_push.c
source/wrepl_server/wrepl_server.c
source/wrepl_server/wrepl_server.h

index 6ac04d9f126955eebc8340e7e04018f528717b1e..82e603156445a14df39f82523889aaa00ce3e688 100644 (file)
@@ -96,17 +96,35 @@ nomem:
        return;
 }
 
-static uint32_t wreplsrv_calc_change_count(struct wreplsrv_partner *partner)
+static uint32_t wreplsrv_calc_change_count(struct wreplsrv_partner *partner, uint64_t seqnumber)
 {
-       /* TODO: add a real implementation here */
-       return (uint32_t)-1;
+       uint64_t tmp_diff = UINT32_MAX;
+
+       /* catch an overflow */
+       if (partner->push.seqnumber > seqnumber) {
+               goto done;
+       }
+
+       tmp_diff = seqnumber - partner->push.seqnumber;
+
+       if (tmp_diff > UINT32_MAX) {
+               tmp_diff = UINT32_MAX;
+               goto done;
+       }
+
+done:
+       partner->push.seqnumber = seqnumber;
+       return (uint32_t)(tmp_diff & UINT32_MAX);
 }
 
 NTSTATUS wreplsrv_out_push_run(struct wreplsrv_service *service)
 {
        struct wreplsrv_partner *partner;
+       uint64_t seqnumber;
        uint32_t change_count;
 
+       seqnumber = wreplsrv_local_db_seqnumber(service);
+
        for (partner = service->partners; partner; partner = partner->next) {
                /* if it's not a push partner, go to the next partner */
                if (!(partner->type & WINSREPL_PARTNER_PUSH)) continue;
@@ -115,7 +133,7 @@ NTSTATUS wreplsrv_out_push_run(struct wreplsrv_service *service)
                if (partner->push.change_count == 0) continue;
 
                /* get the actual change count for the partner */
-               change_count = wreplsrv_calc_change_count(partner);
+               change_count = wreplsrv_calc_change_count(partner, seqnumber);
 
                /* if the configured change count isn't reached, go to the next partner */
                if (change_count < partner->push.change_count) continue;
index 9f1664bc225e7a00e6f82ad41f5d70342bb21652..018b137d7e390aa552f09f33bc96c0b1f4a63e09 100644 (file)
@@ -197,6 +197,34 @@ failed:
        return maxVersion;
 }
 
+uint64_t wreplsrv_local_db_seqnumber(struct wreplsrv_service *service)
+{
+       int ret;
+       struct ldb_context *ldb = service->wins_db->ldb;
+       struct ldb_dn *dn;
+       struct ldb_result *res = NULL;
+       TALLOC_CTX *tmp_ctx = talloc_new(service);
+       uint64_t seqnumber = 0;
+
+       dn = ldb_dn_explode(tmp_ctx, "@BASEINFO");
+       if (!dn) goto failed;
+
+       /* find the record in the WINS database */
+       ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, 
+                        NULL, NULL, &res);
+       if (ret != LDB_SUCCESS) goto failed;
+       talloc_steal(tmp_ctx, res);
+       if (res->count > 1) goto failed;
+
+       if (res->count == 1) {
+               seqnumber = ldb_msg_find_uint64(res->msgs[0], "sequenceNumber", 0);
+       }
+
+failed:
+       talloc_free(tmp_ctx);
+       return seqnumber;
+}
+
 NTSTATUS wreplsrv_fill_wrepl_table(struct wreplsrv_service *service,
                                   TALLOC_CTX *mem_ctx,
                                   struct wrepl_table *table_out,
index 48378fe15264a9c870b176da69ce03bde0f497e5..c846e08d6484235ae1933c25d327ac9a9a55ee9a 100644 (file)
@@ -172,6 +172,9 @@ struct wreplsrv_partner {
                /* change count till push notification */
                uint32_t change_count;
 
+               /* the last wins db seqnumber we know about */
+               uint64_t seqnumber;
+
                /* we should use WREPL_REPL_INFORM* messages to this partner */
                BOOL use_inform;