On Thu, Jun 23, 2016 at 05:06:15PM +0200, Yuri D'Elia wrote:
> On Sun, Jun 12 2016, Oswald Buddenhagen wrote:
> > On Sun, Jun 12, 2016 at 03:25:35PM +0200, Yuri D'Elia wrote:
> >> Does isync currently [attempt to] detect messages which have been moved
> >> across folders, and propagate the change with MOVE?
> >>
> > nope. patches welcome (i can give some direction if you're interested).
>
> Thinking again... can I receive those directions?
>
so, somewhat belated, here they are:
- 1. UIDVALIDITY change recovery
- background: some servers (ms exchange in particular) like to change
mailboxes' UIDVALIDITY for no particular reason while the actual
UIDs stay the same. as a consequence, mbsync refuses to sync the
folder, as continuing could potentially cause data loss (if the UIDs
*did* actually change). the goal is to detect this situation and
simply accept the new UIDVALIDITY (a rather tedious operation when
executed manually).
- how: when fetching new messages (*), also fetch their Message-Id,
and store it in the sync state file (after the flags). when a
changed UIDVALIDITY is reported when a mailbox is opened again,
re-fetch the headers of all messages and verify that all known UIDs
still have the same Message-ID. if so, accept the new UIDVALIDITY
(and emit a notice).
- (*) this also needs to cover the case of messages which were
initially synced before the feature was added.
- it happens that messages have no Message-Id (in particular, this
is permissible for drafts). the way around that is synthetizing
one: fetch all available headers (subject, from, to, cc, bcc,
date), concatenate them, and calculate a hash. the paranoid
version would hash the whole message.
- why: you'll need the Message-Id storage, and this is a nice stepping
stone.
- 2. parallel syncing of multiple mailboxes
- background: mbsync currently syncs only one mailbox at a time. this
increases latency in particular when there are almost no changes to
sync.
- how: mostly just refactoring in main.c.
- add option MaxConnections to limit parallelity (20 simultaneous
connections aren't really nice to the server).
- why: you'll need the ability to have multiple mailboxes open at the
same time, at least logically.
- 3. optional: add support for CONDSTORE & QRESYNC
- background: mbsync currently fetches the headers of all messages it
wants to sync and calculates the delta itself. that costs a lot of
bandwidth. this problem has been recognized by the IMAP authorities
and they defined extensions which put much of these calculations on
the server side.
- how:
- in a first step, factor a big part of the main syncing code into
utility functions. make the drivers use these functions to
calculate event streams instead of providing raw data about the
mailboxes. adjust the main sync loops to this new input.
- in the second step, add optional code paths using said extensions
to obtain the event streams. some hints are in the TODO file.
- why: you'll need some kind of editable event stream anyway.
- 4. implement move detection
- background: re-syncing messages from scratch when they actually just
moved is a waste of time, in particular when doing local moves and
using an asymmetric uplink (the typical case).
- how: when a mailbox' sync has progressed so far that new and deleted
messages have been identified, call back into main.c, new function
done_pre_sync(). this function would "muliplex" the lists of new and
deleted messages by Message-Ids and synthetize moves from that. the
original new/delete entries would be pruned from the lists, and the
move command would be queued to the source mailbox (that's a
practicality dictated by IMAP).
- i have no clue how to integrate this with the transaction system.
possibly, the log replay would also need some multiplexing
callback.
- as the number of simultaneously open mailboxes may be limited, it
may be necessary to re-open the mailbox after returning from the
"multiplexer".
- paranoid mode: in addition to comparing Message-IDs, the actual
messages would be re-fetched and compared. that's because in
principle it would be legal to modify messages while moving them
(they get new UIDs anyway). that's still cheaper then uploading
them over an asymmetric line.
as you can see, this isn't a project for a few hours, and the likelihood
that i'll embark on it myself anytime soon is about zilch.
bonus feature: with the Message-Id handling in place, it would be also
possible to implement smooth migration from other synchronizers.
------------------------------------------------------------------------------
Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San
Francisco, CA to explore cutting-edge tech and listen to tech luminaries
present their vision of the future. This family event has something for
everyone, including kids. Get more information and register today.
http://sdm.link/attshape
_______________________________________________
isync-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/isync-devel