Blame SOURCES/evolution-3.22.6-folder-changed-blocked.patch

a00a81
diff -up evolution-3.22.6/libemail-engine/mail-folder-cache.c.folder-changed-blocked evolution-3.22.6/libemail-engine/mail-folder-cache.c
a00a81
--- evolution-3.22.6/libemail-engine/mail-folder-cache.c.folder-changed-blocked	2016-09-19 10:22:58.000000000 +0200
a00a81
+++ evolution-3.22.6/libemail-engine/mail-folder-cache.c	2017-05-29 23:35:00.143560314 +0200
a00a81
@@ -93,6 +93,12 @@ enum {
a00a81
 
a00a81
 static guint signals[LAST_SIGNAL];
a00a81
 
a00a81
+typedef enum {
a00a81
+	E_FIRST_UPDATE_RUNNING,
a00a81
+	E_FIRST_UPDATE_FAILED,
a00a81
+	E_FIRST_UPDATE_DONE
a00a81
+} EFirstUpdateState;
a00a81
+
a00a81
 struct _StoreInfo {
a00a81
 	volatile gint ref_count;
a00a81
 
a00a81
@@ -107,7 +113,7 @@ struct _StoreInfo {
a00a81
 	gulong folder_unsubscribed_handler_id;
a00a81
 
a00a81
 	GHashTable *folder_info_ht;	/* by full_name */
a00a81
-	gboolean first_update;		/* TRUE, then FALSE forever */
a00a81
+	EFirstUpdateState first_update;
a00a81
 	GSList *pending_folder_notes;	/* Gather note_folder calls during first_update period */
a00a81
 
a00a81
 	/* Hold a reference to keep them alive. */
a00a81
@@ -261,7 +267,7 @@ store_info_new (CamelStore *store)
a00a81
 	store_info = g_slice_new0 (StoreInfo);
a00a81
 	store_info->ref_count = 1;
a00a81
 	store_info->store = g_object_ref (store);
a00a81
-	store_info->first_update = TRUE;
a00a81
+	store_info->first_update = E_FIRST_UPDATE_RUNNING;
a00a81
 
a00a81
 	store_info->folder_info_ht = g_hash_table_new_full (
a00a81
 		(GHashFunc) g_str_hash,
a00a81
@@ -1964,7 +1970,7 @@ mail_folder_cache_first_update (MailFold
a00a81
 	g_object_unref (session);
a00a81
 
a00a81
 	g_mutex_lock (&store_info->lock);
a00a81
-	store_info->first_update = FALSE;
a00a81
+	store_info->first_update = E_FIRST_UPDATE_DONE;
a00a81
 	folders = store_info->pending_folder_notes;
a00a81
 	store_info->pending_folder_notes = NULL;
a00a81
 	g_mutex_unlock (&store_info->lock);
a00a81
@@ -1988,6 +1994,7 @@ mail_folder_cache_note_store_thread (GSi
a00a81
 	StoreInfo *store_info;
a00a81
 	GQueue result_queue = G_QUEUE_INIT;
a00a81
 	AsyncContext *async_context;
a00a81
+	gboolean success = FALSE;
a00a81
 	GError *local_error = NULL;
a00a81
 
a00a81
 	cache = MAIL_FOLDER_CACHE (source_object);
a00a81
@@ -2060,17 +2067,22 @@ mail_folder_cache_note_store_thread (GSi
a00a81
 
a00a81
 	/* Do some extra work for the first update. */
a00a81
 	g_mutex_lock (&store_info->lock);
a00a81
-	if (store_info->first_update) {
a00a81
+	if (store_info->first_update != E_FIRST_UPDATE_DONE) {
a00a81
 		g_mutex_unlock (&store_info->lock);
a00a81
 		mail_folder_cache_first_update (cache, store_info);
a00a81
 	} else {
a00a81
 		g_mutex_unlock (&store_info->lock);
a00a81
 	}
a00a81
 
a00a81
+	success = TRUE;
a00a81
 exit:
a00a81
 	/* We don't want finish() functions being invoked while holding a
a00a81
 	 * locked mutex, so flush the StoreInfo's queue to a local queue. */
a00a81
 	g_mutex_lock (&store_info->lock);
a00a81
+
a00a81
+	if (store_info->first_update != E_FIRST_UPDATE_DONE)
a00a81
+		store_info->first_update = success ? E_FIRST_UPDATE_DONE : E_FIRST_UPDATE_FAILED;
a00a81
+
a00a81
 	e_queue_transfer (&store_info->folderinfo_updates, &result_queue);
a00a81
 	g_mutex_unlock (&store_info->lock);
a00a81
 
a00a81
@@ -2130,6 +2142,9 @@ mail_folder_cache_note_store (MailFolder
a00a81
 
a00a81
 	g_mutex_lock (&store_info->lock);
a00a81
 
a00a81
+	if (store_info->first_update != E_FIRST_UPDATE_DONE)
a00a81
+		store_info->first_update = E_FIRST_UPDATE_RUNNING;
a00a81
+
a00a81
 	g_queue_push_tail (
a00a81
 		&store_info->folderinfo_updates,
a00a81
 		g_object_ref (simple));
a00a81
@@ -2211,18 +2226,23 @@ mail_folder_cache_note_folder (MailFolde
a00a81
 	 *     warnings on startup which might be worth tracking down. */
a00a81
 	if (folder_info == NULL) {
a00a81
 		StoreInfo *store_info;
a00a81
-		gboolean retry = FALSE;
a00a81
+		gboolean retry = FALSE, renote_store = FALSE;
a00a81
 
a00a81
 		store_info = mail_folder_cache_ref_store_info (cache, parent_store);
a00a81
 		if (!store_info)
a00a81
 			return;
a00a81
 
a00a81
 		g_mutex_lock (&store_info->lock);
a00a81
-		if (store_info->first_update) {
a00a81
+		if (store_info->first_update != E_FIRST_UPDATE_DONE) {
a00a81
 			/* The first update did not finish yet, thus add this as a pending
a00a81
 			   folder to be noted once the first update finishes */
a00a81
 			store_info->pending_folder_notes = g_slist_prepend (
a00a81
 				store_info->pending_folder_notes, g_object_ref (folder));
a00a81
+
a00a81
+			if (store_info->first_update == E_FIRST_UPDATE_FAILED) {
a00a81
+				store_info->first_update = E_FIRST_UPDATE_RUNNING;
a00a81
+				renote_store = TRUE;
a00a81
+			}
a00a81
 		} else {
a00a81
 			/* It can be that certain threading interleaving made
a00a81
 			   the first store update finished before we reached
a00a81
@@ -2233,7 +2253,9 @@ mail_folder_cache_note_folder (MailFolde
a00a81
 
a00a81
 		store_info_unref (store_info);
a00a81
 
a00a81
-		if (retry)
a00a81
+		if (renote_store)
a00a81
+			mail_folder_cache_note_store (cache, parent_store, NULL, NULL, NULL);
a00a81
+		else if (retry)
a00a81
 			folder_info = mail_folder_cache_ref_folder_info (
a00a81
 				cache, parent_store, full_name);
a00a81