From 1e39a2bd433c3fdeab408bc49068044527488f46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20F=C3=B6rtsch?= Date: Sun, 15 Mar 2026 11:44:45 +0100 Subject: [PATCH] fix offline: remove deadlocking syncShutdownGracefully from deinit, limit flag sync range MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - remove deinit from IMAPConnection, SMTPConnection — syncShutdownGracefully blocks and deadlocks if called on NIO event loop thread - limit reconcileFlags to last 500 UIDs to avoid overwhelming the connection Co-Authored-By: Claude Opus 4.6 (1M context) --- .../MagnumOpusCore/Sources/IMAPClient/IMAPConnection.swift | 4 ---- .../MagnumOpusCore/Sources/SMTPClient/SMTPConnection.swift | 4 ---- .../MagnumOpusCore/Sources/SyncEngine/SyncCoordinator.swift | 5 +++-- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/Packages/MagnumOpusCore/Sources/IMAPClient/IMAPConnection.swift b/Packages/MagnumOpusCore/Sources/IMAPClient/IMAPConnection.swift index 41b004e..b02ab3a 100644 --- a/Packages/MagnumOpusCore/Sources/IMAPClient/IMAPConnection.swift +++ b/Packages/MagnumOpusCore/Sources/IMAPClient/IMAPConnection.swift @@ -17,10 +17,6 @@ actor IMAPConnection { self.responseHandler = IMAPResponseHandler() } - deinit { - try? group.syncShutdownGracefully() - } - func connect() async throws { let sslContext = try NIOSSLContext(configuration: TLSConfiguration.makeClientConfiguration()) let handler = responseHandler diff --git a/Packages/MagnumOpusCore/Sources/SMTPClient/SMTPConnection.swift b/Packages/MagnumOpusCore/Sources/SMTPClient/SMTPConnection.swift index d21f6c3..16ce7aa 100644 --- a/Packages/MagnumOpusCore/Sources/SMTPClient/SMTPConnection.swift +++ b/Packages/MagnumOpusCore/Sources/SMTPClient/SMTPConnection.swift @@ -19,10 +19,6 @@ actor SMTPConnection { self.responseHandler = SMTPResponseHandler() } - deinit { - try? group.syncShutdownGracefully() - } - func connect() async throws -> SMTPResponse { let handler = responseHandler let hostname = host diff --git a/Packages/MagnumOpusCore/Sources/SyncEngine/SyncCoordinator.swift b/Packages/MagnumOpusCore/Sources/SyncEngine/SyncCoordinator.swift index 529426f..6c24b4b 100644 --- a/Packages/MagnumOpusCore/Sources/SyncEngine/SyncCoordinator.swift +++ b/Packages/MagnumOpusCore/Sources/SyncEngine/SyncCoordinator.swift @@ -171,9 +171,10 @@ public final class SyncCoordinator { emit(.newMessages(count: envelopes.count, mailbox: remoteMailbox.name)) } - // Reconcile flags for existing messages (read/unread state from other devices) + // Reconcile flags for recent existing messages (read/unread state from other devices) if lastUid > 0 { - await reconcileFlags(mailboxId: mailboxId, uidRange: 1...lastUid) + let flagSyncStart = max(1, lastUid - 499) + await reconcileFlags(mailboxId: mailboxId, uidRange: flagSyncStart...lastUid) } await prefetchBodies(mailboxId: mailboxId)