From 3472206bcf861a28dfec61410b5970a7700fb4d6 Mon Sep 17 00:00:00 2001 From: Gilbert Chen Date: Tue, 8 Nov 2022 22:54:35 -0500 Subject: [PATCH] Handle zero-byte files correctly This commit fixed 2 bugs. The first bug occurs when an incomplete backup contains a zero-byte file and no chunks. The second bug occurs when the repository contains only zero-byte files. --- src/duplicacy_backupmanager.go | 65 +++++++++++++++++----------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/src/duplicacy_backupmanager.go b/src/duplicacy_backupmanager.go index 6ad94ca9..a037c266 100644 --- a/src/duplicacy_backupmanager.go +++ b/src/duplicacy_backupmanager.go @@ -301,26 +301,27 @@ func (manager *BackupManager) Backup(top string, quickMode bool, threads int, ta if compareResult == 0 { // No need to check if it is in hash mode -- in that case remote listing is nil if localEntry.IsSameAs(remoteEntry) && localEntry.IsFile() { + if localEntry.Size > 0 { + localEntry.Hash = remoteEntry.Hash + localEntry.StartOffset = remoteEntry.StartOffset + localEntry.EndOffset = remoteEntry.EndOffset + delta := remoteEntry.StartChunk - len(localEntryList.PreservedChunkHashes) + if lastPreservedChunk != remoteEntry.StartChunk { + lastPreservedChunk = remoteEntry.StartChunk + localEntryList.AddPreservedChunk(remoteSnapshot.ChunkHashes[lastPreservedChunk], remoteSnapshot.ChunkLengths[lastPreservedChunk]) + } else { + delta++ + } - localEntry.Hash = remoteEntry.Hash - localEntry.StartOffset = remoteEntry.StartOffset - localEntry.EndOffset = remoteEntry.EndOffset - delta := remoteEntry.StartChunk - len(localEntryList.PreservedChunkHashes) - if lastPreservedChunk != remoteEntry.StartChunk { - lastPreservedChunk = remoteEntry.StartChunk - localEntryList.AddPreservedChunk(remoteSnapshot.ChunkHashes[lastPreservedChunk], remoteSnapshot.ChunkLengths[lastPreservedChunk]) - } else { - delta++ - } + for i := remoteEntry.StartChunk + 1; i <= remoteEntry.EndChunk; i++ { + localEntryList.AddPreservedChunk(remoteSnapshot.ChunkHashes[i], remoteSnapshot.ChunkLengths[i]) + lastPreservedChunk = i + } - for i := remoteEntry.StartChunk + 1; i <= remoteEntry.EndChunk; i++ { - localEntryList.AddPreservedChunk(remoteSnapshot.ChunkHashes[i], remoteSnapshot.ChunkLengths[i]) - lastPreservedChunk = i + localEntry.StartChunk = remoteEntry.StartChunk - delta + localEntry.EndChunk = remoteEntry.EndChunk - delta + preservedFileSize += localEntry.Size } - - localEntry.StartChunk = remoteEntry.StartChunk - delta - localEntry.EndChunk = remoteEntry.EndChunk - delta - preservedFileSize += localEntry.Size } else { totalModifiedFileSize += localEntry.Size if localEntry.Size > 0 { @@ -1047,24 +1048,24 @@ func (manager *BackupManager) UploadSnapshot(chunkOperator *ChunkOperator, top s uploadEntryInfoFunc := func(entry *Entry) error { - delta := entry.StartChunk - len(chunkHashes) + 1 - if entry.StartChunk != lastChunk { - chunkHashes = append(chunkHashes, snapshot.ChunkHashes[entry.StartChunk]) - chunkLengths = append(chunkLengths, snapshot.ChunkLengths[entry.StartChunk]) - delta-- - } + if entry.IsFile() && entry.Size > 0 { + delta := entry.StartChunk - len(chunkHashes) + 1 + if entry.StartChunk != lastChunk { + chunkHashes = append(chunkHashes, snapshot.ChunkHashes[entry.StartChunk]) + chunkLengths = append(chunkLengths, snapshot.ChunkLengths[entry.StartChunk]) + delta-- + } - for i := entry.StartChunk + 1; i <= entry.EndChunk; i++ { - chunkHashes = append(chunkHashes, snapshot.ChunkHashes[i]) - chunkLengths = append(chunkLengths, snapshot.ChunkLengths[i]) - } + for i := entry.StartChunk + 1; i <= entry.EndChunk; i++ { + chunkHashes = append(chunkHashes, snapshot.ChunkHashes[i]) + chunkLengths = append(chunkLengths, snapshot.ChunkLengths[i]) + } - lastChunk = entry.EndChunk - entry.StartChunk -= delta - entry.EndChunk -= delta + lastChunk = entry.EndChunk + entry.StartChunk -= delta + entry.EndChunk -= delta - if entry.IsFile() { - delta := entry.EndChunk - entry.StartChunk + delta = entry.EndChunk - entry.StartChunk entry.StartChunk -= lastEndChunk lastEndChunk = entry.EndChunk entry.EndChunk = delta