[geary/wip/789924-network-transition-redux: 5/11] Ensure MinimalFolder's properties are correctly updated by the remote's.



commit 1a9377db401e3e1892d32189a7541e85a85b92f1
Author: Michael James Gratton <mike vee net>
Date:   Fri Feb 2 11:18:57 2018 +1030

    Ensure MinimalFolder's properties are correctly updated by the remote's.
    
    * src/engine/imap-engine/imap-engine-minimal-folder.vala
      (MinimalFolder): Ensure remote properties are added to and removed from
      the folder's aggregate props when the session is opened or
      disconnected, rather when the folder is opened or disconnected. Rather
      than scheduling a call to close_remote_session via the replay queue
      when it is disconnects, do it immediately since it's a race to re-open
      it again, and if the disconnect op loses the race it can't close the
      old disconnected session.
    
    * src/engine/imap-engine/replay-ops/imap-engine-replay-disconnect.vala:
      Removed, since it is no longer used.

 po/POTFILES.in                                     |    1 -
 src/CMakeLists.txt                                 |    1 -
 .../imap-engine/imap-engine-minimal-folder.vala    |   26 ++++++----
 .../replay-ops/imap-engine-replay-disconnect.vala  |   54 --------------------
 src/engine/meson.build                             |    1 -
 5 files changed, 15 insertions(+), 68 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 08cfa04..932776e 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -265,7 +265,6 @@ src/engine/imap-engine/replay-ops/imap-engine-move-email-prepare.vala
 src/engine/imap-engine/replay-ops/imap-engine-move-email-revoke.vala
 src/engine/imap-engine/replay-ops/imap-engine-remove-email.vala
 src/engine/imap-engine/replay-ops/imap-engine-replay-append.vala
-src/engine/imap-engine/replay-ops/imap-engine-replay-disconnect.vala
 src/engine/imap-engine/replay-ops/imap-engine-replay-removal.vala
 src/engine/imap-engine/replay-ops/imap-engine-replay-update.vala
 src/engine/imap-engine/replay-ops/imap-engine-server-search-email.vala
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 52ca969..7206924 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -230,7 +230,6 @@ engine/imap-engine/replay-ops/imap-engine-move-email-prepare.vala
 engine/imap-engine/replay-ops/imap-engine-move-email-revoke.vala
 engine/imap-engine/replay-ops/imap-engine-remove-email.vala
 engine/imap-engine/replay-ops/imap-engine-replay-append.vala
-engine/imap-engine/replay-ops/imap-engine-replay-disconnect.vala
 engine/imap-engine/replay-ops/imap-engine-replay-removal.vala
 engine/imap-engine/replay-ops/imap-engine-replay-update.vala
 engine/imap-engine/replay-ops/imap-engine-server-search-email.vala
diff --git a/src/engine/imap-engine/imap-engine-minimal-folder.vala 
b/src/engine/imap-engine/imap-engine-minimal-folder.vala
index 1d6b2d0..b9e0f86 100644
--- a/src/engine/imap-engine/imap-engine-minimal-folder.vala
+++ b/src/engine/imap-engine/imap-engine-minimal-folder.vala
@@ -670,7 +670,7 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
     /**
      * Unhooks the IMAP folder session and returns it to the account.
      */
-    internal async void close_remote_session(Folder.CloseReason remote_reason) {
+    internal void close_remote_session(Folder.CloseReason remote_reason) {
         // Block anyone calling wait_for_remote_async(), as the session
         // will no longer available.
         this.remote_wait_semaphore.reset();
@@ -684,6 +684,7 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
             session.updated.disconnect(on_remote_updated);
             session.removed.disconnect(on_remote_removed);
             session.disconnected.disconnect(on_remote_disconnected);
+            this._properties.remove(session.folder.properties);
             this._account.release_folder_session(session);
 
             notify_closed(remote_reason);
@@ -701,9 +702,6 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
         // Close the prefetcher early so it stops using the remote ASAP
         this.email_prefetcher.close();
 
-        if (this.remote_session != null)
-            _properties.remove(this.remote_session.folder.properties);
-
         // block anyone from wait_for_remote_async(), as this is no longer open
         this.remote_wait_semaphore.reset();
 
@@ -808,7 +806,7 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
         this.open_flags = OpenFlags.NONE;
 
         // Actually close the remote folder
-        yield close_remote_session(remote_reason);
+        close_remote_session(remote_reason);
 
         // need to call these every time, even if remote was not fully
         // opened, as some callers rely on order of signals
@@ -910,7 +908,6 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
             yield local_folder.update_folder_select_examine(
                 session.folder.properties, cancellable
             );
-            this.remote_count = session.folder.properties.email_total;
         } catch (Error err) {
             // Database failed, so we have a pretty serious problem
             // and should not try to use the folder further, unless
@@ -929,6 +926,9 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
             return;
         }
 
+        this._properties.add(session.folder.properties);
+        this.remote_count = session.folder.properties.email_total;
+
         // Phase 3: Move in place and notify waiters
 
         this.remote_session = session;
@@ -1039,11 +1039,6 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
         this.replay_queue.schedule_server_notification(op);
     }
 
-    private void on_remote_disconnected(Imap.ClientSession.DisconnectReason reason) {
-        debug("on_remote_disconnected: reason=%s", reason.to_string());
-        replay_queue.schedule(new ReplayDisconnect(this, reason, false, null));
-    }
-
     //
     // list email variants
     //
@@ -1446,4 +1441,13 @@ private class Geary.ImapEngine.MinimalFolder : Geary.Folder, Geary.FolderSupport
         this.open_remote_session.begin();
     }
 
+    private void on_remote_disconnected(Imap.ClientSession.DisconnectReason reason) {
+        // Need to close the remote session immediately to avoid a
+        // race with it opening again
+        Geary.Folder.CloseReason remote_reason = reason.is_error()
+            ? Geary.Folder.CloseReason.REMOTE_ERROR
+            : Geary.Folder.CloseReason.REMOTE_CLOSE;
+        close_remote_session(remote_reason);
+    }
+
 }
diff --git a/src/engine/meson.build b/src/engine/meson.build
index 37fead0..1505805 100644
--- a/src/engine/meson.build
+++ b/src/engine/meson.build
@@ -227,7 +227,6 @@ geary_engine_vala_sources = files(
   'imap-engine/replay-ops/imap-engine-move-email-revoke.vala',
   'imap-engine/replay-ops/imap-engine-remove-email.vala',
   'imap-engine/replay-ops/imap-engine-replay-append.vala',
-  'imap-engine/replay-ops/imap-engine-replay-disconnect.vala',
   'imap-engine/replay-ops/imap-engine-replay-removal.vala',
   'imap-engine/replay-ops/imap-engine-replay-update.vala',
   'imap-engine/replay-ops/imap-engine-server-search-email.vala',


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]