commit bf34d9fd29b7e2bd82ddb6b892ea0e671fc19926
Author: Oswald Buddenhagen <o...@users.sf.net>
Date:   Sat Nov 23 12:12:14 2024 +0100

    do not let both-sided uidvalidity change deter us
    
    the algorithm is symmetrical, comparing the msgids that belong to the
    paired uids. so it doesn't matter for recovering one side if the other
    side's uidvalidity also changed. it does however impact our ability to
    say on which side the change was genuine.
    
    the pointless limitation was presumably a vestige from an earlier
    iteration.
    
    amends 77acc26 and 594e60b.

 src/sync.c | 31 +++++++++++++++----------------
 1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/src/sync.c b/src/sync.c
index 405d98f..38dbf06 100644
--- a/src/sync.c
+++ b/src/sync.c
@@ -511,7 +511,7 @@ box_opened2( sync_vars_t *svars, int t )
        channel_conf_t *chan;
        sync_rec_t *srec;
        uint_array_alloc_t mexcs;
-       uint opts[2], fails, minwuid;
+       uint opts[2], minwuid;
 
        svars->state[t] |= ST_SELECTED;
        if (!(svars->state[t^1] & ST_SELECTED))
@@ -520,23 +520,13 @@ box_opened2( sync_vars_t *svars, int t )
        ctx[1] = svars->ctx[1];
        chan = svars->chan;
 
-       fails = 0;
-       for (t = 0; t < 2; t++)
-               if (svars->uidval[t] != UIDVAL_BAD && svars->uidval[t] != 
svars->newuidval[t])
-                       fails++;
-       // If only one side changed UIDVALIDITY, we will try to re-approve it 
further down.
-       if (fails == 2) {
-               error( "Error: channel %s: UIDVALIDITY of both far side %s and 
near side %s changed.\n",
-                      svars->chan->name, svars->orig_name[F], 
svars->orig_name[N]);
+       if (!lock_state( svars )) {
          bail:
                svars->ret = SYNC_FAIL;
                sync_bail( svars );
                return;
        }
 
-       if (!lock_state( svars ))
-               goto bail;
-
        int any_dummies[2] = { 0, 0 };
        int any_purges[2] = { 0, 0 };
        int any_upgrades[2] = { 0, 0 };
@@ -574,9 +564,11 @@ box_opened2( sync_vars_t *svars, int t )
        }
 
        opts[F] = opts[N] = 0;
-       if (fails)
-               opts[F] = opts[N] = OPEN_PAIRED | OPEN_PAIRED_IDS;
        for (t = 0; t < 2; t++) {
+               if (svars->uidval[t] != UIDVAL_BAD && svars->uidval[t] != 
svars->newuidval[t]) {
+                       opts[F] |= OPEN_PAIRED | OPEN_PAIRED_IDS;
+                       opts[N] |= OPEN_PAIRED | OPEN_PAIRED_IDS;
+               }
                if (any_purges[t]) {
                        debug( "resuming %d %s purge(s)\n", any_purges[t], 
str_fn[t] );
                        opts[t] |= OPEN_SETFLAGS;
@@ -859,8 +851,15 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int 
recent_msgs, void *aux
                                if (!srec->msg[t^1])
                                        continue;  // Partner disappeared.
                                if (!srec->msg[t^1]->msgid || strcmp( 
srec->msg[F]->msgid, srec->msg[N]->msgid )) {
-                                       error( "Error: channel %s, %s box %s: 
UIDVALIDITY genuinely changed (at UID %u).\n",
-                                              svars->chan->name, str_fn[t], 
svars->orig_name[t], srec->uid[t] );
+                                       if (svars->uidval[t^1] != 
svars->newuidval[t^1]) {
+                                               error( "Error: channel %s, %s 
box %s (at UID %u):"
+                                                      " Unable to recover from 
both-sided UIDVALIDITY change,"
+                                                      " as it is genuine on at 
least one side.\n",
+                                                      svars->chan->name, 
str_fn[t], svars->orig_name[t], srec->uid[t] );
+                                       } else {
+                                               error( "Error: channel %s, %s 
box %s (at UID %u): UIDVALIDITY genuinely changed.\n",
+                                                      svars->chan->name, 
str_fn[t], svars->orig_name[t], srec->uid[t] );
+                                       }
                                  uvchg:
                                        svars->ret |= SYNC_FAIL;
                                        cancel_sync( svars );


_______________________________________________
isync-devel mailing list
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to