diff options
author | Jay <jschmidek@gmail.com> | 2023-11-30 08:56:39 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-30 15:56:39 +0000 |
commit | 30ffe0ad78a037694eb3e834ac0afc436eea4ebf (patch) | |
tree | f1eaaba690b4b7185694de556d1acacdc8d6cfd6 | |
parent | 9c847b1510a7bf717adda6e3cafa2b608087d138 (diff) |
Fix bug in DBWALIterator that would return updates before the given sequence (#831)
-rw-r--r-- | src/db_iterator.rs | 2 | ||||
-rw-r--r-- | tests/test_db.rs | 32 |
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(); |