Skip to content

Commit f59bf80

Browse files
authored
Pass message policy to Client::new; add default impl for make_chain_client. (#4045)
## Motivation `Client::new` uses a default value for the message policy, and we explicitly set it each time `make_chain_client` is called. ## Proposal Pass the correct policy into `Client::new` directly, so we can have a default impl for `make_chain_client`. ## Test Plan CI ## Release Plan - Nothing to do / These changes follow the usual release cycle. ## Links - [reviewer checklist](https://github.com/linera-io/linera-protocol/blob/main/CONTRIBUTING.md#reviewer-checklist)
1 parent 93e89f1 commit f59bf80

File tree

7 files changed

+49
-78
lines changed

7 files changed

+49
-78
lines changed

linera-client/src/chain_listener.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ use linera_storage::{Clock as _, Storage as _};
2828
use tokio_util::sync::CancellationToken;
2929
use tracing::{debug, info, instrument, warn, Instrument as _};
3030

31-
use crate::{wallet::Wallet, Error};
31+
use crate::{
32+
wallet::{UserChain, Wallet},
33+
Error,
34+
};
3235

3336
#[derive(Debug, Default, Clone, clap::Args)]
3437
pub struct ChainListenerConfig {
@@ -68,9 +71,22 @@ pub trait ClientContext {
6871

6972
fn storage(&self) -> &<Self::Environment as linera_core::Environment>::Storage;
7073

71-
fn make_chain_client(&self, chain_id: ChainId) -> ContextChainClient<Self>;
72-
73-
fn client(&self) -> &linera_core::client::Client<Self::Environment>;
74+
fn client(&self) -> &Arc<linera_core::client::Client<Self::Environment>>;
75+
76+
fn make_chain_client(&self, chain_id: ChainId) -> ChainClient<Self::Environment> {
77+
let chain = self
78+
.wallet()
79+
.get(chain_id)
80+
.cloned()
81+
.unwrap_or_else(|| UserChain::make_other(chain_id, Timestamp::from(0)));
82+
self.client().create_chain_client(
83+
chain_id,
84+
chain.block_hash,
85+
chain.next_block_height,
86+
chain.pending_proposal,
87+
chain.owner,
88+
)
89+
}
7490

7591
async fn update_wallet_for_new_chain(
7692
&mut self,

linera-client/src/client_context.rs

Lines changed: 9 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#[cfg(with_testing)]
55
use std::num::NonZeroUsize;
6-
use std::{collections::HashSet, sync::Arc};
6+
use std::sync::Arc;
77

88
use futures::Future;
99
use linera_base::{
@@ -15,7 +15,7 @@ use linera_base::{
1515
};
1616
use linera_chain::types::ConfirmedBlockCertificate;
1717
use linera_core::{
18-
client::{BlanketMessagePolicy, ChainClient, Client, MessagePolicy, PendingProposal},
18+
client::{ChainClient, Client, MessagePolicy},
1919
data_types::{ChainInfoQuery, ClientOutcome},
2020
join_set_ext::JoinSet,
2121
node::{CrossChainMessageDelivery, ValidatorNode},
@@ -71,8 +71,6 @@ pub struct ClientContext<Env: Environment, W> {
7171
pub retry_delay: Duration,
7272
pub max_retries: u32,
7373
pub chain_listeners: JoinSet,
74-
pub blanket_message_policy: BlanketMessagePolicy,
75-
pub restrict_chain_ids_to: Option<HashSet<ChainId>>,
7674
}
7775

7876
impl<Env: Environment, W> chain_listener::ClientContext for ClientContext<Env, W>
@@ -89,24 +87,7 @@ where
8987
self.client.storage_client()
9088
}
9189

92-
fn make_chain_client(&self, chain_id: ChainId) -> ChainClient<Env> {
93-
// We only create clients for chains we have in the wallet, or for the admin chain.
94-
let chain = self
95-
.wallet
96-
.get(chain_id)
97-
.cloned()
98-
.unwrap_or_else(|| UserChain::make_other(chain_id, Timestamp::from(0)));
99-
100-
self.make_chain_client_internal(
101-
chain_id,
102-
chain.block_hash,
103-
chain.next_block_height,
104-
chain.pending_proposal,
105-
chain.owner,
106-
)
107-
}
108-
109-
fn client(&self) -> &Client<Env> {
90+
fn client(&self) -> &Arc<Client<Env>> {
11091
&self.client
11192
}
11293

@@ -153,6 +134,10 @@ where
153134
},
154135
options.max_pending_message_bundles,
155136
wallet.genesis_admin_chain(),
137+
MessagePolicy::new(
138+
options.blanket_message_policy,
139+
options.restrict_chain_ids_to,
140+
),
156141
delivery,
157142
options.long_lived_services,
158143
chain_ids,
@@ -170,8 +155,6 @@ where
170155
retry_delay: options.retry_delay,
171156
max_retries: options.max_retries,
172157
chain_listeners: JoinSet::default(),
173-
blanket_message_policy: options.blanket_message_policy,
174-
restrict_chain_ids_to: options.restrict_chain_ids_to,
175158
}
176159
}
177160

@@ -204,6 +187,7 @@ where
204187
},
205188
10,
206189
wallet.genesis_admin_chain(),
190+
MessagePolicy::new_accept_all(),
207191
delivery,
208192
false,
209193
chain_ids,
@@ -221,8 +205,6 @@ where
221205
retry_delay,
222206
max_retries,
223207
chain_listeners: JoinSet::default(),
224-
blanket_message_policy: BlanketMessagePolicy::Accept,
225-
restrict_chain_ids_to: None,
226208
}
227209
}
228210
}
@@ -267,28 +249,6 @@ impl<Env: Environment, W: Persist<Target = Wallet>> ClientContext<Env, W> {
267249
.expect("No non-admin chain specified in wallet with no non-admin chain")
268250
}
269251

270-
fn make_chain_client_internal(
271-
&self,
272-
chain_id: ChainId,
273-
block_hash: Option<CryptoHash>,
274-
next_block_height: BlockHeight,
275-
pending_proposal: Option<PendingProposal>,
276-
preferred_owner: Option<AccountOwner>,
277-
) -> ChainClient<Env> {
278-
let mut chain_client = self.client.create_chain_client(
279-
chain_id,
280-
block_hash,
281-
next_block_height,
282-
pending_proposal,
283-
preferred_owner,
284-
);
285-
chain_client.options_mut().message_policy = MessagePolicy::new(
286-
self.blanket_message_policy,
287-
self.restrict_chain_ids_to.clone(),
288-
);
289-
chain_client
290-
}
291-
292252
pub fn make_node_provider(&self) -> NodeProvider {
293253
NodeProvider::new(self.make_node_options())
294254
}
@@ -907,7 +867,7 @@ where
907867
benchmark_chains.insert(chain_id, pub_key.into());
908868
self.client.track_chain(chain_id);
909869

910-
let mut chain_client = self.make_chain_client_internal(
870+
let mut chain_client = self.client.create_chain_client(
911871
chain_id,
912872
None,
913873
BlockHeight::ZERO,

linera-client/src/unit_tests/chain_listener.rs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use linera_base::{
1313
ownership::{ChainOwnership, TimeoutConfig},
1414
};
1515
use linera_core::{
16-
client::{ChainClient, Client},
16+
client::{ChainClient, Client, MessagePolicy},
1717
environment,
1818
node::CrossChainMessageDelivery,
1919
test_utils::{MemoryStorageBuilder, StorageBuilder as _, TestBuilder},
@@ -46,25 +46,10 @@ impl chain_listener::ClientContext for ClientContext {
4646
self.client.storage_client()
4747
}
4848

49-
fn client(&self) -> &linera_core::client::Client<Self::Environment> {
49+
fn client(&self) -> &Arc<linera_core::client::Client<Self::Environment>> {
5050
&self.client
5151
}
5252

53-
fn make_chain_client(&self, chain_id: ChainId) -> ChainClient<environment::Test> {
54-
let chain = self
55-
.wallet
56-
.get(chain_id)
57-
.cloned()
58-
.unwrap_or_else(|| UserChain::make_other(chain_id, Timestamp::from(0)));
59-
self.client.create_chain_client(
60-
chain_id,
61-
chain.block_hash,
62-
chain.next_block_height,
63-
chain.pending_proposal.clone(),
64-
chain.owner,
65-
)
66-
}
67-
6853
async fn update_wallet_for_new_chain(
6954
&mut self,
7055
chain_id: ChainId,
@@ -129,6 +114,7 @@ async fn test_chain_listener() -> anyhow::Result<()> {
129114
},
130115
10,
131116
admin_id,
117+
MessagePolicy::new_accept_all(),
132118
delivery,
133119
false,
134120
[chain_id0],
@@ -217,6 +203,7 @@ async fn test_chain_listener_admin_chain() -> anyhow::Result<()> {
217203
},
218204
10,
219205
admin_id,
206+
MessagePolicy::new_accept_all(),
220207
delivery,
221208
false,
222209
[],

linera-core/src/client/mod.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ impl<Env: Environment> Client<Env> {
181181
environment: Env,
182182
max_pending_message_bundles: usize,
183183
admin_id: ChainId,
184+
message_policy: MessagePolicy,
184185
cross_chain_message_delivery: CrossChainMessageDelivery,
185186
long_lived_services: bool,
186187
tracked_chains: impl IntoIterator<Item = ChainId>,
@@ -207,7 +208,7 @@ impl<Env: Environment> Client<Env> {
207208
chains: DashMap::new(),
208209
max_pending_message_bundles,
209210
admin_id,
210-
message_policy: MessagePolicy::new(BlanketMessagePolicy::Accept, None),
211+
message_policy,
211212
cross_chain_message_delivery,
212213
grace_period,
213214
tracked_chains,
@@ -1259,6 +1260,14 @@ impl MessagePolicy {
12591260
}
12601261
}
12611262

1263+
#[cfg(with_testing)]
1264+
pub fn new_accept_all() -> Self {
1265+
Self {
1266+
blanket: BlanketMessagePolicy::Accept,
1267+
restrict_chain_ids_to: None,
1268+
}
1269+
}
1270+
12621271
#[instrument(level = "trace", skip(self))]
12631272
fn must_handle(&self, bundle: &mut IncomingBundle) -> bool {
12641273
if self.is_reject() {

linera-core/src/unit_tests/test_utils.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ use {
4949
};
5050

5151
use crate::{
52-
client::Client,
52+
client::{Client, MessagePolicy},
5353
data_types::*,
5454
node::{
5555
CrossChainMessageDelivery, NodeError, NotificationStream, ValidatorNode,
@@ -952,6 +952,7 @@ where
952952
},
953953
10,
954954
self.admin_id(),
955+
MessagePolicy::new_accept_all(),
955956
CrossChainMessageDelivery::NonBlocking,
956957
false,
957958
[chain_id],

linera-faucet/server/src/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ impl chain_listener::ClientContext for ClientContext {
3636
self.client.storage_client()
3737
}
3838

39-
fn client(&self) -> &linera_core::client::Client<environment::Test> {
39+
fn client(&self) -> &Arc<linera_core::client::Client<environment::Test>> {
4040
unimplemented!()
4141
}
4242

linera-service/src/schema_export.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright (c) Zefchain Labs, Inc.
22
// SPDX-License-Identifier: Apache-2.0
33

4+
use std::sync::Arc;
5+
46
use linera_base::{
57
crypto::CryptoHash,
68
data_types::{BlobContent, NetworkDescription, Timestamp},
@@ -180,11 +182,7 @@ impl ClientContext for DummyContext {
180182
unimplemented!()
181183
}
182184

183-
fn client(&self) -> &linera_core::client::Client<Self::Environment> {
184-
unimplemented!()
185-
}
186-
187-
fn make_chain_client(&self, _: ChainId) -> ChainClient<Self::Environment> {
185+
fn client(&self) -> &Arc<linera_core::client::Client<Self::Environment>> {
188186
unimplemented!()
189187
}
190188

0 commit comments

Comments
 (0)