| package org.rocksdb; |
| |
| import org.junit.ClassRule; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.rules.TemporaryFolder; |
| |
| import static org.assertj.core.api.Assertions.assertThat; |
| |
| public class TransactionLogIteratorTest { |
| @ClassRule |
| public static final RocksMemoryResource rocksMemoryResource = |
| new RocksMemoryResource(); |
| |
| @Rule |
| public TemporaryFolder dbFolder = new TemporaryFolder(); |
| |
| @Test |
| public void transactionLogIterator() throws RocksDBException { |
| try (final Options options = new Options() |
| .setCreateIfMissing(true); |
| final RocksDB db = RocksDB.open(options, |
| dbFolder.getRoot().getAbsolutePath()); |
| final TransactionLogIterator transactionLogIterator = |
| db.getUpdatesSince(0)) { |
| //no-op |
| } |
| } |
| |
| @Test |
| public void getBatch() throws RocksDBException { |
| final int numberOfPuts = 5; |
| try (final Options options = new Options() |
| .setCreateIfMissing(true) |
| .setWalTtlSeconds(1000) |
| .setWalSizeLimitMB(10); |
| final RocksDB db = RocksDB.open(options, |
| dbFolder.getRoot().getAbsolutePath())) { |
| |
| for (int i = 0; i < numberOfPuts; i++) { |
| db.put(String.valueOf(i).getBytes(), |
| String.valueOf(i).getBytes()); |
| } |
| db.flush(new FlushOptions().setWaitForFlush(true)); |
| |
| // the latest sequence number is 5 because 5 puts |
| // were written beforehand |
| assertThat(db.getLatestSequenceNumber()). |
| isEqualTo(numberOfPuts); |
| |
| // insert 5 writes into a cf |
| try (final ColumnFamilyHandle cfHandle = db.createColumnFamily( |
| new ColumnFamilyDescriptor("new_cf".getBytes()))) { |
| for (int i = 0; i < numberOfPuts; i++) { |
| db.put(cfHandle, String.valueOf(i).getBytes(), |
| String.valueOf(i).getBytes()); |
| } |
| // the latest sequence number is 10 because |
| // (5 + 5) puts were written beforehand |
| assertThat(db.getLatestSequenceNumber()). |
| isEqualTo(numberOfPuts + numberOfPuts); |
| |
| // Get updates since the beginning |
| try (final TransactionLogIterator transactionLogIterator = |
| db.getUpdatesSince(0)) { |
| assertThat(transactionLogIterator.isValid()).isTrue(); |
| transactionLogIterator.status(); |
| |
| // The first sequence number is 1 |
| final TransactionLogIterator.BatchResult batchResult = |
| transactionLogIterator.getBatch(); |
| assertThat(batchResult.sequenceNumber()).isEqualTo(1); |
| } |
| } |
| } |
| } |
| |
| @Test |
| public void transactionLogIteratorStallAtLastRecord() |
| throws RocksDBException { |
| try (final Options options = new Options() |
| .setCreateIfMissing(true) |
| .setWalTtlSeconds(1000) |
| .setWalSizeLimitMB(10); |
| final RocksDB db = RocksDB.open(options, |
| dbFolder.getRoot().getAbsolutePath())) { |
| |
| db.put("key1".getBytes(), "value1".getBytes()); |
| // Get updates since the beginning |
| try (final TransactionLogIterator transactionLogIterator = |
| db.getUpdatesSince(0)) { |
| transactionLogIterator.status(); |
| assertThat(transactionLogIterator.isValid()).isTrue(); |
| transactionLogIterator.next(); |
| assertThat(transactionLogIterator.isValid()).isFalse(); |
| transactionLogIterator.status(); |
| db.put("key2".getBytes(), "value2".getBytes()); |
| transactionLogIterator.next(); |
| transactionLogIterator.status(); |
| assertThat(transactionLogIterator.isValid()).isTrue(); |
| } |
| } |
| } |
| |
| @Test |
| public void transactionLogIteratorCheckAfterRestart() |
| throws RocksDBException { |
| final int numberOfKeys = 2; |
| try (final Options options = new Options() |
| .setCreateIfMissing(true) |
| .setWalTtlSeconds(1000) |
| .setWalSizeLimitMB(10)) { |
| |
| try (final RocksDB db = RocksDB.open(options, |
| dbFolder.getRoot().getAbsolutePath())) { |
| db.put("key1".getBytes(), "value1".getBytes()); |
| db.put("key2".getBytes(), "value2".getBytes()); |
| db.flush(new FlushOptions().setWaitForFlush(true)); |
| |
| } |
| |
| // reopen |
| try (final RocksDB db = RocksDB.open(options, |
| dbFolder.getRoot().getAbsolutePath())) { |
| assertThat(db.getLatestSequenceNumber()).isEqualTo(numberOfKeys); |
| |
| try (final TransactionLogIterator transactionLogIterator = |
| db.getUpdatesSince(0)) { |
| for (int i = 0; i < numberOfKeys; i++) { |
| transactionLogIterator.status(); |
| assertThat(transactionLogIterator.isValid()).isTrue(); |
| transactionLogIterator.next(); |
| } |
| } |
| } |
| } |
| } |
| } |