Rust-rocksdb: Iterator awalan berperilaku aneh

Dibuat pada 8 Nov 2018  ·  6Komentar  ·  Sumber: rust-rocksdb/rust-rocksdb

Hai,
Jika Anda memberi prefix_iterator awalan yang lebih panjang dari yang Anda nyatakan di Opsi ( set_prefix_extractor ).
Anda tidak mendapatkan kesalahan dan tidak mengabaikan awalan lainnya, ini berperilaku seperti awalan bersama dengan Dari.
seperti ini:

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

Dan contoh kerja aktual:

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);
}

Ini akan mencetak hasil ini:

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]

Jadi byte pertama berperilaku seperti prefiks nyata (memberikan pencocokan tepat), tetapi sisanya bukan prefiks atau diabaikan, mereka digunakan sebagai "Dari" (Anda dapat melihat ini mengabaikan semua yang dimulai dengan [0,0 ] tetapi menyertakan byte yang lebih besar seperti [0,2])

Apakah ini perilaku yang diinginkan atau apakah ini bug?

bug

Semua 6 komentar

Saya menduga bahwa perilaku yang Anda lihat adalah karena bagaimana pustaka inti diterapkan. Saya tidak yakin apakah ini memang disengaja atau "perilaku tidak terdefinisi".

@elichai Oke untuk menutup atau menurut Anda ada masalah dengan pengikatan bahasa ini?

hmm saya sebenarnya tidak memeriksa apakah itu ada di kode C ++, Jadi idk.
Mungkin saya akan segera memeriksanya ketika saya punya waktu (bukan C ++ dev)

@iSynaptic Tidak yakin apakah ini memerlukan masalah tersendiri,
Fungsi put dari write_batch tidak berisi try! dan mereka mengembalikan hasil.
Apakah ini dimaksudkan? Mengapa?
https://github.com/rust-rocksdb/rust-rocksdb/blob/master/src/db.rs#L1147

@elichai Saya pikir itu adalah perilaku yang diinginkan, karena tidak ada kemungkinan kesalahan adalah detail implementasi. Di masa mendatang, kami akan dapat mengubah penerapan internal ini tanpa mengubah API yang dihadapi pengguna

@elichai Sekarang saya setuju bahwa prefix_iterator berperilaku aneh, tetapi seperti yang dirancang. Di # 254, saya menambahkan tes yang memvalidasi perilaku dan menyertakan komentar yang menjelaskan perilaku tersebut (dikutip di bawah). Berdasarkan perilaku yang saya pikir_ inginkan, Anda mungkin harus menggunakan iterator biasa dan memberikan ReadOptions . Ini diaktifkan di # 253.

Penjelasan : db.prefix_iterator menetapkan opsi yang mendasari untuk mencari kunci pertama yang cocok dengan seluruh prefix . Dari sana, iterator akan terus membaca pasangan selama prefiks yang diekstrak dari key cocok dengan prefiks yang diekstrak dari prefix .

@vitvakatu @aleksuss Saya pikir kita perlu melihat semua fungsi yang membangun iterator dan menyederhanakannya sebanyak mungkin - mereka agak membingungkan. Saya punya beberapa ide dan saya bisa membuat PR bersama.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat