Backport nbdkit-curl-plugin "multi" interface support
resolves: rhbz#2228131 Rebase to 1.34.2 resolves: rhbz#2168629
This commit is contained in:
		
							parent
							
								
									cf1d6395e7
								
							
						
					
					
						commit
						6a6cb92d31
					
				| @ -0,0 +1,33 @@ | |||||||
|  | From 41775572a5beb8ae49287271af31264684b2bbe3 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Fri, 21 Jul 2023 19:00:31 +0100 | ||||||
|  | Subject: [PATCH] tests/test-connect.c: Skip if --exit-with-parent is not | ||||||
|  |  supported | ||||||
|  | 
 | ||||||
|  | Fixes: commit 933d7401ff623077ba43b4ef1e7f16a7864c5fde | ||||||
|  | (cherry picked from commit 59664b8b146edcba0353de628528e0a2035b3ba7) | ||||||
|  | ---
 | ||||||
|  |  tests/test-connect.c | 7 +++++++ | ||||||
|  |  1 file changed, 7 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/tests/test-connect.c b/tests/test-connect.c
 | ||||||
|  | index f463415b..d7118330 100644
 | ||||||
|  | --- a/tests/test-connect.c
 | ||||||
|  | +++ b/tests/test-connect.c
 | ||||||
|  | @@ -47,6 +47,13 @@ main (int argc, char *argv[])
 | ||||||
|  |    struct nbd_handle *nbd; | ||||||
|  |    int64_t size; | ||||||
|  |   | ||||||
|  | +  if (system ("nbdkit --exit-with-parent --version") != 0) {
 | ||||||
|  | +    printf ("%s: --exit-with-parent is not implemented on this platform, "
 | ||||||
|  | +            "skipping\n",
 | ||||||
|  | +            argv[0]);
 | ||||||
|  | +    exit (77);
 | ||||||
|  | +  }
 | ||||||
|  | +
 | ||||||
|  |    nbd = nbd_create (); | ||||||
|  |    if (nbd == NULL) { | ||||||
|  |      fprintf (stderr, "%s\n", nbd_get_error ()); | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										70
									
								
								0002-tests-Use-exit-with-parent-in-the-test-framework.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								0002-tests-Use-exit-with-parent-in-the-test-framework.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | |||||||
|  | From 93a2c7321dc5ccd36368d50887cf239cfb883a72 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Fri, 21 Jul 2023 19:01:35 +0100 | ||||||
|  | Subject: [PATCH] tests: Use --exit-with-parent in the test framework | ||||||
|  | 
 | ||||||
|  | Make sure nbdkit always exits, in case some other part of the test is | ||||||
|  | killed. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit c6299889e80217cfadf488a67961be9eb6d24e38) | ||||||
|  | ---
 | ||||||
|  |  tests/Makefile.am |  2 ++ | ||||||
|  |  tests/test.c      | 22 +++++++++++++--------- | ||||||
|  |  2 files changed, 15 insertions(+), 9 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/tests/Makefile.am b/tests/Makefile.am
 | ||||||
|  | index e1087689..f6c5ac9a 100644
 | ||||||
|  | --- a/tests/Makefile.am
 | ||||||
|  | +++ b/tests/Makefile.am
 | ||||||
|  | @@ -594,6 +594,8 @@ EXTRA_DIST += \
 | ||||||
|  |  check_LTLIBRARIES += libtest.la | ||||||
|  |  libtest_la_SOURCES = test.c test.h | ||||||
|  |  libtest_la_CFLAGS = $(WARNINGS_CFLAGS) | ||||||
|  | +libtest_la_CPPFLAGS = -I$(top_srcdir)/common/utils
 | ||||||
|  | +libtest_la_LIBADD = $(top_builddir)/common/utils/libutils.la
 | ||||||
|  |   | ||||||
|  |  # Basic connection test. | ||||||
|  |  LIBNBD_TESTS += test-connect | ||||||
|  | diff --git a/tests/test.c b/tests/test.c
 | ||||||
|  | index 67f69fab..6be10f12 100644
 | ||||||
|  | --- a/tests/test.c
 | ||||||
|  | +++ b/tests/test.c
 | ||||||
|  | @@ -50,6 +50,8 @@
 | ||||||
|  |  #include <sys/wait.h> | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +#include "exit-with-parent.h"
 | ||||||
|  | +
 | ||||||
|  |  #include "test.h" | ||||||
|  |   | ||||||
|  |  #ifndef WIN32 | ||||||
|  | @@ -161,15 +163,17 @@ test_start_nbdkit (const char *arg, ...)
 | ||||||
|  |      const char *argv[MAX_ARGS+1]; | ||||||
|  |      va_list args; | ||||||
|  |   | ||||||
|  | -    argv[0] = "nbdkit";
 | ||||||
|  | -    argv[1] = "-U";
 | ||||||
|  | -    argv[2] = kit->sockpath;
 | ||||||
|  | -    argv[3] = "-P";
 | ||||||
|  | -    argv[4] = kit->pidpath;
 | ||||||
|  | -    argv[5] = "-f";
 | ||||||
|  | -    argv[6] = "-v";
 | ||||||
|  | -    argv[7] = arg;
 | ||||||
|  | -    i = 8;
 | ||||||
|  | +    i = 0;
 | ||||||
|  | +    argv[i++] = "nbdkit";
 | ||||||
|  | +    argv[i++] = "-U";
 | ||||||
|  | +    argv[i++] = kit->sockpath;
 | ||||||
|  | +    argv[i++] = "-P";
 | ||||||
|  | +    argv[i++] = kit->pidpath;
 | ||||||
|  | +    argv[i++] = "-f";
 | ||||||
|  | +    argv[i++] = "-v";
 | ||||||
|  | +    if (can_exit_with_parent ())
 | ||||||
|  | +      argv[i++] = "--exit-with-parent";
 | ||||||
|  | +    argv[i++] = arg;
 | ||||||
|  |   | ||||||
|  |      va_start (args, arg); | ||||||
|  |      while ((p = va_arg (args, const char *)) != NULL) { | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,26 @@ | |||||||
|  | From e3a62ebad571d6512501941c49f7a8ab66ef5646 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Sat, 22 Jul 2023 09:50:44 +0100 | ||||||
|  | Subject: [PATCH] protect: Fix copy and paste error in the documentation | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit f04607c95c27c4342f41d083ad00ac02c579b391) | ||||||
|  | ---
 | ||||||
|  |  filters/protect/nbdkit-protect-filter.pod | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/filters/protect/nbdkit-protect-filter.pod b/filters/protect/nbdkit-protect-filter.pod
 | ||||||
|  | index b5ffc7ca..aad72a68 100644
 | ||||||
|  | --- a/filters/protect/nbdkit-protect-filter.pod
 | ||||||
|  | +++ b/filters/protect/nbdkit-protect-filter.pod
 | ||||||
|  | @@ -102,7 +102,7 @@ Use C<nbdkit --dump-config> to find the location of C<$filterdir>.
 | ||||||
|  |   | ||||||
|  |  =head1 VERSION | ||||||
|  |   | ||||||
|  | -C<nbdkit-offset-filter> first appeared in nbdkit 1.30.
 | ||||||
|  | +C<nbdkit-protect-filter> first appeared in nbdkit 1.30.
 | ||||||
|  |   | ||||||
|  |  =head1 SEE ALSO | ||||||
|  |   | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										26
									
								
								0004-docs-nbdkit-protocol.pod-Fix-manual-page-name.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								0004-docs-nbdkit-protocol.pod-Fix-manual-page-name.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | From c6da52fd3d9a9e5e8ad4648bba686c37b5d3fae7 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Sun, 23 Jul 2023 20:15:23 +0100 | ||||||
|  | Subject: [PATCH] docs/nbdkit-protocol.pod: Fix manual page name | ||||||
|  | 
 | ||||||
|  | Updates: commit dce32051318c3e8bd20825cc0db5df15f95d11fa | ||||||
|  | (cherry picked from commit 00aa248cec0a64ca293bbedffbf47426ee2b2340) | ||||||
|  | ---
 | ||||||
|  |  docs/nbdkit-protocol.pod | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/docs/nbdkit-protocol.pod b/docs/nbdkit-protocol.pod
 | ||||||
|  | index 7e89a607..dabdf23c 100644
 | ||||||
|  | --- a/docs/nbdkit-protocol.pod
 | ||||||
|  | +++ b/docs/nbdkit-protocol.pod
 | ||||||
|  | @@ -1,6 +1,6 @@
 | ||||||
|  |  =head1 NAME | ||||||
|  |   | ||||||
|  | -nbdkit - which parts of the NBD protocol nbdkit supports
 | ||||||
|  | +nbdkit-protocol - which parts of the NBD protocol nbdkit supports
 | ||||||
|  |   | ||||||
|  |  =head1 SYNOPSIS | ||||||
|  |   | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										110
									
								
								0005-retry-request-Print-operation-we-are-retrying-in-deb.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								0005-retry-request-Print-operation-we-are-retrying-in-deb.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,110 @@ | |||||||
|  | From e206e3a645ee6d350df210d2ef95614d3f5d97e7 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Fri, 28 Jul 2023 16:43:07 +0100 | ||||||
|  | Subject: [PATCH] retry-request: Print operation we are retrying in debug | ||||||
|  |  messages | ||||||
|  | 
 | ||||||
|  | Reviewed-by: Eric Blake <eblake@redhat.com> | ||||||
|  | (cherry picked from commit dbc91fd2eac5eac77293e3deded92e11c0b8d6e3) | ||||||
|  | ---
 | ||||||
|  |  filters/retry-request/retry-request.c | 22 +++++++++++----------- | ||||||
|  |  1 file changed, 11 insertions(+), 11 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/filters/retry-request/retry-request.c b/filters/retry-request/retry-request.c
 | ||||||
|  | index ed566080..e5b8344c 100644
 | ||||||
|  | --- a/filters/retry-request/retry-request.c
 | ||||||
|  | +++ b/filters/retry-request/retry-request.c
 | ||||||
|  | @@ -100,15 +100,15 @@ retry_request_config (nbdkit_next_config *next, nbdkit_backend *nxdata,
 | ||||||
|  |   * The code between RETRY_START...RETRY_END must set r to 0 or -1 on | ||||||
|  |   * success or failure.  *err may also be implicitly assigned. | ||||||
|  |   */ | ||||||
|  | -#define RETRY_START                                                     \
 | ||||||
|  | +#define RETRY_START(what)                                               \
 | ||||||
|  |    {                                                                     \ | ||||||
|  |      unsigned i;                                                         \ | ||||||
|  |                                                                          \ | ||||||
|  |      r = -1;                                                             \ | ||||||
|  |      for (i = 0; r == -1 && i <= retries; ++i) {                         \ | ||||||
|  |        if (i > 0) {                                                      \ | ||||||
|  | -        nbdkit_debug ("retry %u: waiting %u seconds before retrying",   \
 | ||||||
|  | -                      i, delay);                                        \
 | ||||||
|  | +        nbdkit_debug ("retry %u: waiting %u seconds before retrying %s",\
 | ||||||
|  | +                      i, delay, what);                                  \
 | ||||||
|  |          if (nbdkit_nanosleep (delay, 0) == -1) {                        \ | ||||||
|  |            if (*err == 0)                                                \ | ||||||
|  |              *err = errno;                                               \ | ||||||
|  | @@ -130,7 +130,7 @@ retry_request_open (nbdkit_next_open *next, nbdkit_context *nxdata,
 | ||||||
|  |    if (retry_open_call) { | ||||||
|  |      int *err = &errno;          /* used by the RETRY_* macros */ | ||||||
|  |   | ||||||
|  | -    RETRY_START
 | ||||||
|  | +    RETRY_START("open")
 | ||||||
|  |        r = next (nxdata, readonly, exportname); | ||||||
|  |      RETRY_END; | ||||||
|  |    } | ||||||
|  | @@ -148,7 +148,7 @@ retry_request_pread (nbdkit_next *next,
 | ||||||
|  |  { | ||||||
|  |    int r; | ||||||
|  |   | ||||||
|  | -  RETRY_START
 | ||||||
|  | +  RETRY_START("pread")
 | ||||||
|  |      r = next->pread (next, buf, count, offset, flags, err); | ||||||
|  |    RETRY_END; | ||||||
|  |    return r; | ||||||
|  | @@ -162,7 +162,7 @@ retry_request_pwrite (nbdkit_next *next,
 | ||||||
|  |  { | ||||||
|  |    int r; | ||||||
|  |   | ||||||
|  | -  RETRY_START
 | ||||||
|  | +  RETRY_START("pwrite")
 | ||||||
|  |      r = next->pwrite (next, buf, count, offset, flags, err); | ||||||
|  |    RETRY_END; | ||||||
|  |    return r; | ||||||
|  | @@ -176,7 +176,7 @@ retry_request_trim (nbdkit_next *next,
 | ||||||
|  |  { | ||||||
|  |    int r; | ||||||
|  |   | ||||||
|  | -  RETRY_START
 | ||||||
|  | +  RETRY_START("trim")
 | ||||||
|  |      r = next->trim (next, count, offset, flags, err); | ||||||
|  |    RETRY_END; | ||||||
|  |    return r; | ||||||
|  | @@ -189,7 +189,7 @@ retry_request_flush (nbdkit_next *next,
 | ||||||
|  |  { | ||||||
|  |    int r; | ||||||
|  |   | ||||||
|  | -  RETRY_START
 | ||||||
|  | +  RETRY_START("flush")
 | ||||||
|  |      r = next->flush (next, flags, err); | ||||||
|  |    RETRY_END; | ||||||
|  |    return r; | ||||||
|  | @@ -203,7 +203,7 @@ retry_request_zero (nbdkit_next *next,
 | ||||||
|  |  { | ||||||
|  |    int r; | ||||||
|  |   | ||||||
|  | -  RETRY_START
 | ||||||
|  | +  RETRY_START("zero")
 | ||||||
|  |      r = next->zero (next, count, offset, flags, err); | ||||||
|  |    RETRY_END; | ||||||
|  |    return r; | ||||||
|  | @@ -218,7 +218,7 @@ retry_request_extents (nbdkit_next *next,
 | ||||||
|  |    CLEANUP_EXTENTS_FREE struct nbdkit_extents *extents2 = NULL; | ||||||
|  |    int r; | ||||||
|  |   | ||||||
|  | -  RETRY_START {
 | ||||||
|  | +  RETRY_START("extents") {
 | ||||||
|  |      /* Each retry must begin with extents reset to the right beginning. */ | ||||||
|  |      nbdkit_extents_free (extents2); | ||||||
|  |      extents2 = nbdkit_extents_new (offset, next->get_size (next)); | ||||||
|  | @@ -254,7 +254,7 @@ retry_request_cache (nbdkit_next *next,
 | ||||||
|  |  { | ||||||
|  |    int r; | ||||||
|  |   | ||||||
|  | -  RETRY_START
 | ||||||
|  | +  RETRY_START("cache")
 | ||||||
|  |      r = next->cache (next, count, offset, flags, err); | ||||||
|  |    RETRY_END; | ||||||
|  |    return r; | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,53 @@ | |||||||
|  | From fdd27622047cd8e25af33b66a57899b75e99db82 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Tue, 1 Aug 2023 11:42:58 +0100 | ||||||
|  | Subject: [PATCH] tests/test-ocaml-errorcodes.c: Don't use assert in test | ||||||
|  | 
 | ||||||
|  | exit with EXIT_FAILURE instead, as the program might be compiled with | ||||||
|  | -DNDEBUG.
 | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 678410e23841376d8b742dce3d10c632499367a2) | ||||||
|  | ---
 | ||||||
|  |  tests/test-ocaml-errorcodes.c | 16 +++++++++++++--- | ||||||
|  |  1 file changed, 13 insertions(+), 3 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/tests/test-ocaml-errorcodes.c b/tests/test-ocaml-errorcodes.c
 | ||||||
|  | index e59f074b..8ab7e0ae 100644
 | ||||||
|  | --- a/tests/test-ocaml-errorcodes.c
 | ||||||
|  | +++ b/tests/test-ocaml-errorcodes.c
 | ||||||
|  | @@ -34,8 +34,9 @@
 | ||||||
|  |   | ||||||
|  |  #include <stdio.h> | ||||||
|  |  #include <stdlib.h> | ||||||
|  | +#include <stdint.h>
 | ||||||
|  | +#include <inttypes.h>
 | ||||||
|  |  #include <errno.h> | ||||||
|  | -#include <assert.h>
 | ||||||
|  |   | ||||||
|  |  #include <libnbd.h> | ||||||
|  |   | ||||||
|  | @@ -84,10 +85,19 @@ main (int argc, char *argv[])
 | ||||||
|  |      exit (EXIT_FAILURE); | ||||||
|  |    } | ||||||
|  |   | ||||||
|  | -  assert (nbd_pread (nbd, buf, 512, 0, 0) == 0);
 | ||||||
|  | +  if (nbd_pread (nbd, buf, 512, 0, 0) == -1) {
 | ||||||
|  | +    fprintf (stderr, "%s: FAIL: did not expect reading sector 0 to fail\n",
 | ||||||
|  | +             argv[0]);
 | ||||||
|  | +    exit (EXIT_FAILURE);
 | ||||||
|  | +  }
 | ||||||
|  |   | ||||||
|  |    for (i = 0; tests[i].offset != 0; ++i) { | ||||||
|  | -    assert (nbd_pread (nbd, buf, 512, tests[i].offset, 0) == -1);
 | ||||||
|  | +    if (nbd_pread (nbd, buf, 512, tests[i].offset, 0) != -1) {
 | ||||||
|  | +      fprintf (stderr,
 | ||||||
|  | +               "%s: FAIL: reading sector %" PRIu64 "should have failed\n",
 | ||||||
|  | +               argv[0], tests[i].offset / 512);
 | ||||||
|  | +      exit (EXIT_FAILURE);
 | ||||||
|  | +    }
 | ||||||
|  |      actual_errno = nbd_get_errno (); | ||||||
|  |      if (actual_errno != tests[i].expected_errno) { | ||||||
|  |        fprintf (stderr, "%s: FAIL: actual errno = %d expected errno = %d\n", | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,30 @@ | |||||||
|  | From eca5131cbbc7e1785b266cc92624a2ce9582a7cc Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Tue, 1 Aug 2023 12:42:05 +0100 | ||||||
|  | Subject: [PATCH] tests/test-ocaml-errorcodes.c: Enable verbose messages | ||||||
|  | 
 | ||||||
|  | This test crashes when the OCaml plugin is unloaded (specifically when | ||||||
|  | we call caml_acquire_runtime_system).  Enable verbose messages in a | ||||||
|  | failed attempt to track down what is happening. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 99567408fdd8ea55b0bb5286b45ce135d91c38b5) | ||||||
|  | ---
 | ||||||
|  |  tests/test-ocaml-errorcodes.c | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/tests/test-ocaml-errorcodes.c b/tests/test-ocaml-errorcodes.c
 | ||||||
|  | index 8ab7e0ae..f84da3d8 100644
 | ||||||
|  | --- a/tests/test-ocaml-errorcodes.c
 | ||||||
|  | +++ b/tests/test-ocaml-errorcodes.c
 | ||||||
|  | @@ -78,7 +78,7 @@ main (int argc, char *argv[])
 | ||||||
|  |   | ||||||
|  |    if (nbd_connect_command (nbd, | ||||||
|  |                             (char *[]) { | ||||||
|  | -                             "nbdkit", "-s", "--exit-with-parent",
 | ||||||
|  | +                             "nbdkit", "-s", "--exit-with-parent", "-v",
 | ||||||
|  |                               "./test-ocaml-errorcodes-plugin.so", | ||||||
|  |                               NULL }) == -1) { | ||||||
|  |      fprintf (stderr, "%s\n", nbd_get_error ()); | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										80
									
								
								0008-curl-Use-the-parallel-thread-model.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								0008-curl-Use-the-parallel-thread-model.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | |||||||
|  | From bfa0b1238f6318d06930ec4d389a27932fc90a16 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Sat, 4 Feb 2023 12:34:57 +0000 | ||||||
|  | Subject: [PATCH] curl: Use the parallel thread model | ||||||
|  | 
 | ||||||
|  | After previous changes, it is now safe to use the parallel thread | ||||||
|  | model in this plugin.  The locking in pool.c protects a single curl | ||||||
|  | handle from being used from multiple threads. | ||||||
|  | 
 | ||||||
|  | An advantage of this is we can now combine the curl plugin with | ||||||
|  | filters such as readahead and scan. | ||||||
|  | 
 | ||||||
|  | This pessimizes some workloads and improves others.  See my earlier | ||||||
|  | comments here: | ||||||
|  | 
 | ||||||
|  |   https://listman.redhat.com/archives/libguestfs/2023-February/030610.html | ||||||
|  |   https://listman.redhat.com/archives/libguestfs/2023-February/030618.html | ||||||
|  |   https://listman.redhat.com/archives/libguestfs/2023-February/030619.html | ||||||
|  |   https://listman.redhat.com/archives/libguestfs/2023-February/030620.html | ||||||
|  | 
 | ||||||
|  | Tests below use this basic command: | ||||||
|  | 
 | ||||||
|  |   $ time nbdkit -r -U - curl https://cloud.debian.org/images/cloud/bookworm/daily/latest/debian-12-generic-amd64-daily.qcow2 \ | ||||||
|  |          --run '$COPY $uri /var/tmp/out' | ||||||
|  | 
 | ||||||
|  | where $COPY is either nbdcopy or qemu-img convert. | ||||||
|  | 
 | ||||||
|  | Before this change: | ||||||
|  | 
 | ||||||
|  |   nbdkit + nbdcopy           0m55.397s | ||||||
|  |   nbdkit + qemu-img convert  [over 20 minutes] | ||||||
|  | 
 | ||||||
|  | After this change: | ||||||
|  | 
 | ||||||
|  |   nbdkit + nbdcopy           1m1.235s | ||||||
|  |   nbdkit + qemu-img convert  6m3.262s | ||||||
|  |   nbdkit --filter=readahead --filter=cache + qemu-img convert | ||||||
|  |                              8m16.488s | ||||||
|  |   nbdkit connections=8 + qemu-img convert | ||||||
|  |                              3m48.502s | ||||||
|  | 
 | ||||||
|  | Previously [see first link above] we noted that file: URLs are | ||||||
|  | impacted, and indeed they are, with this command: | ||||||
|  | 
 | ||||||
|  |   $ time nbdkit -r -U - curl file:/var/tmp/fedora-36.img \ | ||||||
|  |          --run 'nbdcopy --no-extents -p "$uri" null:' | ||||||
|  | 
 | ||||||
|  | nearly doubling in run-time (0.78 -> 1.34).  However I think this may | ||||||
|  | be a peculiarity of curl's handling of file.  (Use nbdkit-file-plugin | ||||||
|  | instead). | ||||||
|  | 
 | ||||||
|  | Note the fundamental issue here is still lack of multiconn support in | ||||||
|  | qemu's NBD client. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit f2163754860d041c4cb12dace90591c280eccae8) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/curl.c | 7 +------ | ||||||
|  |  1 file changed, 1 insertion(+), 6 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/curl.c b/plugins/curl/curl.c
 | ||||||
|  | index 58ffb662..425f1d90 100644
 | ||||||
|  | --- a/plugins/curl/curl.c
 | ||||||
|  | +++ b/plugins/curl/curl.c
 | ||||||
|  | @@ -537,12 +537,7 @@ curl_close (void *handle)
 | ||||||
|  |    free (h); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -/* This plugin could support the parallel thread model.  It currently
 | ||||||
|  | - * uses serialize_requests because parallel has the unfortunate effect
 | ||||||
|  | - * of pessimising common workloads.  See:
 | ||||||
|  | - * https://listman.redhat.com/archives/libguestfs/2023-February/030618.html
 | ||||||
|  | - */
 | ||||||
|  | -#define THREAD_MODEL NBDKIT_THREAD_MODEL_SERIALIZE_REQUESTS
 | ||||||
|  | +#define THREAD_MODEL NBDKIT_THREAD_MODEL_PARALLEL
 | ||||||
|  |   | ||||||
|  |  /* Calls get_handle() ... put_handle() to get a handle for the length | ||||||
|  |   * of the current scope. | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										115
									
								
								0009-curl-Add-ipresolve-option.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								0009-curl-Add-ipresolve-option.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,115 @@ | |||||||
|  | From a5f1e659d52872a499a5744870cb3e6ff382642f Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Tue, 25 Jul 2023 16:57:41 +0100 | ||||||
|  | Subject: [PATCH] curl: Add ipresolve option | ||||||
|  | 
 | ||||||
|  | Allows you to force IPv4 or IPv6. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit d1b27c97f7fac00ee452a1d1b05805ee7145a49c) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/curl.c                 | 15 +++++++++++++++ | ||||||
|  |  plugins/curl/curldefs.h             |  1 + | ||||||
|  |  plugins/curl/nbdkit-curl-plugin.pod | 14 ++++++++++++++ | ||||||
|  |  plugins/curl/pool.c                 |  2 ++ | ||||||
|  |  4 files changed, 32 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/curl.c b/plugins/curl/curl.c
 | ||||||
|  | index 425f1d90..91fa65fb 100644
 | ||||||
|  | --- a/plugins/curl/curl.c
 | ||||||
|  | +++ b/plugins/curl/curl.c
 | ||||||
|  | @@ -68,6 +68,7 @@ struct curl_slist *headers = NULL;
 | ||||||
|  |  const char *header_script = NULL; | ||||||
|  |  unsigned header_script_renew = 0; | ||||||
|  |  long http_version = CURL_HTTP_VERSION_NONE; | ||||||
|  | +long ipresolve = CURL_IPRESOLVE_WHATEVER;
 | ||||||
|  |  char *password = NULL; | ||||||
|  |  #ifndef HAVE_CURLOPT_PROTOCOLS_STR | ||||||
|  |  long protocols = CURLPROTO_ALL; | ||||||
|  | @@ -314,6 +315,19 @@ curl_config (const char *key, const char *value)
 | ||||||
|  |      } | ||||||
|  |    } | ||||||
|  |   | ||||||
|  | +  else if (strcmp (key, "ipresolve") == 0) {
 | ||||||
|  | +    if (strcmp (value, "any") == 0 || strcmp (value, "whatever") == 0)
 | ||||||
|  | +      ipresolve = CURL_IPRESOLVE_WHATEVER;
 | ||||||
|  | +    else if (strcmp (value, "v4") == 0 || strcmp (value, "4") == 0)
 | ||||||
|  | +      ipresolve = CURL_IPRESOLVE_V4;
 | ||||||
|  | +    else if (strcmp (value, "v6") == 0 || strcmp (value, "6") == 0)
 | ||||||
|  | +      ipresolve = CURL_IPRESOLVE_V6;
 | ||||||
|  | +    else {
 | ||||||
|  | +      nbdkit_error ("unknown ipresolve: %s", value);
 | ||||||
|  | +      return -1;
 | ||||||
|  | +    }
 | ||||||
|  | +  }
 | ||||||
|  | +
 | ||||||
|  |    else if (strcmp (key, "password") == 0) { | ||||||
|  |      free (password); | ||||||
|  |      if (nbdkit_read_password (value, &password) == -1) | ||||||
|  | @@ -495,6 +509,7 @@ curl_config_complete (void)
 | ||||||
|  |    "header-script=<SCRIPT>     Script to set HTTP/HTTPS headers.\n" \ | ||||||
|  |    "header-script-renew=<SECS> Time to renew HTTP/HTTPS headers.\n" \ | ||||||
|  |    "http-version=none|...      Force a particular HTTP protocol.\n" \ | ||||||
|  | +  "ipresolve=any|v4|v6        Force IPv4 or IPv6.\n" \
 | ||||||
|  |    "password=<PASSWORD>        The password for the user account.\n" \ | ||||||
|  |    "protocols=PROTO,PROTO,..   Limit protocols allowed.\n" \ | ||||||
|  |    "proxy=<PROXY>              Set proxy URL.\n" \ | ||||||
|  | diff --git a/plugins/curl/curldefs.h b/plugins/curl/curldefs.h
 | ||||||
|  | index 2a74a369..815be2e1 100644
 | ||||||
|  | --- a/plugins/curl/curldefs.h
 | ||||||
|  | +++ b/plugins/curl/curldefs.h
 | ||||||
|  | @@ -61,6 +61,7 @@ extern struct curl_slist *headers;
 | ||||||
|  |  extern const char *header_script; | ||||||
|  |  extern unsigned header_script_renew; | ||||||
|  |  extern long http_version; | ||||||
|  | +extern long ipresolve;
 | ||||||
|  |  extern char *password; | ||||||
|  |  #ifndef HAVE_CURLOPT_PROTOCOLS_STR | ||||||
|  |  extern long protocols; | ||||||
|  | diff --git a/plugins/curl/nbdkit-curl-plugin.pod b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | index 070f9a0f..e12ca197 100644
 | ||||||
|  | --- a/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | +++ b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | @@ -208,6 +208,19 @@ meaning curl will negotiate the best protocol with the server.  The
 | ||||||
|  |  other settings are mainly for testing.  See L<CURLOPT_HTTP_VERSION(3)> | ||||||
|  |  for details. | ||||||
|  |   | ||||||
|  | +=item B<ipresolve=any>
 | ||||||
|  | +
 | ||||||
|  | +=item B<ipresolve=v4>
 | ||||||
|  | +
 | ||||||
|  | +=item B<ipresolve=v6>
 | ||||||
|  | +
 | ||||||
|  | +(nbdkit E<ge> 1.36)
 | ||||||
|  | +
 | ||||||
|  | +Force curl to use only IPv4 (C<ipresolve=v4>), only IPv6
 | ||||||
|  | +(C<ipresolve=v6>) or any IP version supported by your system
 | ||||||
|  | +(C<ipresolve=any>).  The default is C<any>.  See
 | ||||||
|  | +L<CURLOPT_IPRESOLVE(3)>.
 | ||||||
|  | +
 | ||||||
|  |  =item B<password=>PASSWORD | ||||||
|  |   | ||||||
|  |  Set the password to use when connecting to the remote server. | ||||||
|  | @@ -559,6 +572,7 @@ L<CURLOPT_COOKIEFILE(3)>,
 | ||||||
|  |  L<CURLOPT_COOKIEJAR(3)>, | ||||||
|  |  L<CURLOPT_FOLLOWLOCATION(3)>, | ||||||
|  |  L<CURLOPT_HTTPHEADER(3)>, | ||||||
|  | +L<CURLOPT_IPRESOLVE(3)>,
 | ||||||
|  |  L<CURLOPT_PROXY(3)>, | ||||||
|  |  L<CURLOPT_SSL_CIPHER_LIST(3)>, | ||||||
|  |  L<CURLOPT_SSLVERSION(3)>, | ||||||
|  | diff --git a/plugins/curl/pool.c b/plugins/curl/pool.c
 | ||||||
|  | index 731dd367..f0c3cb4f 100644
 | ||||||
|  | --- a/plugins/curl/pool.c
 | ||||||
|  | +++ b/plugins/curl/pool.c
 | ||||||
|  | @@ -257,6 +257,8 @@ allocate_handle (void)
 | ||||||
|  |      curl_easy_setopt (ch->c, CURLOPT_HTTPHEADER, headers); | ||||||
|  |    if (http_version != CURL_HTTP_VERSION_NONE) | ||||||
|  |      curl_easy_setopt (ch->c, CURLOPT_HTTP_VERSION, (long) http_version); | ||||||
|  | +  if (ipresolve != CURL_IPRESOLVE_WHATEVER)
 | ||||||
|  | +    curl_easy_setopt (ch->c, CURLOPT_IPRESOLVE, (long) ipresolve);
 | ||||||
|  |   | ||||||
|  |    if (password) | ||||||
|  |      curl_easy_setopt (ch->c, CURLOPT_PASSWORD, password); | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										113
									
								
								0010-curl-Add-resolve-option.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								0010-curl-Add-resolve-option.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,113 @@ | |||||||
|  | From 55e55ea986ef5fed595bb5a4203e8734d79f1474 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Tue, 25 Jul 2023 17:36:31 +0100 | ||||||
|  | Subject: [PATCH] curl: Add resolve option | ||||||
|  | 
 | ||||||
|  | This allows you to force a particular IP address for the URL host | ||||||
|  | name. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 4f0989cbf0e9eeb959879b1c82b52940f6c5c3cc) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/curl.c                 | 12 ++++++++++++ | ||||||
|  |  plugins/curl/curldefs.h             |  1 + | ||||||
|  |  plugins/curl/nbdkit-curl-plugin.pod |  7 +++++++ | ||||||
|  |  plugins/curl/pool.c                 |  2 ++ | ||||||
|  |  4 files changed, 22 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/curl.c b/plugins/curl/curl.c
 | ||||||
|  | index 91fa65fb..381433fd 100644
 | ||||||
|  | --- a/plugins/curl/curl.c
 | ||||||
|  | +++ b/plugins/curl/curl.c
 | ||||||
|  | @@ -78,6 +78,7 @@ const char *protocols = NULL;
 | ||||||
|  |  const char *proxy = NULL; | ||||||
|  |  char *proxy_password = NULL; | ||||||
|  |  const char *proxy_user = NULL; | ||||||
|  | +struct curl_slist *resolves = NULL;
 | ||||||
|  |  bool sslverify = true; | ||||||
|  |  const char *ssl_cipher_list = NULL; | ||||||
|  |  long ssl_version = CURL_SSLVERSION_DEFAULT; | ||||||
|  | @@ -112,6 +113,8 @@ curl_unload (void)
 | ||||||
|  |      curl_slist_free_all (headers); | ||||||
|  |    free (password); | ||||||
|  |    free (proxy_password); | ||||||
|  | +  if (resolves)
 | ||||||
|  | +    curl_slist_free_all (resolves);
 | ||||||
|  |    scripts_unload (); | ||||||
|  |    free_all_handles (); | ||||||
|  |    curl_global_cleanup (); | ||||||
|  | @@ -356,6 +359,14 @@ curl_config (const char *key, const char *value)
 | ||||||
|  |    else if (strcmp (key, "proxy-user") == 0) | ||||||
|  |      proxy_user = value; | ||||||
|  |   | ||||||
|  | +  else if (strcmp (key, "resolve") == 0) {
 | ||||||
|  | +    resolves = curl_slist_append (headers, value);
 | ||||||
|  | +    if (resolves == NULL) {
 | ||||||
|  | +      nbdkit_error ("curl_slist_append: %m");
 | ||||||
|  | +      return -1;
 | ||||||
|  | +    }
 | ||||||
|  | +  }
 | ||||||
|  | +
 | ||||||
|  |    else if (strcmp (key, "sslverify") == 0) { | ||||||
|  |      r = nbdkit_parse_bool (value); | ||||||
|  |      if (r == -1) | ||||||
|  | @@ -515,6 +526,7 @@ curl_config_complete (void)
 | ||||||
|  |    "proxy=<PROXY>              Set proxy URL.\n" \ | ||||||
|  |    "proxy-password=<PASSWORD>  The proxy password.\n" \ | ||||||
|  |    "proxy-user=<USER>          The proxy user.\n" \ | ||||||
|  | +  "resolve=<HOST>:<PORT>:<ADDR> Custom host to IP address resolution.\n" \
 | ||||||
|  |    "sslverify=false            Do not verify SSL certificate of remote host.\n" \ | ||||||
|  |    "ssl-cipher-list=C1:C2:..   Specify TLS/SSL cipher suites to be used.\n" \ | ||||||
|  |    "ssl-version=<VERSION>      Specify preferred TLS/SSL version.\n" \ | ||||||
|  | diff --git a/plugins/curl/curldefs.h b/plugins/curl/curldefs.h
 | ||||||
|  | index 815be2e1..613cfed7 100644
 | ||||||
|  | --- a/plugins/curl/curldefs.h
 | ||||||
|  | +++ b/plugins/curl/curldefs.h
 | ||||||
|  | @@ -74,6 +74,7 @@ extern const char *proxy_user;
 | ||||||
|  |  extern bool sslverify; | ||||||
|  |  extern const char *ssl_cipher_list; | ||||||
|  |  extern long ssl_version; | ||||||
|  | +extern struct curl_slist *resolves;
 | ||||||
|  |  extern const char *tls13_ciphers; | ||||||
|  |  extern bool tcp_keepalive; | ||||||
|  |  extern bool tcp_nodelay; | ||||||
|  | diff --git a/plugins/curl/nbdkit-curl-plugin.pod b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | index e12ca197..a7315047 100644
 | ||||||
|  | --- a/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | +++ b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | @@ -289,6 +289,12 @@ Set the proxy.  See L<CURLOPT_PROXY(3)>.
 | ||||||
|  |   | ||||||
|  |  Set the proxy username and password. | ||||||
|  |   | ||||||
|  | +=item B<resolve=>HOSTB<:>PORTB<:>ADDRESS
 | ||||||
|  | +
 | ||||||
|  | +Provide custom host name to IP address resolution.  You can supply
 | ||||||
|  | +this option as many times as needed.  See L<CURLOPT_RESOLVE(3)> for
 | ||||||
|  | +the full details of this option.
 | ||||||
|  | +
 | ||||||
|  |  =item B<sslverify=false> | ||||||
|  |   | ||||||
|  |  Don't verify the SSL certificate of the remote host. | ||||||
|  | @@ -574,6 +580,7 @@ L<CURLOPT_FOLLOWLOCATION(3)>,
 | ||||||
|  |  L<CURLOPT_HTTPHEADER(3)>, | ||||||
|  |  L<CURLOPT_IPRESOLVE(3)>, | ||||||
|  |  L<CURLOPT_PROXY(3)>, | ||||||
|  | +L<CURLOPT_RESOLVE(3)>,
 | ||||||
|  |  L<CURLOPT_SSL_CIPHER_LIST(3)>, | ||||||
|  |  L<CURLOPT_SSLVERSION(3)>, | ||||||
|  |  L<CURLOPT_TCP_KEEPALIVE(3)>, | ||||||
|  | diff --git a/plugins/curl/pool.c b/plugins/curl/pool.c
 | ||||||
|  | index f0c3cb4f..a6e2f9f5 100644
 | ||||||
|  | --- a/plugins/curl/pool.c
 | ||||||
|  | +++ b/plugins/curl/pool.c
 | ||||||
|  | @@ -283,6 +283,8 @@ allocate_handle (void)
 | ||||||
|  |      curl_easy_setopt (ch->c, CURLOPT_SSL_VERIFYPEER, 0L); | ||||||
|  |      curl_easy_setopt (ch->c, CURLOPT_SSL_VERIFYHOST, 0L); | ||||||
|  |    } | ||||||
|  | +  if (resolves)
 | ||||||
|  | +    curl_easy_setopt (ch->c, CURLOPT_RESOLVE, resolves);
 | ||||||
|  |    if (ssl_version != CURL_SSLVERSION_DEFAULT) | ||||||
|  |      curl_easy_setopt (ch->c, CURLOPT_SSLVERSION, (long) ssl_version); | ||||||
|  |    if (ssl_cipher_list) | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,82 @@ | |||||||
|  | From f14fbc9498f52661fd8b9c895144eb40bf8bcd64 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Tue, 25 Jul 2023 18:57:00 +0100 | ||||||
|  | Subject: [PATCH] curl: pool: Add abstract load_pool and unload_pool functions | ||||||
|  | 
 | ||||||
|  | Simple code refactoring. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 93761b2abf4c5923a410a4f176ee66c690520a2c) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/curl.c     |  4 +++- | ||||||
|  |  plugins/curl/curldefs.h |  3 ++- | ||||||
|  |  plugins/curl/pool.c     | 10 ++++++++-- | ||||||
|  |  3 files changed, 13 insertions(+), 4 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/curl.c b/plugins/curl/curl.c
 | ||||||
|  | index 381433fd..3557fd53 100644
 | ||||||
|  | --- a/plugins/curl/curl.c
 | ||||||
|  | +++ b/plugins/curl/curl.c
 | ||||||
|  | @@ -103,6 +103,8 @@ curl_load (void)
 | ||||||
|  |      nbdkit_error ("libcurl initialization failed: %d", (int) r); | ||||||
|  |      exit (EXIT_FAILURE); | ||||||
|  |    } | ||||||
|  | +
 | ||||||
|  | +  load_pool ();
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static void | ||||||
|  | @@ -116,7 +118,7 @@ curl_unload (void)
 | ||||||
|  |    if (resolves) | ||||||
|  |      curl_slist_free_all (resolves); | ||||||
|  |    scripts_unload (); | ||||||
|  | -  free_all_handles ();
 | ||||||
|  | +  unload_pool ();
 | ||||||
|  |    curl_global_cleanup (); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | diff --git a/plugins/curl/curldefs.h b/plugins/curl/curldefs.h
 | ||||||
|  | index 613cfed7..4506f3e1 100644
 | ||||||
|  | --- a/plugins/curl/curldefs.h
 | ||||||
|  | +++ b/plugins/curl/curldefs.h
 | ||||||
|  | @@ -122,9 +122,10 @@ struct curl_handle {
 | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  /* pool.c */ | ||||||
|  | +extern void load_pool (void);
 | ||||||
|  | +extern void unload_pool (void);
 | ||||||
|  |  extern struct curl_handle *get_handle (void); | ||||||
|  |  extern void put_handle (struct curl_handle *ch); | ||||||
|  | -extern void free_all_handles (void);
 | ||||||
|  |   | ||||||
|  |  /* scripts.c */ | ||||||
|  |  extern int do_scripts (struct curl_handle *ch); | ||||||
|  | diff --git a/plugins/curl/pool.c b/plugins/curl/pool.c
 | ||||||
|  | index a6e2f9f5..f91cdf57 100644
 | ||||||
|  | --- a/plugins/curl/pool.c
 | ||||||
|  | +++ b/plugins/curl/pool.c
 | ||||||
|  | @@ -89,14 +89,20 @@ static curl_handle_list curl_handles = empty_vector;
 | ||||||
|  |  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; | ||||||
|  |  static size_t in_use = 0, waiting = 0; | ||||||
|  |   | ||||||
|  | +/* Initialize pool structures. */
 | ||||||
|  | +void
 | ||||||
|  | +load_pool (void)
 | ||||||
|  | +{
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  /* Close and free all handles in the pool. */ | ||||||
|  |  void | ||||||
|  | -free_all_handles (void)
 | ||||||
|  | +unload_pool (void)
 | ||||||
|  |  { | ||||||
|  |    size_t i; | ||||||
|  |   | ||||||
|  |    if (curl_debug_pool) | ||||||
|  | -    nbdkit_debug ("free_all_handles: number of curl handles allocated: %zu",
 | ||||||
|  | +    nbdkit_debug ("unload_pool: number of curl handles allocated: %zu",
 | ||||||
|  |                    curl_handles.len); | ||||||
|  |   | ||||||
|  |    for (i = 0; i < curl_handles.len; ++i) | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										278
									
								
								0012-curl-Add-D-curl.times-1-to-collect-time-statistics.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										278
									
								
								0012-curl-Add-D-curl.times-1-to-collect-time-statistics.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,278 @@ | |||||||
|  | From d8bbc2dd00eddd2c36a6a718f7e21e6e7d4f26e5 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Tue, 25 Jul 2023 21:45:31 +0100 | ||||||
|  | Subject: [PATCH] curl: Add -D curl.times=1 to collect time statistics | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 68dddbeb584fb9385915846d259563f74338ffe8) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/Makefile.am            |   1 + | ||||||
|  |  plugins/curl/curl.c                 |   3 + | ||||||
|  |  plugins/curl/curldefs.h             |  13 +++ | ||||||
|  |  plugins/curl/nbdkit-curl-plugin.pod |  21 +++++ | ||||||
|  |  plugins/curl/pool.c                 |   2 + | ||||||
|  |  plugins/curl/times.c                | 130 ++++++++++++++++++++++++++++ | ||||||
|  |  6 files changed, 170 insertions(+) | ||||||
|  |  create mode 100644 plugins/curl/times.c | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/Makefile.am b/plugins/curl/Makefile.am
 | ||||||
|  | index 82c09582..f5f1cc1a 100644
 | ||||||
|  | --- a/plugins/curl/Makefile.am
 | ||||||
|  | +++ b/plugins/curl/Makefile.am
 | ||||||
|  | @@ -42,6 +42,7 @@ nbdkit_curl_plugin_la_SOURCES = \
 | ||||||
|  |  	curl.c \ | ||||||
|  |  	pool.c \ | ||||||
|  |  	scripts.c \ | ||||||
|  | +	times.c \
 | ||||||
|  |  	$(top_srcdir)/include/nbdkit-plugin.h \ | ||||||
|  |  	$(NULL) | ||||||
|  |   | ||||||
|  | diff --git a/plugins/curl/curl.c b/plugins/curl/curl.c
 | ||||||
|  | index 3557fd53..0d1fcfee 100644
 | ||||||
|  | --- a/plugins/curl/curl.c
 | ||||||
|  | +++ b/plugins/curl/curl.c
 | ||||||
|  | @@ -119,6 +119,7 @@ curl_unload (void)
 | ||||||
|  |      curl_slist_free_all (resolves); | ||||||
|  |    scripts_unload (); | ||||||
|  |    unload_pool (); | ||||||
|  | +  display_times ();
 | ||||||
|  |    curl_global_cleanup (); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -639,6 +640,7 @@ curl_pread (void *handle, void *buf, uint32_t count, uint64_t offset)
 | ||||||
|  |      display_curl_error (ch, r, "pread: curl_easy_perform"); | ||||||
|  |      return -1; | ||||||
|  |    } | ||||||
|  | +  update_times (ch->c);
 | ||||||
|  |   | ||||||
|  |    /* Could use curl_easy_getinfo here to obtain further information | ||||||
|  |     * about the connection. | ||||||
|  | @@ -683,6 +685,7 @@ curl_pwrite (void *handle, const void *buf, uint32_t count, uint64_t offset)
 | ||||||
|  |      display_curl_error (ch, r, "pwrite: curl_easy_perform"); | ||||||
|  |      return -1; | ||||||
|  |    } | ||||||
|  | +  update_times (ch->c);
 | ||||||
|  |   | ||||||
|  |    /* Could use curl_easy_getinfo here to obtain further information | ||||||
|  |     * about the connection. | ||||||
|  | diff --git a/plugins/curl/curldefs.h b/plugins/curl/curldefs.h
 | ||||||
|  | index 4506f3e1..dd9791aa 100644
 | ||||||
|  | --- a/plugins/curl/curldefs.h
 | ||||||
|  | +++ b/plugins/curl/curldefs.h
 | ||||||
|  | @@ -44,6 +44,15 @@
 | ||||||
|  |  #if CURL_AT_LEAST_VERSION (7, 55, 0) | ||||||
|  |  #define HAVE_CURLINFO_CONTENT_LENGTH_DOWNLOAD_T | ||||||
|  |  #endif | ||||||
|  | +#if CURL_AT_LEAST_VERSION (7, 61, 0)
 | ||||||
|  | +#define HAVE_CURLINFO_NAMELOOKUP_TIME_T
 | ||||||
|  | +#define HAVE_CURLINFO_CONNECT_TIME_T
 | ||||||
|  | +#define HAVE_CURLINFO_APPCONNECT_TIME_T
 | ||||||
|  | +#define HAVE_CURLINFO_PRETRANSFER_TIME_T
 | ||||||
|  | +#define HAVE_CURLINFO_STARTTRANSFER_TIME_T
 | ||||||
|  | +#define HAVE_CURLINFO_TOTAL_TIME_T
 | ||||||
|  | +#define HAVE_CURLINFO_REDIRECT_TIME_T
 | ||||||
|  | +#endif
 | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  |  extern const char *url; | ||||||
|  | @@ -131,6 +140,10 @@ extern void put_handle (struct curl_handle *ch);
 | ||||||
|  |  extern int do_scripts (struct curl_handle *ch); | ||||||
|  |  extern void scripts_unload (void); | ||||||
|  |   | ||||||
|  | +/* times.c */
 | ||||||
|  | +extern void update_times (CURL *c); /* called after every curl_easy_perform */
 | ||||||
|  | +extern void display_times (void);
 | ||||||
|  | +
 | ||||||
|  |  /* Translate CURLcode to nbdkit_error. */ | ||||||
|  |  #define display_curl_error(ch, r, fs, ...)                      \ | ||||||
|  |    do {                                                          \ | ||||||
|  | diff --git a/plugins/curl/nbdkit-curl-plugin.pod b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | index a7315047..0fd688ed 100644
 | ||||||
|  | --- a/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | +++ b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | @@ -543,6 +543,27 @@ This prints out the headers and cookies generated by the
 | ||||||
|  |  C<header-script> and C<cookie-script> options, which can be useful | ||||||
|  |  when debugging these scripts. | ||||||
|  |   | ||||||
|  | +=item B<-D curl.times=1>
 | ||||||
|  | +
 | ||||||
|  | +This prints out additional information about the total time taken to
 | ||||||
|  | +do name resolution, connect to the remote server, etc.  The
 | ||||||
|  | +information is printed in the debug output before nbdkit exits.  The
 | ||||||
|  | +output will look like:
 | ||||||
|  | +
 | ||||||
|  | + nbdkit: debug: times (-D curl.times=1):
 | ||||||
|  | + nbdkit: debug: name resolution               :   0.128442 s
 | ||||||
|  | + nbdkit: debug: connection                    :   4.945213 s
 | ||||||
|  | + nbdkit: debug: SSL negotiation               :   4.291362 s
 | ||||||
|  | + nbdkit: debug: pretransfer                   :   0.104137 s
 | ||||||
|  | + nbdkit: debug: first byte received           :  56.115269 s
 | ||||||
|  | + nbdkit: debug: data transfer                 : 222.633831 s
 | ||||||
|  | + nbdkit: debug: redirection time              :   0.000000 s
 | ||||||
|  | +
 | ||||||
|  | +The cumulative time taken to perform each step is shown (summed across
 | ||||||
|  | +all HTTP connections).  The redirection time is the total time taken
 | ||||||
|  | +doing HTTP redirections.  For further information see
 | ||||||
|  | +L<curl_easy_getinfo(3)/TIMES>.
 | ||||||
|  | +
 | ||||||
|  |  =item B<-D curl.verbose=1> | ||||||
|  |   | ||||||
|  |  This enables very verbose curl debugging.  See L<CURLOPT_VERBOSE(3)>. | ||||||
|  | diff --git a/plugins/curl/pool.c b/plugins/curl/pool.c
 | ||||||
|  | index f91cdf57..10f9011d 100644
 | ||||||
|  | --- a/plugins/curl/pool.c
 | ||||||
|  | +++ b/plugins/curl/pool.c
 | ||||||
|  | @@ -475,6 +475,7 @@ get_content_length_accept_range (struct curl_handle *ch)
 | ||||||
|  |      display_curl_error (ch, r, | ||||||
|  |                          "problem doing HEAD request to fetch size of URL [%s]", | ||||||
|  |                          url); | ||||||
|  | +  update_times (ch->c);
 | ||||||
|  |   | ||||||
|  |      /* Get the HTTP status code, if available. */ | ||||||
|  |      r = curl_easy_getinfo (ch->c, CURLINFO_RESPONSE_CODE, &code); | ||||||
|  | @@ -569,6 +570,7 @@ try_fallback_GET_method (struct curl_handle *ch)
 | ||||||
|  |    curl_easy_setopt (ch->c, CURLOPT_WRITEFUNCTION, error_cb); | ||||||
|  |    curl_easy_setopt (ch->c, CURLOPT_WRITEDATA, ch); | ||||||
|  |    r = curl_easy_perform (ch->c); | ||||||
|  | +  update_times (ch->c);
 | ||||||
|  |   | ||||||
|  |    /* We expect CURLE_WRITE_ERROR here, but CURLE_OK is possible too | ||||||
|  |     * (eg if the remote has zero length).  Other errors might happen | ||||||
|  | diff --git a/plugins/curl/times.c b/plugins/curl/times.c
 | ||||||
|  | new file mode 100644 | ||||||
|  | index 00000000..8cc4cf27
 | ||||||
|  | --- /dev/null
 | ||||||
|  | +++ b/plugins/curl/times.c
 | ||||||
|  | @@ -0,0 +1,130 @@
 | ||||||
|  | +/* nbdkit
 | ||||||
|  | + * Copyright Red Hat
 | ||||||
|  | + *
 | ||||||
|  | + * Redistribution and use in source and binary forms, with or without
 | ||||||
|  | + * modification, are permitted provided that the following conditions are
 | ||||||
|  | + * met:
 | ||||||
|  | + *
 | ||||||
|  | + * * Redistributions of source code must retain the above copyright
 | ||||||
|  | + * notice, this list of conditions and the following disclaimer.
 | ||||||
|  | + *
 | ||||||
|  | + * * Redistributions in binary form must reproduce the above copyright
 | ||||||
|  | + * notice, this list of conditions and the following disclaimer in the
 | ||||||
|  | + * documentation and/or other materials provided with the distribution.
 | ||||||
|  | + *
 | ||||||
|  | + * * Neither the name of Red Hat nor the names of its contributors may be
 | ||||||
|  | + * used to endorse or promote products derived from this software without
 | ||||||
|  | + * specific prior written permission.
 | ||||||
|  | + *
 | ||||||
|  | + * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
 | ||||||
|  | + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 | ||||||
|  | + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 | ||||||
|  | + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
 | ||||||
|  | + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | ||||||
|  | + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | ||||||
|  | + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 | ||||||
|  | + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | ||||||
|  | + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | ||||||
|  | + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 | ||||||
|  | + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | ||||||
|  | + * SUCH DAMAGE.
 | ||||||
|  | + */
 | ||||||
|  | +
 | ||||||
|  | +#include <config.h>
 | ||||||
|  | +
 | ||||||
|  | +#include <stdio.h>
 | ||||||
|  | +#include <stdlib.h>
 | ||||||
|  | +#include <stdbool.h>
 | ||||||
|  | +#include <stdint.h>
 | ||||||
|  | +#include <inttypes.h>
 | ||||||
|  | +
 | ||||||
|  | +#include <curl/curl.h>
 | ||||||
|  | +
 | ||||||
|  | +#include <nbdkit-plugin.h>
 | ||||||
|  | +
 | ||||||
|  | +#include "array-size.h"
 | ||||||
|  | +
 | ||||||
|  | +#include "curldefs.h"
 | ||||||
|  | +
 | ||||||
|  | +/* Use '-D curl.times=1' to set. */
 | ||||||
|  | +NBDKIT_DLL_PUBLIC int curl_debug_times = 0;
 | ||||||
|  | +
 | ||||||
|  | +/* The cumulative times. */
 | ||||||
|  | +static struct {
 | ||||||
|  | +  bool cumulative;
 | ||||||
|  | +  const char *name;
 | ||||||
|  | +  CURLINFO info;
 | ||||||
|  | +  curl_off_t t;
 | ||||||
|  | +} times[] = {
 | ||||||
|  | +#ifdef HAVE_CURLINFO_NAMELOOKUP_TIME_T
 | ||||||
|  | +  { true, "name resolution", CURLINFO_NAMELOOKUP_TIME_T },
 | ||||||
|  | +#endif
 | ||||||
|  | +#ifdef HAVE_CURLINFO_CONNECT_TIME_T
 | ||||||
|  | +  { true, "connection", CURLINFO_CONNECT_TIME_T },
 | ||||||
|  | +#endif
 | ||||||
|  | +#ifdef HAVE_CURLINFO_APPCONNECT_TIME_T
 | ||||||
|  | +  { true, "SSL negotiation", CURLINFO_APPCONNECT_TIME_T },
 | ||||||
|  | +#endif
 | ||||||
|  | +#ifdef HAVE_CURLINFO_PRETRANSFER_TIME_T
 | ||||||
|  | +  { true, "pretransfer", CURLINFO_PRETRANSFER_TIME_T },
 | ||||||
|  | +#endif
 | ||||||
|  | +#ifdef HAVE_CURLINFO_STARTTRANSFER_TIME_T
 | ||||||
|  | +  { true, "first byte received", CURLINFO_STARTTRANSFER_TIME_T },
 | ||||||
|  | +#endif
 | ||||||
|  | +#ifdef HAVE_CURLINFO_TOTAL_TIME_T
 | ||||||
|  | +  { true, "data transfer", CURLINFO_TOTAL_TIME_T },
 | ||||||
|  | +#endif
 | ||||||
|  | +#ifdef HAVE_CURLINFO_REDIRECT_TIME_T
 | ||||||
|  | +  { false, "redirection time", CURLINFO_REDIRECT_TIME_T },
 | ||||||
|  | +#endif
 | ||||||
|  | +};
 | ||||||
|  | +
 | ||||||
|  | +/* This is called after every curl_easy_perform.  If -D curl.times=1
 | ||||||
|  | + * then we update the time counters.  Refer to curl_easy_getinfo(3)
 | ||||||
|  | + * section "TIMES".
 | ||||||
|  | + */
 | ||||||
|  | +void
 | ||||||
|  | +update_times (CURL *c)
 | ||||||
|  | +{
 | ||||||
|  | +  size_t i;
 | ||||||
|  | +  CURLcode r;
 | ||||||
|  | +  curl_off_t t;
 | ||||||
|  | +
 | ||||||
|  | +  if (!curl_debug_times) return;
 | ||||||
|  | +
 | ||||||
|  | +  for (i = 0; i < ARRAY_SIZE (times); ++i) {
 | ||||||
|  | +    r = curl_easy_getinfo (c, times[i].info, &t);
 | ||||||
|  | +    if (r != CURLE_OK) {
 | ||||||
|  | +      nbdkit_debug ("curl_easy_getinfo: error getting time '%s': %s",
 | ||||||
|  | +                    times[i].name, curl_easy_strerror (r));
 | ||||||
|  | +      continue;
 | ||||||
|  | +    }
 | ||||||
|  | +    if (curl_debug_verbose)
 | ||||||
|  | +      nbdkit_debug ("time '%s': %" PRIi64, times[i].name, (int64_t) t);
 | ||||||
|  | +    times[i].t += t;
 | ||||||
|  | +  }
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +/* Called when the plugin is unloaded. */
 | ||||||
|  | +void
 | ||||||
|  | +display_times (void)
 | ||||||
|  | +{
 | ||||||
|  | +  size_t i;
 | ||||||
|  | +  int64_t prev_t = 0, t, v;
 | ||||||
|  | +
 | ||||||
|  | +  if (!curl_debug_times) return;
 | ||||||
|  | +
 | ||||||
|  | +  nbdkit_debug ("times (-D curl.times=1):");
 | ||||||
|  | +  for (i = 0; i < ARRAY_SIZE (times); ++i) {
 | ||||||
|  | +    t = times[i].t;             /* in microseconds */
 | ||||||
|  | +    if (times[i].cumulative)
 | ||||||
|  | +      v = t - prev_t;
 | ||||||
|  | +    else
 | ||||||
|  | +      v = t;
 | ||||||
|  | +    prev_t = t;
 | ||||||
|  | +
 | ||||||
|  | +    nbdkit_debug ("%-30s: %3" PRIi64 ".%06" PRIi64 " s",
 | ||||||
|  | +                  times[i].name,
 | ||||||
|  | +                  v / 1000000, v % 1000000);
 | ||||||
|  | +  }
 | ||||||
|  | +}
 | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										34
									
								
								0013-curl-Fix-call-to-update_times.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								0013-curl-Fix-call-to-update_times.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | From 320af6bbc9d71e3e67cf1d6e59d4a5094324d41c Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Thu, 27 Jul 2023 17:08:50 +0100 | ||||||
|  | Subject: [PATCH] curl: Fix call to update_times | ||||||
|  | 
 | ||||||
|  | This was called in the wrong place so we didn't count the cost of | ||||||
|  | making the initial HEAD call on each handle. | ||||||
|  | 
 | ||||||
|  | Fixes: commit 68dddbeb584fb9385915846d259563f74338ffe8 | ||||||
|  | (cherry picked from commit f2d7041f94af15b158c92a96b9d9fdf4d3b7cdef) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/pool.c | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/pool.c b/plugins/curl/pool.c
 | ||||||
|  | index 10f9011d..8db69a71 100644
 | ||||||
|  | --- a/plugins/curl/pool.c
 | ||||||
|  | +++ b/plugins/curl/pool.c
 | ||||||
|  | @@ -471,11 +471,11 @@ get_content_length_accept_range (struct curl_handle *ch)
 | ||||||
|  |    curl_easy_setopt (ch->c, CURLOPT_HEADERFUNCTION, header_cb); | ||||||
|  |    curl_easy_setopt (ch->c, CURLOPT_HEADERDATA, ch); | ||||||
|  |    r = curl_easy_perform (ch->c); | ||||||
|  | +  update_times (ch->c);
 | ||||||
|  |    if (r != CURLE_OK) { | ||||||
|  |      display_curl_error (ch, r, | ||||||
|  |                          "problem doing HEAD request to fetch size of URL [%s]", | ||||||
|  |                          url); | ||||||
|  | -  update_times (ch->c);
 | ||||||
|  |   | ||||||
|  |      /* Get the HTTP status code, if available. */ | ||||||
|  |      r = curl_easy_getinfo (ch->c, CURLINFO_RESPONSE_CODE, &code); | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										2075
									
								
								0014-curl-Move-configuration-code-to-a-separate-file.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2075
									
								
								0014-curl-Move-configuration-code-to-a-separate-file.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										53
									
								
								0015-curl-Make-times-seconds-field-slightly-wider.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								0015-curl-Make-times-seconds-field-slightly-wider.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | |||||||
|  | From 110a96d728d54ff31d0d5ff1684427b45e91b832 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Fri, 28 Jul 2023 11:26:49 +0100 | ||||||
|  | Subject: [PATCH] curl: Make times seconds field slightly wider | ||||||
|  | 
 | ||||||
|  | Updates: commit 68dddbeb584fb9385915846d259563f74338ffe8 | ||||||
|  | (cherry picked from commit 1622db8c9f6c6e42b679d1d81df019944178b373) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/nbdkit-curl-plugin.pod | 14 +++++++------- | ||||||
|  |  plugins/curl/times.c                |  2 +- | ||||||
|  |  2 files changed, 8 insertions(+), 8 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/nbdkit-curl-plugin.pod b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | index 0fd688ed..0774adad 100644
 | ||||||
|  | --- a/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | +++ b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | @@ -551,13 +551,13 @@ information is printed in the debug output before nbdkit exits.  The
 | ||||||
|  |  output will look like: | ||||||
|  |   | ||||||
|  |   nbdkit: debug: times (-D curl.times=1): | ||||||
|  | - nbdkit: debug: name resolution               :   0.128442 s
 | ||||||
|  | - nbdkit: debug: connection                    :   4.945213 s
 | ||||||
|  | - nbdkit: debug: SSL negotiation               :   4.291362 s
 | ||||||
|  | - nbdkit: debug: pretransfer                   :   0.104137 s
 | ||||||
|  | - nbdkit: debug: first byte received           :  56.115269 s
 | ||||||
|  | - nbdkit: debug: data transfer                 : 222.633831 s
 | ||||||
|  | - nbdkit: debug: redirection time              :   0.000000 s
 | ||||||
|  | + nbdkit: debug: name resolution               :    0.128442 s
 | ||||||
|  | + nbdkit: debug: connection                    :    4.945213 s
 | ||||||
|  | + nbdkit: debug: SSL negotiation               :    4.291362 s
 | ||||||
|  | + nbdkit: debug: pretransfer                   :    0.104137 s
 | ||||||
|  | + nbdkit: debug: first byte received           :   56.115269 s
 | ||||||
|  | + nbdkit: debug: data transfer                 :  222.633831 s
 | ||||||
|  | + nbdkit: debug: redirection time              :    0.000000 s
 | ||||||
|  |   | ||||||
|  |  The cumulative time taken to perform each step is shown (summed across | ||||||
|  |  all HTTP connections).  The redirection time is the total time taken | ||||||
|  | diff --git a/plugins/curl/times.c b/plugins/curl/times.c
 | ||||||
|  | index 8cc4cf27..e752a0a9 100644
 | ||||||
|  | --- a/plugins/curl/times.c
 | ||||||
|  | +++ b/plugins/curl/times.c
 | ||||||
|  | @@ -123,7 +123,7 @@ display_times (void)
 | ||||||
|  |        v = t; | ||||||
|  |      prev_t = t; | ||||||
|  |   | ||||||
|  | -    nbdkit_debug ("%-30s: %3" PRIi64 ".%06" PRIi64 " s",
 | ||||||
|  | +    nbdkit_debug ("%-30s: %4" PRIi64 ".%06" PRIi64 " s",
 | ||||||
|  |                    times[i].name, | ||||||
|  |                    v / 1000000, v % 1000000); | ||||||
|  |    } | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										51
									
								
								0016-curl-Use-_Atomic-type-to-accumulate-curl-timings.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								0016-curl-Use-_Atomic-type-to-accumulate-curl-timings.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | |||||||
|  | From 22590e0575e78c4fc754705b46d1458eeadefcf1 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Sun, 30 Jul 2023 16:45:38 +0100 | ||||||
|  | Subject: [PATCH] curl: Use _Atomic type to accumulate curl timings | ||||||
|  | 
 | ||||||
|  | Because the global list of times is accessed in parallel by many | ||||||
|  | threads, they must be accessed atomically. | ||||||
|  | 
 | ||||||
|  | Fixes: commit 68dddbeb584fb9385915846d259563f74338ffe8 | ||||||
|  | (cherry picked from commit 4c527063336ccf14d286ef7db5766369e1b23845) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/curldefs.h | 9 +++++++++ | ||||||
|  |  plugins/curl/times.c    | 2 +- | ||||||
|  |  2 files changed, 10 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/curldefs.h b/plugins/curl/curldefs.h
 | ||||||
|  | index 9169b256..1feba844 100644
 | ||||||
|  | --- a/plugins/curl/curldefs.h
 | ||||||
|  | +++ b/plugins/curl/curldefs.h
 | ||||||
|  | @@ -35,6 +35,15 @@
 | ||||||
|  |   | ||||||
|  |  #include <stdbool.h> | ||||||
|  |   | ||||||
|  | +#ifdef HAVE_STDATOMIC_H
 | ||||||
|  | +#include <stdatomic.h>
 | ||||||
|  | +#else
 | ||||||
|  | +/* Some old platforms lack atomic types, but 32 bit ints are usually
 | ||||||
|  | + * "atomic enough".
 | ||||||
|  | + */
 | ||||||
|  | +#define _Atomic /**/
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  |  #include "windows-compat.h" | ||||||
|  |   | ||||||
|  |  /* Macro CURL_AT_LEAST_VERSION was added in 2015 (Curl 7.43) so if the | ||||||
|  | diff --git a/plugins/curl/times.c b/plugins/curl/times.c
 | ||||||
|  | index e752a0a9..23e2950b 100644
 | ||||||
|  | --- a/plugins/curl/times.c
 | ||||||
|  | +++ b/plugins/curl/times.c
 | ||||||
|  | @@ -54,7 +54,7 @@ static struct {
 | ||||||
|  |    bool cumulative; | ||||||
|  |    const char *name; | ||||||
|  |    CURLINFO info; | ||||||
|  | -  curl_off_t t;
 | ||||||
|  | +  _Atomic curl_off_t t;
 | ||||||
|  |  } times[] = { | ||||||
|  |  #ifdef HAVE_CURLINFO_NAMELOOKUP_TIME_T | ||||||
|  |    { true, "name resolution", CURLINFO_NAMELOOKUP_TIME_T }, | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										120
									
								
								0017-curl-Add-D-curl.verbose.ids-1-to-display-conn-and-xf.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								0017-curl-Add-D-curl.verbose.ids-1-to-display-conn-and-xf.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,120 @@ | |||||||
|  | From 07bdd644ae082c8e05afdcda4dcd12816ecc0efc Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Mon, 31 Jul 2023 13:24:39 +0100 | ||||||
|  | Subject: [PATCH] curl: Add -D curl.verbose.ids=1 to display conn and xfer IDs | ||||||
|  | 
 | ||||||
|  | Enhance debugging output with connection (conn) and transfer (xfer) | ||||||
|  | IDs.  Since there is some overhead to doing this, don't do it by | ||||||
|  | default.  Also it requires libcurl >= 8.2.0. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit a3ebf8f1c2cd5d399730ad6887b6b8bed94dc0ce) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/config.c               | 37 +++++++++++++++++++++++++---- | ||||||
|  |  plugins/curl/curldefs.h             |  4 ++++ | ||||||
|  |  plugins/curl/nbdkit-curl-plugin.pod |  6 +++++ | ||||||
|  |  3 files changed, 43 insertions(+), 4 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/config.c b/plugins/curl/config.c
 | ||||||
|  | index 742d6080..d68c92ba 100644
 | ||||||
|  | --- a/plugins/curl/config.c
 | ||||||
|  | +++ b/plugins/curl/config.c
 | ||||||
|  | @@ -99,6 +99,9 @@ static size_t error_cb (char *ptr, size_t size, size_t nmemb, void *opaque);
 | ||||||
|  |  /* Use '-D curl.verbose=1' to set. */ | ||||||
|  |  NBDKIT_DLL_PUBLIC int curl_debug_verbose = 0; | ||||||
|  |   | ||||||
|  | +/* Use '-D curl.verbose.ids=1' to set. */
 | ||||||
|  | +NBDKIT_DLL_PUBLIC int curl_debug_verbose_ids = 0;
 | ||||||
|  | +
 | ||||||
|  |  void | ||||||
|  |  unload_config (void) | ||||||
|  |  { | ||||||
|  | @@ -707,6 +710,14 @@ debug_cb (CURL *handle, curl_infotype type,
 | ||||||
|  |  { | ||||||
|  |    size_t origsize = size; | ||||||
|  |    CLEANUP_FREE char *str; | ||||||
|  | +  curl_off_t conn_id = -1, xfer_id = -1;
 | ||||||
|  | +
 | ||||||
|  | +#if defined(HAVE_CURLINFO_CONN_ID) && defined(HAVE_CURLINFO_XFER_ID)
 | ||||||
|  | +  if (curl_debug_verbose_ids) {
 | ||||||
|  | +    curl_easy_getinfo (handle, CURLINFO_CONN_ID, &conn_id);
 | ||||||
|  | +    curl_easy_getinfo (handle, CURLINFO_XFER_ID, &xfer_id);
 | ||||||
|  | +  }
 | ||||||
|  | +#endif
 | ||||||
|  |   | ||||||
|  |    /* The data parameter passed is NOT \0-terminated, but also it may | ||||||
|  |     * have \n or \r\n line endings.  The only sane way to deal with | ||||||
|  | @@ -726,17 +737,35 @@ debug_cb (CURL *handle, curl_infotype type,
 | ||||||
|  |   | ||||||
|  |    switch (type) { | ||||||
|  |    case CURLINFO_TEXT: | ||||||
|  | -    nbdkit_debug ("%s", str);
 | ||||||
|  | +    if (conn_id >= 0 && xfer_id >= 0)
 | ||||||
|  | +      nbdkit_debug ("conn %" PRIi64 " xfer %" PRIi64 ": %s",
 | ||||||
|  | +                    conn_id, xfer_id, str);
 | ||||||
|  | +    else
 | ||||||
|  | +      nbdkit_debug ("%s",str);
 | ||||||
|  |      break; | ||||||
|  |    case CURLINFO_HEADER_IN: | ||||||
|  | -    nbdkit_debug ("S: %s", str);
 | ||||||
|  | +    if (conn_id >= 0 && xfer_id >= 0)
 | ||||||
|  | +      nbdkit_debug ("conn %" PRIi64 " xfer %" PRIi64 ": S: %s",
 | ||||||
|  | +                    conn_id, xfer_id, str);
 | ||||||
|  | +    else
 | ||||||
|  | +      nbdkit_debug ("S: %s", str);
 | ||||||
|  |      break; | ||||||
|  |    case CURLINFO_HEADER_OUT: | ||||||
|  | -    nbdkit_debug ("C: %s", str);
 | ||||||
|  | +    if (conn_id >= 0 && xfer_id >= 0)
 | ||||||
|  | +      nbdkit_debug ("conn %" PRIi64 " xfer %" PRIi64 ": C: %s",
 | ||||||
|  | +                    conn_id, xfer_id, str);
 | ||||||
|  | +    else
 | ||||||
|  | +      nbdkit_debug ("C: %s", str);
 | ||||||
|  |      break; | ||||||
|  |    default: | ||||||
|  |      /* Assume everything else is binary data that we cannot print. */ | ||||||
|  | -    nbdkit_debug ("<data with size=%zu>", origsize);
 | ||||||
|  | +    if (conn_id >= 0 && xfer_id >= 0)
 | ||||||
|  | +      nbdkit_debug ("conn %" PRIi64 " xfer %" PRIi64 ": "
 | ||||||
|  | +                    "<data with size=%zu>",
 | ||||||
|  | +                    conn_id, xfer_id,
 | ||||||
|  | +                    origsize);
 | ||||||
|  | +    else
 | ||||||
|  | +      nbdkit_debug ("<data with size=%zu>", origsize);
 | ||||||
|  |    } | ||||||
|  |   | ||||||
|  |   out: | ||||||
|  | diff --git a/plugins/curl/curldefs.h b/plugins/curl/curldefs.h
 | ||||||
|  | index 1feba844..022e8c60 100644
 | ||||||
|  | --- a/plugins/curl/curldefs.h
 | ||||||
|  | +++ b/plugins/curl/curldefs.h
 | ||||||
|  | @@ -62,6 +62,10 @@
 | ||||||
|  |  #define HAVE_CURLINFO_TOTAL_TIME_T | ||||||
|  |  #define HAVE_CURLINFO_REDIRECT_TIME_T | ||||||
|  |  #endif | ||||||
|  | +#if CURL_AT_LEAST_VERSION (8, 2, 0)
 | ||||||
|  | +#define HAVE_CURLINFO_CONN_ID
 | ||||||
|  | +#define HAVE_CURLINFO_XFER_ID
 | ||||||
|  | +#endif
 | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  |  extern const char *url; | ||||||
|  | diff --git a/plugins/curl/nbdkit-curl-plugin.pod b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | index 0774adad..7784b553 100644
 | ||||||
|  | --- a/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | +++ b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | @@ -570,6 +570,12 @@ This enables very verbose curl debugging.  See L<CURLOPT_VERBOSE(3)>.
 | ||||||
|  |  This is mainly useful if you suspect there is a bug inside libcurl | ||||||
|  |  itself. | ||||||
|  |   | ||||||
|  | +=item B<-D curl.verbose.ids=1>
 | ||||||
|  | +
 | ||||||
|  | +This enhances C<-D curl.verbose=1> by printing connection and transfer
 | ||||||
|  | +IDs next to each debug message.  As this has some overhead it is not
 | ||||||
|  | +enabled by default.
 | ||||||
|  | +
 | ||||||
|  |  =back | ||||||
|  |   | ||||||
|  |  =head1 FILES | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,85 @@ | |||||||
|  | From ae6c568fecbef8b2aa72a89d6afd4aabcec10a05 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Fri, 28 Jul 2023 14:24:04 +0100 | ||||||
|  | Subject: [PATCH] curl: Rename unload_config, unload_pool -> config_unload, | ||||||
|  |  pool_unload | ||||||
|  | 
 | ||||||
|  | For consistency with scripts_unload. | ||||||
|  | 
 | ||||||
|  | There is still a function called load_pool, but that inconsistency | ||||||
|  | will be removed in a follow-on commit. | ||||||
|  | 
 | ||||||
|  | Reviewed-by: Eric Blake <eblake@redhat.com> | ||||||
|  | (cherry picked from commit f7bea74f670ba303c7ea60713cbbf301fab865fd) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/config.c   | 2 +- | ||||||
|  |  plugins/curl/curl.c     | 4 ++-- | ||||||
|  |  plugins/curl/curldefs.h | 4 ++-- | ||||||
|  |  plugins/curl/pool.c     | 2 +- | ||||||
|  |  4 files changed, 6 insertions(+), 6 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/config.c b/plugins/curl/config.c
 | ||||||
|  | index d68c92ba..276c79d5 100644
 | ||||||
|  | --- a/plugins/curl/config.c
 | ||||||
|  | +++ b/plugins/curl/config.c
 | ||||||
|  | @@ -103,7 +103,7 @@ NBDKIT_DLL_PUBLIC int curl_debug_verbose = 0;
 | ||||||
|  |  NBDKIT_DLL_PUBLIC int curl_debug_verbose_ids = 0; | ||||||
|  |   | ||||||
|  |  void | ||||||
|  | -unload_config (void)
 | ||||||
|  | +config_unload (void)
 | ||||||
|  |  { | ||||||
|  |    free (cookie); | ||||||
|  |    if (headers) | ||||||
|  | diff --git a/plugins/curl/curl.c b/plugins/curl/curl.c
 | ||||||
|  | index 99a7e00b..72971093 100644
 | ||||||
|  | --- a/plugins/curl/curl.c
 | ||||||
|  | +++ b/plugins/curl/curl.c
 | ||||||
|  | @@ -74,9 +74,9 @@ curl_load (void)
 | ||||||
|  |  static void | ||||||
|  |  curl_unload (void) | ||||||
|  |  { | ||||||
|  | -  unload_config ();
 | ||||||
|  | +  config_unload ();
 | ||||||
|  |    scripts_unload (); | ||||||
|  | -  unload_pool ();
 | ||||||
|  | +  pool_unload ();
 | ||||||
|  |    display_times (); | ||||||
|  |    curl_global_cleanup (); | ||||||
|  |  } | ||||||
|  | diff --git a/plugins/curl/curldefs.h b/plugins/curl/curldefs.h
 | ||||||
|  | index 022e8c60..cab4a6b1 100644
 | ||||||
|  | --- a/plugins/curl/curldefs.h
 | ||||||
|  | +++ b/plugins/curl/curldefs.h
 | ||||||
|  | @@ -119,13 +119,13 @@ struct curl_handle {
 | ||||||
|  |  extern int curl_config (const char *key, const char *value); | ||||||
|  |  extern int curl_config_complete (void); | ||||||
|  |  extern const char *curl_config_help; | ||||||
|  | -extern void unload_config (void);
 | ||||||
|  | +extern void config_unload (void);
 | ||||||
|  |  extern struct curl_handle *allocate_handle (void); | ||||||
|  |  extern void free_handle (struct curl_handle *); | ||||||
|  |   | ||||||
|  |  /* pool.c */ | ||||||
|  |  extern void load_pool (void); | ||||||
|  | -extern void unload_pool (void);
 | ||||||
|  | +extern void pool_unload (void);
 | ||||||
|  |  extern struct curl_handle *get_handle (void); | ||||||
|  |  extern void put_handle (struct curl_handle *ch); | ||||||
|  |   | ||||||
|  | diff --git a/plugins/curl/pool.c b/plugins/curl/pool.c
 | ||||||
|  | index 91e56f07..50a623a4 100644
 | ||||||
|  | --- a/plugins/curl/pool.c
 | ||||||
|  | +++ b/plugins/curl/pool.c
 | ||||||
|  | @@ -86,7 +86,7 @@ load_pool (void)
 | ||||||
|  |   | ||||||
|  |  /* Close and free all handles in the pool. */ | ||||||
|  |  void | ||||||
|  | -unload_pool (void)
 | ||||||
|  | +pool_unload (void)
 | ||||||
|  |  { | ||||||
|  |    size_t i; | ||||||
|  |   | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,96 @@ | |||||||
|  | From 995b1b62add89b437cb51bb7e15a35c265e188b3 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Fri, 28 Jul 2023 14:33:03 +0100 | ||||||
|  | Subject: [PATCH] pool: Add outline get_ready and after_fork functions | ||||||
|  | 
 | ||||||
|  | In a forthcoming commit we will need to create a multi handle and a | ||||||
|  | background thread, requiring use of the .get_ready (for multi) and | ||||||
|  | .after_fork (for the thread) plugin methods.  This commit removes the | ||||||
|  | empty load_pool function and adds pool_get_ready and pool_after_fork, | ||||||
|  | and the associated machinery in curl.c. | ||||||
|  | 
 | ||||||
|  | This commit on its own does nothing, future commits will fill in these | ||||||
|  | functions with useful work. | ||||||
|  | 
 | ||||||
|  | Reviewed-by: Eric Blake <eblake@redhat.com> | ||||||
|  | (cherry picked from commit 4075a499115a9e12ea74c4838fe00a7d680de2a1) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/curl.c     | 14 +++++++++++++- | ||||||
|  |  plugins/curl/curldefs.h |  3 ++- | ||||||
|  |  plugins/curl/pool.c     | 12 +++++++++--- | ||||||
|  |  3 files changed, 24 insertions(+), 5 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/curl.c b/plugins/curl/curl.c
 | ||||||
|  | index 72971093..4e727b86 100644
 | ||||||
|  | --- a/plugins/curl/curl.c
 | ||||||
|  | +++ b/plugins/curl/curl.c
 | ||||||
|  | @@ -67,8 +67,18 @@ curl_load (void)
 | ||||||
|  |      nbdkit_error ("libcurl initialization failed: %d", (int) r); | ||||||
|  |      exit (EXIT_FAILURE); | ||||||
|  |    } | ||||||
|  | +}
 | ||||||
|  |   | ||||||
|  | -  load_pool ();
 | ||||||
|  | +int
 | ||||||
|  | +curl_get_ready (void)
 | ||||||
|  | +{
 | ||||||
|  | +  return pool_get_ready ();
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +int
 | ||||||
|  | +curl_after_fork (void)
 | ||||||
|  | +{
 | ||||||
|  | +  return pool_after_fork ();
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static void | ||||||
|  | @@ -249,6 +259,8 @@ static struct nbdkit_plugin plugin = {
 | ||||||
|  |     */ | ||||||
|  |    //.config_help       = curl_config_help, | ||||||
|  |    .magic_config_key  = "url", | ||||||
|  | +  .get_ready         = curl_get_ready,
 | ||||||
|  | +  .after_fork        = curl_after_fork,
 | ||||||
|  |    .open              = curl_open, | ||||||
|  |    .close             = curl_close, | ||||||
|  |    .get_size          = curl_get_size, | ||||||
|  | diff --git a/plugins/curl/curldefs.h b/plugins/curl/curldefs.h
 | ||||||
|  | index cab4a6b1..939c8d37 100644
 | ||||||
|  | --- a/plugins/curl/curldefs.h
 | ||||||
|  | +++ b/plugins/curl/curldefs.h
 | ||||||
|  | @@ -124,7 +124,8 @@ extern struct curl_handle *allocate_handle (void);
 | ||||||
|  |  extern void free_handle (struct curl_handle *); | ||||||
|  |   | ||||||
|  |  /* pool.c */ | ||||||
|  | -extern void load_pool (void);
 | ||||||
|  | +extern int pool_get_ready (void);
 | ||||||
|  | +extern int pool_after_fork (void);
 | ||||||
|  |  extern void pool_unload (void); | ||||||
|  |  extern struct curl_handle *get_handle (void); | ||||||
|  |  extern void put_handle (struct curl_handle *ch); | ||||||
|  | diff --git a/plugins/curl/pool.c b/plugins/curl/pool.c
 | ||||||
|  | index 50a623a4..eb2d330e 100644
 | ||||||
|  | --- a/plugins/curl/pool.c
 | ||||||
|  | +++ b/plugins/curl/pool.c
 | ||||||
|  | @@ -78,10 +78,16 @@ static curl_handle_list curl_handles = empty_vector;
 | ||||||
|  |  static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; | ||||||
|  |  static size_t in_use = 0, waiting = 0; | ||||||
|  |   | ||||||
|  | -/* Initialize pool structures. */
 | ||||||
|  | -void
 | ||||||
|  | -load_pool (void)
 | ||||||
|  | +int
 | ||||||
|  | +pool_get_ready (void)
 | ||||||
|  |  { | ||||||
|  | +  return 0;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +int
 | ||||||
|  | +pool_after_fork (void)
 | ||||||
|  | +{
 | ||||||
|  | +  return 0;
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /* Close and free all handles in the pool. */ | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										36
									
								
								0020-curl-Do-pool_unload-before-config_unload.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								0020-curl-Do-pool_unload-before-config_unload.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | From 173530071d11433e26e1be1c11bc0e474f18079b Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Fri, 28 Jul 2023 14:35:42 +0100 | ||||||
|  | Subject: [PATCH] curl: Do pool_unload before config_unload | ||||||
|  | 
 | ||||||
|  | Since config.c deals with handles (and contains free_handle), and | ||||||
|  | since pool_unload calls free_handle to free handles, it's better to do | ||||||
|  | pool_unload first. | ||||||
|  | 
 | ||||||
|  | I don't believe this is a correctness issue now, but it will be in | ||||||
|  | subsequent commits. | ||||||
|  | 
 | ||||||
|  | Reviewed-by: Eric Blake <eblake@redhat.com> | ||||||
|  | (cherry picked from commit 650bde3bdb85ff2af0ea618fd64e726b7535d686) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/curl.c | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/curl.c b/plugins/curl/curl.c
 | ||||||
|  | index 4e727b86..be42de36 100644
 | ||||||
|  | --- a/plugins/curl/curl.c
 | ||||||
|  | +++ b/plugins/curl/curl.c
 | ||||||
|  | @@ -84,9 +84,9 @@ curl_after_fork (void)
 | ||||||
|  |  static void | ||||||
|  |  curl_unload (void) | ||||||
|  |  { | ||||||
|  | +  pool_unload ();
 | ||||||
|  |    config_unload (); | ||||||
|  |    scripts_unload (); | ||||||
|  | -  pool_unload ();
 | ||||||
|  |    display_times (); | ||||||
|  |    curl_global_cleanup (); | ||||||
|  |  } | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,52 @@ | |||||||
|  | From 0b9807056e8be58b624b67b281accddc630c5d2c Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Fri, 28 Jul 2023 16:47:58 +0100 | ||||||
|  | Subject: [PATCH] retry-request: Allow get_size operation to be retried | ||||||
|  | 
 | ||||||
|  | This plugin operation might need to do some real work (instead of just | ||||||
|  | fetching a number from memory), and so it might have to be retried. | ||||||
|  | 
 | ||||||
|  | In particular, changes to the curl plugin make .get_size into a | ||||||
|  | heavyweight operation, where previously it was done as a side-effect | ||||||
|  | of .open.  And so we must allow .get_size to be retried independent of | ||||||
|  | .open. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 0ff9f9e202218e278bf38faf328ec80f25d6b661) | ||||||
|  | ---
 | ||||||
|  |  filters/retry-request/retry-request.c | 13 +++++++++++++ | ||||||
|  |  1 file changed, 13 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/filters/retry-request/retry-request.c b/filters/retry-request/retry-request.c
 | ||||||
|  | index e5b8344c..8e3dd824 100644
 | ||||||
|  | --- a/filters/retry-request/retry-request.c
 | ||||||
|  | +++ b/filters/retry-request/retry-request.c
 | ||||||
|  | @@ -141,6 +141,18 @@ retry_request_open (nbdkit_next_open *next, nbdkit_context *nxdata,
 | ||||||
|  |    return r == 0 ? NBDKIT_HANDLE_NOT_NEEDED : NULL; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static int64_t
 | ||||||
|  | +retry_request_get_size (nbdkit_next *next, void *handle)
 | ||||||
|  | +{
 | ||||||
|  | +  int64_t r;
 | ||||||
|  | +  int *err = &errno;          /* used by the RETRY_* macros */
 | ||||||
|  | +
 | ||||||
|  | +  RETRY_START("get_size")
 | ||||||
|  | +    r = next->get_size (next);
 | ||||||
|  | +  RETRY_END;
 | ||||||
|  | +  return r;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  static int | ||||||
|  |  retry_request_pread (nbdkit_next *next, | ||||||
|  |                       void *handle, void *buf, uint32_t count, uint64_t offset, | ||||||
|  | @@ -267,6 +279,7 @@ static struct nbdkit_filter filter = {
 | ||||||
|  |    .config            = retry_request_config, | ||||||
|  |    .config_help       = retry_request_config_help, | ||||||
|  |    .open              = retry_request_open, | ||||||
|  | +  .get_size          = retry_request_get_size,
 | ||||||
|  |    .pread             = retry_request_pread, | ||||||
|  |    .pwrite            = retry_request_pwrite, | ||||||
|  |    .trim              = retry_request_trim, | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,42 @@ | |||||||
|  | From 85241affaa52e4d67d0a22329d4cc5e2b0fe5ca3 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Fri, 28 Jul 2023 16:59:20 +0100 | ||||||
|  | Subject: [PATCH] tests/test-retry-request-mirror.c: Don't assume state after | ||||||
|  |  connect | ||||||
|  | 
 | ||||||
|  | After forthcoming changes to the curl plugin we cannot assume the | ||||||
|  | exact mirror we will be connected to after making the NBD connection. | ||||||
|  | So remove that assumption. | ||||||
|  | 
 | ||||||
|  | See: commit 38dccd848bd40cccdf012df7a606e13282aaeecb | ||||||
|  | Reviewed-by: Eric Blake <eblake@redhat.com> | ||||||
|  | (cherry picked from commit ee03fbd2385dcd8772ad2c838401df0b5d8c5617) | ||||||
|  | ---
 | ||||||
|  |  tests/test-retry-request-mirror.c | 4 +++- | ||||||
|  |  1 file changed, 3 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/tests/test-retry-request-mirror.c b/tests/test-retry-request-mirror.c
 | ||||||
|  | index cf42c596..65440d2e 100644
 | ||||||
|  | --- a/tests/test-retry-request-mirror.c
 | ||||||
|  | +++ b/tests/test-retry-request-mirror.c
 | ||||||
|  | @@ -58,7 +58,7 @@ main (int argc, char *argv[])
 | ||||||
|  |    const char *sockpath; | ||||||
|  |    CLEANUP_FREE char *usp_param = NULL; | ||||||
|  |    int i, j; | ||||||
|  | -  char state = 0;
 | ||||||
|  | +  char state;
 | ||||||
|  |    struct nbd_handle *nbd = NULL; | ||||||
|  |   | ||||||
|  |  #ifndef HAVE_CURLOPT_UNIX_SOCKET_PATH | ||||||
|  | @@ -105,6 +105,8 @@ main (int argc, char *argv[])
 | ||||||
|  |      if (nbd_connect_unix (nbd, sock /* NBD socket */) == -1) | ||||||
|  |        goto nbd_error; | ||||||
|  |   | ||||||
|  | +    state = 0;
 | ||||||
|  | +
 | ||||||
|  |      for (i = 0; i < 7 /* not divisible by 2 or 3 */; ++i) { | ||||||
|  |        char buf[512]; | ||||||
|  |   | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										1279
									
								
								0023-curl-Use-curl-multi-interface.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1279
									
								
								0023-curl-Use-curl-multi-interface.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										139
									
								
								0024-curl-Redefine-connections-N-parameter-as-number-of-H.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								0024-curl-Redefine-connections-N-parameter-as-number-of-H.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,139 @@ | |||||||
|  | From d33cf724dccd014f854a90bb7341fd36f890bb01 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Fri, 28 Jul 2023 11:49:24 +0100 | ||||||
|  | Subject: [PATCH] curl: Redefine connections=<N> parameter as number of HTTP | ||||||
|  |  connections | ||||||
|  | 
 | ||||||
|  | Previously (nbdkit 1.34) this was the number of easy handles.  However | ||||||
|  | it turns out that easy handles can open multiple HTTP connections, and | ||||||
|  | in fact there's no good way to tell how many (and they are not | ||||||
|  | shared). | ||||||
|  | 
 | ||||||
|  | Now that we are using a curl multi, curl >= 7.30 provides a way to | ||||||
|  | limit the total number of actual HTTP connections, so we should just | ||||||
|  | use it.  This is closer to what I intended this parameter to mean. | ||||||
|  | 
 | ||||||
|  | Also update the documentation to properly describe previous and | ||||||
|  | current behaviour. | ||||||
|  | 
 | ||||||
|  | Link: https://curl.se/mail/lib-2019-03/0102.html | ||||||
|  | Link: https://curl.se/mail/lib-2019-12/0044.html | ||||||
|  | Reviewed-by: Eric Blake <eblake@redhat.com> | ||||||
|  | (cherry picked from commit 2bb03f898e49ec892070055b6975914642fa8c5c) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/config.c               |  2 +- | ||||||
|  |  plugins/curl/curldefs.h             |  3 +++ | ||||||
|  |  plugins/curl/nbdkit-curl-plugin.pod | 37 +++++++++++++++++++---------- | ||||||
|  |  plugins/curl/pool.c                 |  6 ++++- | ||||||
|  |  4 files changed, 34 insertions(+), 14 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/config.c b/plugins/curl/config.c
 | ||||||
|  | index ce82d5f9..a7501707 100644
 | ||||||
|  | --- a/plugins/curl/config.c
 | ||||||
|  | +++ b/plugins/curl/config.c
 | ||||||
|  | @@ -494,7 +494,7 @@ curl_config_complete (void)
 | ||||||
|  |  const char *curl_config_help = | ||||||
|  |    "cainfo=<CAINFO>            Path to Certificate Authority file.\n" | ||||||
|  |    "capath=<CAPATH>            Path to directory with CA certificates.\n" | ||||||
|  | -  "connections=<N>            Number of libcurl connections to use.\n"
 | ||||||
|  | +  "connections=<N>            Number of HTTP connections to use.\n"
 | ||||||
|  |    "cookie=<COOKIE>            Set HTTP/HTTPS cookies.\n" | ||||||
|  |    "cookiefile=                Enable cookie processing.\n" | ||||||
|  |    "cookiefile=<FILENAME>      Read cookies from file.\n" | ||||||
|  | diff --git a/plugins/curl/curldefs.h b/plugins/curl/curldefs.h
 | ||||||
|  | index 6b158d85..73e7a3b4 100644
 | ||||||
|  | --- a/plugins/curl/curldefs.h
 | ||||||
|  | +++ b/plugins/curl/curldefs.h
 | ||||||
|  | @@ -50,6 +50,9 @@
 | ||||||
|  |   * macro isn't present then Curl is very old. | ||||||
|  |   */ | ||||||
|  |  #ifdef CURL_AT_LEAST_VERSION | ||||||
|  | +#if CURL_AT_LEAST_VERSION (7, 30, 0)
 | ||||||
|  | +#define HAVE_CURLMOPT_MAX_TOTAL_CONNECTIONS
 | ||||||
|  | +#endif
 | ||||||
|  |  #if CURL_AT_LEAST_VERSION (7, 55, 0) | ||||||
|  |  #define HAVE_CURLINFO_CONTENT_LENGTH_DOWNLOAD_T | ||||||
|  |  #endif | ||||||
|  | diff --git a/plugins/curl/nbdkit-curl-plugin.pod b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | index 7784b553..9821f111 100644
 | ||||||
|  | --- a/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | +++ b/plugins/curl/nbdkit-curl-plugin.pod
 | ||||||
|  | @@ -58,10 +58,10 @@ L<CURLOPT_CAPATH(3)> for more information.
 | ||||||
|  |   | ||||||
|  |  (nbdkit E<ge> 1.34) | ||||||
|  |   | ||||||
|  | -Open up to C<N> curl connections to the web server.  The default is 4.
 | ||||||
|  | -Curl connections are shared between all NBD clients, so you may wish
 | ||||||
|  | -to increase this if you expect many simultaneous NBD clients (or a
 | ||||||
|  | -single client using many multi-conn connections).
 | ||||||
|  | +Open up to C<N> connections to the web server.  The default is 16.
 | ||||||
|  | +Connections are shared between all NBD clients, so you may wish to
 | ||||||
|  | +increase this if you expect many simultaneous NBD clients (or a single
 | ||||||
|  | +client using many multi-conn connections).
 | ||||||
|  |   | ||||||
|  |  See L</NBD CONNECTIONS AND CURL HANDLES> below. | ||||||
|  |   | ||||||
|  | @@ -397,15 +397,28 @@ user-agent header.
 | ||||||
|  |  =head1 NBD CONNECTIONS AND CURL HANDLES | ||||||
|  |   | ||||||
|  |  nbdkit E<le> 1.32 used a simple model where a new NBD connection would | ||||||
|  | -create a new libcurl handle.  In practice this meant there was a
 | ||||||
|  | -1-to-1 relationship between NBD connections and HTTP connections to
 | ||||||
|  | -the remote web server (assuming http: or https: URL).
 | ||||||
|  | +create a new libcurl handle.  Since a libcurl handle maintains a small
 | ||||||
|  | +cache of connections, this meant that the number of HTTP connections
 | ||||||
|  | +would be a small multiple of the number of incoming NBD connections
 | ||||||
|  | +and the total would not be limited (assuming http: or https: URL).
 | ||||||
|  |   | ||||||
|  | -nbdkit E<ge> 1.34 changed to using a fixed pool of libcurl handles
 | ||||||
|  | -shared across all NBD connections.  You can control the maximum number
 | ||||||
|  | -of curl handles in the pool with the C<connections> parameter (default
 | ||||||
|  | -4).  Note that if there are more than 4 NBD connections, they will
 | ||||||
|  | -share the 4 web server connections, unless you adjust C<connections>.
 | ||||||
|  | +nbdkit 1.34 changed to using a fixed pool of libcurl handles shared
 | ||||||
|  | +across all NBD connections.  You can control the maximum number of
 | ||||||
|  | +curl handles in the pool with the C<connections> parameter (default
 | ||||||
|  | +4).  Since each curl handle maintains a small cache of connections,
 | ||||||
|  | +this meant that the number of HTTP connections would be a small
 | ||||||
|  | +multiple of the C<connections> parameter.  If there are more than 4
 | ||||||
|  | +incoming NBD connections, they will contend for the libcurl handles,
 | ||||||
|  | +unless you adjust C<connections>.
 | ||||||
|  | +
 | ||||||
|  | +nbdkit E<ge> 1.36 changed again to use a curl multi handle
 | ||||||
|  | +(L<libcurl-multi(3)>).  Now the C<connections> parameter controls the
 | ||||||
|  | +maximum number of HTTP connections made to the remote server
 | ||||||
|  | +(L<CURLMOPT_MAX_TOTAL_CONNECTIONS(3)>).  This is more efficient
 | ||||||
|  | +especially with HTTP/2 and HTTP/3, where each HTTP connection can
 | ||||||
|  | +contain a very large number of streams (typically up to 100)
 | ||||||
|  | +multiplexed over one connection.  The default for C<connections> was
 | ||||||
|  | +raised to 16.
 | ||||||
|  |   | ||||||
|  |  =head1 HEADER AND COOKIE SCRIPTS | ||||||
|  |   | ||||||
|  | diff --git a/plugins/curl/pool.c b/plugins/curl/pool.c
 | ||||||
|  | index 254951d1..7d44dfe5 100644
 | ||||||
|  | --- a/plugins/curl/pool.c
 | ||||||
|  | +++ b/plugins/curl/pool.c
 | ||||||
|  | @@ -79,7 +79,7 @@
 | ||||||
|  |  /* Use '-D curl.pool=1' to debug handle pool. */ | ||||||
|  |  NBDKIT_DLL_PUBLIC int curl_debug_pool = 0; | ||||||
|  |   | ||||||
|  | -unsigned connections = 4;
 | ||||||
|  | +unsigned connections = 16;
 | ||||||
|  |   | ||||||
|  |  /* Pipe used to notify background thread that a command is pending in | ||||||
|  |   * the queue.  A pointer to the 'struct command' is sent over the | ||||||
|  | @@ -115,6 +115,10 @@ pool_get_ready (void)
 | ||||||
|  |      return -1; | ||||||
|  |    } | ||||||
|  |   | ||||||
|  | +#ifdef HAVE_CURLMOPT_MAX_TOTAL_CONNECTIONS
 | ||||||
|  | +  curl_multi_setopt(multi, CURLMOPT_MAX_TOTAL_CONNECTIONS, (long) connections);
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  |    return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										57
									
								
								0025-curl-Disable-this-plugin-on-Windows.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								0025-curl-Disable-this-plugin-on-Windows.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,57 @@ | |||||||
|  | From 852f23db007b13ca8e9e5548c3becbdc78e16601 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Richard W.M. Jones" <rjones@redhat.com> | ||||||
|  | Date: Tue, 1 Aug 2023 11:29:04 +0100 | ||||||
|  | Subject: [PATCH] curl: Disable this plugin on Windows | ||||||
|  | 
 | ||||||
|  | There is no self pipe trick for Windows (or there is, but it would | ||||||
|  | require substantial porting work). | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 9b0759377f6779bbecc8647c026dcdac7f2ebd89) | ||||||
|  | ---
 | ||||||
|  |  plugins/curl/Makefile.am | 5 ++++- | ||||||
|  |  tests/Makefile.am        | 2 ++ | ||||||
|  |  2 files changed, 6 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/plugins/curl/Makefile.am b/plugins/curl/Makefile.am
 | ||||||
|  | index 7529fb2f..971365f1 100644
 | ||||||
|  | --- a/plugins/curl/Makefile.am
 | ||||||
|  | +++ b/plugins/curl/Makefile.am
 | ||||||
|  | @@ -34,6 +34,8 @@ include $(top_srcdir)/common-rules.mk
 | ||||||
|  |  EXTRA_DIST = nbdkit-curl-plugin.pod | ||||||
|  |   | ||||||
|  |  if HAVE_CURL | ||||||
|  | +# Disabled on Windows because no self-pipe.
 | ||||||
|  | +if !IS_WINDOWS
 | ||||||
|  |   | ||||||
|  |  plugin_LTLIBRARIES = nbdkit-curl-plugin.la | ||||||
|  |   | ||||||
|  | @@ -85,4 +87,5 @@ nbdkit-curl-plugin.1: nbdkit-curl-plugin.pod \
 | ||||||
|  |   | ||||||
|  |  endif HAVE_POD | ||||||
|  |   | ||||||
|  | -endif
 | ||||||
|  | +endif !IS_WINDOWS
 | ||||||
|  | +endif HAVE_CURL
 | ||||||
|  | diff --git a/tests/Makefile.am b/tests/Makefile.am
 | ||||||
|  | index f6c5ac9a..08514c7a 100644
 | ||||||
|  | --- a/tests/Makefile.am
 | ||||||
|  | +++ b/tests/Makefile.am
 | ||||||
|  | @@ -643,6 +643,7 @@ EXTRA_DIST += test-cdi.sh
 | ||||||
|  |  # curl plugin test. | ||||||
|  |  if HAVE_MKE2FS_WITH_D | ||||||
|  |  if HAVE_CURL | ||||||
|  | +if !IS_WINDOWS
 | ||||||
|  |  TESTS += \ | ||||||
|  |  	test-curl-file.sh \ | ||||||
|  |  	test-curl-header-script-fail.sh \ | ||||||
|  | @@ -749,6 +750,7 @@ test_curl_cookie_script_LDADD = \
 | ||||||
|  |  	$(LIBNBD_LIBS) \ | ||||||
|  |  	$(NULL) | ||||||
|  |   | ||||||
|  | +endif !IS_WINDOWS
 | ||||||
|  |  endif HAVE_CURL | ||||||
|  |  endif HAVE_MKE2FS_WITH_D | ||||||
|  |   | ||||||
|  | -- 
 | ||||||
|  | 2.39.3 | ||||||
|  | 
 | ||||||
							
								
								
									
										36
									
								
								nbdkit.spec
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								nbdkit.spec
									
									
									
									
									
								
							| @ -46,13 +46,13 @@ ExclusiveArch:  x86_64 | |||||||
| %global verify_tarball_signature 1 | %global verify_tarball_signature 1 | ||||||
| 
 | 
 | ||||||
| # If there are patches which touch autotools files, set this to 1. | # If there are patches which touch autotools files, set this to 1. | ||||||
| %global patches_touch_autotools %{nil} | %global patches_touch_autotools 1 | ||||||
| 
 | 
 | ||||||
| # The source directory. | # The source directory. | ||||||
| %global source_directory 1.34-stable | %global source_directory 1.34-stable | ||||||
| 
 | 
 | ||||||
| Name:           nbdkit | Name:           nbdkit | ||||||
| Version:        1.34.1 | Version:        1.34.2 | ||||||
| Release:        1%{?dist} | Release:        1%{?dist} | ||||||
| Summary:        NBD server | Summary:        NBD server | ||||||
| 
 | 
 | ||||||
| @ -78,7 +78,31 @@ Source3:        copy-patches.sh | |||||||
| # https://gitlab.com/nbdkit/nbdkit/-/commits/rhel-9.3/ | # https://gitlab.com/nbdkit/nbdkit/-/commits/rhel-9.3/ | ||||||
| 
 | 
 | ||||||
| # Patches. | # Patches. | ||||||
| #(nothing) | Patch0001:     0001-tests-test-connect.c-Skip-if-exit-with-parent-is-not.patch | ||||||
|  | Patch0002:     0002-tests-Use-exit-with-parent-in-the-test-framework.patch | ||||||
|  | Patch0003:     0003-protect-Fix-copy-and-paste-error-in-the-documentatio.patch | ||||||
|  | Patch0004:     0004-docs-nbdkit-protocol.pod-Fix-manual-page-name.patch | ||||||
|  | Patch0005:     0005-retry-request-Print-operation-we-are-retrying-in-deb.patch | ||||||
|  | Patch0006:     0006-tests-test-ocaml-errorcodes.c-Don-t-use-assert-in-te.patch | ||||||
|  | Patch0007:     0007-tests-test-ocaml-errorcodes.c-Enable-verbose-message.patch | ||||||
|  | Patch0008:     0008-curl-Use-the-parallel-thread-model.patch | ||||||
|  | Patch0009:     0009-curl-Add-ipresolve-option.patch | ||||||
|  | Patch0010:     0010-curl-Add-resolve-option.patch | ||||||
|  | Patch0011:     0011-curl-pool-Add-abstract-load_pool-and-unload_pool-fun.patch | ||||||
|  | Patch0012:     0012-curl-Add-D-curl.times-1-to-collect-time-statistics.patch | ||||||
|  | Patch0013:     0013-curl-Fix-call-to-update_times.patch | ||||||
|  | Patch0014:     0014-curl-Move-configuration-code-to-a-separate-file.patch | ||||||
|  | Patch0015:     0015-curl-Make-times-seconds-field-slightly-wider.patch | ||||||
|  | Patch0016:     0016-curl-Use-_Atomic-type-to-accumulate-curl-timings.patch | ||||||
|  | Patch0017:     0017-curl-Add-D-curl.verbose.ids-1-to-display-conn-and-xf.patch | ||||||
|  | Patch0018:     0018-curl-Rename-unload_config-unload_pool-config_unload-.patch | ||||||
|  | Patch0019:     0019-pool-Add-outline-get_ready-and-after_fork-functions.patch | ||||||
|  | Patch0020:     0020-curl-Do-pool_unload-before-config_unload.patch | ||||||
|  | Patch0021:     0021-retry-request-Allow-get_size-operation-to-be-retried.patch | ||||||
|  | Patch0022:     0022-tests-test-retry-request-mirror.c-Don-t-assume-state.patch | ||||||
|  | Patch0023:     0023-curl-Use-curl-multi-interface.patch | ||||||
|  | Patch0024:     0024-curl-Redefine-connections-N-parameter-as-number-of-H.patch | ||||||
|  | Patch0025:     0025-curl-Disable-this-plugin-on-Windows.patch | ||||||
| 
 | 
 | ||||||
| # For automatic RPM Provides generation. | # For automatic RPM Provides generation. | ||||||
| # See: https://rpm-software-management.github.io/rpm/manual/dependency_generators.html | # See: https://rpm-software-management.github.io/rpm/manual/dependency_generators.html | ||||||
| @ -1249,6 +1273,12 @@ export LIBGUESTFS_TRACE=1 | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Tue Aug 01 2023 Richard W.M. Jones <rjones@redhat.com> - 1.34.2-1 | ||||||
|  | - Rebase to 1.34.2 | ||||||
|  |   resolves: rhbz#2168629 | ||||||
|  | - Backport nbdkit-curl-plugin "multi" interface support | ||||||
|  |   resolves: rhbz#2228131 | ||||||
|  | 
 | ||||||
| * Tue Apr 18 2023 Richard W.M. Jones <rjones@redhat.com> - 1.34.1-1 | * Tue Apr 18 2023 Richard W.M. Jones <rjones@redhat.com> - 1.34.1-1 | ||||||
| - Rebase to 1.34.1 | - Rebase to 1.34.1 | ||||||
|   resolves: rhbz#2168629 |   resolves: rhbz#2168629 | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								sources
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								sources
									
									
									
									
									
								
							| @ -1,2 +1,2 @@ | |||||||
| SHA512 (nbdkit-1.34.1.tar.gz) = 23d87f72046ea2ba5a315bfa85846a94f3557970e9db500d168ba45057d9835c0c51557b9ff6cdc3135bbdc6bb6e6dfed01f0640a08b576b5620c0476578d4ce | SHA512 (nbdkit-1.34.2.tar.gz) = a279cdde6820729c0c4479a872c436f340f082f5534c53b05902fdfe7a4690d55fb5b449b97d29167d801138a4f1990eaea84092e9c170703819e123b8fdc131 | ||||||
| SHA512 (nbdkit-1.34.1.tar.gz.sig) = c25077362fb6459a83e1acbf1a683017c11edffb9760c9707c929ef4ab54583bdfa5bcfd845ce1f3e98fa46add7a4fba9536a7d4fb0cc072b6a41116489a957d | SHA512 (nbdkit-1.34.2.tar.gz.sig) = 0ca4097816d7f15ec7569c8043caafd2f6fa3e05c6f19ec260b0f2bec65f7be0077257025ac1a09806e2c831bc7556a7270ba0d6c3dbcbef38d7c6ffe5a610f4 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user