Изменение размера ключа для leveldb

Мы используем leveldb для индексации блоков данных для дисков и используем один экземпляр leveldb на диск. Ключи для индекса Отпечаток пальца существовал в ключе по некоторым историческим причинам (мне это неизвестно). Мы планируем избавиться от этого суффикса отпечатка пальца от ключа (поскольку мы пришли к выводу, что мы можем поддерживать уникальность ключа только с помощью inode и page_offset).

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

Пожалуйста, дайте мне знать, если мой вопрос не очень ясен.

1 ответ

Вы можете сделать некоторую работу над leveldb::Options.comparatorкоторый по умолчанию leveldb::BytewiseComparatorImpl,
Например, вы можете определить класс с именем IgnoreSuffixComparatorImpl:

#include "leveldb/comparator.h"
class IgnoreSuffixComparatorImpl : public Comparator {
  ...
  virtual int Compare(const Slice& a, const Slice& b) const {
     return removeSuffix(a).compare(removeSuffix(b));
  }
  ...
}

Затем, когда вы инициализируете db, вы можете использовать новый компаратор:

options.comparator = new IgnoreSuffixComparatorImpl();
s = leveldb::DB::Open(options, db_path, manifest, &db);
Другие вопросы по тегам