|
3 | 3 |
|
4 | 4 | use super::error::Result;
|
5 | 5 | use super::ObjectStore;
|
6 |
| -use crate::base_types::{EpochId, TransactionDigest}; |
| 6 | +use crate::base_types::{EpochId, ExecutionData, TransactionDigest}; |
7 | 7 | use crate::committee::Committee;
|
8 | 8 | use crate::digests::{CheckpointContentsDigest, CheckpointDigest};
|
9 | 9 | use crate::effects::{TransactionEffects, TransactionEvents};
|
@@ -70,19 +70,8 @@ impl ReadStore for SharedInMemoryStore {
|
70 | 70 | sequence_number: Option<CheckpointSequenceNumber>,
|
71 | 71 | digest: &CheckpointContentsDigest,
|
72 | 72 | ) -> Option<FullCheckpointContents> {
|
73 |
| - // First look to see if we saved the complete contents already. |
74 |
| - let inner = self.inner(); |
75 |
| - let contents = sequence_number |
76 |
| - .or_else(|| inner.get_sequence_number_by_contents_digest(digest)) |
77 |
| - .and_then(|seq_num| inner.full_checkpoint_contents.get(&seq_num).cloned()); |
78 |
| - if contents.is_some() { |
79 |
| - return contents; |
80 |
| - } |
81 |
| - |
82 |
| - // Otherwise gather it from the individual components. |
83 |
| - inner.get_checkpoint_contents(digest).and_then(|contents| { |
84 |
| - FullCheckpointContents::from_checkpoint_contents(self, contents.to_owned()) |
85 |
| - }) |
| 73 | + self.inner() |
| 74 | + .get_full_checkpoint_contents(sequence_number, digest) |
86 | 75 | }
|
87 | 76 |
|
88 | 77 | fn get_committee(&self, epoch: EpochId) -> Option<Arc<Committee>> {
|
@@ -229,6 +218,39 @@ impl InMemoryStore {
|
229 | 218 | .and_then(|digest| self.get_checkpoint_by_digest(digest))
|
230 | 219 | }
|
231 | 220 |
|
| 221 | + fn get_full_checkpoint_contents( |
| 222 | + &self, |
| 223 | + sequence_number: Option<CheckpointSequenceNumber>, |
| 224 | + digest: &CheckpointContentsDigest, |
| 225 | + ) -> Option<FullCheckpointContents> { |
| 226 | + let contents = sequence_number |
| 227 | + .or_else(|| self.get_sequence_number_by_contents_digest(digest)) |
| 228 | + .and_then(|seq_num| self.full_checkpoint_contents.get(&seq_num).cloned()); |
| 229 | + if contents.is_some() { |
| 230 | + return contents; |
| 231 | + } |
| 232 | + |
| 233 | + let contents = self.get_checkpoint_contents(digest)?; |
| 234 | + |
| 235 | + let mut transactions = Vec::with_capacity(contents.size()); |
| 236 | + |
| 237 | + for tx in contents.iter() { |
| 238 | + if let (Some(t), Some(e)) = ( |
| 239 | + self.get_transaction_block(&tx.transaction), |
| 240 | + self.get_transaction_effects(&tx.transaction), |
| 241 | + ) { |
| 242 | + transactions.push(ExecutionData::new((*t).clone().into_inner(), e.clone())) |
| 243 | + } else { |
| 244 | + return None; |
| 245 | + } |
| 246 | + } |
| 247 | + |
| 248 | + Some(FullCheckpointContents::from_contents_and_execution_data( |
| 249 | + contents.to_owned(), |
| 250 | + transactions.into_iter(), |
| 251 | + )) |
| 252 | + } |
| 253 | + |
232 | 254 | pub fn get_sequence_number_by_contents_digest(
|
233 | 255 | &self,
|
234 | 256 | digest: &CheckpointContentsDigest,
|
|
0 commit comments