Rust-rocksdb: يتصرف مكرر البادئة بشكل غريب

تم إنشاؤها على ٨ نوفمبر ٢٠١٨  ·  6تعليقات  ·  مصدر: rust-rocksdb/rust-rocksdb

أهلا،
إذا أعطيت prefix_iterator بادئة أطول مما أعلنته في الخيارات ( set_prefix_extractor ).
لا تحصل على خطأ ولا تتجاهل بقية البادئة ، فهي تتصرف كبادئة مع من.
مثله:

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])

هل هذا هو السلوك المطلوب أم أن هذا خطأ؟

bug

ال 6 كومينتر

أظن أن السلوك الذي تراه يرجع إلى كيفية تنفيذ المكتبة الأساسية. لست متأكدًا مما إذا كان هذا عن طريق التصميم أم "سلوك غير محدد".

elichai حسنًا للإغلاق أم تعتقد أن هذه مشكلة تتعلق

حسنًا ، لم أتحقق مما إذا كان موجودًا في كود C ++ ، لذا أتساءل.
ربما سأتحقق قريبًا عندما يكون لدي الوقت (ليس مطور C ++)

iSynaptic لست متأكدًا مما إذا كان هذا يستحق مشكلة منفصلة ،
لا تحتوي وظائف write_batch put على أي try! ومع ذلك فإنها تُرجع نتيجة.
هل هذا مقصود؟ لماذا ا؟
https://github.com/rust-rocksdb/rust-rocksdb/blob/master/src/db.rs#L1147

elichai أعتقد أنه سلوك مقصود ، حيث لا توجد فرصة

elichai أوافق الآن على أن prefix_iterator يتصرف بغرابة ، لكن حسب التصميم. في # 254 ، أضفت اختبارًا يتحقق من السلوك ويتضمن تعليقًا يشرح السلوك (مقتبس أدناه). بناءً على السلوك الذي أعتقد أنه تريده ، ربما يجب عليك استخدام مكرر منتظم وتقديم ReadOptions . تم تمكين هذا في # 253.

التفسير : يحدد db.prefix_iterator الخيارات الأساسية للبحث عن المفتاح الأول الذي يطابق prefix بالكامل . من هناك ، سيستمر المكرر في قراءة الأزواج طالما أن البادئة المستخرجة من key تطابق البادئة المستخرجة من prefix .

vitvakatualeksuss أعتقد أننا بحاجة إلى إلقاء نظرة على جميع الوظائف التي المكررات بناء وتبسيطها قدر الإمكان - فهي مربكة قليلا. لدي بعض الأفكار ويمكنني وضع العلاقات العامة معًا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

benoitc picture benoitc  ·  7تعليقات

rrichardson picture rrichardson  ·  7تعليقات

zach-schoenberger picture zach-schoenberger  ·  7تعليقات

yiyanwannian picture yiyanwannian  ·  6تعليقات

iSynaptic picture iSynaptic  ·  12تعليقات