From: Eric Wong <e@80x24.org>
To: Junio C Hamano <gitster@pobox.com>
Cc: Yaroslav Halchenko <yoh@onerussian.com>,
git@vger.kernel.org, Jeff King <peff@peff.net>
Subject: [PATCH 4/3] http: check curl_multi_remove_handle error code
Date: Wed, 21 Sep 2016 21:46:23 +0000 [thread overview]
Message-ID: <20160921214623.GA1919@whir> (raw)
In-Reply-To: <xmqqr38nv8ul.fsf@gitster.mtv.corp.google.com>
Junio C Hamano <gitster@pobox.com> wrote:
> Eric Wong <e@80x24.org> writes:
> > The key patch here is 3/3 which seems like an obvious fix to
> > adding the problem of adding a curl easy handle to a curl multi
> > handle repeatedly.
>
> Yeah, sounds like the right thing to do and 2/3 makes it really easy
> to read the resulting code.
>
> > I will investigate those failures in a week or two when I regain
> > regular computer access.
>
> Thanks. Will tentatively queue on 'pu' and wait for updates.
I'm comfortable with the original 3 patch series in 'next'
and being merged to 'master' and 'maint', soon.
I don't think the following 4/3 is strictly necessary now, so
I'd be more comfortable with it being tested in 'pu' or 'next'
for a longer period.
(online today, but not much tomorrow or another few days after)
-----------8<-----------
Subject: [PATCH] http: check curl_multi_remove_handle error code
This should help detect bugs in future changes. While we're at
it, fix a (probably innocuous) bug in our http_cleanup function
for users of older curl.
curl_multi_remove_handle was not idempotent until curl 7.33.0
with commit 84f3b3dd448399f9548468676e1bd1475dba8de5
("curl_multi_remove_handle: allow multiple removes"),
so we track the "curlm" membership of the curl easy handle
ourselves with a new "in_multi" flag.
Tested with curl 7.26.0 and 7.38.0 on Debian 7.x (wheezy) and
Debian 8.x (jessie) respectively.
Signed-off-by: Eric Wong <e@80x24.org>
---
http.c | 12 ++++++++++--
http.h | 1 +
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/http.c b/http.c
index 82ed542..9f97749 100644
--- a/http.c
+++ b/http.c
@@ -204,7 +204,12 @@ static void finish_active_slot(struct active_request_slot *slot)
static void xmulti_remove_handle(struct active_request_slot *slot)
{
#ifdef USE_CURL_MULTI
- curl_multi_remove_handle(curlm, slot->curl);
+ CURLMcode code = curl_multi_remove_handle(curlm, slot->curl);
+
+ if (code != CURLM_OK)
+ die("curl_multi_remove_handle failed (%p): %s",
+ slot->curl, curl_multi_strerror(code));
+ slot->in_multi = 0;
#endif
}
@@ -888,7 +893,8 @@ void http_cleanup(void)
while (slot != NULL) {
struct active_request_slot *next = slot->next;
if (slot->curl != NULL) {
- xmulti_remove_handle(slot);
+ if (slot->in_multi)
+ xmulti_remove_handle(slot);
curl_easy_cleanup(slot->curl);
}
free(slot);
@@ -965,6 +971,7 @@ struct active_request_slot *get_active_slot(void)
newslot = xmalloc(sizeof(*newslot));
newslot->curl = NULL;
newslot->in_use = 0;
+ newslot->in_multi = 0;
newslot->next = NULL;
slot = active_queue_head;
@@ -1033,6 +1040,7 @@ int start_active_slot(struct active_request_slot *slot)
slot->in_use = 0;
return 0;
}
+ slot->in_multi = 1;
/*
* We know there must be something to do, since we just added
diff --git a/http.h b/http.h
index 5ab9d9c..3339d70 100644
--- a/http.h
+++ b/http.h
@@ -60,6 +60,7 @@ struct slot_results {
struct active_request_slot {
CURL *curl;
int in_use;
+ int in_multi;
CURLcode curl_result;
long http_code;
int *finished;
--
EW
next prev parent reply other threads:[~2016-09-21 21:46 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-09 22:19 git clone http:// fails some times with "Request for d53.. aborted" Yaroslav Halchenko
2016-09-10 0:21 ` Eric Wong
2016-09-13 0:25 ` [RFC 0/3] http: avoid repeatedly adding curl easy to curlm Eric Wong
2016-09-13 0:25 ` [RFC 1/3] http: warn on curl_multi_add_handle failures Eric Wong
2016-09-13 0:25 ` [RFC 2/3] http: consolidate #ifdefs for curl_multi_remove_handle Eric Wong
2016-09-13 0:25 ` [RFC 3/3] http: always remove curl easy from curlm session on release Eric Wong
2016-09-13 20:32 ` [RFC 0/3] http: avoid repeatedly adding curl easy to curlm Junio C Hamano
2016-09-21 21:46 ` Eric Wong [this message]
2016-09-21 22:22 ` [PATCH 4/3] http: check curl_multi_remove_handle error code Jeff King
2016-09-21 22:29 ` Eric Wong
2016-09-21 22:31 ` Jeff King
2016-09-14 11:59 ` [RFC 0/3] http: avoid repeatedly adding curl easy to curlm Yaroslav Halchenko
2016-09-14 14:03 ` git submodule add spits unrelated to actual problem error msg about .gitignore Yaroslav Halchenko
2016-09-14 19:32 ` Stefan Beller
2016-09-14 20:23 ` Yaroslav Halchenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160921214623.GA1919@whir \
--to=e@80x24.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
--cc=yoh@onerussian.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.