Skip to content

Commit e2d844e

Browse files
krallinfacebook-github-bot
authored andcommitted
buck2: hybrid: don't cap permits at machine size for the low pass filter
Summary: Like it says in the title. We don't actually care to exceed the machine capacity in the low pass filter (in that case we *would* like to not run anything locally: there is nothing special about *1* task). This notably makes it easier to add tests (see next diff). Reviewed By: get9 Differential Revision: D47406600 fbshipit-source-id: c16003a7277e097dbbab0fb1529a8395595cf603
1 parent aad29fa commit e2d844e

File tree

2 files changed

+58
-19
lines changed

2 files changed

+58
-19
lines changed

app/buck2_execute_impl/src/executors/hybrid.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,16 @@ where
204204

205205
let weight = match command.request.host_sharing_requirements() {
206206
HostSharingRequirements::ExclusiveAccess => self.low_pass_filter.capacity(),
207-
HostSharingRequirements::OnePerToken(.., class) => {
208-
self.local.host_sharing_broker.requested_permits(class)
209-
}
210-
HostSharingRequirements::Shared(class) => {
211-
self.local.host_sharing_broker.requested_permits(class)
212-
}
207+
HostSharingRequirements::OnePerToken(.., class) => self
208+
.local
209+
.host_sharing_broker
210+
.requested_permits(class)
211+
.into_count_uncapped(),
212+
HostSharingRequirements::Shared(class) => self
213+
.local
214+
.host_sharing_broker
215+
.requested_permits(class)
216+
.into_count_uncapped(),
213217
};
214218

215219
let is_retryable_status = move |r: &CommandExecutionResult| {

host_sharing/src/host_sharing.rs

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -110,18 +110,36 @@ pub struct HostSharingBroker {
110110
named_semaphores: NamedSemaphores,
111111
}
112112

113+
pub struct RequestedPermits {
114+
count: usize,
115+
cap: usize,
116+
}
117+
118+
impl RequestedPermits {
119+
pub fn into_count(self) -> usize {
120+
self.count.min(self.cap)
121+
}
122+
123+
pub fn into_count_uncapped(self) -> usize {
124+
self.count
125+
}
126+
}
127+
113128
impl HostSharingBroker {
114129
// If a test requires Permits(4) permits but the machine only has 3 permits then we cap the
115130
// test's required permits to 3. Otherwise the test would never be allowed to run.
116-
pub fn requested_permits(&self, weight_class: &WeightClass) -> usize {
117-
match weight_class {
118-
WeightClass::Permits(required_permits) => {
119-
self.num_machine_permits.min(*required_permits)
120-
}
131+
pub fn requested_permits(&self, weight_class: &WeightClass) -> RequestedPermits {
132+
let count = match weight_class {
133+
WeightClass::Permits(required_permits) => *required_permits,
121134
WeightClass::Percentage(percentage) => {
122135
let percentage: usize = percentage.into_value().into();
123136
(self.num_machine_permits * percentage).div_ceil(100)
124137
}
138+
};
139+
140+
RequestedPermits {
141+
count,
142+
cap: self.num_machine_permits,
125143
}
126144
}
127145

@@ -150,7 +168,7 @@ impl HostSharingBroker {
150168
) -> HostSharingGuard {
151169
match host_sharing_requirements {
152170
HostSharingRequirements::Shared(weight_class) => {
153-
let permits = self.requested_permits(weight_class);
171+
let permits = self.requested_permits(weight_class).into_count();
154172
let _run_guard = self.permits.acquire(permits).await;
155173
HostSharingGuard {
156174
_run_guard,
@@ -171,7 +189,7 @@ impl HostSharingBroker {
171189
// for the previous run on this identifier to finish.
172190
let run_semaphore = self.named_semaphores.get(identifier);
173191
let _name_guard = Some(run_semaphore.acquire(SINGLE_RUN).await);
174-
let permits = self.requested_permits(weight_class);
192+
let permits = self.requested_permits(weight_class).into_count();
175193
let _run_guard = self.permits.acquire(permits).await;
176194
HostSharingGuard {
177195
_run_guard,
@@ -198,37 +216,54 @@ mod tests {
198216
fn test_heavyweight_capped_to_machine_permits() {
199217
let broker = HostSharingBroker::new(HostSharingStrategy::SmallerTasksFirst, 2);
200218

201-
let permits = broker.requested_permits(&WeightClass::Permits(4));
219+
let permits = broker
220+
.requested_permits(&WeightClass::Permits(4))
221+
.into_count();
202222
assert_eq!(2, permits);
223+
224+
let permits = broker
225+
.requested_permits(&WeightClass::Permits(4))
226+
.into_count_uncapped();
227+
assert_eq!(4, permits);
203228
}
204229

205230
#[test]
206231
fn test_percentage() {
207232
let broker = HostSharingBroker::new(HostSharingStrategy::SmallerTasksFirst, 10);
208233

209234
assert_eq!(
210-
broker.requested_permits(&WeightClass::Percentage(WeightPercentage { value: 0 })),
235+
broker
236+
.requested_permits(&WeightClass::Percentage(WeightPercentage { value: 0 }))
237+
.into_count(),
211238
0,
212239
);
213240

214241
assert_eq!(
215-
broker.requested_permits(&WeightClass::Percentage(WeightPercentage { value: 40 })),
242+
broker
243+
.requested_permits(&WeightClass::Percentage(WeightPercentage { value: 40 }))
244+
.into_count(),
216245
4,
217246
);
218247

219248
// This rounds up.
220249
assert_eq!(
221-
broker.requested_permits(&WeightClass::Percentage(WeightPercentage { value: 15 })),
250+
broker
251+
.requested_permits(&WeightClass::Percentage(WeightPercentage { value: 15 }))
252+
.into_count(),
222253
2,
223254
);
224255

225256
assert_eq!(
226-
broker.requested_permits(&WeightClass::Percentage(WeightPercentage { value: 99 })),
257+
broker
258+
.requested_permits(&WeightClass::Percentage(WeightPercentage { value: 99 }))
259+
.into_count(),
227260
10,
228261
);
229262

230263
assert_eq!(
231-
broker.requested_permits(&WeightClass::Percentage(WeightPercentage { value: 100 })),
264+
broker
265+
.requested_permits(&WeightClass::Percentage(WeightPercentage { value: 100 }))
266+
.into_count(),
232267
10,
233268
);
234269
}

0 commit comments

Comments
 (0)