Rust-rocksdb: db๋ฅผ ๋‹ค์‹œ ์—ด ๋•Œ ๋น„๊ต๊ธฐ ์˜ค๋ฅ˜

์— ๋งŒ๋“  2020๋…„ 05์›” 18์ผ  ยท  7์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-rocksdb/rust-rocksdb

ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ DB๋ฅผ ๋‹ค์‹œ ์—ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
Invalid argument: leveldb.BytewiseComparator: does not match existing comparator

CF๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  DB๋ฅผ ์—ด๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ CF๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ๊ฐ€ ์ฝ”๋“œ์˜ https://github.com/rust-rocksdb/rust-rocksdb/blob/master/src/db.rs#L214 ์— ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ์ˆ˜์ •์€ https://github.com/rust-rocksdb/rust-rocksdb/blob/master/src/db.rs#L219 ๊ฒ€์‚ฌ๋ฅผ empty ๊ฒ€์‚ฌ ์ „์— ์œ„๋กœ ์ด๋™ํ•˜๊ณ  ๊ธฐ๋ณธ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. cf ๋ฌธ์ž์—ด ๋ชฉ๋ก์—.

์žฌํ˜„ ๋‹จ๊ณ„:

  1. DB ์˜ต์…˜์— ๋น„๊ต๊ธฐ๊ฐ€ ์„ค์ •๋œ DB๋ฅผ ์—ด์ง€๋งŒ ์—ด ํŒจ๋ฐ€๋ฆฌ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์Œ
  2. ์‚ฌ์šฉ์ž ์ •์˜ ๋น„๊ต๊ธฐ๊ฐ€ ์žˆ๋Š” ์˜ต์…˜์œผ๋กœ ๋” ๋งŽ์€ CF๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
  3. DB ๋‹ซ๊ธฐ
  4. ์‚ฌ์šฉ์ž ์ง€์ • ๋น„๊ต๊ธฐ๊ฐ€ ์žˆ๋Š” ์˜ต์…˜์œผ๋กœ db๋ฅผ ๋‹ค์‹œ ์—ฝ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@zach-schoenberger ์—ฌ๊ธฐ๋ฅผ ์‚ดํŽด

๋ชจ๋“  7 ๋Œ“๊ธ€

์‹ ๊ณ  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋ชจ๋“  ์—ด ํŒจ๋ฐ€๋ฆฌ(๊ธฐ๋ณธ ์—ด ํŒจ๋ฐ€๋ฆฌ๋ฟ ์•„๋‹ˆ๋ผ)๊ฐ€ ๊ธฐ๋ณธ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ท€ํ•˜์˜ ์ œ์•ˆ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
https://github.com/rust-rocksdb/rust-rocksdb/blob/master/src/db.rs#L123

์ปฌ๋ŸผํŒจ๋ฐ€๋ฆฌ๋ณ„๋กœ ๋น„๊ต๊ธฐ๋ฅผ ๋”ฐ๋กœ ์ œ๊ณตํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ API๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@DarkEld3r ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋„ ๊ฐ™์€ ์ƒ๊ฐ์„ ํ–ˆ๋‹ค. ์†”์งํžˆ ๋‚˜๋Š” ์™œ ๋น„๊ต๊ธฐ๊ฐ€ ๋‹น์‹ ์ด ์ค€ ์ •ํ™•ํ•œ ์ด์œ ์— ๋Œ€ํ•ด ์ „ํ˜€ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์กฐ๊ฑด๋ฌธ์˜ ๋‹ค๋ฅธ ์ชฝ์„ ํšก๋‹จํ•  ๋•Œ ๋ฌด์Šจ ๋งˆ๋ฒ•์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์—ˆ๋“  ๊ทธ๊ฒƒ ๋•Œ๋ฌธ์— ๊ณ ์น  ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋‚˜๋Š” ์™œ ๋น„๊ต๊ธฐ๊ฐ€ ๋‹น์‹ ์ด ์ค€ ์ •ํ™•ํ•œ ์ด์œ ์— ๋Œ€ํ•ด ์ „ํ˜€ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค.

create_cf ํ˜ธ์ถœ๋กœ ์ปฌ๋Ÿผ ํŒจ๋ฐ€๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  DB์— ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์˜ต์…˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ต์…˜์€ rockdb์— ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒƒ์ด ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ์ด์œ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@zach-schoenberger 4๋‹จ๊ณ„์—์„œ DB๋ฅผ ์—ฌ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

@zach-schoenberger ์—ฌ๊ธฐ๋ฅผ ์‚ดํŽด

@aleksuss ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. open_cf_descriptors ๊ธฐ๋Šฅ์„ ์™„์ „ํžˆ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์ด ํšจ๊ณผ๊ฐ€ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let path = "...";

fn comparator(left: &[u8], right: &[u8]) -> Ordering {
    right.cmp(left)
}

let mut options = Options::default();
options.create_if_missing(true);
options.set_comparator("comparator", comparator);

{
    let mut db = DB::open(&options, &path).expect("Unable to create a DB");
    db.create_cf("cf1", &options).expect("Unable ");
}

{
    let mut cf_options = Options::default();
    cf_options.set_comparator("comparator", comparator);
    let descriptors = vec![ColumnFamilyDescriptor::new("cf1", cf_options)];

    let _ = DB::open_cf_descriptors(&options, &path, descriptors);
}

ํฅ๋ฏธ๋กœ์šด. ๋ถ„๋ช… ์ฒ˜์Œ์—๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋‹ค. ์œ„์˜ ๋‚ด์šฉ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๋‚˜์—๊ฒŒ ์ง๊ด€์ ์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. DB::open_cf() ๋ฐ DB::open()์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. DB::open ๋Œ€์‹  ์ดˆ๊ธฐ DB::open_cf์™€ ํ•จ๊ป˜ "๊ธฐ๋ณธ" cf ์ด๋ฆ„์„ ํฌํ•จํ•˜์—ฌ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์›๋ž˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์–ป์—ˆ์ง€๋งŒ ์˜ต์…˜์„ ์กด์ค‘ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ๋‚ด์šฉ์ด ํ›จ์”ฌ ๋” ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰