From 5536c65c6804ff2f6b41205d13baa5e332e7d670 Mon Sep 17 00:00:00 2001 From: Peter Chapman Date: Thu, 25 Jun 2026 18:08:07 +1200 Subject: [PATCH] Fix versification crash and missing versification table clean up --- src/SIL.Machine/Corpora/CorporaUtils.cs | 3 ++ .../Corpora/DblBundleTextCorpus.cs | 6 +++- .../ParatextProjectSettingsParserBase.cs | 30 +++++++++++-------- src/SIL.Machine/Corpora/UsxFileTextCorpus.cs | 1 + .../Corpora/UsxTextAlignmentCorpus.cs | 6 +++- .../Corpora/ParallelTextCorpusTests.cs | 7 +++-- .../Corpora/UsfmVersificationAnalyzerTests.cs | 6 ++-- 7 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/SIL.Machine/Corpora/CorporaUtils.cs b/src/SIL.Machine/Corpora/CorporaUtils.cs index a76b1403f..cc87f3ff5 100644 --- a/src/SIL.Machine/Corpora/CorporaUtils.cs +++ b/src/SIL.Machine/Corpora/CorporaUtils.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; +using Nito.AsyncEx; using SIL.PlatformUtilities; using SIL.Scripture; @@ -12,6 +13,8 @@ namespace SIL.Machine.Corpora { public static class CorporaUtils { + public static readonly AsyncLock VersificationLock = new AsyncLock(); + public static ISet GetSplitIndices( int corpusSize, double? percent = null, diff --git a/src/SIL.Machine/Corpora/DblBundleTextCorpus.cs b/src/SIL.Machine/Corpora/DblBundleTextCorpus.cs index 3930a968d..70dd23d2f 100644 --- a/src/SIL.Machine/Corpora/DblBundleTextCorpus.cs +++ b/src/SIL.Machine/Corpora/DblBundleTextCorpus.cs @@ -35,7 +35,11 @@ public DblBundleTextCorpus(string fileName) versificationEntry.ExtractToFile(tempFile.Path); var abbr = (string) doc.Root.Elements("identification").Elements("abbreviation").FirstOrDefault(); - Versification = Scripture.Versification.Table.Implementation.Load(tempFile.Path, abbr); + using (CorporaUtils.VersificationLock.Lock()) + { + Versification = Scripture.Versification.Table.Implementation.Load(tempFile.Path, abbr); + Scripture.Versification.Table.Implementation.RemoveAllUnknownVersifications(); + } } } diff --git a/src/SIL.Machine/Corpora/ParatextProjectSettingsParserBase.cs b/src/SIL.Machine/Corpora/ParatextProjectSettingsParserBase.cs index 1c68edd73..900c91557 100644 --- a/src/SIL.Machine/Corpora/ParatextProjectSettingsParserBase.cs +++ b/src/SIL.Machine/Corpora/ParatextProjectSettingsParserBase.cs @@ -52,22 +52,26 @@ public ParatextProjectSettings Parse() if (_paratextProjectFileHandler.Exists("custom.vrs")) { string versName = ((ScrVersType)scrVersType).ToString() + "-" + guid; - if (Versification.Table.Implementation.Exists(versName)) + using (CorporaUtils.VersificationLock.Lock()) { - versification = new ScrVers(versName); - } - else - { - using (var reader = new StreamReader(_paratextProjectFileHandler.Open("custom.vrs"))) + if (Versification.Table.Implementation.Exists(versName)) + { + versification = new ScrVers(versName); + } + else { - versification = Versification.Table.Implementation.Load( - reader, - "custom.vrs", - versification, - versName - ); + using (var reader = new StreamReader(_paratextProjectFileHandler.Open("custom.vrs"))) + { + versification = Versification.Table.Implementation.Load( + reader, + "custom.vrs", + versification, + versName + ); + } + + Versification.Table.Implementation.RemoveAllUnknownVersifications(); } - Versification.Table.Implementation.RemoveAllUnknownVersifications(); } } diff --git a/src/SIL.Machine/Corpora/UsxFileTextCorpus.cs b/src/SIL.Machine/Corpora/UsxFileTextCorpus.cs index 51f2dc7d3..5682c8898 100644 --- a/src/SIL.Machine/Corpora/UsxFileTextCorpus.cs +++ b/src/SIL.Machine/Corpora/UsxFileTextCorpus.cs @@ -19,6 +19,7 @@ private static ScrVers GetVersification(string projectPath, ScrVers versificatio { string vrsName = Path.GetFileName(projectPath); versification = Scripture.Versification.Table.Implementation.Load(versificationFileName, vrsName); + Scripture.Versification.Table.Implementation.RemoveAllUnknownVersifications(); } return versification ?? ScrVers.English; } diff --git a/src/SIL.Machine/Corpora/UsxTextAlignmentCorpus.cs b/src/SIL.Machine/Corpora/UsxTextAlignmentCorpus.cs index c1f2b25b6..37d70aa74 100644 --- a/src/SIL.Machine/Corpora/UsxTextAlignmentCorpus.cs +++ b/src/SIL.Machine/Corpora/UsxTextAlignmentCorpus.cs @@ -51,7 +51,11 @@ private static ScrVers GetVersification(string projectPath, ScrVers versificatio if (versification == null && File.Exists(versificationFileName)) { string vrsName = Path.GetFileName(projectPath); - versification = Versification.Table.Implementation.Load(versificationFileName, vrsName); + using (CorporaUtils.VersificationLock.Lock()) + { + versification = Versification.Table.Implementation.Load(versificationFileName, vrsName); + Versification.Table.Implementation.RemoveAllUnknownVersifications(); + } } return versification ?? ScrVers.English; } diff --git a/tests/SIL.Machine.Tests/Corpora/ParallelTextCorpusTests.cs b/tests/SIL.Machine.Tests/Corpora/ParallelTextCorpusTests.cs index 6a3585974..12374bcd8 100644 --- a/tests/SIL.Machine.Tests/Corpora/ParallelTextCorpusTests.cs +++ b/tests/SIL.Machine.Tests/Corpora/ParallelTextCorpusTests.cs @@ -984,12 +984,13 @@ public void GetRows_SameRefLastManyToOne() [Test] public void GetRows_SameVerseRefOneToMany() { - Versification.Table.Implementation.RemoveAllUnknownVersifications(); - string src = "&MAT 1:2-3 = MAT 1:2\nMAT 1:4 = MAT 1:3\n"; ScrVers versification; - using (var reader = new StringReader(src)) + using (CorporaUtils.VersificationLock.Lock()) { + string src = "&MAT 1:2-3 = MAT 1:2\nMAT 1:4 = MAT 1:3\n"; + using var reader = new StringReader(src); versification = Versification.Table.Implementation.Load(reader, "vers.txt", ScrVers.English, "custom"); + Versification.Table.Implementation.RemoveAllUnknownVersifications(); } var sourceCorpus = new DictionaryTextCorpus( diff --git a/tests/SIL.Machine.Tests/Corpora/UsfmVersificationAnalyzerTests.cs b/tests/SIL.Machine.Tests/Corpora/UsfmVersificationAnalyzerTests.cs index a6f36ce51..95e805922 100644 --- a/tests/SIL.Machine.Tests/Corpora/UsfmVersificationAnalyzerTests.cs +++ b/tests/SIL.Machine.Tests/Corpora/UsfmVersificationAnalyzerTests.cs @@ -566,7 +566,8 @@ private static ScrVers GetCustomVersification(string customVrsContents, ScrVers? { baseVersification ??= ScrVers.English; ScrVers customVersification = baseVersification; - using (var reader = new StreamReader(new MemoryStream(Encoding.UTF8.GetBytes(customVrsContents)))) + using var reader = new StreamReader(new MemoryStream(Encoding.UTF8.GetBytes(customVrsContents))); + using (CorporaUtils.VersificationLock.Lock()) { customVersification = Versification.Table.Implementation.Load( reader, @@ -574,8 +575,9 @@ private static ScrVers GetCustomVersification(string customVrsContents, ScrVers? baseVersification, baseVersification.ToString() + "-" + customVrsContents.GetHashCode() ); + Versification.Table.Implementation.RemoveAllUnknownVersifications(); } - Versification.Table.Implementation.RemoveAllUnknownVersifications(); + return customVersification; } }