Skip to content

Commit 3d1e329

Browse files
committed
refactor: ResourcePoolItem take and drop implementation
1 parent e878d34 commit 3d1e329

File tree

2 files changed

+25
-31
lines changed

2 files changed

+25
-31
lines changed

mithril-aggregator/src/services/prover.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,8 @@ impl ProverService for MithrilProverService {
138138
let mk_trees = BTreeMap::from_iter(mk_trees?);
139139

140140
// 3 - Compute block range roots Merkle map
141-
let mut mk_map = self
142-
.mk_map_pool
143-
.acquire_resource(Duration::from_millis(1000))?;
141+
let acquire_timeout = Duration::from_millis(1000);
142+
let mut mk_map = self.mk_map_pool.acquire_resource(acquire_timeout)?;
144143

145144
// 4 - Enrich the Merkle map with the block ranges Merkle trees
146145
for (block_range, mk_tree) in mk_trees {
@@ -149,8 +148,10 @@ impl ProverService for MithrilProverService {
149148

150149
// 5 - Compute the proof for all transactions
151150
if let Ok(mk_proof) = mk_map.compute_proof(transaction_hashes) {
152-
self.mk_map_pool
153-
.give_back_resource(mk_map.into_inner(), mk_map.discriminant())?;
151+
if let Some(resource) = mk_map.take() {
152+
self.mk_map_pool
153+
.give_back_resource(resource, mk_map.discriminant())?;
154+
}
154155

155156
let transaction_hashes_certified: Vec<TransactionHash> = transaction_hashes
156157
.iter()

mithril-common/src/resource_pool.rs

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ use crate::StdResult;
1616
pub enum ResourcePoolError {
1717
/// Internal Mutex is poisoned
1818
#[error("Poisoned mutex caused error during acquire lock on resource pool")]
19-
PoisonedLock(),
19+
PoisonedLock,
2020

2121
/// Acquire resource has timed out
2222
#[error("Acquire resource has timed out")]
23-
AcquireTimeout(),
23+
AcquireTimeout,
2424
}
2525

2626
/// Resource pool implementation (FIFO)
@@ -54,16 +54,16 @@ impl<T: Send + Sync> ResourcePool<T> {
5454
let mut resources = self
5555
.resources
5656
.lock()
57-
.map_err(|_| ResourcePoolError::PoisonedLock())
57+
.map_err(|_| ResourcePoolError::PoisonedLock)
5858
.with_context(|| "Resource pool 'acquire_resource' failed locking Mutex")?;
5959
while resources.is_empty() {
6060
let (resources_locked, wait_result) = self
6161
.not_empty
6262
.wait_timeout(resources, timeout)
63-
.map_err(|_| ResourcePoolError::PoisonedLock())
63+
.map_err(|_| ResourcePoolError::PoisonedLock)
6464
.with_context(|| "Resource pool 'acquire_resource' failed waiting for resource")?;
6565
if wait_result.timed_out() {
66-
return Err(ResourcePoolError::AcquireTimeout())
66+
return Err(ResourcePoolError::AcquireTimeout)
6767
.with_context(|| "Resource pool 'acquire_resource' has timed out");
6868
}
6969
resources = resources_locked;
@@ -83,7 +83,7 @@ impl<T: Send + Sync> ResourcePool<T> {
8383
let mut resources = self
8484
.resources
8585
.lock()
86-
.map_err(|_| ResourcePoolError::PoisonedLock())
86+
.map_err(|_| ResourcePoolError::PoisonedLock)
8787
.with_context(|| "Resource pool 'give_back_resource' failed locking Mutex")?;
8888
if self.discriminant()? != discriminant {
8989
// Stale resource
@@ -106,7 +106,7 @@ impl<T: Send + Sync> ResourcePool<T> {
106106
Ok(*self
107107
.discriminant
108108
.lock()
109-
.map_err(|_| ResourcePoolError::PoisonedLock())
109+
.map_err(|_| ResourcePoolError::PoisonedLock)
110110
.with_context(|| "Resource pool 'discriminant' failed locking Mutex")?)
111111
}
112112

@@ -115,7 +115,7 @@ impl<T: Send + Sync> ResourcePool<T> {
115115
let mut discriminant_guard = self
116116
.discriminant
117117
.lock()
118-
.map_err(|_| ResourcePoolError::PoisonedLock())
118+
.map_err(|_| ResourcePoolError::PoisonedLock)
119119
.with_context(|| "Resource pool 'set_discriminant' failed locking Mutex")?;
120120
*discriminant_guard = discriminant;
121121

@@ -127,7 +127,7 @@ impl<T: Send + Sync> ResourcePool<T> {
127127
Ok(self
128128
.resources
129129
.lock()
130-
.map_err(|_| ResourcePoolError::PoisonedLock())
130+
.map_err(|_| ResourcePoolError::PoisonedLock)
131131
.with_context(|| "Resource pool 'count' failed locking Mutex")?
132132
.len())
133133
}
@@ -167,14 +167,9 @@ impl<'a, T: Send + Sync> ResourcePoolItem<'a, T> {
167167
self.discriminant
168168
}
169169

170-
/// Get a reference to the inner resource
171-
pub fn resource(&self) -> &T {
172-
self.resource.as_ref().unwrap()
173-
}
174-
175-
/// Take the inner resource
176-
pub fn into_inner(&mut self) -> T {
177-
self.resource.take().unwrap()
170+
/// Take the inner resource if exists
171+
pub fn take(&mut self) -> Option<T> {
172+
self.resource.take()
178173
}
179174
}
180175

@@ -194,12 +189,10 @@ impl<T: Send + Sync> DerefMut for ResourcePoolItem<'_, T> {
194189

195190
impl<T: Send + Sync> Drop for ResourcePoolItem<'_, T> {
196191
fn drop(&mut self) {
197-
if self.resource.is_some() {
198-
let resource = self.into_inner();
199-
let _ = self
200-
.resource_pool
201-
.give_back_resource(resource, self.discriminant);
202-
}
192+
self.take().map(|resource| {
193+
self.resource_pool
194+
.give_back_resource(resource, self.discriminant)
195+
});
203196
}
204197
}
205198

@@ -222,7 +215,7 @@ mod tests {
222215
}
223216
let resources_result = resources_items
224217
.iter_mut()
225-
.map(|resource_item| resource_item.resource().to_owned())
218+
.map(|resource_item| resource_item.take().unwrap())
226219
.collect::<Vec<_>>();
227220

228221
assert_eq!(resources_expected, resources_result);
@@ -265,7 +258,7 @@ mod tests {
265258

266259
let mut resource_item = pool.acquire_resource(Duration::from_millis(10)).unwrap();
267260
assert_eq!(pool.count().unwrap(), pool_size - 1);
268-
pool.give_back_resource(resource_item.into_inner(), pool.discriminant().unwrap())
261+
pool.give_back_resource(resource_item.take().unwrap(), pool.discriminant().unwrap())
269262
.unwrap();
270263

271264
assert_eq!(pool.count().unwrap(), pool_size);
@@ -312,7 +305,7 @@ mod tests {
312305
let discriminant_stale = pool.discriminant().unwrap();
313306
pool.set_discriminant(pool.discriminant().unwrap() + 1)
314307
.unwrap();
315-
pool.give_back_resource(resource_item.into_inner(), discriminant_stale)
308+
pool.give_back_resource(resource_item.take().unwrap(), discriminant_stale)
316309
.unwrap();
317310

318311
assert_eq!(pool.count().unwrap(), pool_size - 1);

0 commit comments

Comments
 (0)