From d50d17d63f2fc0128a2393238e97f7e3133ac1f8 Mon Sep 17 00:00:00 2001 From: Ben Gotow Date: Sun, 4 Feb 2018 20:14:02 -0800 Subject: [PATCH] Retry metadata transfer for reminders, see if it fixes Sentry 363208698 --- .../send-reminders/lib/send-reminders-utils.es6 | 13 +++++++++++-- app/src/flux/stores/database-store.es6 | 2 +- app/src/promise-extensions.es6 | 5 +++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/internal_packages/send-reminders/lib/send-reminders-utils.es6 b/app/internal_packages/send-reminders/lib/send-reminders-utils.es6 index 0884b62a9..4fa89c2b2 100644 --- a/app/internal_packages/send-reminders/lib/send-reminders-utils.es6 +++ b/app/internal_packages/send-reminders/lib/send-reminders-utils.es6 @@ -80,9 +80,15 @@ export async function updateDraftReminderMetadata(draftSession, metadataValue) { } export async function transferReminderMetadataFromDraftToThread({ accountId, headerMessageId }) { - const message = await DatabaseStore.findBy(Message, { accountId, headerMessageId }); + let message = await DatabaseStore.findBy(Message, { accountId, headerMessageId }); if (!message) { - throw new Error('SendReminders: Could not find message to update'); + // The task has just completed, wait a moment to see if the message appears. Testing to + // see whether this resolves https://sentry.io/foundry-376-llc/mailspring/issues/363208698/ + await Promise.delay(1500); + message = await DatabaseStore.findBy(Message, { accountId, headerMessageId }); + if (!message) { + throw new Error('SendReminders: Could not find message to update'); + } } const metadata = message.metadataForPluginId(PLUGIN_ID) || {}; @@ -91,6 +97,9 @@ export async function transferReminderMetadataFromDraftToThread({ accountId, hea } const thread = await DatabaseStore.find(Thread, message.threadId); + if (!thread) { + throw new Error('SendReminders: Could not find thread to update'); + } updateReminderMetadata(thread, { expiration: metadata.expiration, sentHeaderMessageId: metadata.sentHeaderMessageId, diff --git a/app/src/flux/stores/database-store.es6 b/app/src/flux/stores/database-store.es6 index e17a749b5..978a1d94d 100644 --- a/app/src/flux/stores/database-store.es6 +++ b/app/src/flux/stores/database-store.es6 @@ -284,7 +284,7 @@ class DatabaseStore extends MailspringStore { // We don't want to unnecessarily defer and delay every single query, // so we only set the timer when we are actually backing off for a // retry. - await new Promise(resolve => setTimeout(resolve, scheduler.currentDelay())); + await Promise.delay(scheduler.currentDelay()); } let stmt = this._preparedStatementCache.get(query); diff --git a/app/src/promise-extensions.es6 b/app/src/promise-extensions.es6 index ce5f35d5e..4ac45d970 100644 --- a/app/src/promise-extensions.es6 +++ b/app/src/promise-extensions.es6 @@ -112,6 +112,10 @@ async function each(items, fn) { return results; } +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + function props(obj) { const awaitables = []; const keys = Object.keys(obj); @@ -149,6 +153,7 @@ global.Promise.prototype.isResolved = isResolved; global.Promise.prototype.isRejected = isRejected; global.Promise.each = each; +global.Promise.delay = delay; global.Promise.props = props; global.Promise.promisify = promisify; global.Promise.promisifyAll = promisifyAll;