Skip to content

Commit ed5deb7

Browse files
committed
fix: Lock file handling.
Locking: - Added a boolean flag to metadata items which indicates whether they are locally created lock files or not. This is required for correct handling in some places. - Changed database schema version. - Lock files are now not excluded from synchronization but pretended to be synchronized. - On following synchronizations, they are excluded from local deletion due to not being found on the server. - Also, they are ignored in the materialized item enumeration to avoid unnecessary server requests. Logging: - Removed subsystem property in file provider domain log messages because it is always the same anyway. - Improved date formatting of file provider domain log messages. - Messages are written to the unified logging system again in debug configuration builds. - Messages with debug level are not written to log files unless it is a debug configuration build. - Refined encoding of supported log detail types. Key changes of this commit: - FilesDatabaseManager.swift:661 - RemoteChangeObserver.swift:474 - Item+Delete.swift:29 - Item+LockFile.swift:137 Signed-off-by: Iva Horn <iva.horn@icloud.com>
1 parent 0864b0d commit ed5deb7

19 files changed

Lines changed: 246 additions & 280 deletions

Sources/NextcloudFileProviderKit/Database/FilesDatabaseManager.swift

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public final class FilesDatabaseManager: Sendable {
4040
)
4141
}
4242

43-
private static let schemaVersion = SchemaVersion.addedLockTokenPropertyToRealmItemMetadata
43+
private static let schemaVersion = SchemaVersion.addedIsLockFileOfLocalOriginToRealmItemMetadata
4444
let logger: FileProviderLogger
4545
let account: Account
4646

@@ -558,6 +558,7 @@ public final class FilesDatabaseManager: Sendable {
558558

559559
return nil
560560
}
561+
561562
return NSFileProviderItemIdentifier(parentDirectoryMetadata.ocId)
562563
}
563564

@@ -578,6 +579,7 @@ public final class FilesDatabaseManager: Sendable {
578579
depth: .target,
579580
log: logger.log
580581
)
582+
581583
guard error == nil, let parentMetadata = metadatas?.first else {
582584
logger.error("Could not retrieve parent item identifier remotely.", [
583585
.error: error,
@@ -602,61 +604,72 @@ public final class FilesDatabaseManager: Sendable {
602604
managedMaterialisedItemMetadatas(account: account).toUnmanagedResults()
603605
}
604606

605-
public func pendingWorkingSetChanges(
606-
account: Account, since date: Date
607-
) -> (updated: [SendableItemMetadata], deleted: [SendableItemMetadata]) {
607+
public func pendingWorkingSetChanges(account: Account, since date: Date) -> (updated: [SendableItemMetadata], deleted: [SendableItemMetadata]) {
608608
let accId = account.ncKitAccount
609609
let pending = managedMaterialisedItemMetadatas(account: accId).where { $0.syncTime > date }
610610
var updated = pending.where { !$0.deleted }.toUnmanagedResults()
611611
var deleted = pending.where { $0.deleted }.toUnmanagedResults()
612-
613612
var handledUpdateOcIds = Set(updated.map(\.ocId))
613+
614614
updated
615615
.map {
616616
var serverUrl = $0.serverUrl + "/" + $0.fileName
617617
if serverUrl.last == "/" { serverUrl.removeLast() }
618618
return serverUrl
619619
}
620620
.forEach { serverUrl in
621-
logger.debug("Checking (updated) \(serverUrl)")
621+
logger.debug("Checking updated item...", [.url: serverUrl])
622622

623623
itemMetadatas
624624
.where { $0.serverUrl == serverUrl && $0.syncTime > date }
625625
.forEach { metadata in
626-
logger.debug("Checking item: \(metadata.fileName)")
627-
628626
guard !handledUpdateOcIds.contains(metadata.ocId) else {
629627
return
630628
}
631629

632630
handledUpdateOcIds.insert(metadata.ocId)
633631
let sendableMetadata = SendableItemMetadata(value: metadata)
632+
634633
if metadata.deleted {
635634
deleted.append(sendableMetadata)
635+
logger.debug("Appended deleted item to working set changes.", [.item: metadata.ocId, .url: serverUrl])
636636
} else {
637637
updated.append(sendableMetadata)
638+
logger.debug("Appended updated item to working set changes.", [.item: metadata.ocId, .url: serverUrl])
638639
}
639-
640-
logger.debug("Appended item: \(metadata.fileName)")
641640
}
642641
}
643642

644643
var handledDeleteOcIds = Set(deleted.map(\.ocId))
644+
645645
deleted
646-
.map {
646+
.map { // assemble remote location
647647
var serverUrl = $0.serverUrl + "/" + $0.fileName
648-
if serverUrl.last == "/" { serverUrl.removeLast() }
648+
649+
if serverUrl.last == "/" {
650+
serverUrl.removeLast()
651+
}
652+
649653
return serverUrl
650654
}
651655
.forEach { serverUrl in
652-
logger.debug("Checking (deletion) \(serverUrl)")
653-
654-
itemMetadatas
655-
.where { $0.serverUrl.starts(with: serverUrl) && $0.syncTime > date }
656-
.forEach { metadata in
657-
guard !handledDeleteOcIds.contains(metadata.ocId) else { return }
658-
deleted.append(SendableItemMetadata(value: metadata))
656+
logger.debug("Verifying deleted item...", [.url: serverUrl])
657+
658+
itemMetadatas.where {
659+
$0.serverUrl.starts(with: serverUrl) && $0.syncTime > date
660+
}.forEach { metadata in
661+
guard metadata.isLockFileOfLocalOrigin == false else {
662+
logger.info("Excluding item from deletion because it is a lock file from local origin.", [.item: metadata])
663+
return
659664
}
665+
666+
guard !handledDeleteOcIds.contains(metadata.ocId) else {
667+
return
668+
}
669+
670+
deleted.append(SendableItemMetadata(value: metadata))
671+
logger.debug("Appended deleted item to working set changes.", [.item: metadata.ocId, .url: serverUrl])
672+
}
660673
}
661674

662675
return (updated, deleted)

Sources/NextcloudFileProviderKit/Database/SchemaVersion.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ enum SchemaVersion: UInt64 {
88
case initial = 100
99
case deletedLocalFileMetadata = 200
1010
case addedLockTokenPropertyToRealmItemMetadata = 201
11+
case addedIsLockFileOfLocalOriginToRealmItemMetadata = 202
1112
}

Sources/NextcloudFileProviderKit/Enumeration/Enumerator+SyncEngine.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ extension Enumerator {
120120
nextPage: EnumeratorPageResponse?,
121121
readError: NKError?
122122
) {
123-
let ncKitAccount = account.ncKitAccount
124123
let logger = FileProviderLogger(category: "Enumerator", log: log)
125124

126125
logger.debug("Starting to read server URL.", [.url: serverUrl])

0 commit comments

Comments
 (0)