Author: metze
Date: 2005-12-31 09:44:04 +0000 (Sat, 31 Dec 2005)
New Revision: 12642

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12642

Log:
only do push notifications when something changed

metze
Modified:
   branches/SAMBA_4_0/source/wrepl_server/wrepl_out_push.c
   branches/SAMBA_4_0/source/wrepl_server/wrepl_server.c
   branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h


Changeset:
Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_out_push.c
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_out_push.c     2005-12-31 
09:08:46 UTC (rev 12641)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_out_push.c     2005-12-31 
09:44:04 UTC (rev 12642)
@@ -96,17 +96,35 @@
        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 @@
                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;

Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_server.c
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_server.c       2005-12-31 
09:08:46 UTC (rev 12641)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_server.c       2005-12-31 
09:44:04 UTC (rev 12642)
@@ -197,6 +197,34 @@
        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,

Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h       2005-12-31 
09:08:46 UTC (rev 12641)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h       2005-12-31 
09:44:04 UTC (rev 12642)
@@ -172,6 +172,9 @@
                /* 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;
 

Reply via email to