Hi Giovanni,

Currently there is no explicit retry handler for rate limit errors in
Rackspace, but it is something that could be implemented. The
DigitalOcean fixes it in quite an elegant way, and I'm pretty sure a
similar approach could be aded for Rackspace. I'll try to summarise
the relevant bits from the DigitalOcean provider so you can try to
follow the same pattern:

* First, it declares the DigitalOcean2RateLimitModule [1] that
registers a custom error handler for retry limit errors. This module
is not configured by default, but users willing to use the automatic
rate-limit retry mechanism, can add it to the list of modules when
creating the context; that's all it requires from a user's
perspective.

* Second, the declared RateLimitRetryHandler [2] inspects the request
and decides if the error should be propagated or the request should be
retried, and when. Note that retry handlers in jclouds work "at HTTP
level". That means they are transparent to the provider API method
calls. Once call to an interface API method could end up in several
HTTP requests or retries, being the rate limit retries some of them.
The good thing about this approach is that is transparent to the API
and the existing code.

* Finally, the DigitalOcean2ErrorHandler [3] propagates a custom
rate-limit exception, when the request can't be retried any more, or
the user hasn't configured the rate limit module and rate limit errors
are just raised. That exception contains detailed information about
the rate limit error and allows users to manually handle rate-limit
errors, if needed.



With these pieces in place it shouldn't be very difficult to implement
the same for Rackspace, and I would love to see a pull request for
this! If you're up to trying to implement it, I'll be happy to help.


I.


[1] 
https://github.com/jclouds/jclouds/blob/master/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/config/DigitalOcean2RateLimitModule.java
[2] 
https://github.com/jclouds/jclouds/blob/master/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/handlers/RateLimitRetryHandler.java
[3] 
https://github.com/jclouds/jclouds/blob/master/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/handlers/DigitalOcean2ErrorHandler.java#L66-L68

On 24 February 2016 at 15:35, Giovanni Toraldo
<giovanni.tora...@cloudesire.com> wrote:
> Hi guys,
>
> I've just hit a rate limit error while using rackspace dns service:
>
> org.jclouds.http.HttpResponseException: command: GET
> https://lon.dns.api.rackspacecloud.com/v1.0/10040650/domains/4433011?showRecords=true&showSubdomains=true
> HTTP/1.1 failed with response: HTTP/1.1 413 Request Entity Too Large;
> content: [{
>     "overLimit" : {
>         "code" : 413,
>         "message" : "OverLimit Retry...",
>         "details" : "Error Details...",
>    "retryAfter" : "2016-02-24T14:25:57Z"
>     }
> }]
>
> full stacktrace https://gist.github.com/gionn/2b32e8734749a71490c3
>
> Is there an easy way to implement a simple retry feature, maybe using
> the suggested retryAfter field of the error response?
>
> Thanks.
>
> --
> Giovanni Toraldo
> Lead Developer
> https://cloudesire.com

Reply via email to