diff --git a/Duplicati/Library/Main/Database/LocalLockDatabase.cs b/Duplicati/Library/Main/Database/LocalLockDatabase.cs
index dd5e946fa..c720c48e6 100644
--- a/Duplicati/Library/Main/Database/LocalLockDatabase.cs
+++ b/Duplicati/Library/Main/Database/LocalLockDatabase.cs
@@ -54,6 +54,23 @@ namespace Duplicati.Library.Main.Database
return dbnew;
}
+ ///
+ /// Creates a new instance of the class.
+ ///
+ /// The database to create the new instance on.
+ /// A cancellation token to cancel the operation.
+ /// The instance
+ public static async Task CreateAsync(LocalDatabase database, CancellationToken token)
+ {
+ var db = (LocalLockDatabase)await LocalDatabase.CreateLocalDatabaseAsync(
+ database,
+ new LocalLockDatabase(),
+ token
+ ).ConfigureAwait(false);
+ db.ShouldCloseConnection = false;
+ return db;
+ }
+
///
/// Updates the lock expiration time for a remote volume.
///
diff --git a/Duplicati/Library/Main/Operation/BackupHandler.cs b/Duplicati/Library/Main/Operation/BackupHandler.cs
index db6f40bfe..5a3f2287e 100644
--- a/Duplicati/Library/Main/Operation/BackupHandler.cs
+++ b/Duplicati/Library/Main/Operation/BackupHandler.cs
@@ -604,9 +604,10 @@ namespace Duplicati.Library.Main.Operation
return;
}
- m_result.LockResults = new SetLockResults(m_result);
+ using var lockDb = await LocalLockDatabase.CreateAsync(m_database, m_taskReader.StopToken);
+ m_result.LockResults ??= new SetLockResults();
await new SetLocksHandler(m_options, (SetLockResults)m_result.LockResults)
- .RunAsync(backendManager, versionTimestamps)
+ .RunAsync(backendManager, lockDb, versionTimestamps)
.ConfigureAwait(false);
}
diff --git a/Duplicati/Library/Main/Operation/ReadLockInfoHandler.cs b/Duplicati/Library/Main/Operation/ReadLockInfoHandler.cs
index 08be0eec0..04124d535 100644
--- a/Duplicati/Library/Main/Operation/ReadLockInfoHandler.cs
+++ b/Duplicati/Library/Main/Operation/ReadLockInfoHandler.cs
@@ -73,14 +73,14 @@ namespace Duplicati.Library.Main.Operation
if (!backendManager.SupportsObjectLocking)
throw new UserInformationException("Backend does not support object locking", "BackendDoesNotSupportLocking");
- if (!File.Exists(m_options.Dbpath))
+ var ownsDatabase = databaseOverride is null;
+ if (ownsDatabase && !File.Exists(m_options.Dbpath))
throw new UserInformationException(string.Format("Database file does not exist: {0}", m_options.Dbpath), "DatabaseFileDoesNotExist");
m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.ReadLockInfo_Running);
- var ownsDatabase = databaseOverride is null;
await using var db = ownsDatabase
- ? await LocalLockDatabase.CreateAsync(m_options.Dbpath, null, m_result.TaskControl.ProgressToken).ConfigureAwait(false)
+ ? await LocalLockDatabase.CreateAsync(m_options.Dbpath!, null, m_result.TaskControl.ProgressToken).ConfigureAwait(false)
: null;
var database = databaseOverride ?? db!;
@@ -118,6 +118,7 @@ namespace Duplicati.Library.Main.Operation
m_result.VolumesRead = readCount;
m_result.VolumesUpdated = updatedCount;
+ m_result.EndTime = DateTime.UtcNow;
if (updatedCount > 0 || errorCount > 0)
Log.WriteInformationMessage(LOGTAG, "ReadLockInfoComplete", "Read lock info complete: {0} updated, {1} errors", updatedCount, errorCount);
diff --git a/Duplicati/Library/Main/Operation/SetLocksHandler.cs b/Duplicati/Library/Main/Operation/SetLocksHandler.cs
index f684ee9c6..7d85f9d7f 100644
--- a/Duplicati/Library/Main/Operation/SetLocksHandler.cs
+++ b/Duplicati/Library/Main/Operation/SetLocksHandler.cs
@@ -50,7 +50,7 @@ namespace Duplicati.Library.Main.Operation
public Task RunAsync(IBackendManager backendManager, IEnumerable? versionTimestamps = null)
=> RunAsync(backendManager, null, versionTimestamps);
- internal async Task RunAsync(IBackendManager backendManager, Database.LocalLockDatabase? databaseOverride, IEnumerable? versionTimestamps = null)
+ public async Task RunAsync(IBackendManager backendManager, Database.LocalLockDatabase? databaseOverride, IEnumerable? versionTimestamps = null)
{
if (m_options.RemoteFileLockDuration is null)
throw new UserInformationException("No lock duration specified", "MissingLockDuration");
@@ -61,16 +61,16 @@ namespace Duplicati.Library.Main.Operation
if (!backendManager.SupportsObjectLocking)
throw new UserInformationException("Backend does not support object locking", "BackendDoesNotSupportLocking");
- if (!File.Exists(m_options.Dbpath))
+ var ownsDatabase = databaseOverride is null;
+ if (ownsDatabase && !File.Exists(m_options.Dbpath))
throw new Exception(string.Format("Database file does not exist: {0}", m_options.Dbpath));
var effectiveVersionTimestamps = versionTimestamps ?? m_versionTimestamps;
m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_Lock);
- var ownsDatabase = databaseOverride is null;
await using var db = ownsDatabase
- ? await LocalLockDatabase.CreateAsync(m_options.Dbpath, null, m_result.TaskControl.ProgressToken).ConfigureAwait(false)
+ ? await LocalLockDatabase.CreateAsync(m_options.Dbpath!, null, m_result.TaskControl.ProgressToken).ConfigureAwait(false)
: null;
var database = databaseOverride ?? db!;
@@ -123,6 +123,7 @@ namespace Duplicati.Library.Main.Operation
m_result.VolumesRead = readCount;
m_result.VolumesUpdated = updatedCount;
+ m_result.EndTime = DateTime.UtcNow;
}
private async Task> ResolveFilesetIdsAsync(Database.LocalListDatabase db, IEnumerable? suppliedVersions)