Add os.Logger diagnostics to SyncEngine.connect()
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import SwiftData
|
import SwiftData
|
||||||
import Observation
|
import Observation
|
||||||
|
import os
|
||||||
|
|
||||||
enum ICloudStatus: Equatable {
|
enum ICloudStatus: Equatable {
|
||||||
case checking
|
case checking
|
||||||
@@ -23,6 +24,7 @@ final class SyncEngine {
|
|||||||
/// this to push fresh state to the watch.
|
/// this to push fresh state to the watch.
|
||||||
var onCacheChanged: (() -> Void)?
|
var onCacheChanged: (() -> Void)?
|
||||||
|
|
||||||
|
private let log = Logger(subsystem: "dev.rzen.indie.Workouts", category: "sync")
|
||||||
private let modelContainer: ModelContainer
|
private let modelContainer: ModelContainer
|
||||||
private var fileManager: ICloudFileManager?
|
private var fileManager: ICloudFileManager?
|
||||||
private var monitor: ICloudFileMonitor?
|
private var monitor: ICloudFileMonitor?
|
||||||
@@ -42,14 +44,17 @@ final class SyncEngine {
|
|||||||
connectAttempt += 1
|
connectAttempt += 1
|
||||||
let attempt = connectAttempt
|
let attempt = connectAttempt
|
||||||
iCloudStatus = .checking
|
iCloudStatus = .checking
|
||||||
|
log.info("connect[\(attempt)]: resolving container \(Self.containerIdentifier, privacy: .public)")
|
||||||
|
|
||||||
let url = await Task.detached {
|
let url = await Task.detached {
|
||||||
FileManager.default.url(forUbiquityContainerIdentifier: Self.containerIdentifier)
|
FileManager.default.url(forUbiquityContainerIdentifier: Self.containerIdentifier)
|
||||||
}.value
|
}.value
|
||||||
guard let containerURL = url else {
|
guard let containerURL = url else {
|
||||||
|
log.error("connect[\(attempt)]: ubiquity container URL is nil → unavailable (iCloud Drive off, or container not provisioned)")
|
||||||
if attempt == connectAttempt { iCloudStatus = .unavailable }
|
if attempt == connectAttempt { iCloudStatus = .unavailable }
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.info("connect[\(attempt)]: container URL = \(containerURL.path, privacy: .public)")
|
||||||
|
|
||||||
let fm = ICloudFileManager(containerURL: containerURL)
|
let fm = ICloudFileManager(containerURL: containerURL)
|
||||||
|
|
||||||
@@ -57,15 +62,18 @@ final class SyncEngine {
|
|||||||
try? await Task.sleep(for: .seconds(20))
|
try? await Task.sleep(for: .seconds(20))
|
||||||
guard let self, !Task.isCancelled else { return }
|
guard let self, !Task.isCancelled else { return }
|
||||||
if self.iCloudStatus == .checking, attempt == self.connectAttempt {
|
if self.iCloudStatus == .checking, attempt == self.connectAttempt {
|
||||||
|
self.log.error("connect[\(attempt)]: timed out after 20s — first container file op blocked (dataless container?)")
|
||||||
self.iCloudStatus = .unavailable
|
self.iCloudStatus = .unavailable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
log.info("connect[\(attempt)]: preparing directories…")
|
||||||
await fm.prepareDirectories()
|
await fm.prepareDirectories()
|
||||||
timeout.cancel()
|
timeout.cancel()
|
||||||
guard attempt == connectAttempt else { return }
|
guard attempt == connectAttempt else { return }
|
||||||
|
|
||||||
self.fileManager = fm
|
self.fileManager = fm
|
||||||
iCloudStatus = .available
|
iCloudStatus = .available
|
||||||
|
log.info("connect[\(attempt)]: directories ready → available")
|
||||||
WorkoutsModelContainer.persistCurrentIdentityToken()
|
WorkoutsModelContainer.persistCurrentIdentityToken()
|
||||||
|
|
||||||
await reconcile()
|
await reconcile()
|
||||||
|
|||||||
Reference in New Issue
Block a user