Как использовать хвостовой итератор RocksDB?

Я использую RocksDB Java JNI и хотел бы получать новые записи по мере их добавления в RocksDB.

Thread t = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                try {
                    System.out.println("Putting " + i);
                    rocksDB.put(("key " + i).getBytes(), ("value " + i).getBytes());
                    Thread.sleep(100);
                } catch (InterruptedException | RocksDBException e) {
                    e.printStackTrace();
                }
            }
        }, "Putting thread");
        t.start();

       Thread.sleep(1000); // wait for sometime

       ReadOptions readOptions = new ReadOptions();
       readOptions.setTailing(true);
       try (RocksIterator rocksIterator = rocksDB.newIterator(readOptions)) {
            for (rocksIterator.seekToFirst(); rocksIterator.isValid(); rocksIterator.next()) {
                System.out.println(new String(rocksIterator.key()) + " = " + new String(rocksIterator.value()));
            }
        }
        t.join();

Здесь, я полагаю, он создает моментальный снимок в этот момент времени (т. е. после 1 sec), и печатаются только те элементы, которые добавлены. Я ожидал, что хвостовой итератор должен блокироваться, потому что будут добавлены новые записи.

Есть ли пример использования хвостового итератора в RocksDB?


person JavaTechnical    schedule 08.07.2020    source источник


Ответы (1)


Хвостовой итератор не блокирует, это только означает, что итератор может получить новое обновление после создания. В отличие от обычного итератора сделайте снимок текущих данных: новые данные, добавленные после создания итератора, не будут включены.

auto trailing_it = rocksDB.newIterator(readOptions);
auto normal_it = rocksDB.newIterator(new ReadOptions());
rocksDB.put("new_data", "added_after_iterator_creation");
ASSERT(trailing_it.isValid());  // iterator has the new added data
ASSERT(!normal_it.isValid());   // doesn't have the new added data

Для деталей реализации: обычный итератор делает снимок данных с текущим порядковым номером, новые данные не будут включены, поскольку они имеют больший порядковый номер. Завершающий итератор использует MaxSequenceNumber, который будет включать любые новые добавленные данные.

person Jay Zhuang    schedule 11.09.2020