private async Task <(MimeMessageWithUniqueId, LockResult)> GetOrCreateStorageMessageInFolderAsync(IMailFolder folder, string uniqueStoreName, string lockFolderName, bool unlockResource, Action <MimeMessage>?initializationCallback = null) { var messageIdHeaderValue = uniqueStoreName.EnsureContentIdFormat(); logger.Debug("Searching storage message in folder {FolderPath} with Message-Id header value {MessageIdHeaderValue}", folder.FullName, messageIdHeaderValue); var lockResult = await remoteLock.AcquireLockRetry(folder, lockFolderName); if (!lockResult.IsSuccess) { throw new CannotLockException($"Cannot get lock for resource '{lockFolderName}'"); } try { var searchResult = await folder.FindIdByMessageIdHeader(messageIdHeaderValue, false, false); var uniqueId = searchResult.Item1; MimeMessage?resultMessage = null; if (uniqueId.IsValid) { var message = await folder.GetMessageOrDefaultAsync(uniqueId); logger.Debug("Found storage message in folder {FolderPath} for Message-Id header value {MessageIdHeaderValue} with ID {ID}", folder.FullName, messageIdHeaderValue, message.Item2); resultMessage = message.Item1; } if (resultMessage == null) { Action <MimeMessage> initializationCallbackPlusSubjectInit = (message) => { message.Subject = EmailBackedKeyValueStore.GetSubjectFromUniqueStoreName(uniqueStoreName); initializationCallback?.Invoke(message); }; (resultMessage, uniqueId) = await CreateEmptyStorageMessageAsync(folder, messageIdHeaderValue, initializationCallback); } return(new MimeMessageWithUniqueId() { Message = resultMessage, UniqueId = uniqueId }, lockResult); } finally { if (unlockResource) { var unlockResult = await remoteLock.ReleaseLock(folder, lockFolderName, lockResult.ResultingLockCookie); if (!unlockResult) { logger.Warning("Could not unlock the following lock: {@LockResult}", lockResult); } } } }