|
1 |
| -use std::collections::hash_map::Entry; |
2 | 1 | use std::collections::HashMap;
|
3 | 2 | use std::ops::RangeInclusive;
|
4 | 3 | use std::sync::{Arc, Mutex};
|
@@ -52,15 +51,32 @@ pub trait AbstractMultiEngine: Send + Sync {
|
52 | 51 | ) -> anyhow::Result<InnerFvmMachine>;
|
53 | 52 | }
|
54 | 53 |
|
| 54 | +#[derive(Eq, PartialEq, Hash, Debug, Copy, Clone)] |
| 55 | +enum EngineVersion { |
| 56 | + V1, |
| 57 | + V2, |
| 58 | +} |
| 59 | + |
55 | 60 | // The generic engine container
|
56 | 61 | pub struct MultiEngineContainer {
|
57 | 62 | concurrency: u32,
|
58 |
| - engines: Mutex<HashMap<u32, Arc<dyn AbstractMultiEngine + 'static>>>, |
| 63 | + engines: Mutex<HashMap<EngineVersion, Arc<dyn AbstractMultiEngine + 'static>>>, |
59 | 64 | }
|
60 | 65 |
|
61 | 66 | const LOTUS_FVM_CONCURRENCY_ENV_NAME: &str = "LOTUS_FVM_CONCURRENCY";
|
62 | 67 | const VALID_CONCURRENCY_RANGE: RangeInclusive<u32> = 1..=128;
|
63 | 68 |
|
| 69 | +impl TryFrom<u32> for EngineVersion { |
| 70 | + type Error = anyhow::Error; |
| 71 | + fn try_from(value: u32) -> Result<Self, Self::Error> { |
| 72 | + match value { |
| 73 | + 16 | 17 => Ok(EngineVersion::V1), |
| 74 | + 18 | 19 | 20 => Ok(EngineVersion::V2), |
| 75 | + _ => return Err(anyhow!("network version not supported")), |
| 76 | + } |
| 77 | + } |
| 78 | +} |
| 79 | + |
64 | 80 | impl MultiEngineContainer {
|
65 | 81 | /// Constructs a new multi-engine container with the default concurrency (4).
|
66 | 82 | pub fn new() -> MultiEngineContainer {
|
@@ -107,23 +123,21 @@ impl MultiEngineContainer {
|
107 | 123 | }
|
108 | 124 |
|
109 | 125 | pub fn get(&self, nv: u32) -> anyhow::Result<Arc<dyn AbstractMultiEngine + 'static>> {
|
| 126 | + let engine_version = nv.try_into()?; |
110 | 127 | let mut locked = self
|
111 | 128 | .engines
|
112 | 129 | .lock()
|
113 | 130 | .map_err(|e| anyhow!("engine lock poisoned: {e}"))?;
|
114 |
| - Ok(match locked.entry(nv) { |
115 |
| - Entry::Occupied(v) => v.get().clone(), |
116 |
| - Entry::Vacant(v) => v |
117 |
| - .insert(match nv { |
118 |
| - 16 | 17 => { |
119 |
| - Arc::new(MultiEngine2::new()) as Arc<dyn AbstractMultiEngine + 'static> |
120 |
| - } |
121 |
| - 18 | 19 | 20 => Arc::new(MultiEngine3::new(self.concurrency)) |
122 |
| - as Arc<dyn AbstractMultiEngine + 'static>, |
123 |
| - _ => return Err(anyhow!("network version not supported")), |
124 |
| - }) |
125 |
| - .clone(), |
126 |
| - }) |
| 131 | + Ok(locked |
| 132 | + .entry(engine_version) |
| 133 | + .or_insert_with(|| match engine_version { |
| 134 | + EngineVersion::V1 => { |
| 135 | + Arc::new(MultiEngine2::new()) as Arc<dyn AbstractMultiEngine + 'static> |
| 136 | + } |
| 137 | + EngineVersion::V2 => Arc::new(MultiEngine3::new(self.concurrency)) |
| 138 | + as Arc<dyn AbstractMultiEngine + 'static>, |
| 139 | + }) |
| 140 | + .clone()) |
127 | 141 | }
|
128 | 142 | }
|
129 | 143 |
|
|
0 commit comments