@@ -20,7 +20,8 @@ namespace {
20
20
class HashSkipListRep : public MemTableRep {
21
21
public:
22
22
HashSkipListRep (MemTableRep::KeyComparator& compare, Arena* arena,
23
- const SliceTransform* transform, size_t bucket_size);
23
+ const SliceTransform* transform, size_t bucket_size,
24
+ int32_t skiplist_height, int32_t skiplist_branching_factor);
24
25
25
26
virtual void Insert (const char * key) override ;
26
27
@@ -47,6 +48,9 @@ class HashSkipListRep : public MemTableRep {
47
48
48
49
size_t bucket_size_;
49
50
51
+ const int32_t skiplist_height_;
52
+ const int32_t skiplist_branching_factor_;
53
+
50
54
// Maps slices (which are transformed user keys) to buckets of keys sharing
51
55
// the same transform.
52
56
port::AtomicPointer* buckets_;
@@ -215,8 +219,12 @@ class HashSkipListRep : public MemTableRep {
215
219
};
216
220
217
221
HashSkipListRep::HashSkipListRep (MemTableRep::KeyComparator& compare,
218
- Arena* arena, const SliceTransform* transform, size_t bucket_size)
222
+ Arena* arena, const SliceTransform* transform,
223
+ size_t bucket_size, int32_t skiplist_height,
224
+ int32_t skiplist_branching_factor)
219
225
: bucket_size_(bucket_size),
226
+ skiplist_height_ (skiplist_height),
227
+ skiplist_branching_factor_(skiplist_branching_factor),
220
228
transform_(transform),
221
229
compare_(compare),
222
230
arena_(arena),
@@ -239,7 +247,8 @@ HashSkipListRep::Bucket* HashSkipListRep::GetInitializedBucket(
239
247
auto bucket = GetBucket (hash);
240
248
if (bucket == nullptr ) {
241
249
auto addr = arena_->AllocateAligned (sizeof (Bucket));
242
- bucket = new (addr) Bucket (compare_, arena_);
250
+ bucket = new (addr) Bucket (compare_, arena_, skiplist_height_,
251
+ skiplist_branching_factor_);
243
252
buckets_[hash].Release_Store (static_cast <void *>(bucket));
244
253
}
245
254
return bucket;
@@ -302,17 +311,23 @@ std::shared_ptr<MemTableRep::Iterator>
302
311
303
312
class HashSkipListRepFactory : public MemTableRepFactory {
304
313
public:
305
- explicit HashSkipListRepFactory (const SliceTransform* transform,
306
- size_t bucket_count = 1000000 )
307
- : transform_(transform),
308
- bucket_count_(bucket_count) { }
314
+ explicit HashSkipListRepFactory (
315
+ const SliceTransform* transform,
316
+ size_t bucket_count,
317
+ int32_t skiplist_height,
318
+ int32_t skiplist_branching_factor)
319
+ : transform_(transform),
320
+ bucket_count_(bucket_count),
321
+ skiplist_height_(skiplist_height),
322
+ skiplist_branching_factor_(skiplist_branching_factor) { }
309
323
310
324
virtual ~HashSkipListRepFactory () { delete transform_; }
311
325
312
326
virtual std::shared_ptr<MemTableRep> CreateMemTableRep (
313
327
MemTableRep::KeyComparator& compare, Arena* arena) override {
314
328
return std::make_shared<HashSkipListRep>(compare, arena, transform_,
315
- bucket_count_);
329
+ bucket_count_, skiplist_height_,
330
+ skiplist_branching_factor_);
316
331
}
317
332
318
333
virtual const char * Name () const override {
@@ -324,11 +339,15 @@ class HashSkipListRepFactory : public MemTableRepFactory {
324
339
private:
325
340
const SliceTransform* transform_;
326
341
const size_t bucket_count_;
342
+ const int32_t skiplist_height_;
343
+ const int32_t skiplist_branching_factor_;
327
344
};
328
345
329
346
MemTableRepFactory* NewHashSkipListRepFactory (
330
- const SliceTransform* transform, size_t bucket_count) {
331
- return new HashSkipListRepFactory (transform, bucket_count);
347
+ const SliceTransform* transform, size_t bucket_count,
348
+ int32_t skiplist_height, int32_t skiplist_branching_factor) {
349
+ return new HashSkipListRepFactory (transform, bucket_count,
350
+ skiplist_height, skiplist_branching_factor);
332
351
}
333
352
334
353
} // namespace rocksdb
0 commit comments