From 71766039ff236682b78b3b959971f5b15c2f83a8 Mon Sep 17 00:00:00 2001 From: Takeshi Nakatani Date: Fri, 22 Mar 2019 10:47:42 +0000 Subject: [PATCH] Support undefined CURLoption in libcurl library used in build --- configure.ac | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/curl.cpp | 12 +++++++++--- src/curl.h | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 86a2bc8..2c76ff2 100644 --- a/configure.ac +++ b/configure.ac @@ -264,6 +264,51 @@ AC_COMPILE_IFELSE( ] ) +dnl ---------------------------------------------- +dnl check CURLoption +dnl ---------------------------------------------- +dnl CURLOPT_TCP_KEEPALIVE (is supported by 7.25.0 and later) +AC_MSG_CHECKING([checking CURLOPT_TCP_KEEPALIVE]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include ]], + [[CURLoption opt = CURLOPT_TCP_KEEPALIVE;]]) + ], + [AC_DEFINE(HAVE_CURLOPT_TCP_KEEPALIVE, 1, [Define to 1 if libcurl has CURLOPT_TCP_KEEPALIVE CURLoption]) + AC_MSG_RESULT(yes) + ], + [AC_DEFINE(HAVE_CURLOPT_TCP_KEEPALIVE, 0, [Define to 1 if libcurl has CURLOPT_TCP_KEEPALIVE CURLoption]) + AC_MSG_RESULT(no) + ] +) + +dnl CURLOPT_SSL_ENABLE_ALPN (is supported by 7.36.0 and later) +AC_MSG_CHECKING([checking CURLOPT_SSL_ENABLE_ALPN]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include ]], + [[CURLoption opt = CURLOPT_SSL_ENABLE_ALPN;]]) + ], + [AC_DEFINE(HAVE_CURLOPT_SSL_ENABLE_ALPN, 1, [Define to 1 if libcurl has CURLOPT_SSL_ENABLE_ALPN CURLoption]) + AC_MSG_RESULT(yes) + ], + [AC_DEFINE(HAVE_CURLOPT_SSL_ENABLE_ALPN, 0, [Define to 1 if libcurl has CURLOPT_SSL_ENABLE_ALPN CURLoption]) + AC_MSG_RESULT(no) + ] +) + +dnl CURLOPT_KEEP_SENDING_ON_ERROR (is supported by 7.51.0 and later) +AC_MSG_CHECKING([checking CURLOPT_KEEP_SENDING_ON_ERROR]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include ]], + [[CURLoption opt = CURLOPT_KEEP_SENDING_ON_ERROR;]]) + ], + [AC_DEFINE(HAVE_CURLOPT_KEEP_SENDING_ON_ERROR, 1, [Define to 1 if libcurl has CURLOPT_KEEP_SENDING_ON_ERROR CURLoption]) + AC_MSG_RESULT(yes) + ], + [AC_DEFINE(HAVE_CURLOPT_KEEP_SENDING_ON_ERROR, 0, [Define to 1 if libcurl has CURLOPT_KEEP_SENDING_ON_ERROR CURLoption]) + AC_MSG_RESULT(no) + ] +) + dnl ---------------------------------------------- dnl output files dnl ---------------------------------------------- diff --git a/src/curl.cpp b/src/curl.cpp index 85412c8..1a1ee6d 100644 --- a/src/curl.cpp +++ b/src/curl.cpp @@ -1848,9 +1848,15 @@ bool S3fsCurl::ResetHandle() curl_easy_setopt(hCurl, CURLOPT_PROGRESSFUNCTION, S3fsCurl::CurlProgress); curl_easy_setopt(hCurl, CURLOPT_PROGRESSDATA, hCurl); // curl_easy_setopt(hCurl, CURLOPT_FORBID_REUSE, 1); - curl_easy_setopt(hCurl, CURLOPT_TCP_KEEPALIVE, 1); - // curl_easy_setopt(hCurl, CURLOPT_KEEP_SENDING_ON_ERROR, 1); // after 7.51.0 - // curl_easy_setopt(hCurl, CURLOPT_SSL_ENABLE_ALPN, 0); // after 7.36.0 for disable ALPN for s3 server + if(CURLE_OK != curl_easy_setopt(hCurl, S3FS_CURLOPT_TCP_KEEPALIVE, 1)){ + S3FS_PRN_WARN("The CURLOPT_TCP_KEEPALIVE option could not be set. For maximize performance you need to enable this option and you should use libcurl 7.25.0 or later."); + } + if(CURLE_OK != curl_easy_setopt(hCurl, S3FS_CURLOPT_SSL_ENABLE_ALPN, 0)){ + S3FS_PRN_WARN("The CURLOPT_SSL_ENABLE_ALPN option could not be unset. S3 server does not support ALPN, then this option should be disabled to maximize performance. you need to use libcurl 7.36.0 or later."); + } + if(CURLE_OK != curl_easy_setopt(hCurl, S3FS_CURLOPT_KEEP_SENDING_ON_ERROR, 1)){ + S3FS_PRN_WARN("The S3FS_CURLOPT_KEEP_SENDING_ON_ERROR option could not be set. For maximize performance you need to enable this option and you should use libcurl 7.51.0 or later."); + } if(type != REQTYPE_IAMCRED && type != REQTYPE_IAMROLE){ // REQTYPE_IAMCRED and REQTYPE_IAMROLE are always HTTP diff --git a/src/curl.h b/src/curl.h index 34f0963..10c6937 100644 --- a/src/curl.h +++ b/src/curl.h @@ -25,6 +25,39 @@ #include "psemaphore.h" +//---------------------------------------------- +// Avoid dependency on libcurl version +//---------------------------------------------- +// [NOTE] +// The following symbols (enum) depend on the version of libcurl. +// CURLOPT_TCP_KEEPALIVE 7.25.0 and later +// CURLOPT_SSL_ENABLE_ALPN 7.36.0 and later +// CURLOPT_KEEP_SENDING_ON_ERROR 7.51.0 and later +// +// s3fs uses these, if you build s3fs with the old libcurl, +// substitute the following symbols to avoid errors. +// If the version of libcurl linked at runtime is old, +// curl_easy_setopt results in an error(CURLE_UNKNOWN_OPTION) and +// a message is output. +// +#if defined(HAVE_CURLOPT_TCP_KEEPALIVE) && (HAVE_CURLOPT_TCP_KEEPALIVE == 1) + #define S3FS_CURLOPT_TCP_KEEPALIVE CURLOPT_TCP_KEEPALIVE +#else + #define S3FS_CURLOPT_TCP_KEEPALIVE static_cast(213) +#endif + +#if defined(HAVE_CURLOPT_SSL_ENABLE_ALPN) && (HAVE_CURLOPT_SSL_ENABLE_ALPN == 1) + #define S3FS_CURLOPT_SSL_ENABLE_ALPN CURLOPT_SSL_ENABLE_ALPN +#else + #define S3FS_CURLOPT_SSL_ENABLE_ALPN static_cast(226) +#endif + +#if defined(HAVE_CURLOPT_KEEP_SENDING_ON_ERROR) && (HAVE_CURLOPT_KEEP_SENDING_ON_ERROR == 1) + #define S3FS_CURLOPT_KEEP_SENDING_ON_ERROR CURLOPT_KEEP_SENDING_ON_ERROR +#else + #define S3FS_CURLOPT_KEEP_SENDING_ON_ERROR static_cast(245) +#endif + //---------------------------------------------- // Symbols //----------------------------------------------