Skip to content

Commit 3a38d59

Browse files
committed
routing_logic removal from ParseMiningMessagesFromDownstream and adaptation on roles
1 parent 2ea4181 commit 3a38d59

File tree

5 files changed

+39
-52
lines changed

5 files changed

+39
-52
lines changed

protocols/v2/roles-logic-sv2/src/handlers/mining.rs

+6-35
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,13 @@ pub trait ParseMiningMessagesFromDownstream<
7373
self_mutex: Arc<Mutex<Self>>,
7474
message_type: u8,
7575
payload: &mut [u8],
76-
routing_logic: MiningRoutingLogic<Self, Up, Selector, Router>,
7776
) -> Result<SendTo<Up>, Error>
7877
where
7978
Self: IsMiningDownstream + Sized,
8079
{
8180
match Self::handle_message_mining_deserialized(
8281
self_mutex,
8382
(message_type, payload).try_into(),
84-
routing_logic,
8583
) {
8684
Err(Error::UnexpectedMessage(0)) => Err(Error::UnexpectedMessage(message_type)),
8785
result => result,
@@ -92,22 +90,15 @@ pub trait ParseMiningMessagesFromDownstream<
9290
fn handle_message_mining_deserialized(
9391
self_mutex: Arc<Mutex<Self>>,
9492
message: Result<Mining<'_>, Error>,
95-
routing_logic: MiningRoutingLogic<Self, Up, Selector, Router>,
9693
) -> Result<SendTo<Up>, Error>
9794
where
9895
Self: IsMiningDownstream + Sized,
9996
{
100-
let (channel_type, is_work_selection_enabled, downstream_mining_data) = self_mutex
101-
.safe_lock(|self_| {
102-
(
103-
self_.get_channel_type(),
104-
self_.is_work_selection_enabled(),
105-
self_.get_downstream_mining_data(),
106-
)
107-
})
97+
let (channel_type, is_work_selection_enabled) = self_mutex
98+
.safe_lock(|self_| (self_.get_channel_type(), self_.is_work_selection_enabled()))
10899
.map_err(|e| crate::Error::PoisonLock(e.to_string()))?;
109100
match message {
110-
Ok(Mining::OpenStandardMiningChannel(mut m)) => {
101+
Ok(Mining::OpenStandardMiningChannel(m)) => {
111102
info!(
112103
"Received OpenStandardMiningChannel from: {} with id: {}",
113104
std::str::from_utf8(m.user_identity.as_ref()).unwrap_or("Unknown identity"),
@@ -124,41 +115,22 @@ pub trait ParseMiningMessagesFromDownstream<
124115
OpenMiningChannelError::new_unknown_user(m.get_request_id_as_u32()),
125116
)));
126117
}
127-
let upstream = match routing_logic {
128-
MiningRoutingLogic::None => None,
129-
MiningRoutingLogic::Proxy(r_logic) => {
130-
trace!("On OpenStandardMiningChannel r_logic is: {:?}", r_logic);
131-
let up = r_logic
132-
.safe_lock(|r_logic| {
133-
r_logic.on_open_standard_channel(
134-
self_mutex.clone(),
135-
&mut m,
136-
&downstream_mining_data,
137-
)
138-
})
139-
.map_err(|e| crate::Error::PoisonLock(e.to_string()))?;
140-
trace!("On OpenStandardMiningChannel best candidate is: {:?}", up);
141-
Some(up?)
142-
}
143-
// Variant just used for phantom data is ok to panic
144-
MiningRoutingLogic::_P(_) => panic!("Must use either MiningRoutingLogic::None or MiningRoutingLogic::Proxy for `routing_logic` param"),
145-
};
146118
trace!(
147119
"On OpenStandardMiningChannel channel type is: {:?}",
148120
channel_type
149121
);
150122
match channel_type {
151123
SupportedChannelTypes::Standard => self_mutex
152-
.safe_lock(|self_| self_.handle_open_standard_mining_channel(m, upstream))
124+
.safe_lock(|self_| self_.handle_open_standard_mining_channel(m))
153125
.map_err(|e| crate::Error::PoisonLock(e.to_string()))?,
154126
SupportedChannelTypes::Extended => Err(Error::UnexpectedMessage(
155127
MESSAGE_TYPE_OPEN_STANDARD_MINING_CHANNEL,
156128
)),
157129
SupportedChannelTypes::Group => self_mutex
158-
.safe_lock(|self_| self_.handle_open_standard_mining_channel(m, upstream))
130+
.safe_lock(|self_| self_.handle_open_standard_mining_channel(m))
159131
.map_err(|e| crate::Error::PoisonLock(e.to_string()))?,
160132
SupportedChannelTypes::GroupAndExtended => self_mutex
161-
.safe_lock(|self_| self_.handle_open_standard_mining_channel(m, upstream))
133+
.safe_lock(|self_| self_.handle_open_standard_mining_channel(m))
162134
.map_err(|e| crate::Error::PoisonLock(e.to_string()))?,
163135
}
164136
}
@@ -302,7 +274,6 @@ pub trait ParseMiningMessagesFromDownstream<
302274
fn handle_open_standard_mining_channel(
303275
&mut self,
304276
m: OpenStandardMiningChannel,
305-
up: Option<Arc<Mutex<Up>>>,
306277
) -> Result<SendTo<Up>, Error>;
307278

308279
/// Handles an `OpenExtendedMiningChannel` message.

roles/jd-client/src/lib/downstream.rs

-4
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,10 @@ impl DownstreamMiningNode {
260260
let message_type = incoming.get_header().unwrap().msg_type();
261261
let payload = incoming.payload();
262262

263-
let routing_logic = roles_logic_sv2::routing_logic::MiningRoutingLogic::None;
264-
265263
let next_message_to_send = ParseMiningMessagesFromDownstream::handle_message_mining(
266264
self_mutex.clone(),
267265
message_type,
268266
payload,
269-
routing_logic,
270267
);
271268
Self::match_send_to(self_mutex.clone(), next_message_to_send, Some(incoming)).await;
272269
}
@@ -464,7 +461,6 @@ impl
464461
fn handle_open_standard_mining_channel(
465462
&mut self,
466463
_: OpenStandardMiningChannel,
467-
_: Option<Arc<Mutex<UpstreamMiningNode>>>,
468464
) -> Result<SendTo<UpstreamMiningNode>, Error> {
469465
warn!("Ignoring OpenStandardMiningChannel");
470466
Ok(SendTo::None(None))

roles/mining-proxy/src/lib/downstream_mining.rs

+33-10
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ use roles_logic_sv2::{
1818
},
1919
mining_sv2::*,
2020
parsers::{AnyMessage, Mining, MiningDeviceMessages},
21-
routing_logic::{CommonRouter, CommonRoutingLogic, MiningProxyRoutingLogic},
21+
routing_logic::{
22+
CommonRouter, CommonRoutingLogic, MiningProxyRoutingLogic, MiningRouter, MiningRoutingLogic,
23+
},
2224
utils::Mutex,
2325
};
2426

@@ -30,7 +32,7 @@ pub type EitherFrame = StandardEitherFrame<Message>;
3032
/// a mining device or a downstream proxy.
3133
/// A downstream can only be linked with an upstream at a time. Support multi upstreams for
3234
/// downstream do not make much sense.
33-
#[derive(Debug)]
35+
#[derive(Debug, Clone)]
3436
pub struct DownstreamMiningNode {
3537
id: u32,
3638
receiver: Receiver<EitherFrame>,
@@ -39,7 +41,7 @@ pub struct DownstreamMiningNode {
3941
upstream: Option<Arc<Mutex<UpstreamMiningNode>>>,
4042
}
4143

42-
#[derive(Debug)]
44+
#[derive(Debug, Clone)]
4345
pub enum DownstreamMiningNodeStatus {
4446
Initializing,
4547
Paired(CommonDownstreamData),
@@ -193,13 +195,10 @@ impl DownstreamMiningNode {
193195
let message_type = incoming.get_header().unwrap().msg_type();
194196
let payload = incoming.payload();
195197

196-
let routing_logic = super::get_routing_logic();
197-
198198
let next_message_to_send = ParseMiningMessagesFromDownstream::handle_message_mining(
199199
self_mutex.clone(),
200200
message_type,
201201
payload,
202-
routing_logic,
203202
);
204203

205204
match next_message_to_send {
@@ -314,16 +313,40 @@ impl
314313
fn handle_open_standard_mining_channel(
315314
&mut self,
316315
req: OpenStandardMiningChannel,
317-
up: Option<Arc<Mutex<UpstreamMiningNode>>>,
318316
) -> Result<SendTo<UpstreamMiningNode>, Error> {
319-
let channel_id = up
317+
let downstream_mining_data = self.get_downstream_mining_data();
318+
let routing_logic = super::get_routing_logic();
319+
320+
let upstream = match routing_logic {
321+
MiningRoutingLogic::Proxy(r_logic) => {
322+
trace!("On OpenStandardMiningChannel r_logic is: {:?}", r_logic);
323+
let up = r_logic
324+
.safe_lock(|r_logic| {
325+
r_logic.on_open_standard_channel(
326+
Arc::new(Mutex::new(self.clone())),
327+
&mut req.clone(),
328+
&downstream_mining_data,
329+
)
330+
})
331+
.map_err(|e| Error::PoisonLock(e.to_string()))?;
332+
trace!("On OpenStandardMiningChannel best candidate is: {:?}", up);
333+
Some(up?)
334+
}
335+
// Variant just used for phantom data is ok to panic
336+
MiningRoutingLogic::_P(_) => panic!("Must use either MiningRoutingLogic::None or MiningRoutingLogic::Proxy for `routing_logic` param"),
337+
_ => unreachable!()
338+
};
339+
340+
let channel_id = upstream
320341
.as_ref()
321342
.expect("No upstream initialized")
322343
.safe_lock(|s| s.channel_ids.safe_lock(|r| r.next()).unwrap())
323344
.unwrap();
324345
info!(channel_id);
325-
let cloned = up.as_ref().expect("No upstream initialized").clone();
326-
up.as_ref()
346+
let cloned = upstream.as_ref().expect("No upstream initialized").clone();
347+
348+
upstream
349+
.as_ref()
327350
.expect("No upstream initialized")
328351
.safe_lock(|up| {
329352
if up.channel_kind.is_extended() {

roles/pool/src/lib/mining_pool/message_handler.rs

-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ impl ParseMiningMessagesFromDownstream<(), NullDownstreamMiningSelector, NoRouti
3535
fn handle_open_standard_mining_channel(
3636
&mut self,
3737
incoming: OpenStandardMiningChannel,
38-
_m: Option<Arc<Mutex<()>>>,
3938
) -> Result<SendTo<()>, Error> {
4039
let header_only = self.downstream_data.header_only;
4140
let reposnses = self

roles/pool/src/lib/mining_pool/mod.rs

-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ use roles_logic_sv2::{
1919
job_creator::JobsCreators,
2020
mining_sv2::{ExtendedExtranonce, SetNewPrevHash as SetNPH},
2121
parsers::{AnyMessage, Mining},
22-
routing_logic::MiningRoutingLogic,
2322
template_distribution_sv2::{NewTemplate, SetNewPrevHash, SubmitSolution},
2423
utils::{CoinbaseOutput as CoinbaseOutput_, Mutex},
2524
};
@@ -173,7 +172,6 @@ impl Downstream {
173172
self_mutex.clone(),
174173
message_type,
175174
payload,
176-
MiningRoutingLogic::None,
177175
);
178176
Self::match_send_to(self_mutex, next_message_to_send).await
179177
}

0 commit comments

Comments
 (0)