@@ -6,9 +6,9 @@ use std::{
6
6
Arc ,
7
7
} ,
8
8
} ;
9
- use tokio:: sync:: { OwnedSemaphorePermit , Semaphore } ;
9
+ use tokio:: sync:: { OwnedSemaphorePermit , Semaphore , TryAcquireError } ;
10
10
11
- use super :: { ContainerPermit , ProcessPermit , ResourceLimits , ResourceResult } ;
11
+ use super :: { ContainerPermit , ProcessPermit , ResourceError , ResourceLimits , ResourceResult } ;
12
12
13
13
/// Describe how the resource was (or was not) acquired.
14
14
#[ derive( Debug , Copy , Clone , PartialEq ) ]
@@ -187,21 +187,17 @@ where
187
187
// occur when we are already at the upper bounds of our
188
188
// limits. In those cases, freeing an extra container or
189
189
// two shouldn't be the worst thing.
190
- let container_permit = {
191
- let fallback = {
192
- let container_semaphore = container_semaphore. clone ( ) ;
193
- async {
194
- container_request_semaphore. add_permits ( 1 ) ;
195
- container_semaphore. acquire_owned ( ) . await
196
- }
197
- } ;
198
-
199
- tokio:: select! {
200
- biased;
201
-
202
- permit = container_semaphore. acquire_owned( ) => permit,
203
- permit = fallback => permit,
190
+
191
+ let container_permit = match container_semaphore. clone ( ) . try_acquire_owned ( ) {
192
+ Ok ( permit) => Ok ( permit) ,
193
+ Err ( TryAcquireError :: NoPermits ) => {
194
+ container_request_semaphore. add_permits ( 1 ) ;
195
+ container_semaphore
196
+ . acquire_owned ( )
197
+ . await
198
+ . map_err ( ResourceError :: from)
204
199
}
200
+ Err ( e) => Err ( e. into ( ) ) ,
205
201
} ;
206
202
207
203
let container_permit = guard. complete ( container_permit) ?;
0 commit comments