From 9d0a21a23ea9d43bde1ff7c34d881bf5047b3214 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Sun, 20 Mar 2016 10:58:58 +0100 Subject: [PATCH 1/3] Update Issue1410.cs Fixed a race where two backups could be created with the same timestamp in the unittest --- Duplicati/UnitTest/Issue1410.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Duplicati/UnitTest/Issue1410.cs b/Duplicati/UnitTest/Issue1410.cs index 13f8f38ee..285dbe4ed 100644 --- a/Duplicati/UnitTest/Issue1410.cs +++ b/Duplicati/UnitTest/Issue1410.cs @@ -51,6 +51,8 @@ namespace Duplicati.UnitTest Console.WriteLine(string.Join(Environment.NewLine, r.Files.Select(x => x.Path))); } + System.Threading.Thread.Sleep(2000); + new Random().NextBytes(data); File.WriteAllBytes(Path.Combine(DATAFOLDER, "b"), data); using(var c = new Library.Main.Controller("file://" + TARGETFOLDER, TestOptions, null)) From bf07813ca8b2fb2b00c8710e82bb19c09e4fff11 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Sun, 20 Mar 2016 12:38:36 +0100 Subject: [PATCH 2/3] Real fix for the problem with duplicate fileset timestamp on really short backups --- Duplicati/Library/Main/Operation/BackupHandler.cs | 7 +++++++ Duplicati/Library/Main/Volumes/VolumeWriterBase.cs | 7 ++++++- Duplicati/UnitTest/Issue1410.cs | 2 -- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Duplicati/Library/Main/Operation/BackupHandler.cs b/Duplicati/Library/Main/Operation/BackupHandler.cs index 4b2dc8049..c5b0e982d 100644 --- a/Duplicati/Library/Main/Operation/BackupHandler.cs +++ b/Duplicati/Library/Main/Operation/BackupHandler.cs @@ -700,7 +700,14 @@ namespace Duplicati.Library.Main.Operation m_database.BuildLookupTable(m_options); m_transaction = m_database.BeginTransaction(); + + var repcnt = 0; + while(repcnt < 100 && m_database.GetRemoteVolumeID(filesetvolume.RemoteFilename) >= 0) + filesetvolume.ResetRemoteFilename(m_options, m_database.OperationTimestamp.AddSeconds(repcnt)); + if (m_database.GetRemoteVolumeID(filesetvolume.RemoteFilename) >= 0) + throw new Exception("Unable to generate a unique fileset name"); + m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_ProcessingFiles); var filesetvolumeid = m_database.RegisterRemoteVolume(filesetvolume.RemoteFilename, RemoteVolumeType.Files, RemoteVolumeState.Temporary, m_transaction); m_database.CreateFileset(filesetvolumeid, VolumeBase.ParseFilename(filesetvolume.RemoteFilename).Time, m_transaction); diff --git a/Duplicati/Library/Main/Volumes/VolumeWriterBase.cs b/Duplicati/Library/Main/Volumes/VolumeWriterBase.cs index c4893e0f8..957784e5e 100644 --- a/Duplicati/Library/Main/Volumes/VolumeWriterBase.cs +++ b/Duplicati/Library/Main/Volumes/VolumeWriterBase.cs @@ -40,12 +40,17 @@ namespace Duplicati.Library.Main.Volumes } + public void ResetRemoteFilename(Options options, DateTime timestamp) + { + m_volumename = GenerateFilename(this.FileType, options.Prefix, GenerateGuid(options), timestamp, options.CompressionModule, options.NoEncryption ? null : options.EncryptionModule); + } + public VolumeWriterBase(Options options, DateTime timestamp) : base(options) { m_localfile = new Library.Utility.TempFile(); - m_volumename = GenerateFilename(this.FileType, options.Prefix, GenerateGuid(options), timestamp, options.CompressionModule, options.NoEncryption ? null : options.EncryptionModule); + ResetRemoteFilename(options, timestamp); m_compression = DynamicLoader.CompressionLoader.GetModule(options.CompressionModule, m_localfile, options.RawOptions); if(m_compression == null) diff --git a/Duplicati/UnitTest/Issue1410.cs b/Duplicati/UnitTest/Issue1410.cs index 285dbe4ed..13f8f38ee 100644 --- a/Duplicati/UnitTest/Issue1410.cs +++ b/Duplicati/UnitTest/Issue1410.cs @@ -51,8 +51,6 @@ namespace Duplicati.UnitTest Console.WriteLine(string.Join(Environment.NewLine, r.Files.Select(x => x.Path))); } - System.Threading.Thread.Sleep(2000); - new Random().NextBytes(data); File.WriteAllBytes(Path.Combine(DATAFOLDER, "b"), data); using(var c = new Library.Main.Controller("file://" + TARGETFOLDER, TestOptions, null)) From 875cd57eab23c087a0d6fd2303041d9b42d79412 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Sun, 20 Mar 2016 12:41:17 +0100 Subject: [PATCH 3/3] Bit too quick there :) --- Duplicati/Library/Main/Operation/BackupHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Duplicati/Library/Main/Operation/BackupHandler.cs b/Duplicati/Library/Main/Operation/BackupHandler.cs index c5b0e982d..e0f975691 100644 --- a/Duplicati/Library/Main/Operation/BackupHandler.cs +++ b/Duplicati/Library/Main/Operation/BackupHandler.cs @@ -703,7 +703,7 @@ namespace Duplicati.Library.Main.Operation var repcnt = 0; while(repcnt < 100 && m_database.GetRemoteVolumeID(filesetvolume.RemoteFilename) >= 0) - filesetvolume.ResetRemoteFilename(m_options, m_database.OperationTimestamp.AddSeconds(repcnt)); + filesetvolume.ResetRemoteFilename(m_options, m_database.OperationTimestamp.AddSeconds(repcnt++)); if (m_database.GetRemoteVolumeID(filesetvolume.RemoteFilename) >= 0) throw new Exception("Unable to generate a unique fileset name");