From 07265cb0f7abc7f0b90e55f9563d07f38677c90c Mon Sep 17 00:00:00 2001 From: Jonathan Reams Date: Fri, 2 Sep 2022 15:13:08 -0400 Subject: [PATCH] Wait for download completion when downloading fresh FLX realm in client reset (#5805) --- CHANGELOG.md | 1 + src/realm/object-store/sync/sync_session.cpp | 26 +++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 744b00341f3..ee5917ba440 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ * Upload completion callbacks may have called before the download message that completed them was fully integrated. ([#4865](https://github.com/realm/realm-core/issues/4865)). * Fixed an exception "fcntl() with F_BARRIERFSYNC failed: Inappropriate ioctl for device" when running with MacOS on an exFAT drive. ([#5789](https://github.com/realm/realm-core/issues/5789) since 12.0.0) * Syncing of a Decimal128 with big significand could result in a crash. ([#5728](https://github.com/realm/realm-core/issues/5728)) +* Recovery/discardLocal client reset modes will now wait for FLX sync realms to be fully synchronized before beginning recovery operations ([#5705](https://github.com/realm/realm-core/issues/5705)) ### Breaking changes 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); } } });