Rust-rocksdb: `cf_handle`을 잠금 ν•΄μ œ

에 λ§Œλ“  2019λ…„ 03μ›” 13일  Β·  12μ½”λ©˜νŠΈ  Β·  좜처: rust-rocksdb/rust-rocksdb

cf_handle ν•¨μˆ˜λŠ” μ’…μ’… 맀우 자주 호좜되며 κ΅¬ν˜„ν•˜λ €λ©΄ κΈ°λ³Έ 맡에 λŒ€ν•œ 읽기 μž κΈˆμ„ νšλ“ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이것이 ν•« κ²½λ‘œμ—μ„œ 호좜되면 μ„±λŠ₯에 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€. 잠금이 ν•„μš”ν•˜μ§€ μ•Šμ€ μ ‘κ·Ό λ°©μ‹μœΌλ‘œ μ „ν™˜ν•˜λŠ” 방법을 쑰사해야 ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, create_cf 및 drop_cf λ₯Ό λ§Œλ“€ 수 있고 λ‚΄λΆ€ 맡을 λ³€κ²½ν•˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜λŠ” DB λŒ€ν•œ λ³€κ²½ κ°€λŠ₯ν•œ μ°Έμ‘°λ₯Ό ν•„μš”λ‘œ ν•˜κ³  ν˜ΈμΆœμžκ°€ μˆœμ„œλŒ€λ‘œ μž κΈˆμ„ νšλ“ν•˜λŠ” μ±…μž„μ„ 지도둝 ν•©λ‹ˆλ‹€. DB λ₯Ό λ³€κ²½ν•©λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

예, κ·Έλ ‡μŠ΅λ‹ˆλ‹€. κ°€κΉŒμš΄ μ‹œμΌ 내에 μΆœμ‹œν•  κ³„νšμž…λ‹ˆλ‹€.

λͺ¨λ“  12 λŒ“κΈ€

이와 같이?

use std::collections::HashMap;

#[derive(Debug)]
struct ColumnFamily(i32);

struct DB {
    cfs:HashMap<i32,ColumnFamily>,
}

impl DB {
    fn new()->DB{
        let mut cfs = HashMap::new();
        cfs.insert(1,ColumnFamily(1));
        cfs.insert(2,ColumnFamily(2));
        DB{
            cfs
        }
    }
    fn get(&self,key:i32)->&ColumnFamily{
        self.cfs.get(&key).unwrap()
    }
    fn drop_key(&mut self,key:i32){
        self.cfs.remove(&key);
    }
}

fn main() {
    let mut f = DB::new();
    let a = f.get(1);
    println!("{:?}",a);
    f.drop_key(1);
    let c = f.get(2);
    println!("{:?}",c);
}

FWIWμ—μ„œ paritech의 포크 cf_handle λŠ” Copy 이며, μ΄λŠ” 기술적으둜 μ•ˆμ „ν•˜μ§€ μ•Šμ§€λ§Œ(OTOHλŠ” μ˜€μš©ν•˜κΈ° μ–΄λ ΅λ‹€κ³  μ£Όμž₯ν•  κ²ƒμž…λ‹ˆλ‹€) 잠금 μ‚¬μš©μ„ ν”Όν•©λ‹ˆλ‹€.

@hjiayz λ„€, μ•„μ£Ό λΉ„μŠ·ν•©λ‹ˆλ‹€.

이 변경을 μ‹œλ„ν–ˆμ„ λ•Œ(즉, μ—΄ νŒ¨λ°€λ¦¬λ₯Ό 생성/μ‚­μ œν•  λ•Œ &mut self ) ColumnFamily μ •μ˜ 방식에 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. PhantomData λ³€κ²½ κ°€λŠ₯ν•œ μ°Έμ‘°λ₯Ό μ €μž₯ν•˜μ—¬ λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό μ‹€νŒ¨ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

#[test]
fn property_cf_test() {
    let n = DBPath::new("_rust_rocksdb_property_cf_test");
    {
        let opts = Options::default();
        let mut db = DB::open_default(&n).unwrap(); // Notice the `mut`
        let cf = db.create_cf("cf1", &opts).unwrap();
        let value = db.property_value_cf(cf, "rocksdb.stats").unwrap().unwrap();

        assert!(value.contains("Stats"));
    }
}

μ†Œμš” DBμ—μ„œ λ©”μ†Œλ“œλ₯Ό 호좜 ν•  λ•Œ 였λ₯˜κ°€ λ°œμƒν•  &self 등을 db.property_value_cf() 및 전달 ColumnFamily (μ΄λŠ” μ €μž₯ν•œλ‹€ &mut μ—μ„œ db ν•„λ“œ):

error[E0502]: cannot borrow `db` as immutable because it is also borrowed as mutable
  --> tests/test_property.rs:39:21
   |
38 |         let cf = db.create_cf("cf1", &opts).unwrap();
   |                  -- mutable borrow occurs here
39 |         let value = db.property_value_cf(cf, "rocksdb.stats").unwrap().unwrap();
   |                     ^^                   -- mutable borrow later used here
   |                     |
   |                     immutable borrow occurs here

이 λ¬Έμ œμ— λŒ€ν•΄ 맀우 μš°μ•„ν•œ 방법이 μƒκ°λ‚˜μ§€ μ•Šμ§€λ§Œ, ν•œ 가지 μ˜΅μ…˜μ€ ColumnFamily μ—μ„œ create_cf ColumnFamily λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šκ³  λŒ€μ‹  cf_handle() λŒ€ν•œ 호좜둜 μ½”λ“œλ₯Ό μ†ŒλΉ„ν•˜λ„λ‘ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€

#[test]
fn property_cf_test() {
    let n = DBPath::new("_rust_rocksdb_property_cf_test");
    {
        let opts = Options::default();
        let mut db = DB::open_default(&n).unwrap();
        db.create_cf("cf1", &opts).unwrap();
        let cf = db.cf_handle("cf1").unwrap(); // Get the CF
        let value = db.property_value_cf(cf, "rocksdb.stats").unwrap().unwrap();

        assert!(value.contains("Stats"));
    }
}

λ³€ν™”ν•˜λŠ” 것 create_cf() λ°˜ν™˜ Result<(), Error> 수 ν—ˆμš© λ³€ν™”?

@dvdplm ColumnFamily 수λͺ…을 μΆ”κ°€ν•˜λŠ” 것은 κ²°κ΅­ 인체 곡학적인 κ΄€μ μ—μ„œ μ•½κ°„μ˜ μ•…λͺ½μ΄ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 수λͺ…이 ν•„μš”ν•˜μ§€ μ•Šμ§€λ§Œ μ‚­μ œλœ ν›„ μ—΄ νŒ¨λ°€λ¦¬ 포인터λ₯Ό μ‚¬μš©ν•  μœ„ν—˜μ΄ μ—†λŠ” μ ‘κ·Ό 방식을 μΆ”κ΅¬ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 이 λ³€κ²½ 사항은 cf_handle μ—μ„œ μž κΈˆμ„ μ œκ±°ν•˜λŠ” 방법에 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ¬Έμ œλŠ” μ•„λ§ˆ λ‚˜νƒ€λ‚˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

@iSynaptic에 λ™μ˜ν•©λ‹ˆλ‹€. λΆ„λͺ…νžˆ ColumnFamily λŒ€ν•œ μ°Έμ‘°λ₯Ό λ°˜ν™˜ν•˜λŠ” 것은 이 κ²½μš°μ—λ§Œ μ•ˆμ „ν•œ λ°©λ²•μž…λ‹ˆλ‹€.

그러면 #298이 병합될 수 μžˆμŠ΅λ‹ˆκΉŒ?

314

#314둜 ν•΄κ²°λ˜λ‚˜μš”? κ·Έλ ‡λ‹€λ©΄ μΆœμ‹œν•  κ³„νšμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

예, κ·Έλ ‡μŠ΅λ‹ˆλ‹€. κ°€κΉŒμš΄ μ‹œμΌ 내에 μΆœμ‹œν•  κ³„νšμž…λ‹ˆλ‹€.

@aleksuss μΆœμ‹œ ν˜„ν™©μ€? :)

@bkchr λ‹€μŒ 주에 ν•  것 κ°™μ•„μš”.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰