Изменение размера ключа для 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);