Skip to content

Commit 8687ada

Browse files
committed
all: Encapsulate manipulation of SharedProofOfIndexing
This brings a small amount of sanity to the code using that.
1 parent 2374ddf commit 8687ada

File tree

7 files changed

+81
-87
lines changed

7 files changed

+81
-87
lines changed

chain/substreams/src/trigger.rs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use graph::{
1515
substreams::Modules,
1616
};
1717
use graph_runtime_wasm::module::ToAscPtr;
18-
use lazy_static::__Deref;
1918
use std::{collections::BTreeSet, sync::Arc};
2019

2120
use crate::{Block, Chain, NoopDataSourceTemplate, ParsedChanges};
@@ -179,18 +178,6 @@ impl blockchain::TriggersAdapter<Chain> for TriggersAdapter {
179178
}
180179
}
181180

182-
fn write_poi_event(
183-
proof_of_indexing: &SharedProofOfIndexing,
184-
poi_event: &ProofOfIndexingEvent,
185-
causality_region: &str,
186-
logger: &Logger,
187-
) {
188-
if let Some(proof_of_indexing) = proof_of_indexing {
189-
let mut proof_of_indexing = proof_of_indexing.deref().borrow_mut();
190-
proof_of_indexing.write(logger, causality_region, poi_event);
191-
}
192-
}
193-
194181
pub struct TriggerProcessor {
195182
pub locator: DeploymentLocator,
196183
}
@@ -226,8 +213,7 @@ where
226213
return Err(MappingError::Unknown(anyhow!("Detected UNSET entity operation, either a server error or there's a new type of operation and we're running an outdated protobuf")));
227214
}
228215
ParsedChanges::Upsert { key, entity } => {
229-
write_poi_event(
230-
proof_of_indexing,
216+
proof_of_indexing.write_event(
231217
&ProofOfIndexingEvent::SetEntity {
232218
entity_type: key.entity_type.typename(),
233219
id: &key.entity_id.to_string(),
@@ -249,8 +235,7 @@ where
249235
let id = entity_key.entity_id.clone();
250236
state.entity_cache.remove(entity_key);
251237

252-
write_poi_event(
253-
proof_of_indexing,
238+
proof_of_indexing.write_event(
254239
&ProofOfIndexingEvent::RemoveEntity {
255240
entity_type: entity_type.typename(),
256241
id: &id.to_string(),

core/src/subgraph/context/mod.rs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,7 @@ impl<C: Blockchain, T: RuntimeHostBuilder<C>> IndexingContext<C, T> {
126126
) -> Result<BlockState, MappingError> {
127127
let error_count = state.deterministic_errors.len();
128128

129-
if let Some(proof_of_indexing) = proof_of_indexing {
130-
proof_of_indexing
131-
.borrow_mut()
132-
.start_handler(causality_region);
133-
}
129+
proof_of_indexing.start_handler(causality_region);
134130

135131
let start = Instant::now();
136132

@@ -156,16 +152,12 @@ impl<C: Blockchain, T: RuntimeHostBuilder<C>> IndexingContext<C, T> {
156152
let elapsed = start.elapsed().as_secs_f64();
157153
subgraph_metrics.observe_trigger_processing_duration(elapsed);
158154

159-
if let Some(proof_of_indexing) = proof_of_indexing {
160-
if state.deterministic_errors.len() != error_count {
161-
assert!(state.deterministic_errors.len() == error_count + 1);
155+
if state.deterministic_errors.len() != error_count {
156+
assert!(state.deterministic_errors.len() == error_count + 1);
162157

163-
// If a deterministic error has happened, write a new
164-
// ProofOfIndexingEvent::DeterministicError to the SharedProofOfIndexing.
165-
proof_of_indexing
166-
.borrow_mut()
167-
.write_deterministic_error(logger, causality_region);
168-
}
158+
// If a deterministic error has happened, write a new
159+
// ProofOfIndexingEvent::DeterministicError to the SharedProofOfIndexing.
160+
proof_of_indexing.write_deterministic_error(logger, causality_region);
169161
}
170162

171163
Ok(state)

core/src/subgraph/runner.rs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use crate::subgraph::error::BlockProcessingError;
33
use crate::subgraph::inputs::IndexingInputs;
44
use crate::subgraph::state::IndexingState;
55
use crate::subgraph::stream::new_block_stream;
6-
use atomic_refcell::AtomicRefCell;
76
use graph::blockchain::block_stream::{
87
BlockStreamError, BlockStreamEvent, BlockWithTriggers, FirehoseCursor,
98
};
@@ -367,10 +366,8 @@ where
367366
debug!(logger, "Start processing block";
368367
"triggers" => triggers.len());
369368

370-
let proof_of_indexing = Some(Arc::new(AtomicRefCell::new(ProofOfIndexing::new(
371-
block_ptr.number,
372-
self.inputs.poi_version,
373-
))));
369+
let proof_of_indexing =
370+
SharedProofOfIndexing::new(block_ptr.number, self.inputs.poi_version);
374371

375372
// Causality region for onchain triggers.
376373
let causality_region = PoICausalityRegion::from_network(&self.inputs.network);
@@ -629,8 +626,7 @@ where
629626
return Err(BlockProcessingError::Canceled);
630627
}
631628

632-
if let Some(proof_of_indexing) = proof_of_indexing {
633-
let proof_of_indexing = Arc::try_unwrap(proof_of_indexing).unwrap().into_inner();
629+
if let Some(proof_of_indexing) = proof_of_indexing.into_inner() {
634630
update_proof_of_indexing(
635631
proof_of_indexing,
636632
block.timestamp(),
@@ -1156,7 +1152,7 @@ where
11561152

11571153
// PoI ignores offchain events.
11581154
// See also: poi-ignores-offchain
1159-
let proof_of_indexing = None;
1155+
let proof_of_indexing = SharedProofOfIndexing::ignored();
11601156
let causality_region = "";
11611157

11621158
let trigger = TriggerData::Offchain(trigger);
@@ -1314,10 +1310,8 @@ where
13141310
.deployment_head
13151311
.set(block_ptr.number as f64);
13161312

1317-
let proof_of_indexing = Some(Arc::new(AtomicRefCell::new(ProofOfIndexing::new(
1318-
block_ptr.number,
1319-
self.inputs.poi_version,
1320-
))));
1313+
let proof_of_indexing =
1314+
SharedProofOfIndexing::new(block_ptr.number, self.inputs.poi_version);
13211315

13221316
// Causality region for onchain triggers.
13231317
let causality_region = PoICausalityRegion::from_network(&self.inputs.network);
@@ -1372,8 +1366,7 @@ where
13721366
return Err(BlockProcessingError::Canceled.into());
13731367
}
13741368

1375-
if let Some(proof_of_indexing) = proof_of_indexing {
1376-
let proof_of_indexing = Arc::try_unwrap(proof_of_indexing).unwrap().into_inner();
1369+
if let Some(proof_of_indexing) = proof_of_indexing.into_inner() {
13771370
update_proof_of_indexing(
13781371
proof_of_indexing,
13791372
block_time,

core/src/subgraph/trigger_processor.rs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,7 @@ where
3939
return Ok(state);
4040
}
4141

42-
if let Some(proof_of_indexing) = proof_of_indexing {
43-
proof_of_indexing
44-
.borrow_mut()
45-
.start_handler(causality_region);
46-
}
42+
proof_of_indexing.start_handler(causality_region);
4743

4844
for HostedTrigger {
4945
host,
@@ -73,16 +69,12 @@ where
7369
}
7470
}
7571

76-
if let Some(proof_of_indexing) = proof_of_indexing {
77-
if state.deterministic_errors.len() != error_count {
78-
assert!(state.deterministic_errors.len() == error_count + 1);
72+
if state.deterministic_errors.len() != error_count {
73+
assert!(state.deterministic_errors.len() == error_count + 1);
7974

80-
// If a deterministic error has happened, write a new
81-
// ProofOfIndexingEvent::DeterministicError to the SharedProofOfIndexing.
82-
proof_of_indexing
83-
.borrow_mut()
84-
.write_deterministic_error(logger, causality_region);
85-
}
75+
// If a deterministic error has happened, write a new
76+
// ProofOfIndexingEvent::DeterministicError to the SharedProofOfIndexing.
77+
proof_of_indexing.write_deterministic_error(logger, causality_region);
8678
}
8779

8880
Ok(state)

graph/src/components/subgraph/proof_of_indexing/mod.rs

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@ mod online;
33
mod reference;
44

55
pub use event::ProofOfIndexingEvent;
6+
use graph_derive::CheapClone;
67
pub use online::{ProofOfIndexing, ProofOfIndexingFinisher};
78
pub use reference::PoICausalityRegion;
89

910
use atomic_refcell::AtomicRefCell;
10-
use std::sync::Arc;
11+
use slog::Logger;
12+
use std::{ops::Deref, sync::Arc};
13+
14+
use crate::prelude::BlockNumber;
1115

1216
#[derive(Copy, Clone, Debug)]
1317
pub enum ProofOfIndexingVersion {
@@ -22,15 +26,57 @@ pub enum ProofOfIndexingVersion {
2226
/// intentionally disallowed - PoI requires sequential access to the hash
2327
/// function within a given causality region even if ownership is shared across
2428
/// multiple mapping contexts.
25-
///
26-
/// The Option<_> is because not all subgraphs support PoI until re-deployed.
27-
/// Eventually this can be removed.
28-
///
29-
/// This is not a great place to define this type, since the ProofOfIndexing
30-
/// shouldn't "know" these details about wasmtime and subgraph re-deployments,
31-
/// but the APIs that would make use of this are in graph/components so this
32-
/// lives here for lack of a better choice.
33-
pub type SharedProofOfIndexing = Option<Arc<AtomicRefCell<ProofOfIndexing>>>;
29+
#[derive(Clone, CheapClone)]
30+
pub struct SharedProofOfIndexing {
31+
poi: Option<Arc<AtomicRefCell<ProofOfIndexing>>>,
32+
}
33+
34+
impl SharedProofOfIndexing {
35+
pub fn new(block: BlockNumber, version: ProofOfIndexingVersion) -> Self {
36+
SharedProofOfIndexing {
37+
poi: Some(Arc::new(AtomicRefCell::new(ProofOfIndexing::new(
38+
block, version,
39+
)))),
40+
}
41+
}
42+
43+
pub fn ignored() -> Self {
44+
SharedProofOfIndexing { poi: None }
45+
}
46+
47+
pub fn write_event(
48+
&self,
49+
poi_event: &ProofOfIndexingEvent,
50+
causality_region: &str,
51+
logger: &Logger,
52+
) {
53+
if let Some(poi) = &self.poi {
54+
let mut poi = poi.deref().borrow_mut();
55+
poi.write(logger, causality_region, poi_event);
56+
}
57+
}
58+
59+
pub fn start_handler(&self, causality_region: &str) {
60+
if let Some(poi) = &self.poi {
61+
let mut poi = poi.deref().borrow_mut();
62+
poi.start_handler(causality_region);
63+
}
64+
}
65+
66+
pub fn write_deterministic_error(&self, logger: &Logger, causality_region: &str) {
67+
if let Some(proof_of_indexing) = &self.poi {
68+
proof_of_indexing
69+
.deref()
70+
.borrow_mut()
71+
.write_deterministic_error(logger, causality_region);
72+
}
73+
}
74+
75+
pub fn into_inner(self) -> Option<ProofOfIndexing> {
76+
self.poi
77+
.map(|poi| Arc::try_unwrap(poi).unwrap().into_inner())
78+
}
79+
}
3480

3581
#[cfg(test)]
3682
mod tests {

runtime/test/src/common.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use ethabi::Contract;
22
use graph::blockchain::BlockTime;
33
use graph::components::store::DeploymentLocator;
4+
use graph::components::subgraph::SharedProofOfIndexing;
45
use graph::data::subgraph::*;
56
use graph::data_source;
67
use graph::data_source::common::MappingABI;
@@ -127,7 +128,7 @@ pub fn mock_context(
127128
.unwrap(),
128129
Default::default(),
129130
),
130-
proof_of_indexing: None,
131+
proof_of_indexing: SharedProofOfIndexing::ignored(),
131132
host_fns: Arc::new(Vec::new()),
132133
debug_fork: None,
133134
mapping_logger: Logger::root(slog::Discard, o!()),

runtime/wasm/src/host_exports.rs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::collections::HashMap;
2-
use std::ops::Deref;
32
use std::str::FromStr;
43
use std::time::{Duration, Instant};
54

@@ -33,18 +32,6 @@ use crate::{error::DeterminismLevel, module::IntoTrap};
3332

3433
use super::module::WasmInstanceData;
3534

36-
fn write_poi_event(
37-
proof_of_indexing: &SharedProofOfIndexing,
38-
poi_event: &ProofOfIndexingEvent,
39-
causality_region: &str,
40-
logger: &Logger,
41-
) {
42-
if let Some(proof_of_indexing) = proof_of_indexing {
43-
let mut proof_of_indexing = proof_of_indexing.deref().borrow_mut();
44-
proof_of_indexing.write(logger, causality_region, poi_event);
45-
}
46-
}
47-
4835
impl IntoTrap for HostExportError {
4936
fn determinism_level(&self) -> DeterminismLevel {
5037
match self {
@@ -336,8 +323,7 @@ impl HostExports {
336323
.map_err(|e| HostExportError::Deterministic(anyhow!(e)))?;
337324

338325
let poi_section = stopwatch.start_section("host_export_store_set__proof_of_indexing");
339-
write_poi_event(
340-
proof_of_indexing,
326+
proof_of_indexing.write_event(
341327
&ProofOfIndexingEvent::SetEntity {
342328
entity_type: &key.entity_type.typename(),
343329
id: &key.entity_id.to_string(),
@@ -369,8 +355,7 @@ impl HostExports {
369355
entity_id: String,
370356
gas: &GasCounter,
371357
) -> Result<(), HostExportError> {
372-
write_poi_event(
373-
proof_of_indexing,
358+
proof_of_indexing.write_event(
374359
&ProofOfIndexingEvent::RemoveEntity {
375360
entity_type: &entity_type,
376361
id: &entity_id,

0 commit comments

Comments
 (0)