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