From 7b0680879f3d8f2b24c320eb7f85fbd74df4ed21 Mon Sep 17 00:00:00 2001 From: Jelte Fennema Date: Wed, 18 Mar 2020 09:56:09 +0100 Subject: [PATCH] Remove statistics collection code that was disabled by default --- configure | 246 +-------------- configure.in | 19 -- src/backend/distributed/shared_library_init.c | 43 --- src/backend/distributed/utils/maintenanced.c | 56 ---- .../distributed/utils/statistics_collection.c | 297 ------------------ src/include/citus_config.h.in | 3 - src/include/citus_version.h.in | 3 - .../distributed/statistics_collection.h | 38 --- .../upgrade/generate_citus_tarballs.sh | 4 +- 9 files changed, 15 insertions(+), 694 deletions(-) delete mode 100644 src/include/distributed/statistics_collection.h diff --git a/configure b/configure index ba10b52e9..06b387845 100755 --- a/configure +++ b/configure @@ -664,6 +664,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -688,7 +689,6 @@ ac_user_opts=' enable_option_checking with_extra_version enable_coverage -with_libcurl with_reports_hostname ' ac_precious_vars='build_alias @@ -740,6 +740,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -992,6 +993,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1129,7 +1139,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1282,6 +1292,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1318,8 +1329,6 @@ Optional Packages: --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-extra-version=STRING append STRING to version - --without-libcurl do not use libcurl for anonymous statistics - collection --with-reports-hostname=HOSTNAME Use HOSTNAME as hostname for statistics collection and update checks @@ -1749,139 +1758,6 @@ $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. @@ -4342,102 +4218,6 @@ if test "$enable_coverage" = yes; then CITUS_LDFLAGS="$CITUS_LDFLAGS --coverage" fi -# -# libcurl -# - - - -# Check whether --with-libcurl was given. -if test "${with_libcurl+set}" = set; then : - withval=$with_libcurl; - case $withval in - yes) - -$as_echo "#define HAVE_LIBCURL 1" >>confdefs.h - - ;; - no) - : - ;; - *) - as_fn_error $? "no argument expected for --with-libcurl option" "$LINENO" 5 - ;; - esac - -else - with_libcurl=yes - -$as_echo "#define HAVE_LIBCURL 1" >>confdefs.h - -fi - - - -if test "$with_libcurl" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for curl_global_init in -lcurl" >&5 -$as_echo_n "checking for curl_global_init in -lcurl... " >&6; } -if ${ac_cv_lib_curl_curl_global_init+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lcurl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char curl_global_init (); -int -main () -{ -return curl_global_init (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_curl_curl_global_init=yes -else - ac_cv_lib_curl_curl_global_init=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curl_curl_global_init" >&5 -$as_echo "$ac_cv_lib_curl_curl_global_init" >&6; } -if test "x$ac_cv_lib_curl_curl_global_init" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBCURL 1 -_ACEOF - - LIBS="-lcurl $LIBS" - -else - as_fn_error $? "libcurl not found -If you have libcurl already installed, see config.log for details on the -failure. It is possible the compiler isn't looking in the proper directory. -Use --without-libcurl to disable anonymous statistics collection." "$LINENO" 5 -fi - - ac_fn_c_check_header_mongrel "$LINENO" "curl/curl.h" "ac_cv_header_curl_curl_h" "$ac_includes_default" -if test "x$ac_cv_header_curl_curl_h" = xyes; then : - -else - as_fn_error $? "libcurl header not found -If you have libcurl already installed, see config.log for details on the -failure. It is possible the compiler isn't looking in the proper directory. -Use --without-libcurl to disable libcurl support." "$LINENO" 5 -fi - - -fi - # REPORTS_BASE_URL definition diff --git a/configure.in b/configure.in index 14a657446..1d42d5999 100644 --- a/configure.in +++ b/configure.in @@ -185,25 +185,6 @@ if test "$enable_coverage" = yes; then CITUS_LDFLAGS="$CITUS_LDFLAGS --coverage" fi -# -# libcurl -# -PGAC_ARG_BOOL(with, libcurl, yes, - [do not use libcurl for anonymous statistics collection], - [AC_DEFINE([HAVE_LIBCURL], 1, [Define to 1 to build with libcurl support. (--with-libcurl)])]) - -if test "$with_libcurl" = yes; then - AC_CHECK_LIB(curl, curl_global_init, [], - [AC_MSG_ERROR([libcurl not found -If you have libcurl already installed, see config.log for details on the -failure. It is possible the compiler isn't looking in the proper directory. -Use --without-libcurl to disable anonymous statistics collection.])]) - AC_CHECK_HEADER(curl/curl.h, [], [AC_MSG_ERROR([libcurl header not found -If you have libcurl already installed, see config.log for details on the -failure. It is possible the compiler isn't looking in the proper directory. -Use --without-libcurl to disable libcurl support.])]) -fi - # REPORTS_BASE_URL definition PGAC_ARG_REQ(with, reports-hostname, [HOSTNAME], [Use HOSTNAME as hostname for statistics collection and update checks], diff --git a/src/backend/distributed/shared_library_init.c b/src/backend/distributed/shared_library_init.c index c82f64553..2a6faefca 100644 --- a/src/backend/distributed/shared_library_init.c +++ b/src/backend/distributed/shared_library_init.c @@ -60,7 +60,6 @@ #include "distributed/query_stats.h" #include "distributed/remote_commands.h" #include "distributed/shared_library_init.h" -#include "distributed/statistics_collection.h" #include "distributed/subplan_execution.h" #include "distributed/task_tracker.h" #include "distributed/transaction_management.h" @@ -96,8 +95,6 @@ static bool ErrorIfNotASuitableDeadlockFactor(double *newval, void **extra, static bool WarnIfDeprecatedExecutorUsed(int *newval, void **extra, GucSource source); static bool NodeConninfoGucCheckHook(char **newval, void **extra, GucSource source); static void NodeConninfoGucAssignHook(const char *newval, void *extra); -static bool StatisticsCollectionGucCheckHook(bool *newval, void **extra, GucSource - source); /* static variable to hold value of deprecated GUC variable */ static bool ExpireCachedShards = false; @@ -1301,24 +1298,6 @@ RegisterCitusConfigVariables(void) GUC_STANDARD, NULL, NULL, NULL); - DefineCustomBoolVariable( - "citus.enable_statistics_collection", - gettext_noop("Enables sending basic usage statistics to Citus."), - gettext_noop("Citus uploads daily anonymous usage reports containing " - "rounded node count, shard size, distributed table count, " - "and operating system name. This configuration value controls " - "whether these reports are sent."), - &EnableStatisticsCollection, -#if defined(HAVE_LIBCURL) && defined(ENABLE_CITUS_STATISTICS_COLLECTION) - true, -#else - false, -#endif - PGC_SIGHUP, - GUC_SUPERUSER_ONLY, - &StatisticsCollectionGucCheckHook, - NULL, NULL); - DefineCustomStringVariable( "citus.node_conninfo", gettext_noop("Sets parameters used for outbound connections."), @@ -1478,25 +1457,3 @@ NodeConninfoGucAssignHook(const char *newval, void *extra) PQconninfoFree(optionArray); } - - -static bool -StatisticsCollectionGucCheckHook(bool *newval, void **extra, GucSource source) -{ -#ifdef HAVE_LIBCURL - return true; -#else - - /* if libcurl is not installed, only accept false */ - if (*newval) - { - GUC_check_errcode(ERRCODE_FEATURE_NOT_SUPPORTED); - GUC_check_errdetail("Citus was compiled without libcurl support."); - return false; - } - else - { - return true; - } -#endif -} diff --git a/src/backend/distributed/utils/maintenanced.c b/src/backend/distributed/utils/maintenanced.c index f5ee19922..efea2b248 100644 --- a/src/backend/distributed/utils/maintenanced.c +++ b/src/backend/distributed/utils/maintenanced.c @@ -243,9 +243,6 @@ void CitusMaintenanceDaemonMain(Datum main_arg) { Oid databaseOid = DatumGetObjectId(main_arg); - TimestampTz nextStatsCollectionTime USED_WITH_LIBCURL_ONLY = - TimestampTzPlusMilliseconds(GetCurrentTimestamp(), 60 * 1000); - bool retryStatsCollection USED_WITH_LIBCURL_ONLY = false; ErrorContextCallback errorCallback; TimestampTz lastRecoveryTime = 0; TimestampTz nextMetadataSyncTime = 0; @@ -331,59 +328,6 @@ CitusMaintenanceDaemonMain(Datum main_arg) * tasks should do their own time math about whether to re-run checks. */ -#ifdef HAVE_LIBCURL - if (EnableStatisticsCollection && - GetCurrentTimestamp() >= nextStatsCollectionTime) - { - bool statsCollectionSuccess = false; - InvalidateMetadataSystemCache(); - StartTransactionCommand(); - - /* - * Lock the extension such that it cannot be dropped or created - * concurrently. Skip statistics collection if citus extension is - * not accessible. - * - * Similarly, we skip statistics collection if there exists any - * version mismatch or the extension is not fully created yet. - */ - if (!LockCitusExtension()) - { - ereport(DEBUG1, (errmsg("could not lock the citus extension, " - "skipping statistics collection"))); - } - else if (CheckCitusVersion(DEBUG1) && CitusHasBeenLoaded()) - { - FlushDistTableCache(); - WarnIfSyncDNS(); - statsCollectionSuccess = CollectBasicUsageStatistics(); - } - - /* - * If statistics collection was successful the next collection is - * 24-hours later. Also, if this was a retry attempt we don't do - * any more retries until 24-hours later, so we limit number of - * retries to one. - */ - if (statsCollectionSuccess || retryStatsCollection) - { - nextStatsCollectionTime = - TimestampTzPlusMilliseconds(GetCurrentTimestamp(), - STATS_COLLECTION_TIMEOUT_MILLIS); - retryStatsCollection = false; - } - else - { - nextStatsCollectionTime = - TimestampTzPlusMilliseconds(GetCurrentTimestamp(), - STATS_COLLECTION_RETRY_TIMEOUT_MILLIS); - retryStatsCollection = true; - } - - CommitTransactionCommand(); - } -#endif - if (!RecoveryInProgress() && (MetadataSyncTriggeredCheckAndReset(myDbData) || GetCurrentTimestamp() >= nextMetadataSyncTime)) diff --git a/src/backend/distributed/utils/statistics_collection.c b/src/backend/distributed/utils/statistics_collection.c index 47a6e082e..344499293 100644 --- a/src/backend/distributed/utils/statistics_collection.c +++ b/src/backend/distributed/utils/statistics_collection.c @@ -14,306 +14,9 @@ #include "fmgr.h" #include "utils/uuid.h" -bool EnableStatisticsCollection = true; /* send basic usage statistics to Citus */ PG_FUNCTION_INFO_V1(citus_server_id); -#ifdef HAVE_LIBCURL - -#include -#include - -#include "access/xact.h" -#include "distributed/listutils.h" -#include "distributed/metadata_cache.h" -#include "distributed/multi_join_order.h" -#include "distributed/shardinterval_utils.h" -#include "distributed/statistics_collection.h" -#include "distributed/worker_manager.h" -#include "distributed/version_compat.h" -#include "lib/stringinfo.h" -#include "utils/builtins.h" -#include "utils/json.h" -#include "utils/jsonb.h" -#include "utils/fmgrprotos.h" - -static size_t StatisticsCallback(char *contents, size_t size, size_t count, - void *userData); -static uint64 NextPow2(uint64 n); -static uint64 DistributedTablesSize(List *distTableOids); -static bool SendHttpPostJsonRequest(const char *url, const char *postFields, - long timeoutSeconds, - curl_write_callback responseCallback); -static bool PerformHttpRequest(CURL *curl); - - -/* WarnIfSyncDNS warns if libcurl is compiled with synchronous DNS. */ -void -WarnIfSyncDNS(void) -{ - curl_version_info_data *versionInfo = curl_version_info(CURLVERSION_NOW); - if (!(versionInfo->features & CURL_VERSION_ASYNCHDNS)) - { - ereport(WARNING, (errmsg("your current libcurl version doesn't support " - "asynchronous DNS, which might cause unexpected " - "delays in the operation of Citus"), - errhint("Install a libcurl version with asynchronous DNS " - "support."))); - } -} - - -/* - * CollectBasicUsageStatistics sends basic usage statistics to Citus servers. - * This includes Citus version, table count rounded to next power of 2, cluster - * size rounded to next power of 2, worker node count, and uname data. Returns - * true if we actually have sent statistics to the server. - */ -bool -CollectBasicUsageStatistics(void) -{ - List *distTableOids = NIL; - uint64 roundedDistTableCount = 0; - uint64 roundedClusterSize = 0; - uint32 workerNodeCount = 0; - StringInfo fields = makeStringInfo(); - Datum metadataJsonbDatum = 0; - char *metadataJsonbStr = NULL; - MemoryContext savedContext = CurrentMemoryContext; - int unameResult PG_USED_FOR_ASSERTS_ONLY = 0; - bool metadataCollectionFailed = false; - struct utsname unameData; - memset(&unameData, 0, sizeof(unameData)); - - /* - * Start a subtransaction so we can rollback database's state to it in case - * of error. - */ - BeginInternalSubTransaction(NULL); - - PG_TRY(); - { - distTableOids = DistTableOidList(); - roundedDistTableCount = NextPow2(list_length(distTableOids)); - roundedClusterSize = NextPow2(DistributedTablesSize(distTableOids)); - workerNodeCount = ActivePrimaryWorkerNodeCount(); - metadataJsonbDatum = DistNodeMetadata(); - metadataJsonbStr = DatumGetCString(DirectFunctionCall1(jsonb_out, - metadataJsonbDatum)); - - /* - * Releasing a subtransaction doesn't free its memory context, since the - * data it contains will be needed at upper commit. See the comments for - * AtSubCommit_Memory() at postgres/src/backend/access/transam/xact.c. - */ - ReleaseCurrentSubTransaction(); - } - PG_CATCH(); - { - MemoryContextSwitchTo(savedContext); - ErrorData *edata = CopyErrorData(); - FlushErrorState(); - - RollbackAndReleaseCurrentSubTransaction(); - - /* rethrow as WARNING */ - edata->elevel = WARNING; - ThrowErrorData(edata); - metadataCollectionFailed = true; - } - PG_END_TRY(); - - /* - * Returning here instead of in PG_CATCH() since PG_END_TRY() resets couple - * of global variables. - */ - if (metadataCollectionFailed) - { - return false; - } - - unameResult = uname(&unameData); - Assert(unameResult == 0); /* uname() always succeeds if we pass valid buffer */ - - appendStringInfoString(fields, "{\"citus_version\": "); - escape_json(fields, CITUS_VERSION); - appendStringInfo(fields, ",\"table_count\": " UINT64_FORMAT, roundedDistTableCount); - appendStringInfo(fields, ",\"cluster_size\": " UINT64_FORMAT, roundedClusterSize); - appendStringInfo(fields, ",\"worker_node_count\": %u", workerNodeCount); - appendStringInfoString(fields, ",\"os_name\": "); - escape_json(fields, unameData.sysname); - appendStringInfoString(fields, ",\"os_release\": "); - escape_json(fields, unameData.release); - appendStringInfoString(fields, ",\"hwid\": "); - escape_json(fields, unameData.machine); - appendStringInfo(fields, ",\"node_metadata\": %s", metadataJsonbStr); - appendStringInfoString(fields, "}"); - - return SendHttpPostJsonRequest(REPORTS_BASE_URL "/v1/usage_reports", - fields->data, HTTP_TIMEOUT_SECONDS, - StatisticsCallback); -} - - -/* - * StatisticsCallback receives the response for the request sent by - * CollectBasicUsageStatistics. For now, it doesn't check the contents of the - * response and succeeds for any response. - */ -static size_t -StatisticsCallback(char *contents, size_t size, size_t count, void *userData) -{ - return size * count; -} - - -/* - * DistributedTablesSize returns total size of data store in the cluster consisting - * of given distributed tables. We ignore tables which we cannot get their size. - */ -static uint64 -DistributedTablesSize(List *distTableOids) -{ - uint64 totalSize = 0; - - Oid relationId = InvalidOid; - foreach_oid(relationId, distTableOids) - { - /* - * Relations can get dropped after getting the Oid list and before we - * reach here. Acquire a lock to make sure the relation is available - * while we are getting its size. - */ - Relation relation = try_relation_open(relationId, AccessShareLock); - if (relation == NULL) - { - continue; - } - - /* - * Ignore hash partitioned tables with size greater than 1, since - * citus_table_size() doesn't work on them. - */ - if (PartitionMethod(relationId) == DISTRIBUTE_BY_HASH && - !SingleReplicatedTable(relationId)) - { - heap_close(relation, AccessShareLock); - continue; - } - - Datum tableSizeDatum = DirectFunctionCall1(citus_table_size, - ObjectIdGetDatum(relationId)); - totalSize += DatumGetInt64(tableSizeDatum); - heap_close(relation, AccessShareLock); - } - - return totalSize; -} - - -/* - * NextPow2 returns smallest power of 2 less than or equal to n. If n is greater - * than 2^63, it returns 2^63. Returns 0 when n is 0. - */ -static uint64 -NextPow2(uint64 n) -{ - uint64 result = 1; - - if (n == 0) - { - return 0; - } - - /* if there is no 64-bit power of 2 greater than n, return 2^63 */ - if (n > (1ull << 63)) - { - return (1ull << 63); - } - - while (result < n) - { - result *= 2; - } - - return result; -} - - -/* - * SendHttpPostJsonRequest sends a HTTP/HTTPS POST request to the given URL with - * the given json object. responseCallback is called with the content of response. - */ -static bool -SendHttpPostJsonRequest(const char *url, const char *jsonObj, long timeoutSeconds, - curl_write_callback responseCallback) -{ - bool success = false; - - curl_global_init(CURL_GLOBAL_DEFAULT); - CURL *curl = curl_easy_init(); - if (curl) - { - struct curl_slist *headers = NULL; - headers = curl_slist_append(headers, "Accept: application/json"); - headers = curl_slist_append(headers, "Content-Type: application/json"); - headers = curl_slist_append(headers, "charsets: utf-8"); - - curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonObj); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeoutSeconds); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, responseCallback); - - success = PerformHttpRequest(curl); - - curl_slist_free_all(headers); - curl_easy_cleanup(curl); - } - - curl_global_cleanup(); - - return success; -} - - -/* - * PerformHttpRequest sends the HTTP request with the parameters set in the given - * curl object, and returns if it was successful or not. If the request was not - * successful, it may log some warnings. This method expects to take place after - * curl_easy_init() but before curl_easy_cleanup(). - */ -static bool -PerformHttpRequest(CURL *curl) -{ - bool success = false; - CURLcode curlCode = curl_easy_perform(curl); - if (curlCode == CURLE_OK) - { - int64 httpCode = 0; - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode); - if (httpCode == 200) - { - success = true; - } - else if (httpCode >= 400 && httpCode < 500) - { - ereport(WARNING, (errmsg("HTTP request failed."), - errhint("HTTP response code: " INT64_FORMAT, - httpCode))); - } - } - else - { - ereport(WARNING, (errmsg("Sending HTTP request failed."), - errhint("Error code: %s.", curl_easy_strerror(curlCode)))); - } - - return success; -} - - -#endif /* HAVE_LIBCURL */ /* * citus_server_id returns a random UUID value as server identifier. This is diff --git a/src/include/citus_config.h.in b/src/include/citus_config.h.in index 5943116c3..8e86df711 100644 --- a/src/include/citus_config.h.in +++ b/src/include/citus_config.h.in @@ -34,9 +34,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H -/* Define to 1 if you have the `curl' library (-lcurl). */ -#undef HAVE_LIBCURL - /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H diff --git a/src/include/citus_version.h.in b/src/include/citus_version.h.in index e2594767e..8f45f1f02 100644 --- a/src/include/citus_version.h.in +++ b/src/include/citus_version.h.in @@ -21,8 +21,5 @@ /* A string containing the version number, platform, and C compiler */ #undef CITUS_VERSION_STR -/* Define to 1 if you have the `curl' library (-lcurl). */ -#undef HAVE_LIBCURL - /* Base URL for statistics collection and update checks */ #undef REPORTS_BASE_URL diff --git a/src/include/distributed/statistics_collection.h b/src/include/distributed/statistics_collection.h deleted file mode 100644 index 73c4e6f2e..000000000 --- a/src/include/distributed/statistics_collection.h +++ /dev/null @@ -1,38 +0,0 @@ -/*------------------------------------------------------------------------- - * - * statistics_collection.h - * - * Copyright (c) Citus Data, Inc. - * - *------------------------------------------------------------------------- - */ - -#ifndef STATISTICS_COLLECTION_H -#define STATISTICS_COLLECTION_H - -#include "citus_version.h" - -/* - * Append USED_WITH_LIBCURL_ONLY to definitions of variables that are only used - * when compiled with libcurl, to avoid compiler warnings about unused variables - * when built without libcurl. - */ -#ifdef HAVE_LIBCURL -#define USED_WITH_LIBCURL_ONLY -#else -#define USED_WITH_LIBCURL_ONLY pg_attribute_unused() -#endif - -/* Config variables managed via guc.c */ -extern bool EnableStatisticsCollection; - -#ifdef HAVE_LIBCURL - -#define HTTP_TIMEOUT_SECONDS 5 - -extern void WarnIfSyncDNS(void); -extern bool CollectBasicUsageStatistics(void); - -#endif /* HAVE_LIBCURL */ - -#endif /* STATISTICS_COLLECTION_H */ diff --git a/src/test/regress/upgrade/generate_citus_tarballs.sh b/src/test/regress/upgrade/generate_citus_tarballs.sh index ec30ecf8f..b9053dfad 100755 --- a/src/test/regress/upgrade/generate_citus_tarballs.sh +++ b/src/test/regress/upgrade/generate_citus_tarballs.sh @@ -11,7 +11,7 @@ install_citus_and_tar() { # do everything in a subdirectory to avoid clutter in current directory mkdir -p "${builddir}" && cd "${builddir}" - "${citus_dir}/configure" --without-libcurl + "${citus_dir}/configure" installdir="${builddir}/install" make "-j$(nproc)" && mkdir -p "${installdir}" && make DESTDIR="${installdir}" install @@ -40,7 +40,7 @@ build_current() { make -C "${citus_dir}" clean cd "${citus_dir}" - ./configure --without-libcurl + ./configure install_citus_and_tar }