Improve curl timeout handling.

In case libcurl instructs us to call the timeout function as soon
as possible (timeout == 0 in curl_timeout), don't try to be clever
with a timeout value of 10ms.

Instead call the timeout function once we get back in the worker
event loop. This makes things a lot snappier as we don't depend
on epoll/kqueue waiting for io for 10ms (which actually isn't 10ms...).
This commit is contained in:
Joris Vink 2019-06-13 12:59:17 +02:00
parent 574c9a7084
commit 4a64b4f07b
3 changed files with 26 additions and 4 deletions

View File

@ -67,6 +67,7 @@ extern u_int16_t kore_curl_timeout;
extern u_int64_t kore_curl_recv_max;
void kore_curl_sysinit(void);
void kore_curl_do_timeout(void);
void kore_curl_run(struct kore_curl *);
void kore_curl_cleanup(struct kore_curl *);
int kore_curl_success(struct kore_curl *);

View File

@ -33,6 +33,7 @@ struct fd_cache {
static void curl_process(void);
static void curl_event_handle(void *, int);
static void curl_timeout(void *, u_int64_t);
static int curl_timer(CURLM *, long, void *);
static int curl_socket(CURL *, curl_socket_t, int, void *, void *);
@ -43,6 +44,7 @@ static CURLM *multi = NULL;
static struct kore_timer *timer = NULL;
static struct kore_pool fd_cache_pool;
static char user_agent[64];
static int timeout_immediate = 0;
static LIST_HEAD(, fd_cache) cache[FD_CACHE_BUCKETS];
u_int16_t kore_curl_timeout = KORE_CURL_TIMEOUT;
@ -146,6 +148,13 @@ kore_curl_cleanup(struct kore_curl *client)
}
}
void
kore_curl_do_timeout(void)
{
while (timeout_immediate)
curl_timeout(NULL, kore_time_ms());
}
size_t
kore_curl_tobuf(char *ptr, size_t size, size_t nmemb, void *udata)
{
@ -560,6 +569,8 @@ curl_timeout(void *uarg, u_int64_t now)
static int
curl_timer(CURLM *mctx, long timeout, void *arg)
{
timeout_immediate = 0;
if (timeout < 0) {
if (timer != NULL) {
kore_timer_remove(timer);
@ -573,8 +584,10 @@ curl_timer(CURLM *mctx, long timeout, void *arg)
timer = NULL;
}
if (timeout == 0)
timeout = 10;
if (timeout == 0) {
timeout_immediate = 1;
return (CURLM_OK);
}
timer = kore_timer_add(curl_timeout, timeout, mctx, KORE_TIMER_ONESHOT);

View File

@ -49,6 +49,10 @@
#include "python_api.h"
#endif
#if defined(KORE_USE_CURL)
#include "curl.h"
#endif
#if !defined(WAIT_ANY)
#define WAIT_ANY (-1)
#endif
@ -471,14 +475,18 @@ kore_worker_entry(struct kore_worker *kw)
break;
kore_timer_run(now);
#if defined(KORE_USE_CURL)
kore_curl_do_timeout();
#endif
#if !defined(KORE_NO_HTTP)
http_process();
#endif
#if defined(KORE_USE_PYTHON)
kore_python_coro_run();
#endif
#if defined(KORE_USE_CURL)
kore_curl_do_timeout();
#endif
if (next_prune <= now) {
kore_connection_check_timeout(now);
kore_connection_prune(KORE_CONNECTION_PRUNE_DISCONNECT);