@@ -34,6 +34,8 @@ final class DatabaseManager {
3434 /// Separate from the main driver so pings never queue behind long-running user queries.
3535 private var pingDrivers : [ UUID : DatabaseDriver ] = [ : ]
3636
37+ private var metadataCreationTasks : [ UUID : Task < Void , Never > ] = [ : ]
38+
3739 /// Current session (computed from currentSessionId)
3840 var currentSession : ConnectionSession ? {
3941 guard let sessionId = currentSessionId else { return nil }
@@ -204,8 +206,9 @@ final class DatabaseManager {
204206 let metaConnection = effectiveConnection
205207 let metaConnectionId = connection. id
206208 let metaTimeout = AppSettingsManager . shared. general. queryTimeoutSeconds
207- Task { [ weak self] in
209+ metadataCreationTasks [ metaConnectionId ] = Task { [ weak self] in
208210 guard let self else { return }
211+ defer { self . metadataCreationTasks. removeValue ( forKey: metaConnectionId) }
209212 do {
210213 let metaDriver = try DatabaseDriverFactory . createDriver ( for: metaConnection)
211214 try await metaDriver. connect ( )
@@ -269,6 +272,10 @@ final class DatabaseManager {
269272 try ? await SSHTunnelManager . shared. closeTunnel ( connectionId: session. connection. id)
270273 }
271274
275+ // Cancel any in-flight metadata driver creation
276+ metadataCreationTasks [ sessionId] ? . cancel ( )
277+ metadataCreationTasks. removeValue ( forKey: sessionId)
278+
272279 // Stop health monitoring
273280 await stopHealthMonitor ( for: sessionId)
274281
@@ -301,6 +308,9 @@ final class DatabaseManager {
301308 await stopHealthMonitor ( for: sessionId)
302309 }
303310
311+ for task in metadataCreationTasks. values { task. cancel ( ) }
312+ metadataCreationTasks. removeAll ( )
313+
304314 let sessionIds = Array ( activeSessions. keys)
305315 for sessionId in sessionIds {
306316 await disconnectSession ( sessionId)
@@ -539,7 +549,7 @@ final class DatabaseManager {
539549 }
540550 case . failed:
541551 Self . logger. error (
542- " Health monitoring failed for session \( id) after 3 retries " )
552+ " Health monitoring failed for session \( id) " )
543553 self . updateSession ( id) { session in
544554 session. status = . error( String ( localized: " Connection lost " ) )
545555 session. clearCachedData ( )
@@ -674,8 +684,9 @@ final class DatabaseManager {
674684 let metaTimeout = AppSettingsManager . shared. general. queryTimeoutSeconds
675685 let startupCmds = session. connection. startupCommands
676686 let connName = session. connection. name
677- Task { [ weak self] in
687+ metadataCreationTasks [ metaConnectionId ] = Task { [ weak self] in
678688 guard let self else { return }
689+ defer { self . metadataCreationTasks. removeValue ( forKey: metaConnectionId) }
679690 do {
680691 let metaDriver = try DatabaseDriverFactory . createDriver ( for: metaConnection)
681692 try await metaDriver. connect ( )
0 commit comments