You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2019/06/24 21:21:57 UTC
[trafficserver] branch master updated: Allows for resizing
librecords via command line option
This is an automated email from the ASF dual-hosted git repository.
zwoop pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new cba8b22 Allows for resizing librecords via command line option
cba8b22 is described below
commit cba8b22ad53e62a9a08443330c74f5ccbd3f3f6d
Author: Leif Hedstrom <zw...@apache.org>
AuthorDate: Wed Jun 12 20:41:23 2019 -0600
Allows for resizing librecords via command line option
This also eliminates the old configure option --with-max-api-stats. Rather,
you should set the full size of the entire librecords with this setting, with
~1100 needed for the core, and (recommended) 500 for metrics as a minimum.
That is the default (1600) unless specified.
The reason this has to be a command line is because librecords can not be
initialized without it, hence, it can not be a records.config setting.
---
doc/appendices/command-line/traffic_manager.en.rst | 1 +
doc/appendices/command-line/traffic_server.en.rst | 2 ++
include/tscore/ink_config.h.in | 2 --
lib/records/P_RecDefs.h | 9 +++++----
lib/records/RecCore.cc | 7 ++++++-
lib/records/RecUtils.cc | 5 +++--
mgmt/RecordsConfig.h | 3 +++
mgmt/api/CoreAPI.cc | 10 +++++++---
plugins/experimental/remap_stats/remap_stats.c | 5 ++++-
src/traffic_layout/info.cc | 1 -
src/traffic_manager/traffic_manager.cc | 5 +++--
src/traffic_server/InkAPI.cc | 10 ++++++----
src/traffic_server/traffic_server.cc | 3 ++-
13 files changed, 42 insertions(+), 21 deletions(-)
diff --git a/doc/appendices/command-line/traffic_manager.en.rst b/doc/appendices/command-line/traffic_manager.en.rst
index 61a7fbd..d7a0f60 100644
--- a/doc/appendices/command-line/traffic_manager.en.rst
+++ b/doc/appendices/command-line/traffic_manager.en.rst
@@ -40,6 +40,7 @@ Description
.. option:: --proxyPort PORT
.. option:: --recordsConf FILE
.. option:: --tsArgs ARGUMENTS
+.. option:: --maxRecords RECORDS
.. option:: --version
Signals
diff --git a/doc/appendices/command-line/traffic_server.en.rst b/doc/appendices/command-line/traffic_server.en.rst
index 75e17e8..7a2dae2 100644
--- a/doc/appendices/command-line/traffic_server.en.rst
+++ b/doc/appendices/command-line/traffic_server.en.rst
@@ -83,6 +83,8 @@ the available tests.
.. option:: -t MSECS, --poll_timeout MSECS
+.. option:: -m RECORDS, --maxRecords RECORDS
+
.. option:: -h, --help
Print usage information and exit.
diff --git a/include/tscore/ink_config.h.in b/include/tscore/ink_config.h.in
index 36f9871..8c920f9 100644
--- a/include/tscore/ink_config.h.in
+++ b/include/tscore/ink_config.h.in
@@ -92,8 +92,6 @@
#define TS_MAX_HOST_NAME_LEN @max_host_name_len@
-#define TS_MAX_API_STATS @max_api_stats@
-
#define SPLIT_DNS 1
/* Defaults for user / group */
diff --git a/lib/records/P_RecDefs.h b/lib/records/P_RecDefs.h
index fb89c2a..0aa4c09 100644
--- a/lib/records/P_RecDefs.h
+++ b/lib/records/P_RecDefs.h
@@ -31,10 +31,11 @@
#define REC_MESSAGE_ELE_MAGIC 0xF00DF00D
-// This is for the internal stats and configs, as well as API stats. We currently use
-// about 1600 stats + configs for the core, but we're allocating 2000 for some growth.
-// TODO: if/when we switch to a new config system, we should make this run-time dynamic.
-#define REC_MAX_RECORDS (2000 + TS_MAX_API_STATS)
+// We need at least this many internal record entries for our configurations and metrics. Any
+// additional slots in librecords will be allocated to the plugin metrics. These should be
+// updated if we change the internal librecords size significantly.
+#define REC_INTERNAL_RECORDS 1100
+#define REC_MIN_API_RECORDS 500
#define REC_CONFIG_UPDATE_INTERVAL_MS 3000
#define REC_REMOTE_SYNC_INTERVAL_MS 5000
diff --git a/lib/records/RecCore.cc b/lib/records/RecCore.cc
index 7c1f8ab..ba2e833 100644
--- a/lib/records/RecCore.cc
+++ b/lib/records/RecCore.cc
@@ -25,11 +25,16 @@
#include "tscore/ink_memory.h"
#include "tscore/ink_string.h"
+#include "RecordsConfig.h"
#include "P_RecFile.h"
#include "P_RecCore.h"
#include "P_RecUtils.h"
#include "tscore/I_Layout.h"
+// This is needed to manage the size of the librecords record. It can't be static, because it needs to be modified
+// and used (read) from several binaries / modules.
+int max_records_entries = REC_INTERNAL_RECORDS + REC_MIN_API_RECORDS;
+
static bool g_initialized = false;
RecRecord *g_records = nullptr;
@@ -197,7 +202,7 @@ RecCoreInit(RecModeT mode_type, Diags *_diags)
g_num_records = 0;
// initialize record array for our internal stats (this can be reallocated later)
- g_records = (RecRecord *)ats_malloc(REC_MAX_RECORDS * sizeof(RecRecord));
+ g_records = (RecRecord *)ats_malloc(max_records_entries * sizeof(RecRecord));
// initialize record rwlock
ink_rwlock_init(&g_records_rwlock);
diff --git a/lib/records/RecUtils.cc b/lib/records/RecUtils.cc
index 4a380b9..66d09c9 100644
--- a/lib/records/RecUtils.cc
+++ b/lib/records/RecUtils.cc
@@ -24,6 +24,7 @@
#include "tscore/ink_platform.h"
#include "tscore/ink_memory.h"
#include "tscore/ParseRules.h"
+#include "RecordsConfig.h"
#include "P_RecUtils.h"
#include "P_RecCore.h"
@@ -49,8 +50,8 @@ RecRecordFree(RecRecord *r)
RecRecord *
RecAlloc(RecT rec_type, const char *name, RecDataT data_type)
{
- if (g_num_records >= REC_MAX_RECORDS) {
- Warning("too many stats/configs, please increase REC_MAX_RECORDS or rebuild with --with_max_api_stats=<n>");
+ if (g_num_records >= max_records_entries) {
+ Warning("too many stats/configs, please increase max_records_entries using the --maxRecords command line option");
return nullptr;
}
diff --git a/mgmt/RecordsConfig.h b/mgmt/RecordsConfig.h
index 3cb6b4a..c45cd3d 100644
--- a/mgmt/RecordsConfig.h
+++ b/mgmt/RecordsConfig.h
@@ -25,6 +25,9 @@
#include "records/P_RecCore.h"
+// This is to manage the librecords table sizes. Not awesome, but better than the earlier recompiling of ATS requirement...
+extern int max_records_entries;
+
enum RecordRequiredType {
RR_NULL, // config is _not_ required to be defined in records.config
RR_REQUIRED // config _is_ required to be defined in record.config
diff --git a/mgmt/api/CoreAPI.cc b/mgmt/api/CoreAPI.cc
index 1a0ff56..9b6555b 100644
--- a/mgmt/api/CoreAPI.cc
+++ b/mgmt/api/CoreAPI.cc
@@ -28,10 +28,12 @@
*
*
***************************************************************************/
+#include <vector>
#include "tscore/ink_platform.h"
#include "tscore/ink_file.h"
#include "tscore/ParseRules.h"
+#include "RecordsConfig.h"
#include "Alarms.h"
#include "MgmtUtils.h"
#include "LocalManager.h"
@@ -47,8 +49,6 @@
#include "tscore/I_Layout.h"
#include "tscore/ink_cap.h"
-#include <vector>
-
// global variable
static CallbackTable *local_event_callbacks;
@@ -170,7 +170,11 @@ ProxyStateSet(TSProxyStateT state, TSCacheClearT clear)
// Start with the default options from records.config.
if (RecGetRecordString_Xmalloc("proxy.config.proxy_binary_opts", &proxy_options) == REC_ERR_OKAY) {
- snprintf(tsArgs, sizeof(tsArgs), "%s", proxy_options);
+ if (max_records_entries == (REC_INTERNAL_RECORDS + REC_MIN_API_RECORDS)) { // Default size, don't need to pass down to _server
+ snprintf(tsArgs, sizeof(tsArgs), "%s", proxy_options);
+ } else {
+ snprintf(tsArgs, sizeof(tsArgs), "%s --maxRecords %d", proxy_options, max_records_entries);
+ }
ats_free(proxy_options);
}
diff --git a/plugins/experimental/remap_stats/remap_stats.c b/plugins/experimental/remap_stats/remap_stats.c
index b5a9892..79c9315 100644
--- a/plugins/experimental/remap_stats/remap_stats.c
+++ b/plugins/experimental/remap_stats/remap_stats.c
@@ -42,6 +42,9 @@ typedef struct {
TSMutex stat_creation_mutex;
} config_t;
+// From "core".... sigh, but we need it for now at least.
+extern int max_records_entries;
+
static void
stat_add(char *name, TSMgmtInt amount, TSStatPersistence persist_type, TSMutex create_mutex)
{
@@ -52,7 +55,7 @@ stat_add(char *name, TSMgmtInt amount, TSStatPersistence persist_type, TSMutex c
if (unlikely(!hash_init)) {
// NOLINTNEXTLINE
- hcreate_r(TS_MAX_API_STATS << 1, &stat_cache);
+ hcreate_r(max_records_entries << 1, &stat_cache); // This is weird, but oh well.
hash_init = true;
TSDebug(DEBUG_TAG, "stat cache hash init");
}
diff --git a/src/traffic_layout/info.cc b/src/traffic_layout/info.cc
index 184049d..2294524 100644
--- a/src/traffic_layout/info.cc
+++ b/src/traffic_layout/info.cc
@@ -116,7 +116,6 @@ produce_features(bool json)
print_feature("TS_MAX_THREADS_IN_EACH_THREAD_TYPE", TS_MAX_THREADS_IN_EACH_THREAD_TYPE, json);
print_feature("TS_MAX_NUMBER_EVENT_THREADS", TS_MAX_NUMBER_EVENT_THREADS, json);
print_feature("TS_MAX_HOST_NAME_LEN", TS_MAX_HOST_NAME_LEN, json);
- print_feature("TS_MAX_API_STATS", TS_MAX_API_STATS, json);
print_feature("SPLIT_DNS", SPLIT_DNS, json);
print_feature("TS_PKGSYSUSER", TS_PKGSYSUSER, json);
print_feature("TS_PKGSYSGROUP", TS_PKGSYSGROUP, json, true);
diff --git a/src/traffic_manager/traffic_manager.cc b/src/traffic_manager/traffic_manager.cc
index 99b7466..3612507 100644
--- a/src/traffic_manager/traffic_manager.cc
+++ b/src/traffic_manager/traffic_manager.cc
@@ -87,8 +87,7 @@ static int proxy_off = false;
static int listen_off = false;
static char bind_stdout[512] = "";
static char bind_stderr[512] = "";
-
-static const char *mgmt_path = nullptr;
+static const char *mgmt_path = nullptr;
// By default, set the current directory as base
static const char *recs_conf = "records.config";
@@ -497,6 +496,8 @@ main(int argc, const char **argv)
{"recordsConf", '-', "Path to records.config", "S*", &recs_conf, nullptr, nullptr},
{"tsArgs", '-', "Additional arguments for traffic_server", "S*", &tsArgs, nullptr, nullptr},
{"proxyPort", '-', "HTTP port descriptor", "S*", &proxy_port, nullptr, nullptr},
+ {"maxRecords", 'm', "Max number of librecords metrics and configurations (default & minimum: 1600)", "I", &max_records_entries,
+ "PROXY_MAX_RECORDS", nullptr},
{TM_OPT_BIND_STDOUT, '-', "Regular file to bind stdout to", "S512", &bind_stdout, "PROXY_BIND_STDOUT", nullptr},
{TM_OPT_BIND_STDERR, '-', "Regular file to bind stderr to", "S512", &bind_stderr, "PROXY_BIND_STDERR", nullptr},
#if TS_USE_DIAGS
diff --git a/src/traffic_server/InkAPI.cc b/src/traffic_server/InkAPI.cc
index 316282b..8e1e1ba 100644
--- a/src/traffic_server/InkAPI.cc
+++ b/src/traffic_server/InkAPI.cc
@@ -26,6 +26,7 @@
#include <string_view>
#include <tuple>
#include <unordered_map>
+#include <string_view>
#include "tscore/ink_platform.h"
#include "tscore/ink_base64.h"
@@ -66,11 +67,11 @@
#include "I_Tasks.h"
#include "P_OCSPStapling.h"
+#include "RecordsConfig.h"
#include "records/I_RecDefs.h"
#include "records/I_RecCore.h"
#include "I_Machine.h"
#include "HttpProxyServerMain.h"
-#include <string_view>
#include "ts/ts.h"
@@ -1678,12 +1679,13 @@ api_init()
lifecycle_hooks = new LifecycleAPIHooks;
global_config_cbs = new ConfigUpdateCbTable;
- if (TS_MAX_API_STATS > 0) {
- api_rsb = RecAllocateRawStatBlock(TS_MAX_API_STATS);
+ int api_metrics = max_records_entries - REC_INTERNAL_RECORDS;
+ if (api_metrics > 0) {
+ api_rsb = RecAllocateRawStatBlock(api_metrics);
if (nullptr == api_rsb) {
Warning("Can't allocate API stats block");
} else {
- Debug("sdk", "initialized SDK stats APIs with %d slots", TS_MAX_API_STATS);
+ Debug("sdk", "initialized SDK stats APIs with %d slots", api_metrics);
}
} else {
api_rsb = nullptr;
diff --git a/src/traffic_server/traffic_server.cc b/src/traffic_server/traffic_server.cc
index 66bd411..e11b1ed 100644
--- a/src/traffic_server/traffic_server.cc
+++ b/src/traffic_server/traffic_server.cc
@@ -163,7 +163,6 @@ HttpBodyFactory *body_factory = nullptr;
static int accept_mss = 0;
static int poll_timeout = -1; // No value set.
static int cmd_disable_freelist = 0;
-
static bool signal_received[NSIG];
// 1: delay listen, wait for cache.
@@ -182,6 +181,8 @@ static ArgumentDescription argument_descriptions[] = {
{"disable_freelist", 'f', "Disable the freelist memory allocator", "T", &cmd_disable_freelist, "PROXY_DPRINTF_LEVEL", nullptr},
{"disable_pfreelist", 'F', "Disable the freelist memory allocator in ProxyAllocator", "T", &cmd_disable_pfreelist,
"PROXY_DPRINTF_LEVEL", nullptr},
+ {"maxRecords", 'm', "Max number of librecords metrics and configurations (default & minimum: 1600)", "I", &max_records_entries,
+ "PROXY_MAX_RECORDS", nullptr},
#if TS_HAS_TESTS
{"regression", 'R', "Regression Level (quick:1..long:3)", "I", ®ression_level, "PROXY_REGRESSION", nullptr},