Skip to content

Commit 04a338a

Browse files
committed
Add PinnedMemoryCache::size
1 parent 1cc5daf commit 04a338a

File tree

5 files changed

+96
-25
lines changed

5 files changed

+96
-25
lines changed

packages/vm/src/cache.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ where
123123
stats: cache.stats,
124124
elements_pinned_memory_cache: cache.pinned_memory_cache.len(),
125125
elements_memory_cache: cache.memory_cache.len(),
126-
size_pinned_memory_cache: 0,
126+
size_pinned_memory_cache: cache.pinned_memory_cache.size(),
127127
size_memory_cache: cache.memory_cache.size(),
128128
}
129129
}
@@ -185,22 +185,28 @@ where
185185
// Try to get module from the memory cache
186186
if let Some(module) = cache.memory_cache.load(checksum)? {
187187
cache.stats.hits_memory_cache += 1;
188-
return cache.pinned_memory_cache.store(checksum, module);
188+
return cache
189+
.pinned_memory_cache
190+
.store(checksum, module.module, module.size);
189191
}
190192

191193
// Try to get module from file system cache
192194
let store = make_runtime_store(Some(cache.instance_memory_limit));
193-
if let Some((module, _)) = cache.fs_cache.load(checksum, &store)? {
195+
if let Some((module, module_size)) = cache.fs_cache.load(checksum, &store)? {
194196
cache.stats.hits_fs_cache += 1;
195-
return cache.pinned_memory_cache.store(checksum, module);
197+
return cache
198+
.pinned_memory_cache
199+
.store(checksum, module, module_size);
196200
}
197201

198202
// Re-compile from original Wasm bytecode
199203
let code = self.load_wasm_with_path(&cache.wasm_path, checksum)?;
200204
let module = compile(&code, Some(cache.instance_memory_limit))?;
201205
// Store into the fs cache too
202-
cache.fs_cache.store(checksum, &module)?;
203-
cache.pinned_memory_cache.store(checksum, module)
206+
let module_size = cache.fs_cache.store(checksum, &module)?;
207+
cache
208+
.pinned_memory_cache
209+
.store(checksum, module, module_size)
204210
}
205211

206212
/// Unpins a Module, i.e. removes it from the pinned memory cache.
@@ -235,8 +241,12 @@ where
235241
// Get module from memory cache
236242
if let Some(module) = cache.memory_cache.load(checksum)? {
237243
cache.stats.hits_memory_cache += 1;
238-
let instance =
239-
Instance::from_module(&module, backend, options.gas_limit, options.print_debug)?;
244+
let instance = Instance::from_module(
245+
&module.module,
246+
backend,
247+
options.gas_limit,
248+
options.print_debug,
249+
)?;
240250
return Ok(instance);
241251
}
242252

packages/vm/src/modules/in_memory_cache.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use clru::{CLruCache, CLruCacheConfig, WeightScale};
22
use std::collections::hash_map::RandomState;
3+
use std::num::NonZeroUsize;
34
use wasmer::Module;
45

6+
use super::sized_module::SizedModule;
57
use crate::{Checksum, Size, VmError, VmResult};
6-
use std::num::NonZeroUsize;
78

89
// Minimum module size.
910
// Based on `examples/module_size.sh`, and the cosmwasm-plus contracts.
@@ -14,12 +15,6 @@ use std::num::NonZeroUsize;
1415
// Which is a very small percentage (~0.03%) of our typical cache memory budget (2 GB).
1516
const MINIMUM_MODULE_SIZE: Size = Size::kibi(250);
1617

17-
#[derive(Debug)]
18-
struct SizedModule {
19-
pub module: Module,
20-
pub size: usize,
21-
}
22-
2318
#[derive(Debug)]
2419
struct SizeScale;
2520

@@ -64,10 +59,10 @@ impl InMemoryCache {
6459
}
6560

6661
/// Looks up a module in the cache and creates a new module
67-
pub fn load(&mut self, checksum: &Checksum) -> VmResult<Option<Module>> {
62+
pub fn load(&mut self, checksum: &Checksum) -> VmResult<Option<SizedModule>> {
6863
if let Some(modules) = &mut self.modules {
6964
match modules.get(checksum) {
70-
Some(sized_module) => Ok(Some(sized_module.module.clone())),
65+
Some(module) => Ok(Some(module.clone())),
7166
None => Ok(None),
7267
}
7368
} else {
@@ -167,7 +162,7 @@ mod tests {
167162

168163
// Ensure cached module can be executed
169164
{
170-
let instance = WasmerInstance::new(&cached, &imports! {}).unwrap();
165+
let instance = WasmerInstance::new(&cached.module, &imports! {}).unwrap();
171166
set_remaining_points(&instance, TESTING_GAS_LIMIT);
172167
let add_one = instance.exports.get_function("add_one").unwrap();
173168
let result = add_one.call(&[42.into()]).unwrap();

packages/vm/src/modules/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
mod file_system_cache;
22
mod in_memory_cache;
33
mod pinned_memory_cache;
4+
mod sized_module;
45

56
pub use file_system_cache::FileSystemCache;
67
pub use in_memory_cache::InMemoryCache;

packages/vm/src/modules/pinned_memory_cache.rs

Lines changed: 65 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use std::collections::HashMap;
22
use wasmer::Module;
33

4+
use super::sized_module::SizedModule;
45
use crate::{Checksum, VmResult};
56

67
/// An pinned in memory module cache
78
pub struct PinnedMemoryCache {
8-
modules: HashMap<Checksum, Module>,
9+
modules: HashMap<Checksum, SizedModule>,
910
}
1011

1112
impl PinnedMemoryCache {
@@ -16,8 +17,8 @@ impl PinnedMemoryCache {
1617
}
1718
}
1819

19-
pub fn store(&mut self, checksum: &Checksum, module: Module) -> VmResult<()> {
20-
self.modules.insert(*checksum, module);
20+
pub fn store(&mut self, checksum: &Checksum, module: Module, size: usize) -> VmResult<()> {
21+
self.modules.insert(*checksum, SizedModule { module, size });
2122
Ok(())
2223
}
2324

@@ -31,7 +32,7 @@ impl PinnedMemoryCache {
3132
/// Looks up a module in the cache and creates a new module
3233
pub fn load(&mut self, checksum: &Checksum) -> VmResult<Option<Module>> {
3334
match self.modules.get(checksum) {
34-
Some(module) => Ok(Some(module.clone())),
35+
Some(module) => Ok(Some(module.module.clone())),
3536
None => Ok(None),
3637
}
3738
}
@@ -45,6 +46,14 @@ impl PinnedMemoryCache {
4546
pub fn len(&self) -> usize {
4647
self.modules.len()
4748
}
49+
50+
/// Returns cumulative size of all elements in the cache.
51+
///
52+
/// This is based on the values provided with `store`. No actual
53+
/// memory size is measured here.
54+
pub fn size(&self) -> usize {
55+
self.modules.iter().map(|(_, module)| module.size).sum()
56+
}
4857
}
4958

5059
#[cfg(test)]
@@ -90,7 +99,7 @@ mod tests {
9099
}
91100

92101
// Store module
93-
cache.store(&checksum, original).unwrap();
102+
cache.store(&checksum, original, 0).unwrap();
94103

95104
// Load module
96105
let cached = cache.load(&checksum).unwrap().unwrap();
@@ -126,7 +135,7 @@ mod tests {
126135

127136
// Add
128137
let original = compile(&wasm, None).unwrap();
129-
cache.store(&checksum, original).unwrap();
138+
cache.store(&checksum, original, 0).unwrap();
130139

131140
assert_eq!(cache.has(&checksum), true);
132141

@@ -157,7 +166,7 @@ mod tests {
157166

158167
// Add
159168
let original = compile(&wasm, None).unwrap();
160-
cache.store(&checksum, original).unwrap();
169+
cache.store(&checksum, original, 0).unwrap();
161170

162171
assert_eq!(cache.len(), 1);
163172

@@ -166,4 +175,53 @@ mod tests {
166175

167176
assert_eq!(cache.len(), 0);
168177
}
178+
179+
#[test]
180+
fn size_works() {
181+
let mut cache = PinnedMemoryCache::new();
182+
183+
// Create module
184+
let wasm1 = wat::parse_str(
185+
r#"(module
186+
(type $t0 (func (param i32) (result i32)))
187+
(func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32)
188+
get_local $p0
189+
i32.const 1
190+
i32.add)
191+
)"#,
192+
)
193+
.unwrap();
194+
let checksum1 = Checksum::generate(&wasm1);
195+
let wasm2 = wat::parse_str(
196+
r#"(module
197+
(type $t0 (func (param i32) (result i32)))
198+
(func $add_one (export "add_two") (type $t0) (param $p0 i32) (result i32)
199+
get_local $p0
200+
i32.const 2
201+
i32.add)
202+
)"#,
203+
)
204+
.unwrap();
205+
let checksum2 = Checksum::generate(&wasm2);
206+
207+
assert_eq!(cache.size(), 0);
208+
209+
// Add 1
210+
let original = compile(&wasm1, None).unwrap();
211+
cache.store(&checksum1, original, 500).unwrap();
212+
assert_eq!(cache.size(), 500);
213+
214+
// Add 2
215+
let original = compile(&wasm2, None).unwrap();
216+
cache.store(&checksum2, original, 300).unwrap();
217+
assert_eq!(cache.size(), 800);
218+
219+
// Remove 1
220+
cache.remove(&checksum1).unwrap();
221+
assert_eq!(cache.size(), 300);
222+
223+
// Remove 2
224+
cache.remove(&checksum2).unwrap();
225+
assert_eq!(cache.size(), 0);
226+
}
169227
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
use wasmer::Module;
2+
3+
#[derive(Debug, Clone)]
4+
pub struct SizedModule {
5+
pub module: Module,
6+
pub size: usize,
7+
}

0 commit comments

Comments
 (0)