Skip to content

Commit 947a634

Browse files
tillrohrmannfacebook-github-bot
authored andcommitted
Allow specifying ReadOptions for WBWI iterator (facebook#12968)
Summary: Allow specifying ReadOptions for WBWI iterator when creating it through the C bindings. This allows to specify upper and lower bounds for the created iterator. This fixes facebook#12963. Pull Request resolved: facebook#12968 Reviewed By: pdillinger Differential Revision: D74188049 Pulled By: jaykorean fbshipit-source-id: 970d9910472dfedaa29a800c6d52bec14c656f3c
1 parent f49d76b commit 947a634

File tree

5 files changed

+112
-5
lines changed

5 files changed

+112
-5
lines changed

db/c.cc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2632,6 +2632,16 @@ rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base(
26322632
return result;
26332633
}
26342634

2635+
rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base_readopts(
2636+
rocksdb_writebatch_wi_t* wbwi, rocksdb_iterator_t* base_iterator,
2637+
const rocksdb_readoptions_t* options) {
2638+
rocksdb_iterator_t* result = new rocksdb_iterator_t;
2639+
result->rep =
2640+
wbwi->rep->NewIteratorWithBase(base_iterator->rep, &options->rep);
2641+
delete base_iterator;
2642+
return result;
2643+
}
2644+
26352645
rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base_cf(
26362646
rocksdb_writebatch_wi_t* wbwi, rocksdb_iterator_t* base_iterator,
26372647
rocksdb_column_family_handle_t* column_family) {
@@ -2642,6 +2652,17 @@ rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base_cf(
26422652
return result;
26432653
}
26442654

2655+
rocksdb_iterator_t* rocksdb_writebatch_wi_create_iterator_with_base_cf_readopts(
2656+
rocksdb_writebatch_wi_t* wbwi, rocksdb_iterator_t* base_iterator,
2657+
rocksdb_column_family_handle_t* column_family,
2658+
const rocksdb_readoptions_t* options) {
2659+
rocksdb_iterator_t* result = new rocksdb_iterator_t;
2660+
result->rep = wbwi->rep->NewIteratorWithBase(
2661+
column_family->rep, base_iterator->rep, &options->rep);
2662+
delete base_iterator;
2663+
return result;
2664+
}
2665+
26452666
char* rocksdb_writebatch_wi_get_from_batch(rocksdb_writebatch_wi_t* wbwi,
26462667
const rocksdb_options_t* options,
26472668
const char* key, size_t keylen,

db/c_test.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,6 +1362,46 @@ int main(int argc, char** argv) {
13621362
rocksdb_writebatch_wi_destroy(wbi);
13631363
}
13641364

1365+
StartPhase("wbwi_iter_readoptions");
1366+
{
1367+
rocksdb_readoptions_t* iter_roptions = rocksdb_readoptions_create();
1368+
rocksdb_readoptions_set_iterate_lower_bound(iter_roptions, "boy", 3);
1369+
rocksdb_readoptions_set_iterate_upper_bound(iter_roptions, "fool", 4);
1370+
rocksdb_iterator_t* base_iter = rocksdb_create_iterator(db, iter_roptions);
1371+
rocksdb_writebatch_wi_t* wbi = rocksdb_writebatch_wi_create(0, 1);
1372+
rocksdb_writebatch_wi_put(wbi, "bar", 3, "b",
1373+
1); // should get filtered out
1374+
rocksdb_writebatch_wi_put(wbi, "cat", 3, "miau", 4);
1375+
rocksdb_writebatch_wi_put(wbi, "gnu", 3, "muh",
1376+
3); // should get filtered out
1377+
rocksdb_iterator_t* iter =
1378+
rocksdb_writebatch_wi_create_iterator_with_base_readopts(wbi, base_iter,
1379+
iter_roptions);
1380+
CheckCondition(!rocksdb_iter_valid(iter));
1381+
rocksdb_iter_seek_to_first(iter);
1382+
CheckCondition(rocksdb_iter_valid(iter));
1383+
CheckIter(iter, "cat", "miau");
1384+
rocksdb_iter_next(iter);
1385+
CheckIter(iter, "foo", "hello");
1386+
rocksdb_iter_prev(iter);
1387+
CheckIter(iter, "cat", "miau");
1388+
rocksdb_iter_prev(iter);
1389+
CheckCondition(!rocksdb_iter_valid(iter));
1390+
rocksdb_iter_seek_to_last(iter);
1391+
CheckIter(iter, "foo", "hello");
1392+
rocksdb_iter_seek(iter, "b", 1);
1393+
CheckIter(iter, "cat", "miau");
1394+
rocksdb_iter_seek_for_prev(iter, "d", 1);
1395+
CheckIter(iter, "cat", "miau");
1396+
rocksdb_iter_seek_for_prev(iter, "fool", 3);
1397+
CheckIter(iter, "foo", "hello");
1398+
rocksdb_iter_get_error(iter, &err);
1399+
CheckNoError(err);
1400+
rocksdb_iter_destroy(iter);
1401+
rocksdb_writebatch_wi_destroy(wbi);
1402+
rocksdb_readoptions_destroy(iter_roptions);
1403+
}
1404+
13651405
StartPhase("multiget");
13661406
{
13671407
const char* keys[3] = {"box", "foo", "notfound"};
@@ -1792,6 +1832,35 @@ int main(int argc, char** argv) {
17921832
rocksdb_flush_wal(db, 1, &err);
17931833
CheckNoError(err);
17941834

1835+
// Test WriteBatchWithIndex iteration with Column Family
1836+
rocksdb_writebatch_wi_t* wbwi = rocksdb_writebatch_wi_create(0, true);
1837+
rocksdb_writebatch_wi_put_cf(wbwi, handles[1], "boat", 4, "row",
1838+
3); // should be filtered out
1839+
rocksdb_writebatch_wi_put_cf(wbwi, handles[1], "buffy", 5, "charmed", 7);
1840+
rocksdb_writebatch_wi_put_cf(wbwi, handles[1], "bus", 3, "yellow",
1841+
6); // should be filtered out
1842+
rocksdb_readoptions_t* iter_roptions = rocksdb_readoptions_create();
1843+
rocksdb_readoptions_set_iterate_lower_bound(iter_roptions, "bu", 2);
1844+
rocksdb_readoptions_set_iterate_upper_bound(iter_roptions, "buffz", 5);
1845+
rocksdb_iterator_t* base_iter =
1846+
rocksdb_create_iterator_cf(db, iter_roptions, handles[1]);
1847+
rocksdb_iterator_t* wbwi_iter =
1848+
rocksdb_writebatch_wi_create_iterator_with_base_cf_readopts(
1849+
wbwi, base_iter, handles[1], iter_roptions);
1850+
1851+
CheckCondition(!rocksdb_iter_valid(wbwi_iter));
1852+
rocksdb_iter_seek_to_first(wbwi_iter);
1853+
CheckCondition(rocksdb_iter_valid(wbwi_iter));
1854+
CheckIter(wbwi_iter, "buff", "rocksdb");
1855+
rocksdb_iter_next(wbwi_iter);
1856+
CheckIter(wbwi_iter, "buffy", "charmed");
1857+
rocksdb_iter_next(wbwi_iter);
1858+
CheckCondition(!rocksdb_iter_valid(wbwi_iter));
1859+
1860+
rocksdb_iter_destroy(wbwi_iter);
1861+
rocksdb_writebatch_wi_destroy(wbwi);
1862+
rocksdb_readoptions_destroy(iter_roptions);
1863+
17951864
const char* keys[3] = {"box", "box", "barfooxx"};
17961865
const rocksdb_column_family_handle_t* get_handles[3] = {
17971866
handles[0], handles[1], handles[1]};

include/rocksdb/c.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -999,13 +999,20 @@ extern ROCKSDB_LIBRARY_API rocksdb_iterator_t*
999999
rocksdb_writebatch_wi_create_iterator_with_base(
10001000
rocksdb_writebatch_wi_t* wbwi, rocksdb_iterator_t* base_iterator);
10011001
extern ROCKSDB_LIBRARY_API rocksdb_iterator_t*
1002+
rocksdb_writebatch_wi_create_iterator_with_base_readopts(
1003+
rocksdb_writebatch_wi_t* wbwi, rocksdb_iterator_t* base_iterator,
1004+
const rocksdb_readoptions_t* options);
1005+
extern ROCKSDB_LIBRARY_API rocksdb_iterator_t*
10021006
rocksdb_writebatch_wi_create_iterator_with_base_cf(
10031007
rocksdb_writebatch_wi_t* wbwi, rocksdb_iterator_t* base_iterator,
10041008
rocksdb_column_family_handle_t* cf);
1009+
extern ROCKSDB_LIBRARY_API rocksdb_iterator_t*
1010+
rocksdb_writebatch_wi_create_iterator_with_base_cf_readopts(
1011+
rocksdb_writebatch_wi_t* wbwi, rocksdb_iterator_t* base_iterator,
1012+
rocksdb_column_family_handle_t* cf, const rocksdb_readoptions_t* options);
10051013
extern ROCKSDB_LIBRARY_API void rocksdb_writebatch_wi_update_timestamps(
10061014
rocksdb_writebatch_wi_t* wbwi, const char* ts, size_t tslen, void* state,
10071015
size_t (*get_ts_size)(void*, uint32_t), char** errptr);
1008-
10091016
/* Options utils */
10101017

10111018
// Load the latest rocksdb options from the specified db_path.

include/rocksdb/utilities/write_batch_with_index.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,8 @@ class WriteBatchWithIndex : public WriteBatchBase {
236236
Iterator* base_iterator,
237237
const ReadOptions* opts = nullptr);
238238
// default column family
239-
Iterator* NewIteratorWithBase(Iterator* base_iterator);
239+
Iterator* NewIteratorWithBase(Iterator* base_iterator,
240+
const ReadOptions* opts = nullptr);
240241

241242
// Similar to DB::Get() but will only read the key from this batch.
242243
// If the batch does not have enough data to resolve Merge operations,

utilities/write_batch_with_index/write_batch_with_index.cc

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -361,10 +361,19 @@ Iterator* WriteBatchWithIndex::NewIteratorWithBase(
361361
read_options);
362362
}
363363

364-
Iterator* WriteBatchWithIndex::NewIteratorWithBase(Iterator* base_iterator) {
364+
Iterator* WriteBatchWithIndex::NewIteratorWithBase(
365+
Iterator* base_iterator, const ReadOptions* read_options) {
366+
WBWIIteratorImpl* wbwiii;
365367
// default column family's comparator
366-
auto wbwiii = new WBWIIteratorImpl(0, &(rep->skip_list), &rep->write_batch,
367-
&rep->comparator);
368+
if (read_options != nullptr) {
369+
wbwiii = new WBWIIteratorImpl(
370+
0, &(rep->skip_list), &rep->write_batch, &rep->comparator,
371+
read_options->iterate_lower_bound, read_options->iterate_upper_bound);
372+
} else {
373+
wbwiii = new WBWIIteratorImpl(0, &(rep->skip_list), &rep->write_batch,
374+
&rep->comparator);
375+
}
376+
368377
return new BaseDeltaIterator(nullptr, base_iterator, wbwiii,
369378
rep->comparator.default_comparator(),
370379
/* read_options */ nullptr);

0 commit comments

Comments
 (0)