Skip to content

Commit 529267a

Browse files
committed
Add option to stop miner after submitting a single
share
1 parent 68b388c commit 529267a

File tree

4 files changed

+50
-32
lines changed

4 files changed

+50
-32
lines changed

roles/test-utils/mining-device-sv1/src/client.rs

+46-29
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ impl Client {
7171
/// the information from `sender_share`, it is formatted as a `v1::client_to_server::Submit`
7272
/// and then serialized into a json message that is sent to the Upstream via
7373
/// `sender_outgoing`.
74-
pub async fn connect(client_id: u32, upstream_addr: SocketAddr) {
74+
pub async fn connect(client_id: u32, upstream_addr: SocketAddr, single_submit: bool) {
7575
let stream = TcpStream::connect(upstream_addr).await.unwrap();
7676
let (reader, mut writer) = stream.into_split();
7777

@@ -86,6 +86,7 @@ impl Client {
8686
// Upstream via `sender_outgoing`
8787
let (sender_share, receiver_share) = unbounded();
8888

89+
let (send_stop_submitting, mut recv_stop_submitting) = tokio::sync::watch::channel(false);
8990
// Instantiates a new `Miner` (a mock of an actual Mining Device) with a job id of 0.
9091
let miner = Arc::new(Mutex::new(Miner::new(0)));
9192

@@ -128,6 +129,9 @@ impl Client {
128129
loop {
129130
let message: String = receiver_outgoing.recv().await.unwrap();
130131
(writer).write_all(message.as_bytes()).await.unwrap();
132+
if message.contains("mining.submit") && single_submit {
133+
send_stop_submitting.send(true).unwrap();
134+
}
131135
}
132136
});
133137

@@ -170,43 +174,53 @@ impl Client {
170174
// Sends relevant candidate block header values needed to construct a
171175
// `mining.submit` message to the `receiver_share` in the task that is responsible
172176
// for sending messages to the Upstream node.
173-
sender_share
177+
if sender_share
174178
.try_send((nonce, job_id.unwrap(), version.unwrap(), time))
175-
.unwrap();
179+
.is_err()
180+
{
181+
warn!("Share channel is not available");
182+
break;
183+
}
176184
}
177185
miner_cloned
178186
.safe_lock(|m| m.header.as_mut().map(|h| h.nonce += 1))
179187
.unwrap();
180188
});
181-
182189
// Task to receive relevant candidate block header values needed to construct a
183190
// `mining.submit` message. This message is contructed as a `client_to_server::Submit` and
184191
// then serialized into json to be sent to the Upstream via the `sender_outgoing` sender.
185192
let cloned = client.clone();
186193
task::spawn(async move {
187-
let recv = receiver_share.clone();
188-
loop {
189-
let (nonce, job_id, _version, ntime) = recv.recv().await.unwrap();
190-
if cloned.clone().safe_lock(|c| c.status).unwrap() != ClientStatus::Subscribed {
191-
continue;
192-
}
193-
let extra_nonce2: Extranonce =
194-
vec![0; cloned.safe_lock(|c| c.extranonce2_size.unwrap()).unwrap()]
195-
.try_into()
196-
.unwrap();
197-
let submit = client_to_server::Submit {
198-
id: 0,
199-
user_name: "user".into(), // TODO: user name should NOT be hardcoded
200-
job_id: job_id.to_string(),
201-
extra_nonce2,
202-
time: HexU32Be(ntime),
203-
nonce: HexU32Be(nonce),
204-
version_bits: None,
205-
};
206-
let message: json_rpc::Message = submit.into();
207-
let message = format!("{}\n", serde_json::to_string(&message).unwrap());
208-
sender_outgoing_clone.send(message).await.unwrap();
209-
}
194+
tokio::select!(
195+
_ = recv_stop_submitting.changed() => {
196+
warn!("Stopping miner")
197+
},
198+
_ = async {
199+
let recv = receiver_share.clone();
200+
loop {
201+
let (nonce, job_id, _version, ntime) = recv.recv().await.unwrap();
202+
if cloned.clone().safe_lock(|c| c.status).unwrap() != ClientStatus::Subscribed {
203+
continue;
204+
}
205+
let extra_nonce2: Extranonce =
206+
vec![0; cloned.safe_lock(|c| c.extranonce2_size.unwrap()).unwrap()]
207+
.try_into()
208+
.unwrap();
209+
let submit = client_to_server::Submit {
210+
id: 0,
211+
user_name: "user".into(), // TODO: user name should NOT be hardcoded
212+
job_id: job_id.to_string(),
213+
extra_nonce2,
214+
time: HexU32Be(ntime),
215+
nonce: HexU32Be(nonce),
216+
version_bits: None,
217+
};
218+
let message: json_rpc::Message = submit.into();
219+
let message = format!("{}\n", serde_json::to_string(&message).unwrap());
220+
sender_outgoing_clone.send(message).await.unwrap();
221+
}
222+
} => {}
223+
)
210224
});
211225
let recv_incoming = client.safe_lock(|c| c.receiver_incoming.clone()).unwrap();
212226

@@ -226,8 +240,11 @@ impl Client {
226240
// Waits for the `sender_incoming` to get message line from socket to be parsed by the
227241
// `Client`
228242
loop {
229-
let incoming = recv_incoming.recv().await.unwrap();
230-
Self::parse_message(client.clone(), Ok(incoming)).await;
243+
if let Ok(incoming) = recv_incoming.clone().recv().await {
244+
Self::parse_message(client.clone(), Ok(incoming)).await;
245+
} else {
246+
warn!("Error reading from socket via `recv_incoming` channel")
247+
}
231248
}
232249
}
233250

roles/test-utils/mining-device-sv1/src/main.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ async fn main() {
1313
Client::connect(
1414
80,
1515
SocketAddr::from_str(ADDR).expect("Invalid upstream address"),
16+
false,
1617
)
1718
.await
1819
}

roles/tests-integration/lib/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -281,9 +281,9 @@ pub fn measure_hashrate(duration_secs: u64) -> f64 {
281281
hashes as f64 / elapsed_secs
282282
}
283283

284-
pub async fn start_mining_device_sv1(upstream_addr: SocketAddr) {
284+
pub async fn start_mining_device_sv1(upstream_addr: SocketAddr, single_submit: bool) {
285285
tokio::spawn(async move {
286-
mining_device_sv1::client::Client::connect(80, upstream_addr).await;
286+
mining_device_sv1::client::Client::connect(80, upstream_addr, single_submit).await;
287287
});
288288
tokio::time::sleep(std::time::Duration::from_secs(3)).await;
289289
}

roles/tests-integration/tests/translator_integration.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ async fn translation_proxy() {
1313
let (pool_translator_sniffer, pool_translator_sniffer_addr) =
1414
start_sniffer("0".to_string(), pool_addr, false, None).await;
1515
let (_, tproxy_addr) = start_sv2_translator(pool_translator_sniffer_addr).await;
16-
let _mining_device = start_mining_device_sv1(tproxy_addr).await;
16+
let _mining_device = start_mining_device_sv1(tproxy_addr, false).await;
1717
pool_translator_sniffer
1818
.wait_for_message_type(MessageDirection::ToUpstream, MESSAGE_TYPE_SETUP_CONNECTION)
1919
.await;

0 commit comments

Comments
 (0)