isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit 2f4b71c56e3e6caa76a649018681704628405108
parent 1d433b47731180b76e217087539df7aaeedb8219
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Fri, 18 Feb 2022 17:45:01 +0100

knock out ReNew if there are no dummies

the operation requires loading the target side, which makes it somewhat
expensive in otherwise unidirectional syncs.

one could also knock out Flags and Delete if there are no living pairs,
but that wouldn't actually save much.

Diffstat:
Msrc/sync.c | 15++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/sync.c b/src/sync.c @@ -680,14 +680,23 @@ box_opened2( sync_vars_t *svars, int t ) if (!lock_state( svars )) goto bail; + int any_dummies[2] = { 0, 0 }; int any_purges[2] = { 0, 0 }; int any_upgrades[2] = { 0, 0 }; int any_new[2] = { 0, 0 }; int any_tuids[2] = { 0, 0 }; - if (svars->replayed) { + if (svars->replayed || ((chan->ops[F] | chan->ops[N]) & OP_RENEW)) { for (srec = svars->srecs; srec; srec = srec->next) { if (srec->status & S_DEAD) continue; + if (srec->status & S_DUMMY(F)) + any_dummies[F]++; + else if (srec->status & S_DUMMY(N)) + any_dummies[N]++; + else if (srec->status & S_SKIPPED) + any_dummies[!srec->uid[F] ? F : N]++; + if (!svars->replayed) + continue; if (srec->status & S_PURGE) { any_purges[srec->uid[F] ? F : N]++; } else if (srec->status & S_PENDING) { @@ -721,6 +730,10 @@ box_opened2( sync_vars_t *svars, int t ) if (chan->ops[t] & OP_FLAGS) opts[t^1] |= OPEN_FLAGS; } + if (!any_dummies[t] && (chan->ops[t] & OP_RENEW)) { + chan->ops[t] &= ~OP_RENEW; + debug( "no %s dummies; masking ReNew\n", str_fn[t] ); + } if ((chan->ops[t] & (OP_NEW | OP_RENEW)) || any_new[t] || any_upgrades[t]) { opts[t] |= OPEN_APPEND; if ((chan->ops[t] & OP_NEW) || any_new[t]) {