@@ -110,18 +110,36 @@ pub struct HostSharingBroker {
110
110
named_semaphores : NamedSemaphores ,
111
111
}
112
112
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
+
113
128
impl HostSharingBroker {
114
129
// If a test requires Permits(4) permits but the machine only has 3 permits then we cap the
115
130
// 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,
121
134
WeightClass :: Percentage ( percentage) => {
122
135
let percentage: usize = percentage. into_value ( ) . into ( ) ;
123
136
( self . num_machine_permits * percentage) . div_ceil ( 100 )
124
137
}
138
+ } ;
139
+
140
+ RequestedPermits {
141
+ count,
142
+ cap : self . num_machine_permits ,
125
143
}
126
144
}
127
145
@@ -150,7 +168,7 @@ impl HostSharingBroker {
150
168
) -> HostSharingGuard {
151
169
match host_sharing_requirements {
152
170
HostSharingRequirements :: Shared ( weight_class) => {
153
- let permits = self . requested_permits ( weight_class) ;
171
+ let permits = self . requested_permits ( weight_class) . into_count ( ) ;
154
172
let _run_guard = self . permits . acquire ( permits) . await ;
155
173
HostSharingGuard {
156
174
_run_guard,
@@ -171,7 +189,7 @@ impl HostSharingBroker {
171
189
// for the previous run on this identifier to finish.
172
190
let run_semaphore = self . named_semaphores . get ( identifier) ;
173
191
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 ( ) ;
175
193
let _run_guard = self . permits . acquire ( permits) . await ;
176
194
HostSharingGuard {
177
195
_run_guard,
@@ -198,37 +216,54 @@ mod tests {
198
216
fn test_heavyweight_capped_to_machine_permits ( ) {
199
217
let broker = HostSharingBroker :: new ( HostSharingStrategy :: SmallerTasksFirst , 2 ) ;
200
218
201
- let permits = broker. requested_permits ( & WeightClass :: Permits ( 4 ) ) ;
219
+ let permits = broker
220
+ . requested_permits ( & WeightClass :: Permits ( 4 ) )
221
+ . into_count ( ) ;
202
222
assert_eq ! ( 2 , permits) ;
223
+
224
+ let permits = broker
225
+ . requested_permits ( & WeightClass :: Permits ( 4 ) )
226
+ . into_count_uncapped ( ) ;
227
+ assert_eq ! ( 4 , permits) ;
203
228
}
204
229
205
230
#[ test]
206
231
fn test_percentage ( ) {
207
232
let broker = HostSharingBroker :: new ( HostSharingStrategy :: SmallerTasksFirst , 10 ) ;
208
233
209
234
assert_eq ! (
210
- broker. requested_permits( & WeightClass :: Percentage ( WeightPercentage { value: 0 } ) ) ,
235
+ broker
236
+ . requested_permits( & WeightClass :: Percentage ( WeightPercentage { value: 0 } ) )
237
+ . into_count( ) ,
211
238
0 ,
212
239
) ;
213
240
214
241
assert_eq ! (
215
- broker. requested_permits( & WeightClass :: Percentage ( WeightPercentage { value: 40 } ) ) ,
242
+ broker
243
+ . requested_permits( & WeightClass :: Percentage ( WeightPercentage { value: 40 } ) )
244
+ . into_count( ) ,
216
245
4 ,
217
246
) ;
218
247
219
248
// This rounds up.
220
249
assert_eq ! (
221
- broker. requested_permits( & WeightClass :: Percentage ( WeightPercentage { value: 15 } ) ) ,
250
+ broker
251
+ . requested_permits( & WeightClass :: Percentage ( WeightPercentage { value: 15 } ) )
252
+ . into_count( ) ,
222
253
2 ,
223
254
) ;
224
255
225
256
assert_eq ! (
226
- broker. requested_permits( & WeightClass :: Percentage ( WeightPercentage { value: 99 } ) ) ,
257
+ broker
258
+ . requested_permits( & WeightClass :: Percentage ( WeightPercentage { value: 99 } ) )
259
+ . into_count( ) ,
227
260
10 ,
228
261
) ;
229
262
230
263
assert_eq ! (
231
- broker. requested_permits( & WeightClass :: Percentage ( WeightPercentage { value: 100 } ) ) ,
264
+ broker
265
+ . requested_permits( & WeightClass :: Percentage ( WeightPercentage { value: 100 } ) )
266
+ . into_count( ) ,
232
267
10 ,
233
268
) ;
234
269
}
0 commit comments