commit 12676f28da2c708f8adc140b1d114e29dcccf65a
Author: Oswald Buddenhagen <[email protected]>
Date: Sun Nov 17 09:06:20 2013 +0100
remove cleanup of expired entries during setup of master load
the removed code would only ever trigger if a) we were after a journal
replay or b) something external expunged the expired messages - both are
corner cases not worth the extra code.
however, this means that the syncing code further down now needs to take
care of these zombies.
in the end, the normal cleanup will take care of all expired entries,
new and old.
src/run-tests.pl | 24 +++++++-------
src/sync.c | 76 ++++++++++++++++++++--------------------------
2 files changed, 45 insertions(+), 55 deletions(-)
diff --git a/src/run-tests.pl b/src/run-tests.pl
index 76b7317..42cd4b1 100755
--- a/src/run-tests.pl
+++ b/src/run-tests.pl
@@ -206,23 +206,23 @@ my @X41 = (
test("max messages catch-up", \@X31, \@X41, @O41);
my @x50 = (
- [ 5,
- 1, 1, "FS", 2, 2, "FS", 3, 3, "", 4, 4, "", 5, 5, "" ],
- [ 5,
- 1, 1, "S", 2, 2, "ST", 3, 3, "", 4, 4, "", 5, 5, "" ],
- [ 5, 2, 0,
- 1, 1, "FS", 2, 2, "XS", 3, 3, "", 4, 4, "", 5, 5, "" ],
+ [ 6,
+ 1, 1, "FS", 2, 2, "FS", 3, 3, "S", 4, 4, "", 5, 5, "", 6, 6, "" ],
+ [ 6,
+ 1, 1, "S", 2, 2, "ST", 4, 4, "", 5, 5, "", 6, 6, "" ],
+ [ 6, 3, 0,
+ 1, 1, "FS", 2, 2, "XS", 3, 3, "XS", 4, 4, "", 5, 5, "", 6, 6, "" ],
);
my @O51 = ("", "", "MaxMessages 3\nExpunge Both\n");
#show("50", "51", "51");
my @X51 = (
- [ 5,
- 1, 1, "S", 2, 2, "FS", 3, 3, "", 4, 4, "", 5, 5, "" ],
- [ 5,
- 2, 2, "FS", 3, 3, "", 4, 4, "", 5, 5, "" ],
- [ 5, 2, 0,
- 2, 2, "FS", 3, 3, "", 4, 4, "", 5, 5, "" ],
+ [ 6,
+ 1, 1, "S", 2, 2, "FS", 3, 3, "S", 4, 4, "", 5, 5, "", 6, 6, "" ],
+ [ 6,
+ 2, 2, "FS", 4, 4, "", 5, 5, "", 6, 6, "" ],
+ [ 6, 3, 0,
+ 2, 2, "FS", 4, 4, "", 5, 5, "", 6, 6, "" ],
);
test("max messages + expire", \@x50, \@X51, @O51);
diff --git a/src/sync.c b/src/sync.c
index d6ad61d..da719d7 100644
--- a/src/sync.c
+++ b/src/sync.c
@@ -1154,38 +1154,17 @@ box_loaded( int sts, void *aux )
minwuid = srec->uid[M];
}
debug( " min non-orphaned master uid is %d\n", minwuid );
- /* Next, calculate the exception fetch.
- * The svars->maxuid[M] >= srec->uid[M] checks catch messages
which we Pushed
- * to the range we never Pulled from (which we may still do). */
+ /* Next, calculate the exception fetch. */
mexcs = 0;
nmexcs = rmexcs = 0;
- for (srec = svars->srecs; srec; srec = srec->next) {
- if (srec->status & S_DEAD)
- continue;
- if (srec->status & S_EXP_S) {
- if (minwuid > srec->uid[M] && svars->maxuid[M]
>= srec->uid[M]) {
- /* The pair is in the range that will
not be synced any more. */
- debug( " -> killing (%d,%d)\n",
srec->uid[M], srec->uid[S] );
- srec->status = S_DEAD;
- Fprintf( svars->jfp, "- %d %d\n",
srec->uid[M], srec->uid[S] );
- } else if (srec->uid[S]) {
- /* The message disappeared just now,
and the pair is still needed. */
- debug( " -> orphaning (%d,[%d])\n",
srec->uid[M], srec->uid[S] );
- Fprintf( svars->jfp, "> %d %d 0\n",
srec->uid[M], srec->uid[S] );
- srec->uid[S] = 0;
- }
- } else if (minwuid > srec->uid[M]) {
- if (srec->uid[S] < 0) {
- /* The message was never synced over
... */
- if (svars->maxuid[M] >= srec->uid[M]) {
- /* ... and the range is dead
now. */
- debug( " -> killing
(%d,%d)\n", srec->uid[M], srec->uid[S] );
- srec->status = S_DEAD;
- Fprintf( svars->jfp, "- %d
%d\n", srec->uid[M], srec->uid[S] );
- }
- } else if (srec->uid[M] > 0 && srec->uid[S] &&
(svars->ctx[M]->opts & OPEN_OLD) &&
- (!(svars->ctx[M]->opts & OPEN_NEW)
|| svars->maxuid[M] >= srec->uid[M])) {
- /* The pair is alive, but outside the
bulk range, and we want to sync old entries. */
+ if (svars->ctx[M]->opts & OPEN_OLD) {
+ for (srec = svars->srecs; srec; srec = srec->next) {
+ if (srec->status & S_DEAD)
+ continue;
+ if (srec->uid[M] > 0 && srec->uid[S] > 0 &&
+ !(srec->status & S_EXP_S) && minwuid >
srec->uid[M] &&
+ (!(svars->ctx[M]->opts & OPEN_NEW) ||
svars->maxuid[M] >= srec->uid[M])) {
+ /* The pair is alive, but outside the
bulk range. */
if (nmexcs == rmexcs) {
rmexcs = rmexcs * 2 + 100;
mexcs = nfrealloc( mexcs,
rmexcs * sizeof(int) );
@@ -1311,18 +1290,26 @@ box_loaded( int sts, void *aux )
debug( " no more %s\n", str_ms[t] );
} else if (del[1-t]) {
/* c.4) d.9) / b.4) d.4) */
- if (srec->msg[t] &&
(srec->msg[t]->status & M_FLAGS) && srec->msg[t]->flags != srec->flags)
- info( "Info: conflicting
changes in (%d,%d)\n", srec->uid[M], srec->uid[S] );
- if (svars->chan->ops[t] & OP_DELETE) {
- debug( " %sing delete\n",
str_hl[t] );
- svars->flags_total[t]++;
- stats( svars );
- fv = nfmalloc( sizeof(*fv) );
- fv->aux = AUX;
- fv->srec = srec;
- DRIVER_CALL(set_flags(
svars->ctx[t], srec->msg[t], srec->uid[t], F_DELETED, 0, flags_set_del, fv ));
- } else
- debug( " not %sing delete\n",
str_hl[t] );
+ if ((t == M) && (srec->status &
(S_EXPIRE|S_EXPIRED))) {
+ /* Don't propagate deletion
resulting from expiration. */
+ debug( " slave expired,
orphaning master\n" );
+ Fprintf( svars->jfp, "> %d %d
0\n", srec->uid[M], srec->uid[S] );
+ srec->uid[S] = 0;
+ } else {
+ if (srec->msg[t] &&
(srec->msg[t]->status & M_FLAGS) && srec->msg[t]->flags != srec->flags)
+ info( "Info:
conflicting changes in (%d,%d)\n", srec->uid[M], srec->uid[S] );
+ if (svars->chan->ops[t] &
OP_DELETE) {
+ debug( " %sing
delete\n", str_hl[t] );
+ svars->flags_total[t]++;
+ stats( svars );
+ fv = nfmalloc(
sizeof(*fv) );
+ fv->aux = AUX;
+ fv->srec = srec;
+ DRIVER_CALL(set_flags(
svars->ctx[t], srec->msg[t], srec->uid[t], F_DELETED, 0, flags_set_del, fv ));
+ } else {
+ debug( " not %sing
delete\n", str_hl[t] );
+ }
+ }
} else if (!srec->msg[1-t])
/* c.1) c.2) d.7) d.8) / b.1) b.2) d.2)
d.3) */
;
@@ -1335,6 +1322,7 @@ box_loaded( int sts, void *aux )
sflags = srec->msg[1-t]->flags;
if ((t == M) && (srec->status &
(S_EXPIRE|S_EXPIRED))) {
/* Don't propagate
deletion resulting from expiration. */
+ debug( " slave
expiring\n" );
sflags &= ~F_DELETED;
}
srec->aflags[t] = sflags &
~srec->flags;
@@ -1416,6 +1404,8 @@ box_loaded( int sts, void *aux )
if (srec->status & (S_DEAD|S_DONE))
continue;
for (t = 0; t < 2; t++) {
+ if (srec->uid[t] <= 0)
+ continue;
aflags = srec->aflags[t];
dflags = srec->dflags[t];
if ((t == S) && ((mvBit(srec->status, S_EXPIRE,
S_EXPIRED) ^ srec->status) & S_EXPIRED)) {
@@ -1739,7 +1729,7 @@ box_closed_p2( sync_vars_t *svars, int t )
if (!(svars->state[1-t] & ST_CLOSED))
return;
- if ((svars->state[M] | svars->state[S]) & ST_DID_EXPUNGE) {
+ if (((svars->state[M] | svars->state[S]) & ST_DID_EXPUNGE) ||
svars->smaxxuid) {
/* This cleanup is not strictly necessary, as the next full sync
would throw out the dead entries anyway. But ... */
------------------------------------------------------------------------------
Sponsored by Intel(R) XDK
Develop, test and display web and hybrid apps with a single code base.
Download it for free now!
http://pubads.g.doubleclick.net/gampad/clk?id=111408631&iu=/4140/ostg.clktrk
_______________________________________________
isync-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/isync-devel