From 3af09b1a7b95de167c08455dd8c5305e1da5fe97 Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 10 Apr 2019 20:17:58 +0200 Subject: [PATCH] Fast fail on folder closed --- app/src/main/java/eu/faircode/email/Core.java | 12 +++++++++++- .../eu/faircode/email/ServiceSynchronize.java | 17 ++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 184ea8ca5c..ae4e66148b 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -1913,6 +1913,7 @@ class Core { private Thread thread; private Semaphore semaphore = new Semaphore(0); private boolean running = true; + private boolean recoverable = true; State(Helper.NetworkState networkState) { this.networkState = networkState; @@ -1944,11 +1945,16 @@ class Core { return semaphore.tryAcquire(milliseconds, TimeUnit.MILLISECONDS); } - void error() { + void error(Throwable ex) { + recoverable = !(ex instanceof FolderClosedException); thread.interrupt(); yield(); } + void reset() { + recoverable = true; + } + private void yield() { try { // Give interrupted thread some time to acquire wake lock @@ -1974,6 +1980,10 @@ class Core { return running; } + boolean recoverable() { + return recoverable; + } + void join(Thread thread) { boolean joined = false; while (!joined) diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index c081bf0b34..a45829e784 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -498,6 +498,7 @@ public class ServiceSynchronize extends LifecycleService { int backoff = CONNECT_BACKOFF_START; while (state.running()) { + state.reset(); Log.i(account.name + " run"); Handler handler = new Handler(getMainLooper()); @@ -535,7 +536,7 @@ public class ServiceSynchronize extends LifecycleService { (message != null && !message.startsWith("Too many simultaneous connections"))) Core.reportError(ServiceSynchronize.this, account, null, new Core.AlertException(message)); - state.error(); + state.error(null); } else Log.i(account.name + " notice: " + message); } finally { @@ -727,7 +728,7 @@ public class ServiceSynchronize extends LifecycleService { } catch (Throwable ex) { Log.e(folder.name, ex); Core.reportError(ServiceSynchronize.this, account, folder, ex); - state.error(); + state.error(ex); } finally { wlAccount.release(); } @@ -756,7 +757,7 @@ public class ServiceSynchronize extends LifecycleService { Log.e(folder.name, ex); Core.reportError(ServiceSynchronize.this, account, folder, ex); db.folder().setFolderError(folder.id, Helper.formatThrowable(ex, true)); - state.error(); + state.error(ex); } finally { wlAccount.release(); } @@ -807,7 +808,7 @@ public class ServiceSynchronize extends LifecycleService { } catch (Throwable ex) { Log.e(folder.name, ex); Core.reportError(ServiceSynchronize.this, account, folder, ex); - state.error(); + state.error(ex); } finally { wlAccount.release(); } @@ -828,7 +829,7 @@ public class ServiceSynchronize extends LifecycleService { Log.e(folder.name, ex); Core.reportError(ServiceSynchronize.this, account, folder, ex); db.folder().setFolderError(folder.id, Helper.formatThrowable(ex, true)); - state.error(); + state.error(ex); } finally { Log.i(folder.name + " end idle"); } @@ -906,7 +907,7 @@ public class ServiceSynchronize extends LifecycleService { Log.e(folder.name, ex); Core.reportError(ServiceSynchronize.this, account, folder, ex); db.folder().setFolderError(folder.id, Helper.formatThrowable(ex, true)); - state.error(); + state.error(ex); } finally { if (shouldClose) { if (ifolder != null && ifolder.isOpen()) { @@ -954,8 +955,10 @@ public class ServiceSynchronize extends LifecycleService { AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); try { while (state.running()) { + if (!state.recoverable()) + throw new StoreClosedException(istore, "Unrecoverable"); if (!istore.isConnected()) // Sends store NOOP - throw new StoreClosedException(istore); + throw new StoreClosedException(istore, "NOOP"); for (EntityFolder folder : folders.keySet()) if (folder.synchronize)