Rust-rocksdb: Итератор префикса ведет себя странно

Созданный на 8 нояб. 2018  ·  6Комментарии  ·  Источник: rust-rocksdb/rust-rocksdb

Привет,
Если вы дадите prefix_iterator более длинный префикс, чем тот, который вы указали в параметрах ( set_prefix_extractor ).
Вы не получаете сообщение об ошибке, и он не игнорирует остальную часть префикса, он ведет себя как префикс вместе с From.
как это:

set_prefix_extractor(len)
myp = &[1u8; len+1];
prefix(myp[..len]) + From(myp)

И реальный рабочий пример:

let prefix_extractor = rocksdb::SliceTransform::create_fixed_prefix(1);
let mut opts = Options::default();
opts.create_if_missing(true);
opts.set_prefix_extractor(prefix_extractor);
let db = DB::open(&opts, &tempdir).unwrap();


db.put(&[0,0,0,0], &[0,0,0,0]).unwrap();
db.put(&[0,0,0,1], &[0,0,0,1]).unwrap();
db.put(&[0,1,0,1], &[0,1,0,1]).unwrap();
db.put(&[0,1,1,1], &[0,1,1,1]).unwrap();
db.put(&[0,1,2,1], &[0,1,2,1]).unwrap();
db.put(&[2,0,0,0], &[2,0,0,0]).unwrap();
db.put(&[2,2,2,2], &[2,2,2,2]).unwrap();

let me = db.prefix_iterator(&[0,1,0]);
for (key, value) in me {
    println!("Saw {:?} {:?}", key, value);
}

Это напечатает следующие результаты:

Saw [0, 1, 0, 1] [0, 1, 0, 1]
Saw [0, 1, 1, 1] [0, 1, 1, 1]
Saw [0, 1, 2, 1] [0, 1, 2, 1]

Таким образом, первый байт ведет себя как настоящий префикс (дает точное совпадение), но остальные не являются ни префиксом, ни игнорируются, они используются как «От» (вы можете видеть, что это игнорирует все, что начинается с [0,0 ], но включает в себя байты большего размера, например [0,2])

Это желаемое поведение или ошибка?

Все 6 Комментарий

Я подозреваю, что наблюдаемое вами поведение связано с тем, как реализована основная библиотека. Я не уверен, что это намеренно или «неопределенное поведение».

@elichai Хорошо закрыть или вы думаете, что это проблема с привязкой к языку?

хм, я вообще-то не проверял, существует ли он в коде C ++, так что idk.
Возможно, я скоро проверю, когда у меня будет время (не разработчик C ++)

@iSynaptic Не уверен, заслуживает ли это отдельного
put функции write_batch не содержат try! но они возвращают результат.
Это предназначено? Зачем?
https://github.com/rust-rocksdb/rust-rocksdb/blob/master/src/db.rs#L1147

@elichai Я думаю, что это предполагаемое поведение, поскольку нет никаких шансов на ошибку в деталях реализации. В будущем мы сможем изменить эту внутреннюю реализацию без изменения пользовательского API.

@elichai Теперь я согласен с тем, что prefix_iterator ведет себя странно, но так, как задумано. В № 254 я добавил тест, который проверяет поведение и включает комментарий, объясняющий поведение (цитируется ниже). Судя по поведению, которое, как мне кажется, вы хотите, вам, вероятно, следует использовать обычный итератор и предоставить свой собственный ReadOptions . Это включено в # 253.

Объяснение : db.prefix_iterator устанавливает базовые параметры для поиска первого ключа, который соответствует всему prefix . Оттуда итератор будет продолжать читать пары до тех пор, пока префикс, извлеченный из key совпадает с префиксом, извлеченным из prefix .

@vitvakatu @aleksuss Я думаю, нам нужно взглянуть на все функции, которые

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

iSynaptic picture iSynaptic  ·  31Комментарии

iSynaptic picture iSynaptic  ·  5Комментарии

rrichardson picture rrichardson  ·  7Комментарии

zach-schoenberger picture zach-schoenberger  ·  5Комментарии

rohitjoshi picture rohitjoshi  ·  10Комментарии