mirror of https://github.com/citusdata/citus.git
Remove statistics collection code that was disabled by default
parent
e5a2bbb2bd
commit
7b0680879f
|
@ -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
|
||||
|
||||
|
||||
|
|
19
configure.in
19
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],
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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 <curl/curl.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#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
|
||||
|
|
|
@ -34,9 +34,6 @@
|
|||
/* Define to 1 if you have the <inttypes.h> 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 <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue