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;