Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Curl retry mechanism

I have a script I run to deploy two web services and a front-end application. The script calls a method that checks to see if the two back-end services are up and running. If so, deem the deploy successful, otherwise revert.

The two services sometimes take longer than the front-end to start up. Currently, I put in a sleep call to delay the web service check. This allows them time to start up.

I want to remove this sleep and add in a retry mechanism so that if a service is down, just retry the check repeatedly until I get a response.

To check if the device is up, I use curl. I've read that curl has a retry mechanism but I've never used it.

Have any of you solved this problem before? I want to understand the things I must consider when solving it, e.g. do I retry until I get an HTTP 200 response from my service?

Does anyone have any suggestions on how I'd test this? I'd need to find a service that was down.

EDIT: I see that -retry only reacts to transient errors. "Transient error means either: a timeout, an FTP 4xx response code or an HTTP 5xx response code". My service can return a 404 therefore curl's retry is not my solution.

like image 264
TheCoder Avatar asked Mar 18 '17 10:03

TheCoder


People also ask

Does curl automatically retry?

If a transient error is returned when curl tries to perform a transfer, it will retry this number of times before giving up. Setting the number to 0 makes curl do no retries (which is the default).

What is retry policy?

A Retry Policy is a collection of attributes that instructs the Temporal Server how to retry a failure of a Workflow Execution or an Activity Task Execution. (Retry Policies do not apply to Workflow Task Executions, which always retry indefinitely.)


3 Answers

The following statement will retry 5 times or a maximum of 40 seconds with a connection timeout of 5 seconds, and no exponential backoff policy

curl --connect-timeout 5 \
    --max-time 10 \
    --retry 5 \
    --retry-delay 0 \
    --retry-max-time 40 \
    'http://your_url'


--max-time 10     (how long each retry will wait)
--retry 5         (it will retry 5 times)
--retry-delay 0   (an exponential backoff algorithm)
--retry-max-time  (total time before it's considered failed)

Note that there is also a --retry-connrefused (since curl 7.52.0) that retries even when the connection is refused and --retry-all-errors (since curl 7.71.0) which "is the sledgehammer of retrying".

like image 111
Dan Ionescu Avatar answered Oct 13 '22 11:10

Dan Ionescu


Just to clear up any possible confusion for anyone new...

Please see: https://curl.haxx.se/docs/manpage.html

--retry

If a transient error is returned when curl tries to perform a transfer, it will retry this number of times before giving up. Setting the number to 0 makes curl do no retries (which is the default). Transient error means either: a timeout, an FTP 4xx response code or an HTTP 5xx response code.

When curl is about to retry a transfer, it will first wait one second and then for all forthcoming retries it will double the waiting time until it reaches 10 minutes which then will be the delay between the rest of the retries. By using --retry-delay you disable this exponential backoff algorithm. See also --retry-max-time to limit the total time allowed for retries.

If this option is used several times, the last one will be used.

Added in 7.12.3.

like image 25
Twilio Technical Support Avatar answered Oct 13 '22 10:10

Twilio Technical Support


If you use --max-time 10 this will kill your connection before 10 seconds so its not useful when downloading.

Following will retry 300 times with 5sec delay and 30sec connection timeout

curl \
    --connect-timeout 30 \
    --retry 300 \
    --retry-delay 5 \
    URL
like image 11
Max Barrass Avatar answered Oct 13 '22 11:10

Max Barrass