Skip to content

Commit 90d6313

Browse files
Alex Schneidmanfacebook-github-bot
authored andcommitted
Fix underflow in sizeBucketsPowerAndLocksPower()
Summary: If `cacheEntries` is too small, `bucketsPower_` will be less than 10. Since `bucketsPower_` is unsigned, it will underflow if we subtract 10 from it. Reviewed By: jaesoo-fb Differential Revision: D50994522 fbshipit-source-id: 55151fdab1982442a706267b3dd3a0bb6a6fd6e7
1 parent 0238600 commit 90d6313

File tree

2 files changed

+6
-1
lines changed

2 files changed

+6
-1
lines changed

cachelib/allocator/ChainedHashTable.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,8 @@ class ChainedHashTable {
286286
}
287287

288288
// 1 lock per 1000 buckets.
289-
locksPower_ = std::max<unsigned int>(1, bucketsPower_ - 10);
289+
locksPower_ =
290+
(bucketsPower_ <= 20) ? (bucketsPower_ / 2) + 1 : bucketsPower_ - 10;
290291
}
291292

292293
unsigned int getBucketsPower() const noexcept { return bucketsPower_; }

cachelib/allocator/tests/ChainedHashTest.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ TEST(ChainedHashTableConfigTest, Size) {
3333

3434
ASSERT_THROW(config.sizeBucketsPowerAndLocksPower(2700000000),
3535
std::invalid_argument);
36+
37+
config.sizeBucketsPowerAndLocksPower(1);
38+
EXPECT_EQ(config.getBucketsPower(), 1);
39+
EXPECT_EQ(config.getLocksPower(), 1);
3640
}
3741

3842
TEST_F(ChainedHashTest, Insert) { testInsert(); }

0 commit comments

Comments
 (0)