From b9af01ef75e329214bea60d0ce99139bafb07d5a Mon Sep 17 00:00:00 2001 From: Jeff Nelson Date: Sun, 11 May 2025 13:00:58 -0400 Subject: [PATCH 1/2] Add Unit test to repro brute force substring dedplicator --- .../storage/db/search/SubstringDeduplicatorTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/concourse-server/src/test/java/com/cinchapi/concourse/server/storage/db/search/SubstringDeduplicatorTest.java b/concourse-server/src/test/java/com/cinchapi/concourse/server/storage/db/search/SubstringDeduplicatorTest.java index 8dec91557..5ebbd76be 100644 --- a/concourse-server/src/test/java/com/cinchapi/concourse/server/storage/db/search/SubstringDeduplicatorTest.java +++ b/concourse-server/src/test/java/com/cinchapi/concourse/server/storage/db/search/SubstringDeduplicatorTest.java @@ -52,6 +52,12 @@ public void testDuplicatesNotAddedReproA() { doTestDuplicatesNotAdded(string); } + @Test + public void testDuplicatesNotAddedReproB() { + String string = "wjxzzywpqzaecrgyonfoayffnkletncndqnldjknumlzmmiuxdwjyecwvlhcwrszvutwhqrmylrvrzsqofpurfdmhcccdhompnakqqghgjrjjlqtveyaygdqsfnzftoemdhxkqljjaojhxpyltudgltibecdcigrymowxvqrsoxbdditorpqerdiuvvxwreshlghxapdnapvwacdnanskhokwbqwvrspmfijdcmawflmnlfuyyodhuxfipbuogjmbewlwqeaedortqlgmidgujaiopoblgnomgncfmzomyb"; + doTestDuplicatesNotAdded(string); + } + @Test public void testSanityCheck() { String term = "abrakadabra"; @@ -92,6 +98,8 @@ private void doTestDuplicatesNotAdded(String string) { String ss = string.substring(i, j).trim(); if(!Strings.isNullOrEmpty(ss)) { Text st = Text.wrap(chars, i, j); + System.out.println( + ss + " vs " + st + " with " + i + " and " + j); Assert.assertEquals(expected.add(ss), deduplicator.add(st)); } From 512c733c164a1aace7e3447a67dc52fd9efc002a Mon Sep 17 00:00:00 2001 From: Jeff Nelson Date: Sat, 14 Feb 2026 06:49:02 -0500 Subject: [PATCH 2/2] add the fix --- .../server/storage/db/search/SubstringDeduplicator.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/concourse-server/src/main/java/com/cinchapi/concourse/server/storage/db/search/SubstringDeduplicator.java b/concourse-server/src/main/java/com/cinchapi/concourse/server/storage/db/search/SubstringDeduplicator.java index 7428a72f0..1c8cf37ff 100644 --- a/concourse-server/src/main/java/com/cinchapi/concourse/server/storage/db/search/SubstringDeduplicator.java +++ b/concourse-server/src/main/java/com/cinchapi/concourse/server/storage/db/search/SubstringDeduplicator.java @@ -681,9 +681,8 @@ public static boolean substringAppearsEarlier(char[] s, int start, if(len <= 0 || start <= 0) { return false; } - // for each possible earlier start k where k + len ≤ s.length and k - // < start - int maxK = Math.min(start - len, s.length - len); + // Check every earlier start position, including overlapping ranges. + int maxK = Math.min(start - 1, s.length - len); for (int k = 0; k <= maxK; k++) { // compare s[k..k+len) to s[start..end) int i = 0;