Rust-rocksdb: 前缀迭代器的行为很奇怪

创建于 2018-11-08  ·  6评论  ·  资料来源: rust-rocksdb/rust-rocksdb

你好,
如果给prefix_iterator的前缀比在Options( 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]

因此,第一个字节的行为就像一个真实的前缀(给出完全匹配),但其余字节既不是前缀也不被忽略,它们被用作“ From”(您可以看到它忽略了以[0,0 ],但包含较大的字节,例如[0,2])

这是通缉的行为,还是一个错误?

所有6条评论

我怀疑您看到的行为是由于核心库的实现方式引起的。 我不确定这是设计使然还是“未定义行为”。

@elichai可以关闭,还是您认为此语言绑定存在问题?

嗯,我实际上没有检查它是否存在于C ++代码中,所以idk。
也许我有空的时候会尽快检查(不是C ++开发人员)

@iSynaptic不知道这是否值得单独提出,
write_batch的put函数不包含任何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我认为我们需要看一下构造迭代器并尽可能简化它们的所有功能-它们有些令人困惑。 我有一些想法,我可以将PR组合在一起。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

yiyanwannian picture yiyanwannian  ·  6评论

eupn picture eupn  ·  3评论

benoitc picture benoitc  ·  7评论

iSynaptic picture iSynaptic  ·  31评论

iSynaptic picture iSynaptic  ·  11评论