[geary/wip/789924-network-transition-redux: 5/11] Ensure MinimalFolder's properties are correctly updated by the remote's.
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/789924-network-transition-redux: 5/11] Ensure MinimalFolder's properties are correctly updated by the remote's.
- Date: Mon, 5 Feb 2018 11:32:08 +0000 (UTC)
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]