test2600: fix flakiness on low cpu
- refs #11355 where failures to to low cpu resources in CI are reported - vastly extend CURLOPT_CONNECTTIMEOUT_MS and max durations to test cases - trigger Curl_expire() in test filter to allow re-checks before the usual 1second interval Closes #11690
This commit is contained in:
parent
20e3287aca
commit
862741637b
@ -50,6 +50,7 @@
|
|||||||
#include "urldata.h"
|
#include "urldata.h"
|
||||||
#include "connect.h"
|
#include "connect.h"
|
||||||
#include "cfilters.h"
|
#include "cfilters.h"
|
||||||
|
#include "multiif.h"
|
||||||
#include "curl_trc.h"
|
#include "curl_trc.h"
|
||||||
|
|
||||||
/* copied from hostip.c to switch using SIGALARM for timeouts.
|
/* copied from hostip.c to switch using SIGALARM for timeouts.
|
||||||
@ -148,19 +149,20 @@ static CURLcode cf_test_connect(struct Curl_cfilter *cf,
|
|||||||
bool blocking, bool *done)
|
bool blocking, bool *done)
|
||||||
{
|
{
|
||||||
struct cf_test_ctx *ctx = cf->ctx;
|
struct cf_test_ctx *ctx = cf->ctx;
|
||||||
struct curltime now;
|
timediff_t duration_ms;
|
||||||
|
|
||||||
(void)data;
|
(void)data;
|
||||||
(void)blocking;
|
(void)blocking;
|
||||||
*done = FALSE;
|
*done = FALSE;
|
||||||
now = Curl_now();
|
duration_ms = Curl_timediff(Curl_now(), ctx->started);
|
||||||
if(Curl_timediff(now, ctx->started) >= ctx->fail_delay_ms) {
|
if(duration_ms >= ctx->fail_delay_ms) {
|
||||||
infof(data, "%04dms: cf[%s] fail delay reached",
|
infof(data, "%04dms: cf[%s] fail delay reached",
|
||||||
(int)Curl_timediff(Curl_now(), current_tr->started), ctx->id);
|
(int)duration_ms, ctx->id);
|
||||||
return CURLE_COULDNT_CONNECT;
|
return CURLE_COULDNT_CONNECT;
|
||||||
}
|
}
|
||||||
infof(data, "%04dms: cf[%s] continuing",
|
if(duration_ms)
|
||||||
(int)Curl_timediff(Curl_now(), current_tr->started), ctx->id);
|
infof(data, "%04dms: cf[%s] continuing", (int)duration_ms, ctx->id);
|
||||||
|
Curl_expire(data, ctx->fail_delay_ms - duration_ms, EXPIRE_RUN_NOW);
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,6 +228,10 @@ static CURLcode cf_test_create(struct Curl_cfilter **pcf,
|
|||||||
infof(data, "%04dms: cf[%s] created", (int)created_at, ctx->id);
|
infof(data, "%04dms: cf[%s] created", (int)created_at, ctx->id);
|
||||||
|
|
||||||
result = Curl_cf_create(&cf, &cft_test, ctx);
|
result = Curl_cf_create(&cf, &cft_test, ctx);
|
||||||
|
if(result)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
Curl_expire(data, ctx->fail_delay_ms, EXPIRE_RUN_NOW);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
*pcf = (!result)? cf : NULL;
|
*pcf = (!result)? cf : NULL;
|
||||||
@ -240,7 +246,10 @@ static void check_result(struct test_case *tc,
|
|||||||
struct test_result *tr)
|
struct test_result *tr)
|
||||||
{
|
{
|
||||||
char msg[256];
|
char msg[256];
|
||||||
timediff_t duration_ms = 0;
|
timediff_t duration_ms;
|
||||||
|
|
||||||
|
duration_ms = Curl_timediff(tr->ended, tr->started);
|
||||||
|
fprintf(stderr, "%d: test case took %dms\n", tc->id, (int)duration_ms);
|
||||||
|
|
||||||
if(tr->result != tc->exp_result
|
if(tr->result != tc->exp_result
|
||||||
&& CURLE_OPERATION_TIMEDOUT != tr->result) {
|
&& CURLE_OPERATION_TIMEDOUT != tr->result) {
|
||||||
@ -261,7 +270,6 @@ static void check_result(struct test_case *tc,
|
|||||||
fail(msg);
|
fail(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)duration_ms;
|
|
||||||
#ifndef USE_ALARM_TIMEOUT
|
#ifndef USE_ALARM_TIMEOUT
|
||||||
duration_ms = Curl_timediff(tr->ended, tr->started);
|
duration_ms = Curl_timediff(tr->ended, tr->started);
|
||||||
if(duration_ms < tc->min_duration_ms) {
|
if(duration_ms < tc->min_duration_ms) {
|
||||||
@ -316,14 +324,14 @@ static void test_connect(struct test_case *tc)
|
|||||||
fail_unless(list, "error allocating resolve list entry");
|
fail_unless(list, "error allocating resolve list entry");
|
||||||
curl_easy_setopt(easy, CURLOPT_RESOLVE, list);
|
curl_easy_setopt(easy, CURLOPT_RESOLVE, list);
|
||||||
curl_easy_setopt(easy, CURLOPT_IPRESOLVE, (long)tc->ip_version);
|
curl_easy_setopt(easy, CURLOPT_IPRESOLVE, (long)tc->ip_version);
|
||||||
|
curl_easy_setopt(easy, CURLOPT_CONNECTTIMEOUT_MS,
|
||||||
|
(long)tc->connect_timeout_ms);
|
||||||
#ifdef USE_ALARM_TIMEOUT
|
#ifdef USE_ALARM_TIMEOUT
|
||||||
curl_easy_setopt(easy, CURLOPT_CONNECTTIMEOUT_MS, 2000L);
|
/* we only 1sec timer resolution here */
|
||||||
curl_easy_setopt(easy, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS,
|
curl_easy_setopt(easy, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS,
|
||||||
(tc->he_timeout_ms > tc->connect_timeout_ms)?
|
(tc->he_timeout_ms > tc->connect_timeout_ms)?
|
||||||
3000L : 1000L);
|
3000L : 1000L);
|
||||||
#else
|
#else
|
||||||
curl_easy_setopt(easy, CURLOPT_CONNECTTIMEOUT_MS,
|
|
||||||
(long)tc->connect_timeout_ms);
|
|
||||||
curl_easy_setopt(easy, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS,
|
curl_easy_setopt(easy, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS,
|
||||||
(long)tc->he_timeout_ms);
|
(long)tc->he_timeout_ms);
|
||||||
#endif
|
#endif
|
||||||
@ -362,39 +370,39 @@ static void test_connect(struct test_case *tc)
|
|||||||
#define TURL "http://test.com:123"
|
#define TURL "http://test.com:123"
|
||||||
|
|
||||||
#define R_FAIL CURLE_COULDNT_CONNECT
|
#define R_FAIL CURLE_COULDNT_CONNECT
|
||||||
|
/* timeout values accounting for low cpu resources in CI */
|
||||||
|
#define TC_TMOT 90000 /* 90 sec max test duration */
|
||||||
|
#define CNCT_TMOT 60000 /* 60sec connect timeout */
|
||||||
|
|
||||||
static struct test_case TEST_CASES[] = {
|
static struct test_case TEST_CASES[] = {
|
||||||
/* TIMEOUT_MS, FAIL_MS CREATED DURATION Result, HE_PREF */
|
/* TIMEOUT_MS, FAIL_MS CREATED DURATION Result, HE_PREF */
|
||||||
/* CNCT HE v4 v6 v4 v6 MIN MAX */
|
/* CNCT HE v4 v6 v4 v6 MIN MAX */
|
||||||
{ 1, TURL, "test.com:123:192.0.2.1", CURL_IPRESOLVE_WHATEVER,
|
{ 1, TURL, "test.com:123:192.0.2.1", CURL_IPRESOLVE_WHATEVER,
|
||||||
250, 150, 200, 200, 1, 0, 200, 600, R_FAIL, NULL },
|
CNCT_TMOT, 150, 200, 200, 1, 0, 200, TC_TMOT, R_FAIL, NULL },
|
||||||
/* 1 ipv4, fails after ~200ms, reports COULDNT_CONNECT */
|
/* 1 ipv4, fails after ~200ms, reports COULDNT_CONNECT */
|
||||||
{ 2, TURL, "test.com:123:192.0.2.1,192.0.2.2", CURL_IPRESOLVE_WHATEVER,
|
{ 2, TURL, "test.com:123:192.0.2.1,192.0.2.2", CURL_IPRESOLVE_WHATEVER,
|
||||||
500, 150, 200, 200, 2, 0, 400, 800, R_FAIL, NULL },
|
CNCT_TMOT, 150, 200, 200, 2, 0, 400, TC_TMOT, R_FAIL, NULL },
|
||||||
/* 2 ipv4, fails after ~400ms, reports COULDNT_CONNECT */
|
/* 2 ipv4, fails after ~400ms, reports COULDNT_CONNECT */
|
||||||
#ifdef ENABLE_IPV6
|
#ifdef ENABLE_IPV6
|
||||||
{ 3, TURL, "test.com:123:::1", CURL_IPRESOLVE_WHATEVER,
|
{ 3, TURL, "test.com:123:::1", CURL_IPRESOLVE_WHATEVER,
|
||||||
250, 150, 200, 200, 0, 1, 200, 500, R_FAIL, NULL },
|
CNCT_TMOT, 150, 200, 200, 0, 1, 200, TC_TMOT, R_FAIL, NULL },
|
||||||
/* 1 ipv6, fails after ~200ms, reports COULDNT_CONNECT */
|
/* 1 ipv6, fails after ~200ms, reports COULDNT_CONNECT */
|
||||||
{ 4, TURL, "test.com:123:::1,::2", CURL_IPRESOLVE_WHATEVER,
|
{ 4, TURL, "test.com:123:::1,::2", CURL_IPRESOLVE_WHATEVER,
|
||||||
500, 150, 200, 200, 0, 2, 400, 800, R_FAIL, NULL },
|
CNCT_TMOT, 150, 200, 200, 0, 2, 400, TC_TMOT, R_FAIL, NULL },
|
||||||
/* 2 ipv6, fails after ~400ms, reports COULDNT_CONNECT */
|
/* 2 ipv6, fails after ~400ms, reports COULDNT_CONNECT */
|
||||||
|
|
||||||
{ 5, TURL, "test.com:123:192.0.2.1,::1", CURL_IPRESOLVE_WHATEVER,
|
{ 5, TURL, "test.com:123:192.0.2.1,::1", CURL_IPRESOLVE_WHATEVER,
|
||||||
500, 150, 200, 200, 1, 1, 350, 800, R_FAIL, "v4" },
|
CNCT_TMOT, 150, 200, 200, 1, 1, 350, TC_TMOT, R_FAIL, "v4" },
|
||||||
/* mixed ip4+6, v4 starts, v6 kicks in on HE, fails after ~350ms */
|
/* mixed ip4+6, v4 starts, v6 kicks in on HE, fails after ~350ms */
|
||||||
{ 6, TURL, "test.com:123:::1,192.0.2.1", CURL_IPRESOLVE_WHATEVER,
|
{ 6, TURL, "test.com:123:::1,192.0.2.1", CURL_IPRESOLVE_WHATEVER,
|
||||||
500, 150, 200, 200, 1, 1, 350, 800, R_FAIL, "v6" },
|
CNCT_TMOT, 150, 200, 200, 1, 1, 350, TC_TMOT, R_FAIL, "v6" },
|
||||||
/* mixed ip6+4, v6 starts, v4 kicks in on HE, fails after ~350ms */
|
|
||||||
{ 7, TURL, "test.com:123:::1,192.0.2.1,::2,::3", CURL_IPRESOLVE_WHATEVER,
|
|
||||||
500, 600, 200, 200, 0, 3, 350, 800, R_FAIL, "v6" },
|
|
||||||
/* mixed ip6+4, v6 starts, v4 never starts due to high HE, TIMEOUT */
|
/* mixed ip6+4, v6 starts, v4 never starts due to high HE, TIMEOUT */
|
||||||
{ 8, TURL, "test.com:123:192.0.2.1,::1", CURL_IPRESOLVE_V4,
|
{ 7, TURL, "test.com:123:192.0.2.1,::1", CURL_IPRESOLVE_V4,
|
||||||
400, 150, 500, 500, 1, 0, 400, 600, R_FAIL, NULL },
|
CNCT_TMOT, 150, 500, 500, 1, 0, 400, TC_TMOT, R_FAIL, NULL },
|
||||||
/* mixed ip4+6, but only use v4, check it uses full connect timeout,
|
/* mixed ip4+6, but only use v4, check it uses full connect timeout,
|
||||||
although another address of the 'wrong' family is available */
|
although another address of the 'wrong' family is available */
|
||||||
{ 9, TURL, "test.com:123:::1,192.0.2.1", CURL_IPRESOLVE_V6,
|
{ 8, TURL, "test.com:123:::1,192.0.2.1", CURL_IPRESOLVE_V6,
|
||||||
400, 150, 500, 500, 0, 1, 400, 600, R_FAIL, NULL },
|
CNCT_TMOT, 150, 500, 500, 0, 1, 400, TC_TMOT, R_FAIL, NULL },
|
||||||
/* mixed ip4+6, but only use v6, check it uses full connect timeout,
|
/* mixed ip4+6, but only use v6, check it uses full connect timeout,
|
||||||
although another address of the 'wrong' family is available */
|
although another address of the 'wrong' family is available */
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user