commit 49a32910a7ff482ff2d58b40366fc6e366cf15f1
Author: Oswald Buddenhagen <[email protected]>
Date:   Sun Nov 24 18:26:11 2013 +0100

    move handling of new messages after that of old ones
    
    i.e., move it back. whatever the original reason was, it's now gone.
    
    this order is way more natural, which allows us to remove the osrecadd
    and S_DONE hacks.

 src/sync.c |  161 +++++++++++++++++++++++++---------------------------
 1 files changed, 78 insertions(+), 83 deletions(-)

diff --git a/src/sync.c b/src/sync.c
index 4cbee88..429e843 100644
--- a/src/sync.c
+++ b/src/sync.c
@@ -95,7 +95,6 @@ make_flags( int flags, char *buf )
 
 
 #define S_DEAD         (1<<0)  /* ephemeral: the entry was killed and should 
be ignored */
-#define S_DONE         (1<<1)  /* ephemeral: the entry was already synced */
 #define S_DEL(ms)      (1<<(2+(ms)))  /* ephemeral: m/s message would be 
subject to expunge */
 #define S_EXPIRED      (1<<4)  /* the entry is expired (slave message removal 
confirmed) */
 #define S_EXPIRE       (1<<5)  /* the entry is being expired (slave message 
removal scheduled) */
@@ -146,7 +145,7 @@ typedef struct {
        void (*cb)( int sts, void *aux ), *aux;
        char *dname, *jname, *nname, *lname;
        FILE *jfp, *nfp;
-       sync_rec_t *srecs, **srecadd, **osrecadd;
+       sync_rec_t *srecs, **srecadd;
        channel_conf_t *chan;
        store_t *ctx[2];
        driver_t *drv[2];
@@ -1203,84 +1202,9 @@ box_loaded( int sts, void *aux )
 
        info( "Synchronizing...\n" );
 
-       debug( "synchronizing new entries\n" );
-       svars->osrecadd = svars->srecadd;
-       for (t = 0; t < 2; t++) {
-               for (tmsg = svars->ctx[1-t]->msgs; tmsg; tmsg = tmsg->next) {
-                       /* If we have a srec:
-                        * - message is old (> 0) or expired (0) => ignore
-                        * - message was skipped (-1) => ReNew
-                        * - message was attempted, but failed (-2) => New
-                        * If new have no srec, the message is always New. If 
messages were previously ignored
-                        * due to being excessive, they would now appear to be 
newer than the messages that
-                        * got actually synced, so make sure to look only at 
the newest ones. As some messages
-                        * may be already propagated before an interruption, 
and maxuid logging is delayed,
-                        * we need to track the newmaxuid separately. */
-                       srec = tmsg->srec;
-                       if (srec ? srec->uid[t] < 0 && (svars->chan->ops[t] & 
(srec->uid[t] == -1 ? OP_RENEW : OP_NEW))
-                                : svars->newmaxuid[1-t] < tmsg->uid && 
(svars->chan->ops[t] & OP_NEW)) {
-                               debug( "new message %d on %s\n", tmsg->uid, 
str_ms[1-t] );
-                               if ((svars->chan->ops[t] & OP_EXPUNGE) && 
(tmsg->flags & F_DELETED))
-                                       debug( "  -> not %sing - would be 
expunged anyway\n", str_hl[t] );
-                               else {
-                                       if (srec) {
-                                               srec->status |= S_DONE;
-                                               debug( "  -> pair(%d,%d) 
exists\n", srec->uid[M], srec->uid[S] );
-                                       } else {
-                                               srec = nfmalloc( sizeof(*srec) 
);
-                                               srec->next = 0;
-                                               *svars->srecadd = srec;
-                                               svars->srecadd = &srec->next;
-                                               svars->nsrecs++;
-                                               srec->status = S_DONE;
-                                               srec->flags = 0;
-                                               srec->tuid[0] = 0;
-                                               srec->uid[1-t] = tmsg->uid;
-                                               srec->uid[t] = -2;
-                                               srec->msg[1-t] = tmsg;
-                                               srec->msg[t] = 0;
-                                               tmsg->srec = srec;
-                                               if (svars->newmaxuid[1-t] < 
tmsg->uid)
-                                                       svars->newmaxuid[1-t] = 
tmsg->uid;
-                                               Fprintf( svars->jfp, "+ %d 
%d\n", srec->uid[M], srec->uid[S] );
-                                               debug( "  -> pair(%d,%d) 
created\n", srec->uid[M], srec->uid[S] );
-                                       }
-                                       if (svars->maxuid[1-t] < tmsg->uid) {
-                                               /* We do this here for 
simplicity. However, logging must be delayed until
-                                                * all messages were 
propagated, as skipped messages could otherwise be
-                                                * logged before the 
propagation of messages with lower UIDs completes. */
-                                               svars->maxuid[1-t] = tmsg->uid;
-                                       }
-                                       if ((tmsg->flags & F_FLAGGED) || 
tmsg->size <= svars->chan->stores[t]->max_size) {
-                                               if (tmsg->flags) {
-                                                       srec->flags = 
tmsg->flags;
-                                                       Fprintf( svars->jfp, "* 
%d %d %u\n", srec->uid[M], srec->uid[S], srec->flags );
-                                                       debug( "  -> updated 
flags to %u\n", tmsg->flags );
-                                               }
-                                               for (t1 = 0; t1 < TUIDL; t1++) {
-                                                       t2 = arc4_getbyte() & 
0x3f;
-                                                       srec->tuid[t1] = t2 < 
26 ? t2 + 'A' : t2 < 52 ? t2 + 'a' - 26 : t2 < 62 ? t2 + '0' - 52 : t2 == 62 ? 
'+' : '/';
-                                               }
-                                               Fprintf( svars->jfp, "# %d %d 
%." stringify(TUIDL) "s\n", srec->uid[M], srec->uid[S], srec->tuid );
-                                               if (FSyncLevel >= 
FSYNC_THOROUGH)
-                                                       fdatasync( fileno( 
svars->jfp ) );
-                                               debug( "  -> %sing message, 
TUID %." stringify(TUIDL) "s\n", str_hl[t], srec->tuid );
-                                       } else {
-                                               if (srec->uid[t] == -1) {
-                                                       debug( "  -> not %sing 
- still too big\n", str_hl[t] );
-                                               } else {
-                                                       debug( "  -> not %sing 
- too big\n", str_hl[t] );
-                                                       msg_copied_p2( svars, 
srec, t, -1 );
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-
        debug( "synchronizing old entries\n" );
-       for (srec = svars->srecs; srec != *svars->osrecadd; srec = srec->next) {
-               if (srec->status & (S_DEAD|S_DONE))
+       for (srec = svars->srecs; srec; srec = srec->next) {
+               if (srec->status & S_DEAD)
                        continue;
                debug( "pair (%d,%d)\n", srec->uid[M], srec->uid[S] );
                no[M] = !srec->msg[M] && (svars->ctx[M]->opts & OPEN_OLD);
@@ -1350,6 +1274,79 @@ box_loaded( int sts, void *aux )
                }
        }
 
+       debug( "synchronizing new entries\n" );
+       for (t = 0; t < 2; t++) {
+               for (tmsg = svars->ctx[1-t]->msgs; tmsg; tmsg = tmsg->next) {
+                       /* If we have a srec:
+                        * - message is old (> 0) or expired (0) => ignore
+                        * - message was skipped (-1) => ReNew
+                        * - message was attempted, but failed (-2) => New
+                        * If new have no srec, the message is always New. If 
messages were previously ignored
+                        * due to being excessive, they would now appear to be 
newer than the messages that
+                        * got actually synced, so make sure to look only at 
the newest ones. As some messages
+                        * may be already propagated before an interruption, 
and maxuid logging is delayed,
+                        * we need to track the newmaxuid separately. */
+                       srec = tmsg->srec;
+                       if (srec ? srec->uid[t] < 0 && (svars->chan->ops[t] & 
(srec->uid[t] == -1 ? OP_RENEW : OP_NEW))
+                                : svars->newmaxuid[1-t] < tmsg->uid && 
(svars->chan->ops[t] & OP_NEW)) {
+                               debug( "new message %d on %s\n", tmsg->uid, 
str_ms[1-t] );
+                               if ((svars->chan->ops[t] & OP_EXPUNGE) && 
(tmsg->flags & F_DELETED)) {
+                                       debug( "  -> not %sing - would be 
expunged anyway\n", str_hl[t] );
+                               } else {
+                                       if (srec) {
+                                               debug( "  -> pair(%d,%d) 
exists\n", srec->uid[M], srec->uid[S] );
+                                       } else {
+                                               srec = nfmalloc( sizeof(*srec) 
);
+                                               srec->next = 0;
+                                               *svars->srecadd = srec;
+                                               svars->srecadd = &srec->next;
+                                               svars->nsrecs++;
+                                               srec->status = 0;
+                                               srec->flags = 0;
+                                               srec->tuid[0] = 0;
+                                               srec->uid[1-t] = tmsg->uid;
+                                               srec->uid[t] = -2;
+                                               srec->msg[1-t] = tmsg;
+                                               srec->msg[t] = 0;
+                                               tmsg->srec = srec;
+                                               if (svars->newmaxuid[1-t] < 
tmsg->uid)
+                                                       svars->newmaxuid[1-t] = 
tmsg->uid;
+                                               Fprintf( svars->jfp, "+ %d 
%d\n", srec->uid[M], srec->uid[S] );
+                                               debug( "  -> pair(%d,%d) 
created\n", srec->uid[M], srec->uid[S] );
+                                       }
+                                       if (svars->maxuid[1-t] < tmsg->uid) {
+                                               /* We do this here for 
simplicity. However, logging must be delayed until
+                                                * all messages were 
propagated, as skipped messages could otherwise be
+                                                * logged before the 
propagation of messages with lower UIDs completes. */
+                                               svars->maxuid[1-t] = tmsg->uid;
+                                       }
+                                       if ((tmsg->flags & F_FLAGGED) || 
tmsg->size <= svars->chan->stores[t]->max_size) {
+                                               if (tmsg->flags) {
+                                                       srec->flags = 
tmsg->flags;
+                                                       Fprintf( svars->jfp, "* 
%d %d %u\n", srec->uid[M], srec->uid[S], srec->flags );
+                                                       debug( "  -> updated 
flags to %u\n", tmsg->flags );
+                                               }
+                                               for (t1 = 0; t1 < TUIDL; t1++) {
+                                                       t2 = arc4_getbyte() & 
0x3f;
+                                                       srec->tuid[t1] = t2 < 
26 ? t2 + 'A' : t2 < 52 ? t2 + 'a' - 26 : t2 < 62 ? t2 + '0' - 52 : t2 == 62 ? 
'+' : '/';
+                                               }
+                                               Fprintf( svars->jfp, "# %d %d 
%." stringify(TUIDL) "s\n", srec->uid[M], srec->uid[S], srec->tuid );
+                                               if (FSyncLevel >= 
FSYNC_THOROUGH)
+                                                       fdatasync( fileno( 
svars->jfp ) );
+                                               debug( "  -> %sing message, 
TUID %." stringify(TUIDL) "s\n", str_hl[t], srec->tuid );
+                                       } else {
+                                               if (srec->uid[t] == -1) {
+                                                       debug( "  -> not %sing 
- still too big\n", str_hl[t] );
+                                               } else {
+                                                       debug( "  -> not %sing 
- too big\n", str_hl[t] );
+                                                       msg_copied_p2( svars, 
srec, t, -1 );
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
        if ((svars->chan->ops[S] & (OP_NEW|OP_RENEW|OP_FLAGS)) && 
svars->chan->max_messages) {
                /* Note: When this branch is entered, we have loaded all slave 
messages. */
                /* Expire excess messages. Important (flagged, unread, or 
unpropagated) messages
@@ -1452,12 +1449,10 @@ box_loaded( int sts, void *aux )
        }
 
        debug( "synchronizing flags\n" );
-       for (srec = svars->srecs; srec != *svars->osrecadd; srec = srec->next) {
-               if (srec->status & (S_DEAD|S_DONE))
+       for (srec = svars->srecs; srec; srec = srec->next) {
+               if ((srec->status & S_DEAD) || srec->uid[M] <= 0 || 
srec->uid[S] <= 0)
                        continue;
                for (t = 0; t < 2; t++) {
-                       if (srec->uid[t] <= 0)
-                               continue;
                        aflags = srec->aflags[t];
                        dflags = srec->dflags[t];
                        if (srec->status & S_DELETE) {

------------------------------------------------------------------------------
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

Reply via email to