You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by sh...@apache.org on 2017/11/17 01:51:25 UTC
[trafficserver] branch master updated: Add configuration for
per-client IP debugging
This is an automated email from the ASF dual-hosted git repository.
shinrich 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 d8c814a Add configuration for per-client IP debugging
d8c814a is described below
commit d8c814ad57bccd8362e59bb6f22babf0ec094965
Author: shinrich <sh...@yahoo-inc.com>
AuthorDate: Wed Jan 25 17:55:23 2017 -0600
Add configuration for per-client IP debugging
---
doc/admin-guide/files/records.config.en.rst | 8 +++++++-
iocore/cache/Cache.cc | 1 +
iocore/net/P_UnixNetVConnection.h | 1 +
iocore/net/UnixNet.cc | 4 ++--
lib/ts/ContFlags.cc | 32 +++++------------------------
lib/ts/ContFlags.h | 10 ++++++---
lib/ts/Diags.cc | 4 ++--
lib/ts/Diags.h | 14 ++++++++++---
mgmt/RecordsConfig.cc | 2 ++
proxy/Main.cc | 24 ++++++++++++++++++++++
proxy/http/HttpSM.cc | 2 +-
proxy/http/HttpServerSession.cc | 2 ++
proxy/shared/DiagsConfig.cc | 2 +-
13 files changed, 66 insertions(+), 40 deletions(-)
diff --git a/doc/admin-guide/files/records.config.en.rst b/doc/admin-guide/files/records.config.en.rst
index 0dfec5a..24310a8 100644
--- a/doc/admin-guide/files/records.config.en.rst
+++ b/doc/admin-guide/files/records.config.en.rst
@@ -2967,7 +2967,13 @@ Diagnostic Logging Configuration
.. ts:cv:: CONFIG proxy.config.diags.debug.enabled INT 0
:reloadable:
- Enables logging for diagnostic messages whose log level is `diag` or `debug`.
+ When set to 1, enables logging for diagnostic messages whose log level is `diag` or `debug`.
+
+ When set to 2, interprets the :ts:cv:`proxy.config.diags.debug.client_ip` setting determine whether diagnostic messages are logged.
+
+.. ts:cv:: CONFIG proxy.config.diags.debug.client_ip STRING NULL
+
+ if :ts:cv:`proxy.config.diags.debug.enabled` is set to 2, this value is tested against the source IP of the incoming connection. If there is a match, all the diagnostic messages for that connection and the related outgoing connection will be logged.
.. ts:cv:: CONFIG proxy.config.diags.debug.tags STRING http|dns
diff --git a/iocore/cache/Cache.cc b/iocore/cache/Cache.cc
index c39a0d8..23c362c 100644
--- a/iocore/cache/Cache.cc
+++ b/iocore/cache/Cache.cc
@@ -1004,6 +1004,7 @@ CacheProcessor::cacheInitialized()
vol = gvol[i];
double factor;
if (gvol[i]->cache == theCache) {
+ ink_assert(gvol[i]->cache != nullptr);
factor = (double)(int64_t)(gvol[i]->len >> STORE_BLOCK_SHIFT) / (int64_t)theCache->cache_size;
Debug("cache_init", "CacheProcessor::cacheInitialized - factor = %f", factor);
gvol[i]->ram_cache->init((int64_t)(http_ram_cache_size * factor), vol);
diff --git a/iocore/net/P_UnixNetVConnection.h b/iocore/net/P_UnixNetVConnection.h
index c6ad45e..06a2d79 100644
--- a/iocore/net/P_UnixNetVConnection.h
+++ b/iocore/net/P_UnixNetVConnection.h
@@ -317,6 +317,7 @@ TS_INLINE void
UnixNetVConnection::set_remote_addr()
{
ats_ip_copy(&remote_addr, &con.addr);
+ this->control_flags.set_flag(ContFlags::DEBUG_OVERRIDE, diags->test_override_ip(remote_addr));
}
TS_INLINE void
diff --git a/iocore/net/UnixNet.cc b/iocore/net/UnixNet.cc
index 2b7476d..831c21f 100644
--- a/iocore/net/UnixNet.cc
+++ b/iocore/net/UnixNet.cc
@@ -432,7 +432,7 @@ NetHandler::process_ready_list()
}
#else /* !USE_EDGE_TRIGGER */
while ((vc = read_ready_list.dequeue())) {
- diags->set_override(vc->control.debug_override);
+ set_cont_flags(vc->control_flags);
if (vc->closed)
free_netvc(vc);
else if (vc->read.enabled && vc->read.triggered)
@@ -441,7 +441,7 @@ NetHandler::process_ready_list()
vc->ep.modify(-EVENTIO_READ);
}
while ((vc = write_ready_list.dequeue())) {
- diags->set_override(vc->control.debug_override);
+ set_cont_flags(vc->control_flags);
if (vc->closed)
free_netvc(vc);
else if (vc->write.enabled && vc->write.triggered)
diff --git a/lib/ts/ContFlags.cc b/lib/ts/ContFlags.cc
index ef84768..ba5e0bf 100644
--- a/lib/ts/ContFlags.cc
+++ b/lib/ts/ContFlags.cc
@@ -23,50 +23,28 @@
#include "ContFlags.h"
-static ink_thread_key init_thread_key();
-static inkcoreapi ink_thread_key flags_data_key = init_thread_key();
-
-static ink_thread_key
-init_thread_key()
-{
- ink_thread_key_create(&flags_data_key, nullptr);
- return flags_data_key;
-}
-
-/* Set up a cont_flags entry for this threa */
-void
-init_cont_flags()
-{
- ContFlags new_flags;
- void *val = reinterpret_cast<void *>(static_cast<intptr_t>((new_flags.get_flags())));
- ink_thread_setspecific(flags_data_key, val);
-}
+thread_local ContFlags local_flags;
void
set_cont_flags(const ContFlags &flags)
{
- void *val = reinterpret_cast<void *>(static_cast<intptr_t>((flags.get_flags())));
- ink_thread_setspecific(flags_data_key, val);
+ local_flags.set_flags(flags.get_flags());
}
void
set_cont_flag(ContFlags::flags flag_bit, bool value)
{
- ContFlags new_flags(reinterpret_cast<intptr_t>(ink_thread_getspecific(flags_data_key)));
- new_flags.set_flag(flag_bit, value);
- void *val = reinterpret_cast<void *>(static_cast<intptr_t>((new_flags.get_flags())));
- ink_thread_setspecific(flags_data_key, val);
+ local_flags.set_flag(flag_bit, value);
}
ContFlags
get_cont_flags()
{
- return ContFlags(reinterpret_cast<intptr_t>(ink_thread_getspecific(flags_data_key)));
+ return local_flags;
}
bool
get_cont_flag(ContFlags::flags flag_bit)
{
- ContFlags flags(reinterpret_cast<intptr_t>(ink_thread_getspecific(flags_data_key)));
- return flags.get_flag(flag_bit);
+ return local_flags.get_flag(flag_bit);
}
diff --git a/lib/ts/ContFlags.h b/lib/ts/ContFlags.h
index 21dff75..eb75016 100644
--- a/lib/ts/ContFlags.h
+++ b/lib/ts/ContFlags.h
@@ -42,7 +42,7 @@ class ContFlags
public:
enum flags { DEBUG_OVERRIDE = 0, DISABLE_PLUGINS = 1, LAST_FLAG };
- ContFlags() : raw_flags(0) {}
+ ContFlags() {}
ContFlags(uint32_t in_flags) : raw_flags(in_flags) {}
void
set_flags(uint32_t new_flags)
@@ -80,12 +80,16 @@ public:
return false;
}
}
+ bool
+ is_set() const
+ {
+ return raw_flags != 0;
+ }
private:
- uint32_t raw_flags;
+ uint32_t raw_flags = 0;
};
-void init_cont_flags();
void set_cont_flags(const ContFlags &flags);
void set_cont_flag(ContFlags::flags flag_bit, bool value);
ContFlags get_cont_flags();
diff --git a/lib/ts/Diags.cc b/lib/ts/Diags.cc
index 70095d1..04ca6e2 100644
--- a/lib/ts/Diags.cc
+++ b/lib/ts/Diags.cc
@@ -44,8 +44,8 @@
#include "ts/ink_thread.h"
#include "ts/Diags.h"
-int diags_on_for_plugins = 0;
-bool DiagsConfigState::enabled[2] = {false, false};
+int diags_on_for_plugins = 0;
+int DiagsConfigState::enabled[2] = {0, 0};
// Global, used for all diagnostics
inkcoreapi Diags *diags = nullptr;
diff --git a/lib/ts/Diags.h b/lib/ts/Diags.h
index fbed231..8b220cb 100644
--- a/lib/ts/Diags.h
+++ b/lib/ts/Diags.h
@@ -90,7 +90,7 @@ typedef void (*DiagsCleanupFunc)();
struct DiagsConfigState {
// this is static to eliminate many loads from the critical path
- static bool enabled[2]; // one debug, one action
+ static int enabled[2]; // one debug, one action
DiagsModeOutput outputs[DiagsLevel_Count]; // where each level prints
};
@@ -136,15 +136,21 @@ public:
}
bool
+ test_override_ip(IpEndpoint const &test_ip)
+ {
+ return this->debug_client_ip == test_ip;
+ }
+
+ bool
on(DiagsTagType mode = DiagsTagType_Debug) const
{
- return (config.enabled[mode]);
+ return ((config.enabled[mode] == 1) || (config.enabled[mode] == 2 && this->get_override()));
}
bool
on(const char *tag, DiagsTagType mode = DiagsTagType_Debug) const
{
- return (config.enabled[mode] && tag_activated(tag, mode));
+ return this->on(mode) && tag_activated(tag, mode);
}
/////////////////////////////////////
@@ -222,6 +228,8 @@ public:
const char *base_debug_tags; // internal copy of default debug tags
const char *base_action_tags; // internal copy of default action tags
+ IpAddr debug_client_ip;
+
private:
const char *prefix_str;
mutable ink_mutex tag_table_lock; // prevents reconfig/read races
diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc
index fdc5b8a..e6037e9 100644
--- a/mgmt/RecordsConfig.cc
+++ b/mgmt/RecordsConfig.cc
@@ -199,6 +199,8 @@ static const RecordElement RecordsConfig[] =
,
{RECT_CONFIG, "proxy.config.diags.debug.tags", RECD_STRING, "http|dns", RECU_DYNAMIC, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
,
+ {RECT_CONFIG, "proxy.config.diags.debug.client_ip", RECD_STRING, NULL, RECU_DYNAMIC, RR_NULL, RECC_NULL, NULL, RECA_NULL}
+ ,
{RECT_CONFIG, "proxy.config.diags.action.enabled", RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
,
{RECT_CONFIG, "proxy.config.diags.action.tags", RECD_STRING, nullptr, RECU_DYNAMIC, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
diff --git a/proxy/Main.cc b/proxy/Main.cc
index 5348726..1269f82 100644
--- a/proxy/Main.cc
+++ b/proxy/Main.cc
@@ -433,6 +433,23 @@ private:
struct rusage _usage;
};
+void
+set_debug_ip(const char *ip_string)
+{
+ if (ip_string)
+ diags->debug_client_ip.load(ip_string);
+ else
+ diags->debug_client_ip.invalidate();
+}
+
+static int
+update_debug_client_ip(const char * /*name ATS_UNUSED */, RecDataT /* data_type ATS_UNUSED */, RecData data,
+ void * /* data_type ATS_UNUSED */)
+{
+ set_debug_ip(data.rec_string);
+ return 0;
+}
+
static int
init_memory_tracker(const char *config_var, RecDataT /* type ATS_UNUSED */, RecData data, void * /* cookie ATS_UNUSED */)
{
@@ -1793,6 +1810,13 @@ main(int /* argc ATS_UNUSED */, const char **argv)
REC_RegisterConfigUpdateFunc("proxy.config.dump_mem_info_frequency", init_memory_tracker, nullptr);
init_memory_tracker(nullptr, RECD_NULL, RecData(), nullptr);
+ char *p = REC_ConfigReadString("proxy.config.diags.debug.client_ip");
+ if (p) {
+ // Translate string to IpAddr
+ set_debug_ip(p);
+ }
+ REC_RegisterConfigUpdateFunc("proxy.config.diags.debug.client_ip", update_debug_client_ip, NULL);
+
// log initialization moved down
if (command_flag) {
diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc
index c471520..c83f516 100644
--- a/proxy/http/HttpSM.cc
+++ b/proxy/http/HttpSM.cc
@@ -5837,7 +5837,7 @@ HttpSM::attach_server_session(HttpServerSession *s)
server_transact_count = server_session->transact_count++;
// Propagate the per client IP debugging
if (ua_session) {
- s->get_netvc()->control_flags = get_cont_flags();
+ s->get_netvc()->control_flags.set_flags(get_cont_flags().get_flags());
} else { // If there is no ua_session no sense in continuing to attach the server session
return;
}
diff --git a/proxy/http/HttpServerSession.cc b/proxy/http/HttpServerSession.cc
index e7db34d..c70cf44 100644
--- a/proxy/http/HttpServerSession.cc
+++ b/proxy/http/HttpServerSession.cc
@@ -170,6 +170,8 @@ HttpServerSession::release()
// Set our state to KA for stat issues
state = HSS_KA_SHARED;
+ server_vc->control_flags.set_flags(0);
+
// Private sessions are never released back to the shared pool
if (private_session || TS_SERVER_SESSION_SHARING_MATCH_NONE == sharing_match) {
this->do_io_close();
diff --git a/proxy/shared/DiagsConfig.cc b/proxy/shared/DiagsConfig.cc
index bbf3f63..96445f2 100644
--- a/proxy/shared/DiagsConfig.cc
+++ b/proxy/shared/DiagsConfig.cc
@@ -73,7 +73,7 @@ DiagsConfig::reconfigure_diags()
e = (int)REC_readInteger("proxy.config.diags.debug.enabled", &found);
if (e && found) {
- c.enabled[DiagsTagType_Debug] = true; // implement OR logic
+ c.enabled[DiagsTagType_Debug] = e; // implement OR logic
}
all_found = all_found && found;
--
To stop receiving notification emails like this one, please contact
['"commits@trafficserver.apache.org" <co...@trafficserver.apache.org>'].