From f15e7d43e3597f499cc66b5b6e194bdf1aa01943 Mon Sep 17 00:00:00 2001 From: iequidoo Date: Tue, 6 Feb 2024 12:25:56 -0300 Subject: [PATCH] fix: ImapSession::select_or_create_folder(): Don't fail if folder is created in parallel --- src/imap/select_folder.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/imap/select_folder.rs b/src/imap/select_folder.rs index 2d6dfa9a6..c8b36c7a3 100644 --- a/src/imap/select_folder.rs +++ b/src/imap/select_folder.rs @@ -112,11 +112,16 @@ impl ImapSession { Err(err) => match err { Error::NoFolder(..) => { info!(context, "Failed to select folder {} because it does not exist, trying to create it.", folder); - self.create(folder).await.with_context(|| { - format!("Couldn't select folder ('{err}'), then create() failed") - })?; - - Ok(self.select_folder(context, Some(folder)).await.with_context(|| format!("failed to select newely created folder {folder}"))?) + let create_res = self.create(folder).await; + if let Err(ref err) = create_res { + info!(context, "Couldn't select folder, then create() failed: {err:#}."); + // Need to recheck, could have been created in parallel. + } + let select_res = self.select_folder(context, Some(folder)).await.with_context(|| format!("failed to select newely created folder {folder}")); + if select_res.is_err() { + create_res?; + } + select_res } _ => Err(err).with_context(|| format!("failed to select folder {folder} with error other than NO, not trying to create it")), },