From da3d0573729270dcaa119c3823789d89abe20e50 Mon Sep 17 00:00:00 2001 From: rmcrackan Date: Mon, 2 Mar 2026 07:59:45 -0500 Subject: [PATCH 1/3] Lucene search engine retries to use exponential backoff --- Source/LibationSearchEngine/SearchEngine.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Source/LibationSearchEngine/SearchEngine.cs b/Source/LibationSearchEngine/SearchEngine.cs index 173e0406..9238d2e8 100644 --- a/Source/LibationSearchEngine/SearchEngine.cs +++ b/Source/LibationSearchEngine/SearchEngine.cs @@ -1,4 +1,4 @@ -using DataLayer; +using DataLayer; using Dinah.Core; using FileManager; using LibationFileManager; @@ -81,7 +81,7 @@ public class SearchEngine public void CreateNewIndex(IEnumerable library, bool overwrite = true) { const int maxRetries = 5; - const int retryDelayMs = 400; + const int baseDelayMs = 400; var libraryList = library.ToList(); for (var attempt = 0; attempt < maxRetries; attempt++) @@ -93,15 +93,17 @@ public class SearchEngine } catch (IOException ex) when (attempt < maxRetries - 1) { + var delayMs = baseDelayMs * (1 << attempt); // write.lock can be held by another process (e.g. second Libation instance, antivirus) or a prior writer that did not release. Retry after delay. - Serilog.Log.Logger.Warning(ex, "Search index lock conflict (attempt {Attempt}/{Max}), retrying in {Delay}ms", attempt + 1, maxRetries, retryDelayMs); - Thread.Sleep(retryDelayMs); + Serilog.Log.Logger.Warning(ex, "Search index lock conflict (attempt {Attempt}/{Max}), retrying in {Delay}ms", attempt + 1, maxRetries, delayMs); + Thread.Sleep(delayMs); } catch (UnauthorizedAccessException ex) when (attempt < maxRetries - 1) { + var delayMs = baseDelayMs * (1 << attempt); // Windows may report "file in use" as UnauthorizedAccessException - Serilog.Log.Logger.Warning(ex, "Search index lock conflict (attempt {Attempt}/{Max}), retrying in {Delay}ms", attempt + 1, maxRetries, retryDelayMs); - Thread.Sleep(retryDelayMs); + Serilog.Log.Logger.Warning(ex, "Search index lock conflict (attempt {Attempt}/{Max}), retrying in {Delay}ms", attempt + 1, maxRetries, delayMs); + Thread.Sleep(delayMs); } } } From 5bf1438e003a70caaff3855b17ae11d556a6af85 Mon Sep 17 00:00:00 2001 From: rmcrackan Date: Mon, 2 Mar 2026 08:04:04 -0500 Subject: [PATCH 2/3] exp bak comments --- Source/LibationSearchEngine/SearchEngine.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/LibationSearchEngine/SearchEngine.cs b/Source/LibationSearchEngine/SearchEngine.cs index 9238d2e8..1c1b6031 100644 --- a/Source/LibationSearchEngine/SearchEngine.cs +++ b/Source/LibationSearchEngine/SearchEngine.cs @@ -84,7 +84,9 @@ public class SearchEngine const int baseDelayMs = 400; var libraryList = library.ToList(); - for (var attempt = 0; attempt < maxRetries; attempt++) + // Exponential backoff retry: 400 ms, 800 ms, 1600 ms, etc + // Total wait time before giving up: 12.4 sec + for (var attempt = 0; attempt < maxRetries; attempt++) { try { From 8dad104121a894bf70f333c26731ce5bba99d812 Mon Sep 17 00:00:00 2001 From: rmcrackan Date: Mon, 2 Mar 2026 08:04:48 -0500 Subject: [PATCH 3/3] fix file encoding --- Source/LibationSearchEngine/SearchEngine.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/LibationSearchEngine/SearchEngine.cs b/Source/LibationSearchEngine/SearchEngine.cs index 1c1b6031..43e55b8f 100644 --- a/Source/LibationSearchEngine/SearchEngine.cs +++ b/Source/LibationSearchEngine/SearchEngine.cs @@ -1,4 +1,4 @@ -using DataLayer; +using DataLayer; using Dinah.Core; using FileManager; using LibationFileManager;