Skip to content

Commit f367c14

Browse files
authored
chore: group the creation of bouncers similar to artifact pools (dfinity#3474)
1 parent 8035be0 commit f367c14

File tree

2 files changed

+138
-98
lines changed

2 files changed

+138
-98
lines changed

rs/artifact_pool/src/idkg_pool.rs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,14 @@ use crate::{
1212
IntoInner,
1313
};
1414
use ic_config::artifact_pool::{ArtifactPoolConfig, PersistentPoolBackend};
15+
use ic_interfaces::idkg::{
16+
IDkgChangeAction, IDkgChangeSet, IDkgPool, IDkgPoolSection, IDkgPoolSectionOp,
17+
IDkgPoolSectionOps, MutableIDkgPoolSection,
18+
};
1519
use ic_interfaces::p2p::consensus::{
1620
ArtifactTransmit, ArtifactTransmits, ArtifactWithOpt, MutablePool, UnvalidatedArtifact,
1721
ValidatedPoolReader,
1822
};
19-
use ic_interfaces::{
20-
idkg::{
21-
IDkgChangeAction, IDkgChangeSet, IDkgPool, IDkgPoolSection, IDkgPoolSectionOp,
22-
IDkgPoolSectionOps, MutableIDkgPoolSection,
23-
},
24-
time_source::TimeSource,
25-
};
2623
use ic_logger::{info, warn, ReplicaLogger};
2724
use ic_metrics::MetricsRegistry;
2825
use ic_types::consensus::{
@@ -380,11 +377,7 @@ impl IDkgPoolImpl {
380377
}
381378

382379
// Populates the unvalidated pool with the initial dealings from the CUP.
383-
pub fn add_initial_dealings(
384-
&mut self,
385-
catch_up_package: &CatchUpPackage,
386-
time_source: &dyn TimeSource,
387-
) {
380+
pub fn add_initial_dealings(&mut self, catch_up_package: &CatchUpPackage) {
388381
let block = catch_up_package.content.block.get_value();
389382

390383
let mut initial_dealings = Vec::new();
@@ -413,7 +406,7 @@ impl IDkgPoolImpl {
413406
self.insert(UnvalidatedArtifact {
414407
message: IDkgMessage::Dealing(signed_dealing.clone()),
415408
peer_id: signed_dealing.dealer_id(),
416-
timestamp: time_source.get_relative_time(),
409+
timestamp: block.context.time,
417410
})
418411
}
419412
}

rs/replica/setup_ic_network/src/lib.rs

Lines changed: 132 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ use ic_https_outcalls_consensus::{
2828
use ic_ingress_manager::{bouncer::IngressBouncer, IngressManager, RandomStateKind};
2929
use ic_interfaces::{
3030
batch_payload::BatchPayloadBuilder,
31+
consensus_pool::{ConsensusBlockCache, ConsensusPoolCache},
3132
execution_environment::IngressHistoryReader,
3233
messaging::{MessageRouting, XNetPayloadBuilder},
33-
p2p::artifact_manager::JoinGuard,
34-
p2p::state_sync::StateSyncClient,
34+
p2p::{artifact_manager::JoinGuard, state_sync::StateSyncClient},
3535
self_validating_payload::SelfValidatingPayloadBuilder,
3636
time_source::{SysTimeSource, TimeSource},
3737
};
@@ -85,6 +85,105 @@ struct ArtifactPools {
8585
canister_http_pool: Arc<RwLock<CanisterHttpPoolImpl>>,
8686
}
8787

88+
impl ArtifactPools {
89+
fn new(
90+
log: &ReplicaLogger,
91+
metrics_registry: &MetricsRegistry,
92+
node_id: NodeId,
93+
config: ArtifactPoolConfig,
94+
catch_up_package: &CatchUpPackage,
95+
) -> Self {
96+
let ingress_pool = Arc::new(RwLock::new(IngressPoolImpl::new(
97+
node_id,
98+
config.clone(),
99+
metrics_registry.clone(),
100+
log.clone(),
101+
)));
102+
103+
let mut idkg_pool = IDkgPoolImpl::new(
104+
config.clone(),
105+
log.clone(),
106+
metrics_registry.clone(),
107+
Box::new(idkg::IDkgStatsImpl::new(metrics_registry.clone())),
108+
);
109+
idkg_pool.add_initial_dealings(catch_up_package);
110+
let idkg_pool = Arc::new(RwLock::new(idkg_pool));
111+
112+
let certification_pool = Arc::new(RwLock::new(CertificationPoolImpl::new(
113+
node_id,
114+
config,
115+
log.clone(),
116+
metrics_registry.clone(),
117+
)));
118+
let dkg_pool = Arc::new(RwLock::new(DkgPoolImpl::new(
119+
metrics_registry.clone(),
120+
log.clone(),
121+
)));
122+
let canister_http_pool = Arc::new(RwLock::new(CanisterHttpPoolImpl::new(
123+
metrics_registry.clone(),
124+
log.clone(),
125+
)));
126+
Self {
127+
ingress_pool,
128+
certification_pool,
129+
dkg_pool,
130+
idkg_pool,
131+
canister_http_pool,
132+
}
133+
}
134+
}
135+
136+
struct Bouncers {
137+
ingress: Arc<IngressBouncer>,
138+
consensus: Arc<ConsensusBouncer>,
139+
certifier: Arc<CertifierBouncer>,
140+
dkg: Arc<DkgBouncer>,
141+
idkg: Arc<idkg::IDkgBouncer>,
142+
https_outcalls: Arc<CanisterHttpGossipImpl>,
143+
}
144+
145+
impl Bouncers {
146+
fn new(
147+
log: &ReplicaLogger,
148+
metrics_registry: &MetricsRegistry,
149+
subnet_id: SubnetId,
150+
time_source: Arc<dyn TimeSource>,
151+
message_router: Arc<dyn MessageRouting>,
152+
consensus_pool_cache: Arc<dyn ConsensusPoolCache>,
153+
consensus_block_cache: Arc<dyn ConsensusBlockCache>,
154+
state_reader: Arc<dyn StateReader<State = ReplicatedState>>,
155+
) -> Self {
156+
let ingress = Arc::new(IngressBouncer::new(time_source.clone()));
157+
let consensus = Arc::new(ConsensusBouncer::new(metrics_registry, message_router));
158+
let dkg = Arc::new(DkgBouncer::new(metrics_registry));
159+
let certifier = Arc::new(CertifierBouncer::new(
160+
metrics_registry,
161+
consensus_pool_cache.clone(),
162+
));
163+
let idkg = Arc::new(idkg::IDkgBouncer::new(
164+
metrics_registry,
165+
subnet_id,
166+
consensus_block_cache,
167+
state_reader.clone(),
168+
));
169+
170+
let https_outcalls = Arc::new(CanisterHttpGossipImpl::new(
171+
consensus_pool_cache.clone(),
172+
state_reader.clone(),
173+
log.clone(),
174+
));
175+
176+
Self {
177+
ingress,
178+
consensus,
179+
dkg,
180+
idkg,
181+
certifier,
182+
https_outcalls,
183+
}
184+
}
185+
}
186+
88187
pub type CanisterHttpAdapterClient =
89188
Box<dyn NonBlockingChannel<CanisterHttpRequest, Response = CanisterHttpResponse> + Send>;
90189

@@ -138,7 +237,7 @@ pub fn setup_consensus_and_p2p(
138237
node_id,
139238
subnet_id,
140239
artifact_pool_config,
141-
catch_up_package,
240+
&catch_up_package,
142241
Arc::clone(&consensus_crypto) as Arc<_>,
143242
Arc::clone(&certifier_crypto) as Arc<_>,
144243
Arc::clone(&ingress_sig_crypto) as Arc<_>,
@@ -219,7 +318,7 @@ fn start_consensus(
219318
node_id: NodeId,
220319
subnet_id: SubnetId,
221320
artifact_pool_config: ArtifactPoolConfig,
222-
catch_up_package: CatchUpPackage,
321+
catch_up_package: &CatchUpPackage,
223322
// ConsensusCrypto is an extension of the Crypto trait and we can
224323
// not downcast traits.
225324
consensus_crypto: Arc<dyn ConsensusCrypto>,
@@ -245,26 +344,34 @@ fn start_consensus(
245344
Vec<Box<dyn JoinGuard>>,
246345
AbortableBroadcastChannelBuilder,
247346
) {
347+
let artifact_pools = ArtifactPools::new(
348+
log,
349+
metrics_registry,
350+
node_id,
351+
artifact_pool_config,
352+
catch_up_package,
353+
);
248354
let time_source = Arc::new(SysTimeSource::new());
355+
let consensus_pool_cache = consensus_pool.read().unwrap().get_cache();
356+
let consensus_block_cache = consensus_pool.read().unwrap().get_block_cache();
357+
let bouncers = Bouncers::new(
358+
log,
359+
metrics_registry,
360+
subnet_id,
361+
time_source.clone(),
362+
message_router.clone(),
363+
consensus_pool_cache.clone(),
364+
consensus_block_cache,
365+
state_reader.clone(),
366+
);
367+
249368
let mut new_p2p_consensus: ic_consensus_manager::AbortableBroadcastChannelBuilder =
250369
ic_consensus_manager::AbortableBroadcastChannelBuilder::new(
251370
log.clone(),
252371
rt_handle.clone(),
253372
metrics_registry.clone(),
254373
);
255374

256-
let artifact_pools = init_artifact_pools(
257-
node_id,
258-
artifact_pool_config,
259-
metrics_registry,
260-
log,
261-
catch_up_package,
262-
time_source.as_ref(),
263-
);
264-
265-
let mut join_handles = vec![];
266-
267-
let consensus_pool_cache = consensus_pool.read().unwrap().get_cache();
268375
let consensus_time = consensus_pool.read().unwrap().get_consensus_time();
269376
let replica_config = ReplicaConfig { node_id, subnet_id };
270377
let ingress_manager = Arc::new(IngressManager::new(
@@ -302,6 +409,8 @@ fn start_consensus(
302409
&PoolReader::new(&*consensus_pool.read().unwrap()),
303410
)));
304411

412+
let mut join_handles = vec![];
413+
305414
{
306415
let consensus_impl = ConsensusImpl::new(
307416
replica_config.clone(),
@@ -327,14 +436,13 @@ fn start_consensus(
327436

328437
let consensus_pool = Arc::clone(&consensus_pool);
329438

330-
let bouncer = Arc::new(ConsensusBouncer::new(metrics_registry, message_router));
331439
let (outbound_tx, inbound_rx) = if HASHES_IN_BLOCKS_FEATURE_ENABLED {
332440
let assembler = ic_artifact_downloader::FetchStrippedConsensusArtifact::new(
333441
log.clone(),
334442
rt_handle.clone(),
335443
consensus_pool.clone(),
336444
artifact_pools.ingress_pool.clone(),
337-
bouncer,
445+
bouncers.consensus,
338446
metrics_registry.clone(),
339447
node_id,
340448
);
@@ -344,7 +452,7 @@ fn start_consensus(
344452
log.clone(),
345453
rt_handle.clone(),
346454
consensus_pool.clone(),
347-
bouncer,
455+
bouncers.consensus,
348456
metrics_registry.clone(),
349457
);
350458
new_p2p_consensus.abortable_broadcast_channel(assembler, SLOT_TABLE_NO_LIMIT)
@@ -366,12 +474,11 @@ fn start_consensus(
366474
let user_ingress_tx = {
367475
#[allow(clippy::disallowed_methods)]
368476
let (user_ingress_tx, user_ingress_rx) = unbounded_channel();
369-
let bouncer = Arc::new(IngressBouncer::new(time_source.clone()));
370477
let assembler = ic_artifact_downloader::FetchArtifact::new(
371478
log.clone(),
372479
rt_handle.clone(),
373480
artifact_pools.ingress_pool.clone(),
374-
bouncer,
481+
bouncers.ingress,
375482
metrics_registry.clone(),
376483
);
377484

@@ -402,12 +509,11 @@ fn start_consensus(
402509
log.clone(),
403510
max_certified_height_tx,
404511
);
405-
let bouncer = CertifierBouncer::new(metrics_registry, Arc::clone(&consensus_pool_cache));
406512
let assembler = ic_artifact_downloader::FetchArtifact::new(
407513
log.clone(),
408514
rt_handle.clone(),
409515
artifact_pools.certification_pool.clone(),
410-
Arc::new(bouncer),
516+
bouncers.certifier,
411517
metrics_registry.clone(),
412518
);
413519

@@ -426,12 +532,11 @@ fn start_consensus(
426532
};
427533

428534
{
429-
let bouncer = Arc::new(DkgBouncer::new(metrics_registry));
430535
let assembler = ic_artifact_downloader::FetchArtifact::new(
431536
log.clone(),
432537
rt_handle.clone(),
433538
artifact_pools.dkg_pool.clone(),
434-
bouncer,
539+
bouncers.dkg,
435540
metrics_registry.clone(),
436541
);
437542

@@ -469,17 +574,11 @@ fn start_consensus(
469574
finalized.payload.as_ref().is_summary(),
470575
finalized.payload.as_ref().as_idkg().is_some(),
471576
);
472-
let bouncer = Arc::new(idkg::IDkgBouncer::new(
473-
metrics_registry,
474-
subnet_id,
475-
consensus_pool.read().unwrap().get_block_cache(),
476-
Arc::clone(&state_reader),
477-
));
478577
let assembler = ic_artifact_downloader::FetchArtifact::new(
479578
log.clone(),
480579
rt_handle.clone(),
481580
artifact_pools.idkg_pool.clone(),
482-
bouncer,
581+
bouncers.idkg,
483582
metrics_registry.clone(),
484583
);
485584

@@ -506,16 +605,11 @@ fn start_consensus(
506605
};
507606

508607
{
509-
let bouncer = Arc::new(CanisterHttpGossipImpl::new(
510-
Arc::clone(&consensus_pool_cache),
511-
Arc::clone(&state_reader),
512-
log.clone(),
513-
));
514608
let assembler = ic_artifact_downloader::FetchArtifact::new(
515609
log.clone(),
516610
rt_handle.clone(),
517611
artifact_pools.canister_http_pool.clone(),
518-
bouncer,
612+
bouncers.https_outcalls,
519613
metrics_registry.clone(),
520614
);
521615

@@ -549,50 +643,3 @@ fn start_consensus(
549643
new_p2p_consensus,
550644
)
551645
}
552-
553-
fn init_artifact_pools(
554-
node_id: NodeId,
555-
config: ArtifactPoolConfig,
556-
metrics_registry: &MetricsRegistry,
557-
log: &ReplicaLogger,
558-
catch_up_package: CatchUpPackage,
559-
time_source: &dyn TimeSource,
560-
) -> ArtifactPools {
561-
let ingress_pool = Arc::new(RwLock::new(IngressPoolImpl::new(
562-
node_id,
563-
config.clone(),
564-
metrics_registry.clone(),
565-
log.clone(),
566-
)));
567-
568-
let mut idkg_pool = IDkgPoolImpl::new(
569-
config.clone(),
570-
log.clone(),
571-
metrics_registry.clone(),
572-
Box::new(idkg::IDkgStatsImpl::new(metrics_registry.clone())),
573-
);
574-
idkg_pool.add_initial_dealings(&catch_up_package, time_source);
575-
let idkg_pool = Arc::new(RwLock::new(idkg_pool));
576-
577-
let certification_pool = Arc::new(RwLock::new(CertificationPoolImpl::new(
578-
node_id,
579-
config,
580-
log.clone(),
581-
metrics_registry.clone(),
582-
)));
583-
let dkg_pool = Arc::new(RwLock::new(DkgPoolImpl::new(
584-
metrics_registry.clone(),
585-
log.clone(),
586-
)));
587-
let canister_http_pool = Arc::new(RwLock::new(CanisterHttpPoolImpl::new(
588-
metrics_registry.clone(),
589-
log.clone(),
590-
)));
591-
ArtifactPools {
592-
ingress_pool,
593-
certification_pool,
594-
dkg_pool,
595-
idkg_pool,
596-
canister_http_pool,
597-
}
598-
}

0 commit comments

Comments
 (0)