issue with exception handling in single-threaded mode (was Re: irreversible silent loss of mail when server account is full)

Adam Spiers offlineimap at adamspiers.org
Wed Mar 27 19:21:36 GMT 2013


On Wed, Mar 27, 2013 at 06:56:07PM +0000, Adam Spiers wrote:

[snipped]

>     https://github.com/OfflineIMAP/offlineimap/pull/29
> 
> However, this led me to notice a separate issue where single-threaded
> mode doesn't properly handle exceptions.  I'll send a separate mail
> about that.

My fix in the above pull request raises an OfflineImapError of type
ERROR.REPO, which causes the sync thread to abort, and *should* cause
the sync runner to abort execution of any further threads for this
repository.  But it only aborts correctly in multi-threaded mode, not
in single-threaded mode.  The explanation is as follows:

ExitNotifyThread.run() catches the OfflineImapError exception and
stores it:

        except Exception as e:
            # Thread exited with Exception, store it
            tb = traceback.format_exc()
            self.set_exit_exception(e, tb)

However, the code which later accesses this stored exception and
propagates it to the UI is in threadutils.threadexited(), which is
only invoked in multi-threaded mode, as seen in this extract of
OfflineIMAP.sync():

        if options.singlethreading:
            #singlethreaded
            self.sync_singlethreaded(syncaccounts)
        else:
            # multithreaded
            t = threadutil.ExitNotifyThread(target=syncmaster.syncitall,
                             name='Sync Runner',
                             kwargs = {'accounts': syncaccounts,
                                       'config': self.config})
            t.start()
            threadutil.exitnotifymonitorloop(threadutil.threadexited)

The thread-handling code is non-trivial so I can't propose a fix
without wading in deeper, which unfortunately I don't have time to do
right now.  The important thing for now is that my pull request above
prevents any further mail loss.  The UI output in single-threaded mode
silently aborts the APPEND without explanation, which is not good, but
significantly better than the previous behaviour.

I would be very grateful if someone could validate my analysis and let
me know whether I should submit a github issue for this.

Cheers!
Adam




More information about the OfflineIMAP-project mailing list