diff options
Diffstat (limited to 'src/util.c')
-rw-r--r-- | src/util.c | 45 |
1 files changed, 26 insertions, 19 deletions
@@ -227,23 +227,27 @@ eclat_send_request(struct ec2_request *orig, struct grecs_node **ret_tree) char *url; CURLcode res; int ret = 0; - struct curl_slist *headers = NULL; + struct curl_slist *headers; struct eclat_io *io; time_t endtime; unsigned long tts, t; + struct grecs_node *xmltree = NULL; + void *sim; - io = eclat_io_init(0); - if (!io) { - err("cannot initialize IO structure"); - return -1; - } - endtime = time(NULL) + max_retry_time; - tts = 1; + tts = 2; do { struct grecs_node *node; + struct ec2_request *req; + + io = eclat_io_init(0); + if (!io) { + err("cannot initialize IO structure"); + return -1; + } + /* Prepare the request */ - struct ec2_request *req = eclat_request_dup(orig); + req = eclat_request_dup(orig); if (req->flags & EC2_RF_POST) { eclat_request_finalize(orig); curl_easy_setopt(io->curl, CURLOPT_POST, 1); @@ -257,6 +261,7 @@ eclat_send_request(struct ec2_request *orig, struct grecs_node **ret_tree) curl_easy_setopt(io->curl, CURLOPT_URL, url); debug(ECLAT_DEBCAT_MAIN, 1, ("using URL: %s", url)); free(url); + headers = NULL; if (req->headers) { struct grecs_list_entry *ep; struct grecs_txtacc *acc; @@ -298,12 +303,13 @@ eclat_send_request(struct ec2_request *orig, struct grecs_node **ret_tree) else { res = curl_easy_perform(io->curl); if (res == CURLE_OK) { - *ret_tree = eclat_io_finish(io); + xmltree = eclat_io_finish(io); } else { err("CURL: %s", curl_easy_strerror(res)); ret = 1; } } + eclat_io_free(io); curl_slist_free_all(headers); eclat_request_free(req); @@ -311,21 +317,23 @@ eclat_send_request(struct ec2_request *orig, struct grecs_node **ret_tree) if (ret) break; - node = grecs_find_node(*ret_tree, - ".Response.Errors.Error.Code"); + node = grecs_find_node(xmltree, ".Response.Errors.Error.Code"); if (!node) break; if (node->type != grecs_node_stmt - || node->v.value->type == GRECS_TYPE_STRING) { + || node->v.value->type != GRECS_TYPE_STRING) { err("unexpectedly formatted error code"); break; } - if (strcmp(node->v.value->v.string, - "Client.RequestLimitExceeded")) + if (strcmp(node->v.value->v.string, "RequestLimitExceeded")) break; - t = random() % tts; + grecs_tree_free(xmltree); + xmltree = NULL; + + t = random() % tts + 1; + warn("request limit exceeded; sleeping for %lu seconds", t); sleep(t); if (tts < max_retry_sleep) { tts <<= 1; @@ -333,9 +341,8 @@ eclat_send_request(struct ec2_request *orig, struct grecs_node **ret_tree) tts = max_retry_sleep; } } while (time(NULL) < endtime); - - eclat_io_free(io); - + + *ret_tree = xmltree; return ret; } |