Skip to content

Commit 9ab46a6

Browse files
authored
Optimize allocations for large values (#245)
* Update dependencies * Optimize allocations * Version bump
1 parent ee51351 commit 9ab46a6

File tree

8 files changed

+228
-147
lines changed

8 files changed

+228
-147
lines changed

Cargo.toml

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "parity-db"
3-
version = "0.5.0"
3+
version = "0.5.1"
44
authors = ["Parity Technologies <[email protected]>"]
55
edition = "2021"
66
license = "MIT OR Apache-2.0"
@@ -13,28 +13,28 @@ instrumentation = []
1313
bench = []
1414

1515
[dependencies]
16-
blake2 = "0.10.4"
17-
crc32fast = "1.2.0"
16+
blake2 = "0.10.6"
17+
crc32fast = "1.4.2"
1818
fs2 = "0.4.3"
19-
hex = "0.4.2"
19+
hex = "0.4.3"
2020
libc = "0.2"
21-
log = "0.4.8"
22-
lz4 = "1.24.0"
23-
memmap2 = "0.5"
24-
parking_lot = "0.12.0"
25-
rand = "0.8.4"
21+
log = "0.4.27"
22+
lz4 = "1.28.1"
23+
memmap2 = "0.9"
24+
parking_lot = "0.12.3"
25+
rand = "0.9.1"
2626
snap = "1"
27-
loom = { version = "0.5.1", optional = true }
28-
siphasher = "0.3.10"
27+
loom = { version = "0.7.2", optional = true }
28+
siphasher = "1.0.1"
2929

3030
[target.'cfg(windows)'.dependencies]
3131
winapi = "0.3.9"
3232

3333
[dev-dependencies]
34-
env_logger = { version = "0.10.0", default-features = false, features = ["auto-color", "humantime"] }
35-
fdlimit = "0.2.1"
36-
rand = { version = "0.8.2", features = ["small_rng"] }
37-
tempfile = "3.2"
34+
env_logger = { version = "0.11.8", default-features = false, features = ["auto-color", "humantime"] }
35+
fdlimit = "0.3.0"
36+
rand = { version = "0.9.1", features = ["small_rng"] }
37+
tempfile = "3.19"
3838

3939
[profile.release]
4040
panic = "abort"

admin/Cargo.toml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ edition = "2018"
77

88
[dependencies]
99
clap = { version = "4", features = ["derive"] }
10-
env_logger = { version = "0.10.0", default-features = false, features = ["auto-color", "humantime"] }
11-
fdlimit = "0.2.1"
12-
log = "0.4.8"
10+
env_logger = { version = "0.11.8", default-features = false, features = ["auto-color", "humantime"] }
11+
fdlimit = "0.3.0"
12+
log = "0.4.27"
1313
parity-db = { path = ".." }
14-
parking_lot = "0.12.0"
15-
rand = { version = "0.8.5", features = ["small_rng"] }
16-
blake2 = "0.10.4"
17-
siphasher = "0.3.10"
14+
parking_lot = "0.12.3"
15+
rand = { version = "0.9.1", features = ["small_rng"] }
16+
blake2 = "0.10.6"
17+
siphasher = "1.0.1"
1818

1919
[target.'cfg(not(target_env = "msvc"))'.dependencies]
20-
jemallocator = "0.5.0"
20+
jemallocator = "0.5.4"

admin/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
1111

1212
fn main() {
13-
fdlimit::raise_fd_limit();
13+
fdlimit::raise_fd_limit().unwrap();
1414

1515
parity_db_admin::run().unwrap();
1616
}

src/db.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ impl DbInner {
275275
if let Some(v) = overlay.get(col as usize).and_then(|o| o.get(&key)) {
276276
return Ok(v.map(|i| i.value().clone()))
277277
}
278+
std::mem::drop(overlay);
278279
// Go into tables and log overlay.
279280
let log = self.log.overlays();
280281
Ok(column.get(&key, log)?.map(|(v, _rc)| v))
@@ -284,6 +285,7 @@ impl DbInner {
284285
if let Some(l) = overlay.get(col as usize).and_then(|o| o.btree_get(key)) {
285286
return Ok(l.map(|i| i.value().clone()))
286287
}
288+
std::mem::drop(overlay);
287289
// We lock log, if btree structure changed while reading that would be an issue.
288290
let log = self.log.overlays().read();
289291
column.with_locked(|btree| BTreeTable::get(key, &*log, btree))
@@ -1814,7 +1816,7 @@ impl Db {
18141816
if let Err(e) = self.inner.kill_logs(&self.inner) {
18151817
log::warn!(target: "parity-db", "Shutdown error: {:?}", e);
18161818
}
1817-
if let Err(e) = self.inner.lock_file.unlock() {
1819+
if let Err(e) = fs2::FileExt::unlock(&self.inner.lock_file) {
18181820
log::debug!(target: "parity-db", "Error removing file lock: {:?}", e);
18191821
}
18201822
}
@@ -2853,12 +2855,12 @@ mod tests {
28532855
let mut iter = db.iter(0).unwrap();
28542856

28552857
for _ in 0..100 {
2856-
let at = rng.gen_range(0u64..=1024);
2858+
let at = rng.random_range(0u64..=1024);
28572859
iter.seek(&at.to_be_bytes()).unwrap();
28582860

2859-
let mut prev_run: bool = rng.gen();
2861+
let mut prev_run: bool = rng.random();
28602862
let at = if prev_run {
2861-
let take = rng.gen_range(1..100);
2863+
let take = rng.random_range(1..100);
28622864
let got = std::iter::from_fn(|| iter.next().unwrap())
28632865
.map(|(k, _)| u64::from_be_bytes(k.try_into().unwrap()))
28642866
.take(take)
@@ -2877,7 +2879,7 @@ mod tests {
28772879
};
28782880

28792881
let at = {
2880-
let take = rng.gen_range(1..100);
2882+
let take = rng.random_range(1..100);
28812883
let got = std::iter::from_fn(|| iter.prev().unwrap())
28822884
.map(|(k, _)| u64::from_be_bytes(k.try_into().unwrap()))
28832885
.take(take)
@@ -2895,7 +2897,7 @@ mod tests {
28952897
expected.last().copied().unwrap_or(at)
28962898
};
28972899

2898-
let take = rng.gen_range(1..100);
2900+
let take = rng.random_range(1..100);
28992901
let mut got = std::iter::from_fn(|| iter.next().unwrap())
29002902
.map(|(k, _)| u64::from_be_bytes(k.try_into().unwrap()))
29012903
.take(take)
@@ -2910,7 +2912,7 @@ mod tests {
29102912
assert_eq!(got, expected);
29112913
}
29122914

2913-
let take = rng.gen_range(20..100);
2915+
let take = rng.random_range(20..100);
29142916
iter.seek_to_last().unwrap();
29152917
let got = std::iter::from_fn(|| iter.prev().unwrap())
29162918
.map(|(k, _)| u64::from_be_bytes(k.try_into().unwrap()))
@@ -3007,7 +3009,7 @@ mod tests {
30073009

30083010
#[test]
30093011
fn test_random() {
3010-
fdlimit::raise_fd_limit();
3012+
fdlimit::raise_fd_limit().unwrap();
30113013
for i in 0..100 {
30123014
test_random_inner(60, 60, i);
30133015
}

src/index.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,7 @@ mod test {
681681
let mut keys = [0u64; CHUNK_ENTRIES];
682682
let mut rng = rand::prelude::SmallRng::from_seed(Default::default());
683683
for i in 0..CHUNK_ENTRIES {
684-
keys[i] = rng.gen();
684+
keys[i] = rng.random();
685685
let partial_key = Entry::extract_key(keys[i], 18);
686686
let e = Entry::new(Address::new(0, 0), partial_key, 18);
687687
entries[i] = e;
@@ -763,7 +763,7 @@ mod test {
763763
let mut keys = [0u64; CHUNK_ENTRIES];
764764
let mut rng = rand::prelude::SmallRng::from_seed(Default::default());
765765
for i in 0..CHUNK_ENTRIES {
766-
keys[i] = rng.gen();
766+
keys[i] = rng.random();
767767
let partial_key = Entry::extract_key(keys[i], 18);
768768
let e = Entry::new(Address::new(0, 0), partial_key, 18);
769769
IndexTable::write_entry(&e, i, &mut chunk);

src/options.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ use crate::{
99
use rand::Rng;
1010
use std::{collections::HashMap, path::Path};
1111

12-
pub const CURRENT_VERSION: u32 = 8;
12+
pub const CURRENT_VERSION: u32 = 9;
1313
// TODO on last supported 5, remove MULTIHEAD_V4 and MULTIPART_V4
1414
// TODO on last supported 8, remove XOR with salt in column::hash
15+
// TODO on last supported 9, remove MULTIHEAD_V8
1516
const LAST_SUPPORTED_VERSION: u32 = 4;
1617

1718
pub const DEFAULT_COMPRESSION_THRESHOLD: u32 = 4096;
@@ -250,7 +251,7 @@ impl Options {
250251
}
251252
Ok(meta)
252253
} else if create {
253-
let s: Salt = self.salt.unwrap_or_else(|| rand::thread_rng().gen());
254+
let s: Salt = self.salt.unwrap_or_else(|| rand::rng().random());
254255
self.write_metadata(&self.path, &s)?;
255256
Ok(Metadata { version: CURRENT_VERSION, columns: self.columns.clone(), salt: s })
256257
} else {

src/ref_count.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -479,8 +479,8 @@ mod test {
479479
let mut addresses = [0u64; CHUNK_ENTRIES];
480480
let mut rng = rand::prelude::SmallRng::from_seed(Default::default());
481481
for i in 0..CHUNK_ENTRIES {
482-
addresses[i] = rng.gen();
483-
let ref_count = rng.gen();
482+
addresses[i] = rng.random();
483+
let ref_count = rng.random();
484484
let e = Entry::new(Address::from_u64(addresses[i]), ref_count);
485485
entries[i] = e;
486486
RefCountTable::write_entry(&e, i, &mut chunk);
@@ -528,8 +528,8 @@ mod test {
528528
let mut addresses = [0u64; CHUNK_ENTRIES];
529529
let mut rng = rand::prelude::SmallRng::from_seed(Default::default());
530530
for i in 0..CHUNK_ENTRIES {
531-
addresses[i] = rng.gen();
532-
let ref_count = rng.gen();
531+
addresses[i] = rng.random();
532+
let ref_count = rng.random();
533533
let e = Entry::new(Address::from_u64(addresses[i]), ref_count);
534534
RefCountTable::write_entry(&e, i, &mut chunk);
535535
}

0 commit comments

Comments
 (0)