1
1
import logging
2
- import time
3
2
from typing import (
4
3
TYPE_CHECKING ,
5
4
Dict ,
15
14
from jenkinsapi .custom_exceptions import JenkinsAPIException
16
15
from jenkinsapi .jenkinsbase import JenkinsBase
17
16
from jenkinsapi .utils .requester import Requester
17
+ from jenkinsapi .utils .retry import Retry , SimpleRetry
18
18
19
19
if TYPE_CHECKING :
20
20
from jenkinsapi .jenkins import Jenkins
@@ -226,67 +226,59 @@ def try_reserve(
226
226
def wait_reserve (
227
227
self ,
228
228
selector : "ResourceSelector" ,
229
- sleep_period : float = DEFAULT_WAIT_SLEEP_PERIOD ,
230
- timeout : float = DEFAULT_WAIT_TIMEOUT_PERIOD ,
229
+ retry : Optional [Retry ] = None ,
231
230
) -> str :
232
231
"""
233
232
Reserve a resource that matches the given condition
234
233
235
234
:return: the name of the reserved resource
236
235
:raise TimeoutError: if no resource could be reserved
237
236
"""
238
- start_time = time .time ()
237
+ if retry is None :
238
+ retry = SimpleRetry (
239
+ sleep_period = self .DEFAULT_WAIT_SLEEP_PERIOD ,
240
+ timeout = self .DEFAULT_WAIT_TIMEOUT_PERIOD ,
241
+ )
242
+ retry .begin ()
239
243
while True :
240
244
result = self .try_reserve (selector )
241
245
if result is not None :
242
246
return result
243
- if time .time () - start_time > timeout :
244
- raise TimeoutError ("Timed out waiting for resource" )
245
- logger .info (
246
- "No free resources matching %r, sleep %.3f seconds" ,
247
- selector ,
248
- sleep_period ,
249
- )
247
+ retry .check ()
248
+ logger .info ("No free resources matching %r, retry" , selector )
250
249
self .poll ()
251
- time .sleep (sleep_period )
252
250
253
251
def reservation_by_label (
254
252
self ,
255
253
label : str ,
256
- sleep_period : float = DEFAULT_WAIT_SLEEP_PERIOD ,
257
- timeout : float = DEFAULT_WAIT_TIMEOUT_PERIOD ,
254
+ retry : Optional [Retry ] = None ,
258
255
) -> "LockedResourceReservation" :
259
256
return LockedResourceReservation (
260
257
self ,
261
258
ResourceLabelSelector (label ),
262
- sleep_period = sleep_period ,
263
- timeout = timeout ,
259
+ retry = retry ,
264
260
)
265
261
266
262
def reservation_by_name (
267
263
self ,
268
264
name : str ,
269
- sleep_period : float = DEFAULT_WAIT_SLEEP_PERIOD ,
270
- timeout : float = DEFAULT_WAIT_TIMEOUT_PERIOD ,
265
+ retry : Optional [Retry ] = None ,
271
266
) -> "LockedResourceReservation" :
272
267
return LockedResourceReservation (
273
268
self ,
274
269
ResourceNameSelector (name ),
275
- sleep_period = sleep_period ,
276
- timeout = timeout ,
270
+ retry = retry ,
277
271
)
278
272
279
273
def reservation_by_name_list (
280
274
self ,
281
275
name_list : List [str ],
282
- sleep_period : float = DEFAULT_WAIT_SLEEP_PERIOD ,
283
- timeout : float = DEFAULT_WAIT_TIMEOUT_PERIOD ,
276
+ retry : Optional [Retry ] = None ,
284
277
) -> "LockedResourceReservation" :
285
278
return LockedResourceReservation (
286
279
self ,
287
280
ResourceNameListSelector (name_list ),
288
- sleep_period = sleep_period ,
289
- timeout = timeout ,
281
+ retry = retry ,
290
282
)
291
283
292
284
@@ -363,13 +355,11 @@ def __init__(
363
355
self ,
364
356
api : LockableResources ,
365
357
selector : ResourceSelector ,
366
- sleep_period : float = LockableResources .DEFAULT_WAIT_SLEEP_PERIOD ,
367
- timeout : float = LockableResources .DEFAULT_WAIT_TIMEOUT_PERIOD ,
358
+ retry : Optional [Retry ] = None ,
368
359
):
369
360
self .api = api
370
361
self .selector = selector
371
- self .sleep_period = sleep_period
372
- self .timeout = timeout
362
+ self .retry = retry
373
363
374
364
@property
375
365
def locked_resource_name (self ) -> str :
@@ -387,7 +377,7 @@ def __enter__(self) -> "LockedResourceReservation":
387
377
if self ._locked_resource_name is not None :
388
378
raise RuntimeError ("Lock already acquired" )
389
379
self ._locked_resource_name = self .api .wait_reserve (
390
- self .selector , sleep_period = self .sleep_period , timeout = self . timeout
380
+ self .selector , retry = self .retry
391
381
)
392
382
self .locked = True
393
383
return self
0 commit comments