Skip to content

Commit 3a171dc

Browse files
committed
Pass logger to memtable rep and TLB page allocation error logged to info logs
Summary: TLB page allocation errors are now logged to info logs, instead of stderr. In order to do that, mem table rep's factory functions take a info logger now. Test Plan: make all check Reviewers: haobo, igor, yhchiang Reviewed By: yhchiang CC: leveldb, yhchiang, dhruba Differential Revision: https://reviews.facebook.net/D18471
1 parent 044af85 commit 3a171dc

16 files changed

+53
-31
lines changed

HISTORY.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Public API changes
66
* Added _LEVEL to all InfoLogLevel enums
77
* Deprecated ReadOptions.prefix and ReadOptions.prefix_seek. Seek() defaults to prefix-based seek when Options.prefix_extractor is supplied. More detail is documented in https://github.com/facebook/rocksdb/wiki/Prefix-Seek-API-Changes
8+
* MemTableRepFactory::CreateMemTableRep() takes info logger as an extra parameter.
89

910
### New Features
1011
* Column family support

db/memtable.cc

+4-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ MemTable::MemTable(const InternalKeyComparator& cmp, const Options& options)
3737
kWriteBufferSize(options.write_buffer_size),
3838
arena_(options.arena_block_size),
3939
table_(options.memtable_factory->CreateMemTableRep(
40-
comparator_, &arena_, options.prefix_extractor.get())),
40+
comparator_, &arena_, options.prefix_extractor.get(),
41+
options.info_log.get())),
4142
num_entries_(0),
4243
flush_in_progress_(false),
4344
flush_completed_(false),
@@ -55,7 +56,8 @@ MemTable::MemTable(const InternalKeyComparator& cmp, const Options& options)
5556
prefix_bloom_.reset(new DynamicBloom(
5657
options.memtable_prefix_bloom_bits, options.bloom_locality,
5758
options.memtable_prefix_bloom_probes, nullptr,
58-
options.memtable_prefix_bloom_huge_page_tlb_size));
59+
options.memtable_prefix_bloom_huge_page_tlb_size,
60+
options.info_log.get()));
5961
}
6062
}
6163

include/rocksdb/memtablerep.h

+8-6
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class Arena;
4444
class LookupKey;
4545
class Slice;
4646
class SliceTransform;
47+
class Logger;
4748

4849
typedef void* KeyHandle;
4950

@@ -174,16 +175,17 @@ class MemTableRepFactory {
174175
public:
175176
virtual ~MemTableRepFactory() {}
176177
virtual MemTableRep* CreateMemTableRep(const MemTableRep::KeyComparator&,
177-
Arena*, const SliceTransform*) = 0;
178+
Arena*, const SliceTransform*,
179+
Logger* logger) = 0;
178180
virtual const char* Name() const = 0;
179181
};
180182

181183
// This uses a skip list to store keys. It is the default.
182184
class SkipListFactory : public MemTableRepFactory {
183185
public:
184186
virtual MemTableRep* CreateMemTableRep(const MemTableRep::KeyComparator&,
185-
Arena*,
186-
const SliceTransform*) override;
187+
Arena*, const SliceTransform*,
188+
Logger* logger) override;
187189
virtual const char* Name() const override { return "SkipListFactory"; }
188190
};
189191

@@ -201,9 +203,9 @@ class VectorRepFactory : public MemTableRepFactory {
201203

202204
public:
203205
explicit VectorRepFactory(size_t count = 0) : count_(count) { }
204-
virtual MemTableRep* CreateMemTableRep(
205-
const MemTableRep::KeyComparator&, Arena*,
206-
const SliceTransform*) override;
206+
virtual MemTableRep* CreateMemTableRep(const MemTableRep::KeyComparator&,
207+
Arena*, const SliceTransform*,
208+
Logger* logger) override;
207209
virtual const char* Name() const override {
208210
return "VectorRepFactory";
209211
}

table/plain_table_reader.cc

+6-4
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,8 @@ void PlainTableReader::AllocateIndexAndBloom(int num_prefixes) {
272272
uint32_t bloom_total_bits = num_prefixes * kBloomBitsPerKey;
273273
if (bloom_total_bits > 0) {
274274
bloom_.reset(new DynamicBloom(bloom_total_bits, options_.bloom_locality,
275-
6, nullptr, huge_page_tlb_size_));
275+
6, nullptr, huge_page_tlb_size_,
276+
options_.info_log.get()));
276277
}
277278
}
278279

@@ -328,8 +329,8 @@ void PlainTableReader::FillIndexes(
328329
Log(options_.info_log, "Reserving %zu bytes for plain table's sub_index",
329330
kSubIndexSize);
330331
auto total_allocate_size = sizeof(uint32_t) * index_size_ + kSubIndexSize;
331-
char* allocated =
332-
arena_.AllocateAligned(total_allocate_size, huge_page_tlb_size_);
332+
char* allocated = arena_.AllocateAligned(
333+
total_allocate_size, huge_page_tlb_size_, options_.info_log.get());
333334
index_ = reinterpret_cast<uint32_t*>(allocated);
334335
sub_index_ = allocated + sizeof(uint32_t) * index_size_;
335336

@@ -398,7 +399,8 @@ Status PlainTableReader::PopulateIndex(TableProperties* props) {
398399
uint32_t num_bloom_bits = table_properties_->num_entries * kBloomBitsPerKey;
399400
if (num_bloom_bits > 0) {
400401
bloom_.reset(new DynamicBloom(num_bloom_bits, options_.bloom_locality, 6,
401-
nullptr, huge_page_tlb_size_));
402+
nullptr, huge_page_tlb_size_,
403+
options_.info_log.get()));
402404
}
403405
}
404406

util/arena.cc

+6-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "util/arena.h"
1111
#include <sys/mman.h>
1212
#include <algorithm>
13+
#include "rocksdb/env.h"
1314

1415
namespace rocksdb {
1516

@@ -70,20 +71,23 @@ char* Arena::AllocateFallback(size_t bytes, bool aligned) {
7071
}
7172
}
7273

73-
char* Arena::AllocateAligned(size_t bytes, size_t huge_page_tlb_size) {
74+
char* Arena::AllocateAligned(size_t bytes, size_t huge_page_tlb_size,
75+
Logger* logger) {
7476
assert((kAlignUnit & (kAlignUnit - 1)) ==
7577
0); // Pointer size should be a power of 2
7678

7779
#ifdef OS_LINUX
7880
if (huge_page_tlb_size > 0 && bytes > 0) {
7981
// Allocate from a huge page TBL table.
82+
assert(logger != nullptr); // logger need to be passed in.
8083
size_t reserved_size =
8184
((bytes - 1U) / huge_page_tlb_size + 1U) * huge_page_tlb_size;
8285
assert(reserved_size >= bytes);
8386
void* addr = mmap(nullptr, reserved_size, (PROT_READ | PROT_WRITE),
8487
(MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB), 0, 0);
8588
if (addr == MAP_FAILED) {
86-
// TODO(sdong): Better handling
89+
Warn(logger, "AllocateAligned fail to allocate huge TLB pages: %s",
90+
strerror(errno));
8791
// fail back to malloc
8892
} else {
8993
blocks_memory_ += reserved_size;

util/arena.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
namespace rocksdb {
2222

23+
class Logger;
24+
2325
class Arena {
2426
public:
2527
// No copying allowed
@@ -41,7 +43,12 @@ class Arena {
4143
// huge pages for it to be allocated, like:
4244
// sysctl -w vm.nr_hugepages=20
4345
// See linux doc Documentation/vm/hugetlbpage.txt for details.
44-
char* AllocateAligned(size_t bytes, size_t huge_page_tlb_size = 0);
46+
// huge page allocation can fail. In this case it will fail back to
47+
// normal cases. The messages will be logged to logger. So when calling with
48+
// huge_page_tlb_size > 0, we highly recommend a logger is passed in.
49+
// Otherwise, the error message will be printed out to stderr directly.
50+
char* AllocateAligned(size_t bytes, size_t huge_page_tlb_size = 0,
51+
Logger* logger = nullptr);
4552

4653
// Returns an estimate of the total memory usage of data allocated
4754
// by the arena (exclude the space allocated but not yet used for future

util/dynamic_bloom.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ static uint32_t BloomHash(const Slice& key) {
2222
DynamicBloom::DynamicBloom(uint32_t total_bits, uint32_t cl_per_block,
2323
uint32_t num_probes,
2424
uint32_t (*hash_func)(const Slice& key),
25-
size_t huge_page_tlb_size)
25+
size_t huge_page_tlb_size, Logger* logger)
2626
: kBlocked(cl_per_block > 0),
2727
kBitsPerBlock(std::min(cl_per_block, num_probes) * CACHE_LINE_SIZE * 8),
2828
kTotalBits((kBlocked ? (total_bits + kBitsPerBlock - 1) / kBitsPerBlock *
@@ -40,7 +40,7 @@ DynamicBloom::DynamicBloom(uint32_t total_bits, uint32_t cl_per_block,
4040
sz += CACHE_LINE_SIZE - 1;
4141
}
4242
raw_ = reinterpret_cast<unsigned char*>(
43-
arena_.AllocateAligned(sz, huge_page_tlb_size));
43+
arena_.AllocateAligned(sz, huge_page_tlb_size, logger));
4444
memset(raw_, 0, sz);
4545
if (kBlocked && (reinterpret_cast<uint64_t>(raw_) % CACHE_LINE_SIZE)) {
4646
data_ = raw_ + CACHE_LINE_SIZE -

util/dynamic_bloom.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
namespace rocksdb {
1414

1515
class Slice;
16+
class Logger;
1617

1718
class DynamicBloom {
1819
public:
@@ -29,7 +30,8 @@ class DynamicBloom {
2930
explicit DynamicBloom(uint32_t total_bits, uint32_t cl_per_block = 0,
3031
uint32_t num_probes = 6,
3132
uint32_t (*hash_func)(const Slice& key) = nullptr,
32-
size_t huge_page_tlb_size = 0);
33+
size_t huge_page_tlb_size = 0,
34+
Logger* logger = nullptr);
3335

3436
~DynamicBloom() {}
3537

util/hash_cuckoo_rep.cc

+3-2
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,8 @@ void HashCuckooRep::Insert(KeyHandle handle) {
314314
// immutable.
315315
if (backup_table_.get() == nullptr) {
316316
VectorRepFactory factory(10);
317-
backup_table_.reset(factory.CreateMemTableRep(compare_, arena_, nullptr));
317+
backup_table_.reset(
318+
factory.CreateMemTableRep(compare_, arena_, nullptr, nullptr));
318319
is_nearly_full_ = true;
319320
}
320321
backup_table_->Insert(key);
@@ -595,7 +596,7 @@ void HashCuckooRep::Iterator::SeekToLast() {
595596

596597
MemTableRep* HashCuckooRepFactory::CreateMemTableRep(
597598
const MemTableRep::KeyComparator& compare, Arena* arena,
598-
const SliceTransform* transform) {
599+
const SliceTransform* transform, Logger* logger) {
599600
// The estimated average fullness. The write performance of any close hash
600601
// degrades as the fullness of the mem-table increases. Setting kFullness
601602
// to a value around 0.7 can better avoid write performance degradation while

util/hash_cuckoo_rep.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class HashCuckooRepFactory : public MemTableRepFactory {
2929

3030
virtual MemTableRep* CreateMemTableRep(
3131
const MemTableRep::KeyComparator& compare, Arena* arena,
32-
const SliceTransform* transform) override;
32+
const SliceTransform* transform, Logger* logger) override;
3333

3434
virtual const char* Name() const override { return "HashCuckooRepFactory"; }
3535

util/hash_linklist_rep.cc

+6-5
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class HashLinkListRep : public MemTableRep {
5454
public:
5555
HashLinkListRep(const MemTableRep::KeyComparator& compare, Arena* arena,
5656
const SliceTransform* transform, size_t bucket_size,
57-
size_t huge_page_tlb_size);
57+
size_t huge_page_tlb_size, Logger* logger);
5858

5959
virtual KeyHandle Allocate(const size_t len, char** buf) override;
6060

@@ -307,13 +307,14 @@ class HashLinkListRep : public MemTableRep {
307307

308308
HashLinkListRep::HashLinkListRep(const MemTableRep::KeyComparator& compare,
309309
Arena* arena, const SliceTransform* transform,
310-
size_t bucket_size, size_t huge_page_tlb_size)
310+
size_t bucket_size, size_t huge_page_tlb_size,
311+
Logger* logger)
311312
: MemTableRep(arena),
312313
bucket_size_(bucket_size),
313314
transform_(transform),
314315
compare_(compare) {
315316
char* mem = arena_->AllocateAligned(sizeof(port::AtomicPointer) * bucket_size,
316-
huge_page_tlb_size);
317+
huge_page_tlb_size, logger);
317318

318319
buckets_ = new (mem) port::AtomicPointer[bucket_size];
319320

@@ -469,9 +470,9 @@ Node* HashLinkListRep::FindGreaterOrEqualInBucket(Node* head,
469470

470471
MemTableRep* HashLinkListRepFactory::CreateMemTableRep(
471472
const MemTableRep::KeyComparator& compare, Arena* arena,
472-
const SliceTransform* transform) {
473+
const SliceTransform* transform, Logger* logger) {
473474
return new HashLinkListRep(compare, arena, transform, bucket_count_,
474-
huge_page_tlb_size_);
475+
huge_page_tlb_size_, logger);
475476
}
476477

477478
MemTableRepFactory* NewHashLinkListRepFactory(size_t bucket_count,

util/hash_linklist_rep.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class HashLinkListRepFactory : public MemTableRepFactory {
2323

2424
virtual MemTableRep* CreateMemTableRep(
2525
const MemTableRep::KeyComparator& compare, Arena* arena,
26-
const SliceTransform* transform) override;
26+
const SliceTransform* transform, Logger* logger) override;
2727

2828
virtual const char* Name() const override {
2929
return "HashLinkListRepFactory";

util/hash_skiplist_rep.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ MemTableRep::Iterator* HashSkipListRep::GetDynamicPrefixIterator() {
320320

321321
MemTableRep* HashSkipListRepFactory::CreateMemTableRep(
322322
const MemTableRep::KeyComparator& compare, Arena* arena,
323-
const SliceTransform* transform) {
323+
const SliceTransform* transform, Logger* logger) {
324324
return new HashSkipListRep(compare, arena, transform, bucket_count_,
325325
skiplist_height_, skiplist_branching_factor_);
326326
}

util/hash_skiplist_rep.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class HashSkipListRepFactory : public MemTableRepFactory {
2727

2828
virtual MemTableRep* CreateMemTableRep(
2929
const MemTableRep::KeyComparator& compare, Arena* arena,
30-
const SliceTransform* transform) override;
30+
const SliceTransform* transform, Logger* logger) override;
3131

3232
virtual const char* Name() const override {
3333
return "HashSkipListRepFactory";

util/skiplistrep.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class SkipListRep : public MemTableRep {
116116

117117
MemTableRep* SkipListFactory::CreateMemTableRep(
118118
const MemTableRep::KeyComparator& compare, Arena* arena,
119-
const SliceTransform*) {
119+
const SliceTransform*, Logger* logger) {
120120
return new SkipListRep(compare, arena);
121121
}
122122

util/vectorrep.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ MemTableRep::Iterator* VectorRep::GetIterator() {
275275

276276
MemTableRep* VectorRepFactory::CreateMemTableRep(
277277
const MemTableRep::KeyComparator& compare, Arena* arena,
278-
const SliceTransform*) {
278+
const SliceTransform*, Logger* logger) {
279279
return new VectorRep(compare, arena, count_);
280280
}
281281
} // namespace rocksdb

0 commit comments

Comments
 (0)