From patchwork Mon Apr 22 14:25:45 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 48222 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c906:b0:1a9:af23:56c1 with SMTP id gx6csp2326013pzb; Mon, 22 Apr 2024 07:27:30 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVd5uQjL4eR5696SwxLOaz0D18b8/QgNp4U9chCMhAEV0VsqX9OT93adrZCATJlb6Ukm5CEdi4sy65TIP+tz42jLek1RPPyRQKKyQ== X-Google-Smtp-Source: AGHT+IEIPIjkCWnxKzw6ct8HJWYmAb3oLoyJH0A6hu7p8nMIWKJxaJ++lNqADjKuQcWVDhATeLaq X-Received: by 2002:a50:cd12:0:b0:56e:2c1d:1174 with SMTP id z18-20020a50cd12000000b0056e2c1d1174mr7300278edi.4.1713796050168; Mon, 22 Apr 2024 07:27:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1713796050; cv=none; d=google.com; s=arc-20160816; b=bfzQ/5spa+Ptk856DzY9Gb73Wtpl5T4oufHlqITyjcuzVPoZJXkYNDZblniuPEl8sr BG9qdcP/iLJg2fHt0PhACXrj4aLn4m3XVEEzYkEkSbMNhCstaKmk+TdLVhAnaG2lclY9 SskJALx6JKu3Z20SjmVml2sNIt9qdfe4ID+OgB2EDJ/1HJImZ32RLgWtQ9njXqN/BdLf YWadpFwiK/7NS9PAC5NKbKsrlRQErPlN7sZq0EoPsyG1r3HHTiOpPWHJ9TgkkD6Aphg7 0OqLo95Eru0GQkkQNa6IYUJL6tETQGXhP4Xc037HWlP8JtSq8vp198fI1BKxcGcfQNkZ x/3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=dG/gO/N+hzyzQKjOzqORGELQL8R/pf/hq56rF0Y4DD8=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=gCLoIQJLWj3oIgBoCOyk3rKOgL+mPC8D9unFX0oM9qwCFWRtQcNQ7QMrb1aKMcU8F5 fIR4EELaJx4eNFrpKeiEIodtFtOb3xyq2wTGoXedsB59s+y9fTcDGHXQ7yNpepGl+fJd RMMY9qI9y5a5C+Vv6+xJLGU1zU0ZfugOdpqFdLMR4+LM7I9SRjx/ah/pjLv+EhjdMnzK 6p1Nmwc3N776BgnRb18poBWHey87wVXLR+rGnnp67Do6fCzi/OwpnRHBV0yNxnA9nb7u FTZVne6oLF2+ZLg98DrBX48QoI2AuZNlRzJhQU8VsYJhusSIeC3cEwrSO5Q97c1A+DYH 81Bw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=iM1XXcMq; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y4-20020a50eb04000000b005720ec1cdf3si1074969edp.121.2024.04.22.07.27.29; Mon, 22 Apr 2024 07:27:30 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=iM1XXcMq; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A59AF68D38B; Mon, 22 Apr 2024 17:26:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2BD9268D32A for ; Mon, 22 Apr 2024 17:26:06 +0300 (EEST) Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-41a523e2888so7376255e9.1 for ; Mon, 22 Apr 2024 07:26:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713795965; x=1714400765; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=PoK1u0FcUJnwc28EJhZ7aNZq796cHyRVudv7K4HKB6E=; b=iM1XXcMqbkGj3bzC8UTJ9LjSXyA4jxuwp9ckFSjFUlhYOKK2QONkCgAzScGuKA6Ims m1CgIzKKRidbzmqVMOZvQXXJizrWymBgEoZuXGHjPRc10jq+0UYh4fpNex9YjsDq8fqc BueX3+K6cEJWeFdKYdIIdA7MRbuHA1K+NXvAKQoX+k2ptUMtZ3BBuyraJBeedjpSgp1M G5VZmFV5FUS07f/ZUwlEGeseDlp+vOpwNw3Qt0sUaq7HVvMDr9lbkhKS0UAV0EaexVAe ZjmuL0juSiMWa9Qy9evUMDTum/tlEc3PhOoHMvJA6h4ElSM8QAwUHwA3ksbJnzIii+j1 AuDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713795965; x=1714400765; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PoK1u0FcUJnwc28EJhZ7aNZq796cHyRVudv7K4HKB6E=; b=oroaEK3vAs+iuNWhYCH/htrbZOMbNuNg6NxwUYA1HeEpegPRsLtZZa0tguVJSyfuo/ m5XoxLC7LQToiZMpoHtd2aNmVgviQnqP3PUxyYCQCfIW/YpzcbfhvBBw4dJUEUQXQy6d 48cU8Q0OqLsbglRdlorK5IgoaQxOkBEOySCx7GXqAKOXlkLDpVTPywcEG6OJcDk4BBcI Tk0vGYa2oCbCM6J1KLAY88XO1ENvydF3oYHmvQtU0EOwxlQHnrNCa0kd7a7fYt1Zkxsz kJlQE1P+eEeCLwrZ/cQKZdM+pOB9xCtI81s/A+/B92D1y21JcYbiAWmjtb40kPdGaHzo Dn6A== X-Gm-Message-State: AOJu0Ywk5J90iOPjF/B57VaamoMouHK8FtsAuwwbksz4nxi2/K8Rz4J4 IcC8h0ci7wVM+RPzdTsvsHXLUlHbaFlbuVPu8pGSh05DRnZnf36odD0QxQ== X-Received: by 2002:a05:600c:4ec9:b0:419:ed35:e312 with SMTP id g9-20020a05600c4ec900b00419ed35e312mr5807273wmq.21.1713795964857; Mon, 22 Apr 2024 07:26:04 -0700 (PDT) Received: from localhost.localdomain (33bf3d9d.skybroadband.com. [51.191.61.157]) by smtp.gmail.com with ESMTPSA id d11-20020a05600c3acb00b0041aa14b4646sm67111wms.8.2024.04.22.07.26.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Apr 2024 07:26:04 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Mon, 22 Apr 2024 15:25:45 +0100 Message-ID: <20240422142547.281064-8-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240422142547.281064-1-derek.buitenhuis@gmail.com> References: <20240422142547.281064-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 7/9] avformat/http: Add option to limit total reconnect delay X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ldIV8HEPdt+I The existing option only allows users to set the max delay for a single attempt, rather than the total allowed delay, which is both pretty unintitive, and only applicable when exponential backoff is used. The default for this option is set to 256, which is just above the effective total delay accomplished by the the existing reconnect_delay_max default of 120. Signed-off-by: Derek Buitenhuis --- libavformat/http.c | 12 ++++++++++-- libavformat/version.h | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/libavformat/http.c b/libavformat/http.c index 06bd3e340e..930c115ec3 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -141,6 +141,7 @@ typedef struct HTTPContext { int respect_retry_after; unsigned int retry_after; int reconnect_max_retries; + int reconnect_delay_total_max; } HTTPContext; #define OFFSET(x) offsetof(HTTPContext, x) @@ -180,6 +181,7 @@ static const AVOption options[] = { { "reconnect_streamed", "auto reconnect streamed / non seekable streams", OFFSET(reconnect_streamed), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, D }, { "reconnect_delay_max", "max reconnect delay in seconds after which to give up", OFFSET(reconnect_delay_max), AV_OPT_TYPE_INT, { .i64 = 120 }, 0, UINT_MAX/1000/1000, D }, { "reconnect_max_retries", "the max number of times to retry a connection", OFFSET(reconnect_max_retries), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, D }, + { "reconnect_delay_total_max", "max total reconnect delay in seconds after which to give up", OFFSET(reconnect_delay_total_max), AV_OPT_TYPE_INT, { .i64 = 256 }, 0, UINT_MAX/1000/1000, D }, { "respect_retry_after", "respect the Retry-After header when retrying connections", OFFSET(respect_retry_after), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, D }, { "listen", "listen on HTTP", OFFSET(listen), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 2, D | E }, { "resource", "The resource requested by a client", OFFSET(resource), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, E }, @@ -363,6 +365,7 @@ static int http_open_cnx(URLContext *h, AVDictionary **options) HTTPContext *s = h->priv_data; int ret, conn_attempts = 1, auth_attempts = 0, redirects = 0; int reconnect_delay = 0; + int reconnect_delay_total = 0; uint64_t off; char *cached; @@ -389,7 +392,8 @@ redo: if (ret < 0) { if (!http_should_reconnect(s, ret) || reconnect_delay > s->reconnect_delay_max || - (s->reconnect_max_retries >= 0 && conn_attempts > s->reconnect_max_retries)) + (s->reconnect_max_retries >= 0 && conn_attempts > s->reconnect_max_retries) || + reconnect_delay_total > s->reconnect_delay_total_max) goto fail; if (s->respect_retry_after && s->retry_after > 0) { @@ -403,6 +407,7 @@ redo: ret = ff_network_sleep_interruptible(1000U * 1000 * reconnect_delay, &h->interrupt_callback); if (ret != AVERROR(ETIMEDOUT)) goto fail; + reconnect_delay_total += reconnect_delay; reconnect_delay = 1 + 2 * reconnect_delay; conn_attempts++; @@ -1710,6 +1715,7 @@ static int http_read_stream(URLContext *h, uint8_t *buf, int size) int err, read_ret; int64_t seek_ret; int reconnect_delay = 0; + int reconnect_delay_total = 0; int conn_attempt = 1; if (!s->hd) @@ -1739,13 +1745,15 @@ static int http_read_stream(URLContext *h, uint8_t *buf, int size) !(s->reconnect_at_eof && read_ret == AVERROR_EOF)) break; - if (reconnect_delay > s->reconnect_delay_max || (s->reconnect_max_retries >= 0 && conn_attempt > s->reconnect_max_retries)) + if (reconnect_delay > s->reconnect_delay_max || (s->reconnect_max_retries >= 0 && conn_attempt > s->reconnect_max_retries) || + reconnect_delay_total > s->reconnect_delay_total_max) return AVERROR(EIO); av_log(h, AV_LOG_WARNING, "Will reconnect at %"PRIu64" in %d second(s), error=%s.\n", s->off, reconnect_delay, av_err2str(read_ret)); err = ff_network_sleep_interruptible(1000U*1000*reconnect_delay, &h->interrupt_callback); if (err != AVERROR(ETIMEDOUT)) return err; + reconnect_delay_total += reconnect_delay; reconnect_delay = 1 + 2*reconnect_delay; conn_attempt++; seek_ret = http_seek_internal(h, target, SEEK_SET, 1); diff --git a/libavformat/version.h b/libavformat/version.h index 41dbd4ad01..5310326bda 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,7 +32,7 @@ #include "version_major.h" #define LIBAVFORMAT_VERSION_MINOR 3 -#define LIBAVFORMAT_VERSION_MICRO 102 +#define LIBAVFORMAT_VERSION_MICRO 103 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \