diff --git a/Cargo.lock b/Cargo.lock index d1372e6ac..5eab43f28 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -158,22 +158,23 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.47.3" +version = "0.49.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "clang-sys 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)", + "clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -446,10 +447,10 @@ dependencies = [ [[package]] name = "clang-sys" -version = "0.26.4" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1135,6 +1136,14 @@ dependencies = [ "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "gcc" version = "0.3.55" @@ -1199,6 +1208,11 @@ name = "glob" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "globset" version = "0.4.4" @@ -1666,12 +1680,12 @@ dependencies = [ [[package]] name = "librocksdb-sys" -version = "5.18.3" +version = "6.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bindgen 0.47.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bindgen 0.49.2 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", - "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2677,11 +2691,11 @@ dependencies = [ [[package]] name = "rocksdb" -version = "0.11.0" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", - "librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)", + "librocksdb-sys 6.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2904,6 +2918,11 @@ dependencies = [ "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "shlex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "siphasher" version = "0.2.3" @@ -3559,7 +3578,7 @@ dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rocksdb 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", "solana-budget-api 0.20.0", @@ -5438,7 +5457,7 @@ dependencies = [ "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum bech32 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "58946044516aa9dc922182e0d6e9d124a31aafe6b421614654eb27cf90cec09c" "checksum bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8ab639324e3ee8774d296864fbc0dbbb256cf1a41c490b94cba90c082915f92" -"checksum bindgen 0.47.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df683a55b54b41d5ea8ebfaebb5aa7e6b84e3f3006a78f010dadc9ca88469260" +"checksum bindgen 0.49.2 (registry+https://github.com/rust-lang/crates.io-index)" = "846a1fba6535362a01487ef6b10f0275faa12e5c5d835c5c1c627aabc46ccbd6" "checksum bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e84c238982c4b1e1ee668d136c510c67a13465279c0cb367ea6baf6310620a80" "checksum bit-vec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "02b4ff8b16e6076c3e14220b39fbc1fabb6737522281a388998046859400895f" "checksum bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f59bbe95d4e52a6398ec21238d31577f2b28a9d86807f06ca59d191d8440d0bb" @@ -5472,7 +5491,7 @@ dependencies = [ "checksum cgmath 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)" = "64a4b57c8f4e3a2e9ac07e0f6abc9c24b6fc9e1b54c3478cfb598f3d0023e51c" "checksum chashmap 2.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff41a3c2c1e39921b9003de14bf0439c7b63a9039637c291e1a64925d8ddfa45" "checksum chrono 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e8493056968583b0193c1bb04d6f7684586f3726992d6c573261941a895dbd68" -"checksum clang-sys 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ef0c1bcf2e99c649104bd7a7012d8f8802684400e03db0ec0af48583c6fa0e4" +"checksum clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81de550971c976f176130da4b2978d3b524eaa0fd9ac31f3ceb5ae1231fb4853" "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum clicolors-control 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "73abfd4c73d003a674ce5d2933fca6ce6c42480ea84a5ffe0a2dc39ed56300f9" @@ -5548,6 +5567,7 @@ dependencies = [ "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "45dc39533a6cae6da2b56da48edae506bb767ec07370f86f70fc062e9d435869" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" +"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" "checksum generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0ed1e761351b56f54eb9dcd0cfaca9fd0daecf93918e1cfc01c8a3d26ee7adcd" @@ -5556,6 +5576,7 @@ dependencies = [ "checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum getrandom 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e65cce4e5084b14874c4e7097f38cab54f47ee554f9194673456ea379dcc4c55" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" +"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" "checksum globset 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "925aa2cac82d8834e2b2a4415b6f6879757fb5c0928fc445ae76461a12eed8f2" "checksum grpcio 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c02fb3c9c44615973814c838f75d7898695d4d4b97a3e8cf52e9ccca30664b6f" "checksum grpcio-sys 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9d8d3b6d1a70b9dcb2545d1aff5b2c74652cb635f6ab6426be8fd201e9566b7e" @@ -5603,7 +5624,7 @@ dependencies = [ "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8" "checksum libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -"checksum librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19778314deaa7048f2ea7d07b8aa12e1c227acebe975a37eeab6d2f8c74e41b" +"checksum librocksdb-sys 6.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c4eb0cf7e0b5030e5db893882f1f77d8d7d10f815283aa7e800a3cfbfd4b20c5" "checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8912e782533a93a167888781b836336a6ca5da6175c05944c86cf28c31104dc" @@ -5716,7 +5737,7 @@ dependencies = [ "checksum reqwest 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)" = "2c2064233e442ce85c77231ebd67d9eca395207dec2127fe0bbedde4bd29a650" "checksum rgb 0.8.13 (registry+https://github.com/rust-lang/crates.io-index)" = "4f089652ca87f5a82a62935ec6172a534066c7b97be003cc8f702ee9a7a59c92" "checksum ring 0.16.7 (registry+https://github.com/rust-lang/crates.io-index)" = "796ae8317a07b04dffb1983bdc7045ccd02f741f0b411704f07fd35dbf99f757" -"checksum rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1651697fefd273bfb4fd69466cc2a9d20de557a0213b97233b22b5e95924b5e" +"checksum rocksdb 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d65bee9fe606c76fd90d6cc33b86bdafde0981b8a6b2d190ec1267e0d065baf8" "checksum rpassword 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f072d931f11a96546efd97642e1e75e807345aced86b947f9239102f262d0fcd" "checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" @@ -5743,6 +5764,7 @@ dependencies = [ "checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" "checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" +"checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1cc9c640a4adbfbcc11ffb95efe5aa7af7309e002adab54b185507dbf2377b99" diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 72dd6bca0..9184607df 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -43,7 +43,7 @@ tempfile = "3.1.0" [dependencies.rocksdb] # Avoid the vendored bzip2 within rocksdb-sys that can cause linker conflicts # when also using the bzip2 crate -version = "0.11.0" +version = "0.12.4" default-features = false features = ["lz4"] diff --git a/ledger/src/blocktree.rs b/ledger/src/blocktree.rs index 5d0b13d4c..77118cfcd 100644 --- a/ledger/src/blocktree.rs +++ b/ledger/src/blocktree.rs @@ -2,8 +2,7 @@ //! Proof of History ledger as well as iterative read, append write, and random //! access read to a persistent file-based ledger. use crate::blocktree_db::{ - columns as cf, BatchProcessor, Column, Database, IteratorDirection, IteratorMode, LedgerColumn, - WriteBatch, + columns as cf, Column, Database, IteratorDirection, IteratorMode, LedgerColumn, WriteBatch, }; pub use crate::blocktree_db::{BlocktreeError, Result}; pub use crate::blocktree_meta::SlotMeta; @@ -55,7 +54,6 @@ pub struct Blocktree { index_cf: LedgerColumn, data_shred_cf: LedgerColumn, code_shred_cf: LedgerColumn, - batch_processor: Arc>, last_root: Arc>, pub new_shreds_signals: Vec>, pub completed_slots_senders: Vec>>, @@ -70,8 +68,6 @@ impl Blocktree { // Open the database let db = Database::open(&blocktree_path)?; - let batch_processor = unsafe { Arc::new(RwLock::new(db.batch_processor())) }; - // Create the metadata column family let meta_cf = db.column(); @@ -109,7 +105,6 @@ impl Blocktree { data_shred_cf, code_shred_cf, new_shreds_signals: vec![], - batch_processor, completed_slots_senders: vec![], last_root, }) @@ -179,54 +174,52 @@ impl Blocktree { let from_slot = Some(from_slot); let batch_end = Some(batch_end); - unsafe { - let mut batch_processor = self.db.batch_processor(); - let mut write_batch = batch_processor - .batch() - .expect("Database Error: Failed to get write batch"); - let end = self - .meta_cf + let mut write_batch = self + .db + .batch() + .expect("Database Error: Failed to get write batch"); + let end = self + .meta_cf + .delete_slot(&mut write_batch, from_slot, batch_end) + .unwrap_or(false) + && self + .erasure_meta_cf .delete_slot(&mut write_batch, from_slot, batch_end) .unwrap_or(false) - && self - .erasure_meta_cf - .delete_slot(&mut write_batch, from_slot, batch_end) - .unwrap_or(false) - && self - .data_shred_cf - .delete_slot(&mut write_batch, from_slot, batch_end) - .unwrap_or(false) - && self - .code_shred_cf - .delete_slot(&mut write_batch, from_slot, batch_end) - .unwrap_or(false) - && self - .orphans_cf - .delete_slot(&mut write_batch, from_slot, batch_end) - .unwrap_or(false) - && self - .index_cf - .delete_slot(&mut write_batch, from_slot, batch_end) - .unwrap_or(false) - && self - .dead_slots_cf - .delete_slot(&mut write_batch, from_slot, batch_end) - .unwrap_or(false) - && self - .db - .column::() - .delete_slot(&mut write_batch, from_slot, batch_end) - .unwrap_or(false); + && self + .data_shred_cf + .delete_slot(&mut write_batch, from_slot, batch_end) + .unwrap_or(false) + && self + .code_shred_cf + .delete_slot(&mut write_batch, from_slot, batch_end) + .unwrap_or(false) + && self + .orphans_cf + .delete_slot(&mut write_batch, from_slot, batch_end) + .unwrap_or(false) + && self + .index_cf + .delete_slot(&mut write_batch, from_slot, batch_end) + .unwrap_or(false) + && self + .dead_slots_cf + .delete_slot(&mut write_batch, from_slot, batch_end) + .unwrap_or(false) + && self + .db + .column::() + .delete_slot(&mut write_batch, from_slot, batch_end) + .unwrap_or(false); - if let Err(e) = batch_processor.write(write_batch) { - error!( - "Error: {:?} while submitting write batch for slot {:?} retrying...", - e, from_slot - ); - return Err(e); - } - Ok(end) + if let Err(e) = self.db.write(write_batch) { + error!( + "Error: {:?} while submitting write batch for slot {:?} retrying...", + e, from_slot + ); + return Err(e); } + Ok(end) } pub fn erasure_meta(&self, slot: u64, set_index: u64) -> Result> { @@ -367,8 +360,7 @@ impl Blocktree { leader_schedule: Option<&Arc>, ) -> Result<()> { let db = &*self.db; - let mut batch_processor = self.batch_processor.write().unwrap(); - let mut write_batch = batch_processor.batch()?; + let mut write_batch = db.batch()?; let mut just_inserted_coding_shreds = HashMap::new(); let mut just_inserted_data_shreds = HashMap::new(); @@ -437,7 +429,7 @@ impl Blocktree { write_batch.put::(slot, index)?; } - batch_processor.write(write_batch)?; + self.db.write(write_batch)?; if should_signal { for signal in &self.new_shreds_signals { @@ -1098,16 +1090,13 @@ impl Blocktree { } pub fn set_roots(&self, rooted_slots: &[u64]) -> Result<()> { - unsafe { - let mut batch_processor = self.db.batch_processor(); - let mut write_batch = batch_processor.batch()?; - for slot in rooted_slots { - write_batch.put::(*slot, &true)?; - } - - batch_processor.write(write_batch)?; + let mut write_batch = self.db.batch()?; + for slot in rooted_slots { + write_batch.put::(*slot, &true)?; } + self.db.write(write_batch)?; + let mut last_root = self.last_root.write().unwrap(); if *last_root == std::u64::MAX { *last_root = 0; diff --git a/ledger/src/blocktree_db.rs b/ledger/src/blocktree_db.rs index f778cdec2..7867831c1 100644 --- a/ledger/src/blocktree_db.rs +++ b/ledger/src/blocktree_db.rs @@ -471,11 +471,6 @@ pub struct Database { backend: Arc, } -#[derive(Debug, Clone)] -pub struct BatchProcessor { - backend: Arc, -} - #[derive(Debug, Clone)] pub struct LedgerColumn where @@ -485,10 +480,9 @@ where column: PhantomData, } -pub struct WriteBatch { +pub struct WriteBatch<'a> { write_batch: RWriteBatch, - backend: PhantomData, - map: HashMap<&'static str, ColumnFamily>, + map: HashMap<&'static str, ColumnFamily<'a>>, } impl Database { @@ -552,21 +546,8 @@ impl Database { self.backend.raw_iterator_cf(cf) } - // Note this returns an object that can be used to directly write to multiple column families. - // This circumvents the synchronization around APIs that in Blocktree that use - // blocktree.batch_processor, so this API should only be used if the caller is sure they - // are writing to data in columns that will not be corrupted by any simultaneous blocktree - // operations. - pub unsafe fn batch_processor(&self) -> BatchProcessor { - BatchProcessor { - backend: Arc::clone(&self.backend), - } - } -} - -impl BatchProcessor { - pub fn batch(&mut self) -> Result { - let db_write_batch = self.backend.batch()?; + pub fn batch(&self) -> Result { + let write_batch = self.backend.batch()?; let map = self .backend .columns() @@ -574,14 +555,10 @@ impl BatchProcessor { .map(|desc| (desc, self.backend.cf_handle(desc))) .collect(); - Ok(WriteBatch { - write_batch: db_write_batch, - backend: PhantomData, - map, - }) + Ok(WriteBatch { write_batch, map }) } - pub fn write(&mut self, batch: WriteBatch) -> Result<()> { + pub fn write(&self, batch: WriteBatch) -> Result<()> { self.backend.write(batch.write_batch) } } @@ -676,7 +653,7 @@ where } } -impl WriteBatch { +impl<'a> WriteBatch<'a> { pub fn put_bytes(&mut self, key: C::Index, bytes: &[u8]) -> Result<()> { self.write_batch .put_cf(self.get_cf::(), &C::key(key), bytes)?; @@ -697,7 +674,7 @@ impl WriteBatch { } #[inline] - fn get_cf(&self) -> ColumnFamily { + fn get_cf(&self) -> ColumnFamily<'a> { self.map[C::NAME] } }