[commit] master: do not let both-sided uidvalidity change deter us
mailbox synchronizer
Brought to you by:
ossi
|
From: ossi <os...@us...> - 2024-11-24 10:50:10
|
commit bf34d9fd29b7e2bd82ddb6b892ea0e671fc19926
Author: Oswald Buddenhagen <os...@us...>
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 );
|