summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay <jschmidek@gmail.com>2023-11-30 08:56:39 -0700
committerGitHub <noreply@github.com>2023-11-30 15:56:39 +0000
commit30ffe0ad78a037694eb3e834ac0afc436eea4ebf (patch)
treef1eaaba690b4b7185694de556d1acacdc8d6cfd6
parent9c847b1510a7bf717adda6e3cafa2b608087d138 (diff)
Fix bug in DBWALIterator that would return updates before the given sequence (#831)
-rw-r--r--src/db_iterator.rs2
-rw-r--r--tests/test_db.rs32
2 files changed, 33 insertions, 1 deletions
diff --git a/src/db_iterator.rs b/src/db_iterator.rs
index a1b66fa..846cfcf 100644
--- a/src/db_iterator.rs
+++ b/src/db_iterator.rs
@@ -558,7 +558,7 @@ impl Iterator for DBWALIterator {
// if the initial sequence number is what was requested we skip it to
// only provide changes *after* it
- if seq == self.start_seq_number {
+ while seq <= self.start_seq_number {
unsafe {
ffi::rocksdb_wal_iter_next(self.inner);
}
diff --git a/tests/test_db.rs b/tests/test_db.rs
index 4b14703..33a586d 100644
--- a/tests/test_db.rs
+++ b/tests/test_db.rs
@@ -531,6 +531,38 @@ fn test_get_updates_since_one_batch() {
}
#[test]
+fn test_get_updates_since_batches() {
+ let path = DBPath::new("_rust_rocksdb_test_get_updates_since_one_batch");
+ let db = DB::open_default(&path).unwrap();
+ db.put(b"key2", b"value2").unwrap();
+
+ assert_eq!(db.latest_sequence_number(), 1);
+ let mut batch = WriteBatch::default();
+ batch.put(b"key1", b"value1");
+ batch.delete(b"key2");
+ db.write(batch).unwrap();
+ let seq2 = db.latest_sequence_number();
+ assert_eq!(seq2, 3);
+ let mut batch = WriteBatch::default();
+ batch.put(b"key3", b"value1");
+ batch.put(b"key4", b"value1");
+ db.write(batch).unwrap();
+ assert_eq!(db.latest_sequence_number(), 5);
+ let mut iter = db.get_updates_since(seq2).unwrap();
+ let mut counts = OperationCounts {
+ puts: 0,
+ deletes: 0,
+ };
+ // Verify we get the 2nd batch with 2 puts back and not the first
+ let (seq, batch) = iter.next().unwrap().unwrap();
+ assert_eq!(seq, 4);
+ batch.iterate(&mut counts);
+ assert!(iter.next().is_none());
+ assert_eq!(counts.puts, 2);
+ assert_eq!(counts.deletes, 0);
+}
+
+#[test]
fn test_get_updates_since_nothing() {
let path = DBPath::new("_rust_rocksdb_test_get_updates_since_nothing");
let db = DB::open_default(&path).unwrap();