diff --git a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java index 90b6cce073..2378c6fa0e 100644 --- a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java +++ b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java @@ -496,7 +496,8 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback id = new LinkedHashMap<>(); @@ -3309,7 +3309,7 @@ class Core { account.partial_fetch = false; DB db = DB.getInstance(context); db.account().setAccountPartialFetch(account.id, account.partial_fetch); - state.error(new StoreClosedException(istore)); + state.error(new StoreClosedException(istore), session); } } @@ -4052,6 +4052,7 @@ class Core { } static class State { + private int session; private int backoff; private ConnectionHelper.NetworkState networkState; private Thread thread = new Thread(); @@ -4101,7 +4102,12 @@ class Core { return semaphore.tryAcquire(milliseconds, TimeUnit.MILLISECONDS); } - void error(Throwable ex) { + void error(Throwable ex, int session) { + if (session != this.session) { + Log.i("Ignoring session=" + session + "/" + this.session + " ex=" + ex); + return; + } + if (ex instanceof MessagingException && ("connection failure".equals(ex.getMessage()) || "Not connected".equals(ex.getMessage()) || // POP3 @@ -4132,7 +4138,8 @@ class Core { yield(); } - void reset() { + void reset(int run) { + session = run; recoverable = true; lastActivity = null; resetBatches(); diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 73690d3eaf..14fe5d2dad 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -904,11 +904,13 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences Log.w(account.name + " backoff " + ex.toString()); } + int run = 0; int errors = 0; state.setBackoff(CONNECT_BACKOFF_START); while (state.isRunning() && currentThread != null && currentThread.equals(thread)) { - state.reset(); + final int session = ++run; + state.reset(session); Log.i(account.name + " run thread=" + currentThread); final List cowners = new ArrayList<>(); @@ -1131,7 +1133,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences EntityLog.log( ServiceSynchronize.this, folder.name + " " + Log.formatThrowable(ex, false)); - state.error(ex); + state.error(ex, session); } finally { wlMessage.release(); } @@ -1160,7 +1162,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences EntityLog.log( ServiceSynchronize.this, folder.name + " " + Log.formatThrowable(ex, false)); - state.error(ex); + state.error(ex, session); } finally { wlMessage.release(); } @@ -1184,7 +1186,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences EntityLog.log( ServiceSynchronize.this, folder.name + " " + Log.formatThrowable(ex, false)); - state.error(ex); + state.error(ex, session); } finally { wlMessage.release(); } @@ -1207,7 +1209,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences EntityLog.log( ServiceSynchronize.this, folder.name + " " + Log.formatThrowable(ex, false)); - state.error(new FolderClosedException(ifolder, "IDLE")); + state.error(new FolderClosedException(ifolder, "IDLE"), session); } finally { Log.i(folder.name + " end idle"); } @@ -1343,7 +1345,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences Log.i(account.name + " folder " + folder.name + " flags=" + ifolder.getPermanentFlags()); } - Core.processOperations(ServiceSynchronize.this, + Core.processOperations( + ServiceSynchronize.this, session, account, folder, partition, iservice.getStore(), ifolder, @@ -1355,7 +1358,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences ServiceSynchronize.this, folder.name + " " + Log.formatThrowable(ex, false)); db.folder().setFolderError(folder.id, Log.formatThrowable(ex)); - state.error(ex); + state.error(ex, session); } finally { if (shouldClose) { if (ifolder != null && ifolder.isOpen()) {