fix: overflow bug

* Fixes https://issues.apache.org/jira/browse/CASSANDRA-14098 in a similar way as the provided patch.
* Also refactored and added tests.

Co-Authored-By: Lada Kesseler <23501754+lexler@users.noreply.github.com>
This commit is contained in:
Danny Faught 2024-09-27 12:49:29 -07:00
parent 8c592323f3
commit d58b230153
No known key found for this signature in database
GPG Key ID: 28A992107D6E8DF4
2 changed files with 24 additions and 11 deletions

View File

@ -3556,11 +3556,10 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
static int calculateSplitCount(int keysPerSplit, long totalRowCountEstimate, int numberOfKeys)
{
int minSamplesPerSplit = 4;
int maxSplitCount = numberOfKeys / minSamplesPerSplit + 1;
int calculatedSplitCount = (int) (totalRowCountEstimate / keysPerSplit);
int splitCountMaxOrLess = Math.min(maxSplitCount, calculatedSplitCount);
int splitCountOneOrHigher = Math.max(1, splitCountMaxOrLess);
return splitCountOneOrHigher;
long maxSplitCount = numberOfKeys / minSamplesPerSplit + 1;
long calculatedSplitCount = totalRowCountEstimate / keysPerSplit;
int splitCountWithLimit = (int) Math.min(maxSplitCount, calculatedSplitCount);
return Math.max(1, splitCountWithLimit);
}
private List<Pair<Range<Token>, Long>> getSplits(List<Token> tokens, int splitCount, ColumnFamilyStore cfs)

View File

@ -318,23 +318,37 @@ public class StorageServiceTest extends TestBaseImpl
}
@Test
public void calculateSplitCountHappyPath()
public void calculateSplitCount_SmallRowCount_NotLimited()
{
int result = StorageService.calculateSplitCount(2, 4, 40);
assertEquals(2, result);
int result = StorageService.calculateSplitCount(2, 8, 40);
assertEquals(4, result);
}
@Test
public void calculateSplitCountForMin()
public void calculateSplitCount_ForLargeRowCount_LimitsResult()
{
int result = StorageService.calculateSplitCount(2, 100, 40);
assertEquals(11, result);
}
@Test
public void calculateSplitCountForMaxWithOverflow()
public void calculateSplitCount_ForMaxIntegerRowCount_LimitsResult()
{
int result = StorageService.calculateSplitCount(1, Integer.MAX_VALUE, 4);
assertEquals(2, result);
}
@Test
public void calculateSplitCount_ForOverflowingRowCount_LimitsResult()
{
int result = StorageService.calculateSplitCount(1, Integer.MAX_VALUE + 1L, 4);
assertEquals(2, result);
}
@Test
public void calculateSplitCount_ForMaxLongRowCount_LimitsResult()
{
int result = StorageService.calculateSplitCount(1, Long.MAX_VALUE, 4);
assertEquals(1, result);
assertEquals(2, result);
}
}