Skip to content

Commit 9f8b589

Browse files
authored
Merge pull request #1848 from input-output-hk/jpraynaud/fix-resource-pool-reset
fix: Resource not Reset when given back to Pool
2 parents a2d3fe1 + 6627346 commit 9f8b589

File tree

3 files changed

+47
-8
lines changed

3 files changed

+47
-8
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-common/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-common"
3-
version = "0.4.33"
3+
version = "0.4.34"
44
description = "Common types, interfaces, and utilities for Mithril nodes."
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-common/src/resource_pool.rs

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ impl<T: Reset + Send + Sync> ResourcePool<T> {
7676
/// A resource is given back to the pool only if the discriminant matches
7777
/// and if the pool is not already full
7878
pub fn give_back_resource(&self, resource: T, discriminant: u64) -> StdResult<()> {
79+
let mut resource = resource;
80+
resource.reset()?;
7981
if self.count()? == self.size {
8082
// Pool is full
8183
return Ok(());
@@ -103,12 +105,9 @@ impl<T: Reset + Send + Sync> ResourcePool<T> {
103105
resource_pool_item: ResourcePoolItem<'_, T>,
104106
) -> StdResult<()> {
105107
let mut resource_pool_item = resource_pool_item;
106-
resource_pool_item.take().map(|resource_item| {
107-
let mut resource_item = resource_item;
108-
resource_item.reset()?;
109-
110-
self.give_back_resource(resource_item, self.discriminant()?)
111-
});
108+
resource_pool_item
109+
.take()
110+
.map(|resource_item| self.give_back_resource(resource_item, self.discriminant()?));
112111

113112
Ok(())
114113
}
@@ -228,6 +227,20 @@ mod tests {
228227

229228
use super::*;
230229

230+
/// Resource for testing reset
231+
#[derive(Default)]
232+
struct TestResetResource {
233+
reset: bool,
234+
}
235+
236+
impl Reset for TestResetResource {
237+
fn reset(&mut self) -> StdResult<()> {
238+
self.reset = true;
239+
240+
Ok(())
241+
}
242+
}
243+
231244
#[test]
232245
fn test_resource_pool_acquire_returns_resource_when_available() {
233246
let pool_size = 10;
@@ -369,4 +382,30 @@ mod tests {
369382

370383
assert_eq!(pool.count().unwrap(), pool_size - 1);
371384
}
385+
386+
#[tokio::test]
387+
async fn test_resource_pool_is_reset_when_given_back() {
388+
let pool = ResourcePool::<TestResetResource>::new(1, vec![TestResetResource::default()]);
389+
390+
let mut resource_item = pool.acquire_resource(Duration::from_millis(10)).unwrap();
391+
let resource = resource_item.take().unwrap();
392+
pool.give_back_resource(resource, pool.discriminant().unwrap())
393+
.unwrap();
394+
395+
// Acquire the resource again and make sure it has been reseted
396+
let resource_item = pool.acquire_resource(Duration::from_millis(10)).unwrap();
397+
assert!(resource_item.reset);
398+
}
399+
400+
#[tokio::test]
401+
async fn test_resource_pool_item_is_reset_when_given_back() {
402+
let pool = ResourcePool::<TestResetResource>::new(1, vec![TestResetResource::default()]);
403+
404+
let resource_item = pool.acquire_resource(Duration::from_millis(10)).unwrap();
405+
pool.give_back_resource_pool_item(resource_item).unwrap();
406+
407+
// Acquire the resource again and make sure it has been reseted
408+
let resource_item = pool.acquire_resource(Duration::from_millis(10)).unwrap();
409+
assert!(resource_item.reset);
410+
}
372411
}

0 commit comments

Comments
 (0)