From c71c5dcdcc7514a2d9c1def6b67c19a4e097318e Mon Sep 17 00:00:00 2001 From: Jonathan Reams Date: Wed, 31 Aug 2022 18:04:13 -0400 Subject: [PATCH] Wait for download completion when downloading fresh FLX realm in client reset --- src/realm/object-store/sync/sync_session.cpp | 26 +++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/realm/object-store/sync/sync_session.cpp b/src/realm/object-store/sync/sync_session.cpp index a12003d637c..279aee69b9b 100644 --- a/src/realm/object-store/sync/sync_session.cpp +++ b/src/realm/object-store/sync/sync_session.cpp @@ -392,7 +392,28 @@ void SyncSession::download_fresh_realm(sync::ProtocolErrorInfo::Action server_re std::move(fresh_mut_sub) .commit() .get_state_change_notification(sync::SubscriptionSet::State::Complete) - .get_async([=, weak_self = weak_from_this()](StatusWith s) { + .then([=, weak_self = weak_from_this()](sync::SubscriptionSet::State) { + auto pf = util::make_promise_future(); + sync_session->wait_for_download_completion([=, promise = std::move(pf.promise)]( + std::error_code ec) mutable { + auto strong_self = weak_self.lock(); + if (!strong_self) { + return promise.set_error({ErrorCodes::RuntimeError, + "SyncSession was destroyed before download could be completed"}); + } + + if (ec) { + return promise.set_error( + {ErrorCodes::RuntimeError, + util::format("Error waiting for download completion for fresh realm (code: %1): %2", + ec.value(), ec.message())}); + } + + promise.emplace_value(); + }); + return std::move(pf.future); + }) + .get_async([=, weak_self = weak_from_this()](Status s) { // Keep the sync session alive while it's downloading, but then close // it immediately sync_session->close(); @@ -401,8 +422,7 @@ void SyncSession::download_fresh_realm(sync::ProtocolErrorInfo::Action server_re strong_self->handle_fresh_realm_downloaded(db, none, server_requests_action); } else { - strong_self->handle_fresh_realm_downloaded(nullptr, s.get_status().reason(), - server_requests_action); + strong_self->handle_fresh_realm_downloaded(nullptr, s.reason(), server_requests_action); } } });