Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit 79b0d6e

Browse files
Issue 4393: Correcting Unnecessary Use of Arc (#6882)
* Added participation and queue sizes metrics * First draft of all metric code * Tests pass * Changed Metrics to field on participation + queues * fmt * Improving naming * Refactor, placing timer in ParticipationRequest * fmt * Final cleanup * Revert "Final cleanup" This reverts commit 02e5608. * Changing metric names * Implementing Eq only for unit tests * fmt * Removing Clone trait from ParticipationRequest * fmt * Moved clone functionality to tests helper
1 parent 6282def commit 79b0d6e

File tree

5 files changed

+35
-24
lines changed

5 files changed

+35
-24
lines changed

node/core/dispute-coordinator/src/initialized.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ impl Initialized {
916916
} else {
917917
self.metrics.on_queued_best_effort_participation();
918918
}
919-
let request_timer = Arc::new(self.metrics.time_participation_pipeline());
919+
let request_timer = self.metrics.time_participation_pipeline();
920920
let r = self
921921
.participation
922922
.queue_participation(

node/core/dispute-coordinator/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ impl DisputeCoordinatorSubsystem {
347347
?candidate_hash,
348348
"Found valid dispute, with no vote from us on startup - participating."
349349
);
350-
let request_timer = Arc::new(self.metrics.time_participation_pipeline());
350+
let request_timer = self.metrics.time_participation_pipeline();
351351
participation_requests.push((
352352
ParticipationPriority::with_priority_if(is_included),
353353
ParticipationRequest::new(

node/core/dispute-coordinator/src/participation/queues/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
// You should have received a copy of the GNU General Public License
1515
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
1616

17-
use std::{cmp::Ordering, collections::BTreeMap, sync::Arc};
17+
use std::{cmp::Ordering, collections::BTreeMap};
1818

1919
use futures::channel::oneshot;
2020
use polkadot_node_subsystem::{messages::ChainApiMessage, overseer};
@@ -65,12 +65,12 @@ pub struct Queues {
6565
}
6666

6767
/// A dispute participation request that can be queued.
68-
#[derive(Debug, Clone)]
68+
#[derive(Debug)]
6969
pub struct ParticipationRequest {
7070
candidate_hash: CandidateHash,
7171
candidate_receipt: CandidateReceipt,
7272
session: SessionIndex,
73-
_request_timer: Arc<Option<prometheus::HistogramTimer>>, // Sends metric data when request is dropped
73+
_request_timer: Option<prometheus::HistogramTimer>, // Sends metric data when request is dropped
7474
}
7575

7676
/// Whether a `ParticipationRequest` should be put on best-effort or the priority queue.
@@ -117,7 +117,7 @@ impl ParticipationRequest {
117117
pub fn new(
118118
candidate_receipt: CandidateReceipt,
119119
session: SessionIndex,
120-
request_timer: Arc<Option<prometheus::HistogramTimer>>,
120+
request_timer: Option<prometheus::HistogramTimer>,
121121
) -> Self {
122122
Self {
123123
candidate_hash: candidate_receipt.hash(),
@@ -142,8 +142,8 @@ impl ParticipationRequest {
142142
}
143143
}
144144

145-
// We want to compare participation requests in unit tests, so we
146-
// only implement Eq for tests.
145+
// We want to compare and clone participation requests in unit tests, so we
146+
// only implement Eq and Clone for tests.
147147
#[cfg(test)]
148148
impl PartialEq for ParticipationRequest {
149149
fn eq(&self, other: &Self) -> bool {

node/core/dispute-coordinator/src/participation/queues/tests.rs

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ use crate::{metrics::Metrics, ParticipationPriority};
1818
use ::test_helpers::{dummy_candidate_receipt, dummy_hash};
1919
use assert_matches::assert_matches;
2020
use polkadot_primitives::{BlockNumber, Hash};
21-
use std::sync::Arc;
2221

2322
use super::{CandidateComparator, ParticipationRequest, QueueError, Queues};
2423

@@ -27,7 +26,7 @@ fn make_participation_request(hash: Hash) -> ParticipationRequest {
2726
let mut receipt = dummy_candidate_receipt(dummy_hash());
2827
// make it differ:
2928
receipt.commitments_hash = hash;
30-
let request_timer = Arc::new(Metrics::default().time_participation_pipeline());
29+
let request_timer = Metrics::default().time_participation_pipeline();
3130
ParticipationRequest::new(receipt, 1, request_timer)
3231
}
3332

@@ -39,6 +38,18 @@ fn make_dummy_comparator(
3938
CandidateComparator::new_dummy(relay_parent, *req.candidate_hash())
4039
}
4140

41+
/// Make a partial clone of the given ParticipationRequest, just missing
42+
/// the request_timer field. We prefer this helper to implementing Clone
43+
/// for ParticipationRequest, since we only clone requests in tests.
44+
fn clone_request(request: &ParticipationRequest) -> ParticipationRequest {
45+
ParticipationRequest {
46+
candidate_receipt: request.candidate_receipt.clone(),
47+
candidate_hash: request.candidate_hash.clone(),
48+
session: request.session,
49+
_request_timer: None,
50+
}
51+
}
52+
4253
/// Check that dequeuing acknowledges order.
4354
///
4455
/// Any priority item will be dequeued before any best effort items, priority and best effort with
@@ -59,35 +70,35 @@ fn ordering_works_as_expected() {
5970
.queue_with_comparator(
6071
make_dummy_comparator(&req1, Some(1)),
6172
ParticipationPriority::BestEffort,
62-
req1.clone(),
73+
clone_request(&req1),
6374
)
6475
.unwrap();
6576
queue
6677
.queue_with_comparator(
6778
make_dummy_comparator(&req_prio, Some(1)),
6879
ParticipationPriority::Priority,
69-
req_prio.clone(),
80+
clone_request(&req_prio),
7081
)
7182
.unwrap();
7283
queue
7384
.queue_with_comparator(
7485
make_dummy_comparator(&req3, Some(2)),
7586
ParticipationPriority::BestEffort,
76-
req3.clone(),
87+
clone_request(&req3),
7788
)
7889
.unwrap();
7990
queue
8091
.queue_with_comparator(
8192
make_dummy_comparator(&req_prio_2, Some(2)),
8293
ParticipationPriority::Priority,
83-
req_prio_2.clone(),
94+
clone_request(&req_prio_2),
8495
)
8596
.unwrap();
8697
queue
8798
.queue_with_comparator(
8899
make_dummy_comparator(&req5_unknown_parent, None),
89100
ParticipationPriority::BestEffort,
90-
req5_unknown_parent.clone(),
101+
clone_request(&req5_unknown_parent),
91102
)
92103
.unwrap();
93104
assert_matches!(
@@ -132,46 +143,46 @@ fn candidate_is_only_dequeued_once() {
132143
.queue_with_comparator(
133144
make_dummy_comparator(&req1, None),
134145
ParticipationPriority::BestEffort,
135-
req1.clone(),
146+
clone_request(&req1),
136147
)
137148
.unwrap();
138149
queue
139150
.queue_with_comparator(
140151
make_dummy_comparator(&req_prio, Some(1)),
141152
ParticipationPriority::Priority,
142-
req_prio.clone(),
153+
clone_request(&req_prio),
143154
)
144155
.unwrap();
145156
// Insert same best effort again:
146157
queue
147158
.queue_with_comparator(
148159
make_dummy_comparator(&req1, None),
149160
ParticipationPriority::BestEffort,
150-
req1.clone(),
161+
clone_request(&req1),
151162
)
152163
.unwrap();
153164
// insert same prio again:
154165
queue
155166
.queue_with_comparator(
156167
make_dummy_comparator(&req_prio, Some(1)),
157168
ParticipationPriority::Priority,
158-
req_prio.clone(),
169+
clone_request(&req_prio),
159170
)
160171
.unwrap();
161172
// Insert first as best effort:
162173
queue
163174
.queue_with_comparator(
164175
make_dummy_comparator(&req_best_effort_then_prio, Some(2)),
165176
ParticipationPriority::BestEffort,
166-
req_best_effort_then_prio.clone(),
177+
clone_request(&req_best_effort_then_prio),
167178
)
168179
.unwrap();
169180
// Then as prio:
170181
queue
171182
.queue_with_comparator(
172183
make_dummy_comparator(&req_best_effort_then_prio, Some(2)),
173184
ParticipationPriority::Priority,
174-
req_best_effort_then_prio.clone(),
185+
clone_request(&req_best_effort_then_prio),
175186
)
176187
.unwrap();
177188

@@ -183,15 +194,15 @@ fn candidate_is_only_dequeued_once() {
183194
.queue_with_comparator(
184195
make_dummy_comparator(&req_prio_then_best_effort, Some(3)),
185196
ParticipationPriority::Priority,
186-
req_prio_then_best_effort.clone(),
197+
clone_request(&req_prio_then_best_effort),
187198
)
188199
.unwrap();
189200
// Then as best effort:
190201
queue
191202
.queue_with_comparator(
192203
make_dummy_comparator(&req_prio_then_best_effort, Some(3)),
193204
ParticipationPriority::BestEffort,
194-
req_prio_then_best_effort.clone(),
205+
clone_request(&req_prio_then_best_effort),
195206
)
196207
.unwrap();
197208

node/core/dispute-coordinator/src/participation/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ async fn participate_with_commitments_hash<Context>(
7272
};
7373
let session = 1;
7474

75-
let request_timer = Arc::new(participation.metrics.time_participation_pipeline());
75+
let request_timer = participation.metrics.time_participation_pipeline();
7676
let req = ParticipationRequest::new(candidate_receipt, session, request_timer);
7777

7878
participation

0 commit comments

Comments
 (0)