// found in the LICENSE file. See the AUTHORS file for names of contributors.
#include "rocksdb/write_buffer_manager.h"
-#include "util/testharness.h"
+#include "test_util/testharness.h"
-namespace rocksdb {
+namespace ROCKSDB_NAMESPACE {
class WriteBufferManagerTest : public testing::Test {};
}
TEST_F(WriteBufferManagerTest, CacheCost) {
+ LRUCacheOptions co;
// 1GB cache
- std::shared_ptr<Cache> cache = NewLRUCache(1024 * 1024 * 1024, 4);
+ co.capacity = 1024 * 1024 * 1024;
+ co.num_shard_bits = 4;
+ co.metadata_charge_policy = kDontChargeCacheMetadata;
+ std::shared_ptr<Cache> cache = NewLRUCache(co);
// A write buffer manager of size 50MB
std::unique_ptr<WriteBufferManager> wbf(
new WriteBufferManager(50 * 1024 * 1024, cache));
- // Allocate 1.5MB will allocate 2MB
- wbf->ReserveMem(1536 * 1024);
- ASSERT_GE(cache->GetPinnedUsage(), 2 * 1024 * 1024);
- ASSERT_LT(cache->GetPinnedUsage(), 2 * 1024 * 1024 + 10000);
+ // Allocate 333KB will allocate 512KB
+ wbf->ReserveMem(333 * 1024);
+ ASSERT_GE(cache->GetPinnedUsage(), 2 * 256 * 1024);
+ ASSERT_LT(cache->GetPinnedUsage(), 2 * 256 * 1024 + 10000);
- // Allocate another 2MB
- wbf->ReserveMem(2 * 1024 * 1024);
- ASSERT_GE(cache->GetPinnedUsage(), 4 * 1024 * 1024);
- ASSERT_LT(cache->GetPinnedUsage(), 4 * 1024 * 1024 + 10000);
+ // Allocate another 512KB
+ wbf->ReserveMem(512 * 1024);
+ ASSERT_GE(cache->GetPinnedUsage(), 4 * 256 * 1024);
+ ASSERT_LT(cache->GetPinnedUsage(), 4 * 256 * 1024 + 10000);
- // Allocate another 20MB
- wbf->ReserveMem(20 * 1024 * 1024);
- ASSERT_GE(cache->GetPinnedUsage(), 24 * 1024 * 1024);
- ASSERT_LT(cache->GetPinnedUsage(), 24 * 1024 * 1024 + 10000);
+ // Allocate another 10MB
+ wbf->ReserveMem(10 * 1024 * 1024);
+ ASSERT_GE(cache->GetPinnedUsage(), 11 * 1024 * 1024);
+ ASSERT_LT(cache->GetPinnedUsage(), 11 * 1024 * 1024 + 10000);
- // Free 2MB will not cause any change in cache cost
- wbf->FreeMem(2 * 1024 * 1024);
- ASSERT_GE(cache->GetPinnedUsage(), 24 * 1024 * 1024);
- ASSERT_LT(cache->GetPinnedUsage(), 24 * 1024 * 1024 + 10000);
+ // Free 1MB will not cause any change in cache cost
+ wbf->FreeMem(1024 * 1024);
+ ASSERT_GE(cache->GetPinnedUsage(), 11 * 1024 * 1024);
+ ASSERT_LT(cache->GetPinnedUsage(), 11 * 1024 * 1024 + 10000);
ASSERT_FALSE(wbf->ShouldFlush());
- // Allocate another 30MB
- wbf->ReserveMem(30 * 1024 * 1024);
- ASSERT_GE(cache->GetPinnedUsage(), 52 * 1024 * 1024);
- ASSERT_LT(cache->GetPinnedUsage(), 52 * 1024 * 1024 + 10000);
+ // Allocate another 41MB
+ wbf->ReserveMem(41 * 1024 * 1024);
+ ASSERT_GE(cache->GetPinnedUsage(), 51 * 1024 * 1024);
+ ASSERT_LT(cache->GetPinnedUsage(), 51 * 1024 * 1024 + 10000);
ASSERT_TRUE(wbf->ShouldFlush());
ASSERT_TRUE(wbf->ShouldFlush());
wbf->ScheduleFreeMem(20 * 1024 * 1024);
- ASSERT_GE(cache->GetPinnedUsage(), 52 * 1024 * 1024);
- ASSERT_LT(cache->GetPinnedUsage(), 52 * 1024 * 1024 + 10000);
+ ASSERT_GE(cache->GetPinnedUsage(), 51 * 1024 * 1024);
+ ASSERT_LT(cache->GetPinnedUsage(), 51 * 1024 * 1024 + 10000);
// Still need flush as the hard limit hits
ASSERT_TRUE(wbf->ShouldFlush());
- // Free 20MB will releae 1MB from cache
+ // Free 20MB will releae 256KB from cache
wbf->FreeMem(20 * 1024 * 1024);
- ASSERT_GE(cache->GetPinnedUsage(), 51 * 1024 * 1024);
- ASSERT_LT(cache->GetPinnedUsage(), 51 * 1024 * 1024 + 10000);
+ ASSERT_GE(cache->GetPinnedUsage(), 51 * 1024 * 1024 - 256 * 1024);
+ ASSERT_LT(cache->GetPinnedUsage(), 51 * 1024 * 1024 - 256 * 1024 + 10000);
ASSERT_FALSE(wbf->ShouldFlush());
- // Every free will release 1MB if still not hit 3/4
+ // Every free will release 256KB if still not hit 3/4
wbf->FreeMem(16 * 1024);
- ASSERT_GE(cache->GetPinnedUsage(), 50 * 1024 * 1024);
- ASSERT_LT(cache->GetPinnedUsage(), 50 * 1024 * 1024 + 10000);
+ ASSERT_GE(cache->GetPinnedUsage(), 51 * 1024 * 1024 - 2 * 256 * 1024);
+ ASSERT_LT(cache->GetPinnedUsage(), 51 * 1024 * 1024 - 2 * 256 * 1024 + 10000);
wbf->FreeMem(16 * 1024);
- ASSERT_GE(cache->GetPinnedUsage(), 49 * 1024 * 1024);
- ASSERT_LT(cache->GetPinnedUsage(), 49 * 1024 * 1024 + 10000);
+ ASSERT_GE(cache->GetPinnedUsage(), 51 * 1024 * 1024 - 3 * 256 * 1024);
+ ASSERT_LT(cache->GetPinnedUsage(), 51 * 1024 * 1024 - 3 * 256 * 1024 + 10000);
- // Free 2MB will not cause any change in cache cost
- wbf->ReserveMem(2 * 1024 * 1024);
- ASSERT_GE(cache->GetPinnedUsage(), 49 * 1024 * 1024);
- ASSERT_LT(cache->GetPinnedUsage(), 49 * 1024 * 1024 + 10000);
+ // Reserve 512KB will not cause any change in cache cost
+ wbf->ReserveMem(512 * 1024);
+ ASSERT_GE(cache->GetPinnedUsage(), 51 * 1024 * 1024 - 3 * 256 * 1024);
+ ASSERT_LT(cache->GetPinnedUsage(), 51 * 1024 * 1024 - 3 * 256 * 1024 + 10000);
wbf->FreeMem(16 * 1024);
- ASSERT_GE(cache->GetPinnedUsage(), 48 * 1024 * 1024);
- ASSERT_LT(cache->GetPinnedUsage(), 48 * 1024 * 1024 + 10000);
+ ASSERT_GE(cache->GetPinnedUsage(), 51 * 1024 * 1024 - 4 * 256 * 1024);
+ ASSERT_LT(cache->GetPinnedUsage(), 51 * 1024 * 1024 - 4 * 256 * 1024 + 10000);
// Destory write buffer manger should free everything
wbf.reset();
ASSERT_FALSE(wbf->ShouldFlush());
wbf->FreeMem(9 * 1024 * 1024);
- for (int i = 0; i < 10; i++) {
- wbf->FreeMem(16 * 1024);
+ for (int i = 0; i < 40; i++) {
+ wbf->FreeMem(4 * 1024);
}
ASSERT_GE(cache->GetPinnedUsage(), 1024 * 1024);
ASSERT_LT(cache->GetPinnedUsage(), 1024 * 1024 + 10000);
}
#endif // ROCKSDB_LITE
-} // namespace rocksdb
+} // namespace ROCKSDB_NAMESPACE
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);