Skip to content

Commit 38dc5ef

Browse files
author
Thomas Adam
committed
[C-API] added the possiblity to create a HashSkipList or HashLinkedList to support prefix seeks
1 parent a73383e commit 38dc5ef

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

db/c.cc

+20
Original file line numberDiff line numberDiff line change
@@ -983,6 +983,26 @@ void rocksdb_options_set_memtable_prefix_bloom_probes(
983983
opt->rep.memtable_prefix_bloom_probes = v;
984984
}
985985

986+
void rocksdb_options_set_hash_skip_list_rep(
987+
rocksdb_options_t *opt, size_t bucket_count,
988+
int32_t skiplist_height, int32_t skiplist_branching_factor) {
989+
static rocksdb::MemTableRepFactory* factory = 0;
990+
if (!factory) {
991+
factory = rocksdb::NewHashSkipListRepFactory(
992+
bucket_count, skiplist_height, skiplist_branching_factor);
993+
}
994+
opt->rep.memtable_factory.reset(factory);
995+
}
996+
997+
void rocksdb_options_set_hash_link_list_rep(
998+
rocksdb_options_t *opt, size_t bucket_count) {
999+
static rocksdb::MemTableRepFactory* factory = 0;
1000+
if (!factory) {
1001+
factory = rocksdb::NewHashLinkListRepFactory(bucket_count);
1002+
}
1003+
opt->rep.memtable_factory.reset(factory);
1004+
}
1005+
9861006
void rocksdb_options_set_max_successive_merges(
9871007
rocksdb_options_t* opt, size_t v) {
9881008
opt->rep.max_successive_merges = v;

db/c_test.c

+46
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,52 @@ int main(int argc, char** argv) {
433433

434434
}
435435

436+
StartPhase("prefix");
437+
{
438+
// Create new database
439+
rocksdb_close(db);
440+
rocksdb_destroy_db(options, dbname, &err);
441+
442+
rocksdb_options_set_filter_policy(options, rocksdb_filterpolicy_create_bloom(10));
443+
rocksdb_options_set_prefix_extractor(options, rocksdb_slicetransform_create_fixed_prefix(3));
444+
rocksdb_options_set_hash_skip_list_rep(options, 50000, 4, 4);
445+
446+
db = rocksdb_open(options, dbname, &err);
447+
CheckNoError(err);
448+
449+
rocksdb_put(db, woptions, "foo1", 4, "foo", 3, &err);
450+
CheckNoError(err);
451+
rocksdb_put(db, woptions, "foo2", 4, "foo", 3, &err);
452+
CheckNoError(err);
453+
rocksdb_put(db, woptions, "foo3", 4, "foo", 3, &err);
454+
CheckNoError(err);
455+
rocksdb_put(db, woptions, "bar1", 4, "bar", 3, &err);
456+
CheckNoError(err);
457+
rocksdb_put(db, woptions, "bar2", 4, "bar", 3, &err);
458+
CheckNoError(err);
459+
rocksdb_put(db, woptions, "bar3", 4, "bar", 3, &err);
460+
CheckNoError(err);
461+
462+
rocksdb_readoptions_set_prefix_seek(roptions, 1);
463+
464+
rocksdb_iterator_t* iter = rocksdb_create_iterator(db, roptions);
465+
CheckCondition(!rocksdb_iter_valid(iter));
466+
467+
rocksdb_iter_seek(iter, "bar", 3);
468+
rocksdb_iter_get_error(iter, &err);
469+
CheckNoError(err);
470+
CheckCondition(rocksdb_iter_valid(iter));
471+
472+
CheckIter(iter, "bar1", "bar");
473+
rocksdb_iter_next(iter);
474+
CheckIter(iter, "bar2", "bar");
475+
rocksdb_iter_next(iter);
476+
CheckIter(iter, "bar3", "bar");
477+
rocksdb_iter_get_error(iter, &err);
478+
CheckNoError(err);
479+
rocksdb_iter_destroy(iter);
480+
}
481+
436482
StartPhase("cleanup");
437483
rocksdb_close(db);
438484
rocksdb_options_destroy(options);

include/rocksdb/c.h

+2
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,8 @@ extern void rocksdb_options_set_delete_obsolete_files_period_micros(
346346
extern void rocksdb_options_set_source_compaction_factor(rocksdb_options_t*, int);
347347
extern void rocksdb_options_prepare_for_bulk_load(rocksdb_options_t*);
348348
extern void rocksdb_options_set_memtable_vector_rep(rocksdb_options_t*);
349+
extern void rocksdb_options_set_hash_skip_list_rep(rocksdb_options_t*, size_t, int32_t, int32_t);
350+
extern void rocksdb_options_set_hash_link_list_rep(rocksdb_options_t*, size_t);
349351

350352
extern void rocksdb_options_set_max_bytes_for_level_base(rocksdb_options_t* opt, uint64_t n);
351353
extern void rocksdb_options_set_stats_dump_period_sec(rocksdb_options_t* opt, unsigned int sec);

0 commit comments

Comments
 (0)