This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a commit to branch 9.1.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/9.1.x by this push:
     new 093200f  Revert "Implement log throttling (#7279)"
093200f is described below

commit 093200f3f3c95b8098f037c39dd061a1424ccfa0
Author: Leif Hedstrom <[email protected]>
AuthorDate: Mon Mar 29 13:35:52 2021 -0600

    Revert "Implement log throttling (#7279)"
    
    This reverts commit 10f7c51a13de34842767bcb0aa6621612fbee946.
    
    Oops, this should go to 9.2.x, not 9.1.x.
---
 doc/admin-guide/files/records.config.en.rst |  34 ---
 include/tscore/Diags.h                      | 338 +++++++++++++++++++++-------
 include/tscore/DiagsTypes.h                 | 265 ----------------------
 include/tscore/LogMessage.h                 | 145 ------------
 include/tscore/Ptr.h                        |  19 --
 include/tscore/Throttler.h                  | 124 ----------
 iocore/dns/DNS.cc                           |   4 -
 mgmt/RecordsConfig.cc                       |   4 -
 proxy/logging/Log.cc                        |   6 +-
 proxy/logging/Log.h                         |   6 -
 proxy/logging/LogBuffer.cc                  |   4 +-
 proxy/logging/LogConfig.cc                  |  43 +---
 proxy/logging/LogFile.cc                    |   2 +-
 proxy/logging/LogObject.cc                  |   6 +-
 proxy/logging/LogStandalone.cc              |   2 +
 proxy/shared/DiagsConfig.cc                 |  56 +++--
 proxy/shared/DiagsConfig.h                  |   9 +-
 src/traffic_manager/traffic_manager.cc      |  13 +-
 src/traffic_server/traffic_server.cc        |   2 +
 src/tscore/LogMessage.cc                    | 275 ----------------------
 src/tscore/Makefile.am                      |   5 +-
 src/tscore/Throttler.cc                     |  57 -----
 src/tscore/unit_tests/test_Throttler.cc     |  55 -----
 23 files changed, 308 insertions(+), 1166 deletions(-)

diff --git a/doc/admin-guide/files/records.config.en.rst 
b/doc/admin-guide/files/records.config.en.rst
index 719efec..6f7529a 100644
--- a/doc/admin-guide/files/records.config.en.rst
+++ b/doc/admin-guide/files/records.config.en.rst
@@ -3007,29 +3007,6 @@ Logging Configuration
 
    How often |TS| executes log related periodic tasks, in seconds
 
-.. ts:cv:: CONFIG proxy.config.log.proxy.config.log.throttling_interval_msec 
INT 60000
-   :reloadable:
-   :units: milliseconds
-
-   The minimum amount of milliseconds between repeated throttled |TS| log
-   events. A value of 0 implies no throttling. Note that for performance
-   reasons only certain logs are compiled with throttling applied to them.
-
-   Throttling is applied to all log events for a particular message which is
-   emitted within its throttling interval. That is, once a throttled log is
-   emitted, none will be emitted until the next log event for that message
-   which occurs outside of this configured interval. As mentioned above, this
-   message is applied not broadly but rather to potentially noisy log messages,
-   such as ones that might occur thousands of times a second under certain
-   error conditions. Once the next log event occurs outside of its interval, a
-   summary message is printed conveying how many messages of that type were
-   throttled since the last time it was emitted.
-
-   It is possible that a log is emitted, followed by more of its type in an
-   interval, then none are emitted after that. Be aware this would result in no
-   summary log message for that interval until the message is emitted again
-   outside of the throttled interval.
-
 .. ts:cv:: CONFIG proxy.config.http.slow.log.threshold INT 0
    :reloadable:
    :units: milliseconds
@@ -3173,17 +3150,6 @@ Diagnostic Logging Configuration
    |TS| plugins will typically log debug messages using the :c:func:`TSDebug`
    API, passing the plugin name as the debug tag.
 
-.. ts:cv:: CONFIG proxy.config.diags.debug.throttling_interval_msec INT 0
-   :reloadable:
-   :units: milliseconds
-
-   The minimum amount of milliseconds between repeated |TS| `diag` and `debug`
-   log events. A value of 0 implies no throttling. All diags and debug logs
-   are compiled with throttling applied to them.
-
-   For details about how log throttling works, see
-   :ts:cv:`log.throttling_interval_msec
-   <proxy.config.log.proxy.config.log.throttling_interval_msec>`.
 
 .. ts:cv:: CONFIG proxy.config.diags.logfile_perm STRING rw-r--r--
 
diff --git a/include/tscore/Diags.h b/include/tscore/Diags.h
index be3e6bf..fbcb290 100644
--- a/include/tscore/Diags.h
+++ b/include/tscore/Diags.h
@@ -33,9 +33,236 @@
 
 #pragma once
 
-#include "DiagsTypes.h"
+#include <cstdarg>
+#include "ink_mutex.h"
+#include "Regex.h"
+#include "ink_apidefs.h"
+#include "ContFlags.h"
+#include "ink_inet.h"
+#include "BaseLogFile.h"
 #include "SourceLocation.h"
-#include "LogMessage.h"
+
+#define DIAGS_MAGIC 0x12345678
+#define BYTES_IN_MB 1000000
+
+class Diags;
+
+// extern int diags_on_for_plugins;
+enum DiagsTagType {
+  DiagsTagType_Debug  = 0, // do not renumber --- used as array index
+  DiagsTagType_Action = 1
+};
+
+struct DiagsModeOutput {
+  bool to_stdout;
+  bool to_stderr;
+  bool to_syslog;
+  bool to_diagslog;
+};
+
+enum DiagsLevel { // do not renumber --- used as array index
+  DL_Diag = 0,    // process does not die
+  DL_Debug,       // process does not die
+  DL_Status,      // process does not die
+  DL_Note,        // process does not die
+  DL_Warning,     // process does not die
+  DL_Error,       // process does not die
+  DL_Fatal,       // causes process termination
+  DL_Alert,       // causes process termination
+  DL_Emergency,   // causes process termination, exits with UNRECOVERABLE_EXIT
+  DL_Undefined    // must be last, used for size!
+};
+
+enum StdStream { STDOUT = 0, STDERR };
+
+enum RollingEnabledValues { NO_ROLLING = 0, ROLL_ON_TIME, ROLL_ON_SIZE, 
ROLL_ON_TIME_OR_SIZE, INVALID_ROLLING_VALUE };
+
+enum DiagsShowLocation { SHOW_LOCATION_NONE = 0, SHOW_LOCATION_DEBUG, 
SHOW_LOCATION_ALL };
+
+#define DiagsLevel_Count DL_Undefined
+
+#define DiagsLevel_IsTerminal(_l) (((_l) >= DL_Fatal) && ((_l) < DL_Undefined))
+
+// Cleanup Function Prototype - Called before ink_fatal to
+//   cleanup process state
+typedef void (*DiagsCleanupFunc)();
+
+struct DiagsConfigState {
+  // this is static to eliminate many loads from the critical path
+  static int enabled[2];                     // one debug, one action
+  DiagsModeOutput outputs[DiagsLevel_Count]; // where each level prints
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//      class Diags
+//
+//      The Diags class is used for global configuration of the run-time
+//      diagnostics system.  This class provides the following services:
+//
+//      * run-time notices, debugging, warnings, errors
+//      * debugging tags to selectively enable & disable diagnostics
+//      * action tags to selectively enable & disable code paths
+//      * configurable output to stdout, stderr, syslog, error logs
+//      * traffic_manager interface supporting on-the-fly reconfiguration
+//
+//////////////////////////////////////////////////////////////////////////////
+
+class Diags
+{
+public:
+  Diags(std::string_view prefix_string, const char *base_debug_tags, const 
char *base_action_tags, BaseLogFile *_diags_log,
+        int diags_log_perm = -1, int output_log_perm = -1);
+  virtual ~Diags();
+
+  BaseLogFile *diags_log;
+  BaseLogFile *stdout_log;
+  BaseLogFile *stderr_log;
+
+  const unsigned int magic;
+  DiagsConfigState config;
+  DiagsShowLocation show_location;
+  DiagsCleanupFunc cleanup_func;
+
+  ///////////////////////////
+  // conditional debugging //
+  ///////////////////////////
+
+  bool
+  get_override() const
+  {
+    return get_cont_flag(ContFlags::DEBUG_OVERRIDE);
+  }
+
+  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] == 1) || (config.enabled[mode] == 2 && 
this->get_override()));
+  }
+
+  bool
+  on(const char *tag, DiagsTagType mode = DiagsTagType_Debug) const
+  {
+    return this->on(mode) && tag_activated(tag, mode);
+  }
+
+  /////////////////////////////////////
+  // low-level tag inquiry functions //
+  /////////////////////////////////////
+
+  bool tag_activated(const char *tag, DiagsTagType mode = DiagsTagType_Debug) 
const;
+
+  /////////////////////////////
+  // raw printing interfaces //
+  /////////////////////////////
+
+  const char *level_name(DiagsLevel level) const;
+
+  ///////////////////////////////////////////////////////////////////////
+  // user diagnostic output interfaces --- enabled on or off based     //
+  // on the value of the enable flag, and the state of the debug tags. //
+  ///////////////////////////////////////////////////////////////////////
+
+  void
+  print(const char *tag, DiagsLevel level, const SourceLocation *loc, const 
char *fmt, ...) const TS_PRINTFLIKE(5, 6)
+  {
+    va_list ap;
+    va_start(ap, fmt);
+    print_va(tag, level, loc, fmt, ap);
+    va_end(ap);
+  }
+
+  void print_va(const char *tag, DiagsLevel level, const SourceLocation *loc, 
const char *fmt, va_list ap) const;
+
+  void
+  log(const char *tag, DiagsLevel level, const SourceLocation *loc, const char 
*fmt, ...) const TS_PRINTFLIKE(5, 6)
+  {
+    if (on(tag)) {
+      va_list ap;
+      va_start(ap, fmt);
+      print_va(tag, level, loc, fmt, ap);
+      va_end(ap);
+    }
+  }
+
+  void
+  log_va(const char *tag, DiagsLevel level, const SourceLocation *loc, const 
char *fmt, va_list ap)
+  {
+    if (on(tag)) {
+      print_va(tag, level, loc, fmt, ap);
+    }
+  }
+
+  void
+  error(DiagsLevel level, const SourceLocation *loc, const char *fmt, ...) 
const TS_PRINTFLIKE(4, 5)
+  {
+    va_list ap;
+    va_start(ap, fmt);
+    error_va(level, loc, fmt, ap);
+    va_end(ap);
+  }
+
+  virtual void error_va(DiagsLevel level, const SourceLocation *loc, const 
char *fmt, va_list ap) const;
+
+  void dump(FILE *fp = stdout) const;
+
+  void activate_taglist(const char *taglist, DiagsTagType mode = 
DiagsTagType_Debug);
+
+  void deactivate_all(DiagsTagType mode = DiagsTagType_Debug);
+
+  bool setup_diagslog(BaseLogFile *blf);
+  void config_roll_diagslog(RollingEnabledValues re, int ri, int rs);
+  void config_roll_outputlog(RollingEnabledValues re, int ri, int rs);
+  bool reseat_diagslog();
+  bool should_roll_diagslog();
+  bool should_roll_outputlog();
+
+  bool set_std_output(StdStream stream, const char *file);
+
+  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 std::string prefix_str;
+  mutable ink_mutex tag_table_lock; // prevents reconfig/read races
+  DFA *activated_tags[2];           // 1 table for debug, 1 for action
+
+  // These are the default logfile permissions
+  int diags_logfile_perm  = -1;
+  int output_logfile_perm = -1;
+
+  // log rotation variables
+  RollingEnabledValues outputlog_rolling_enabled;
+  int outputlog_rolling_size;
+  int outputlog_rolling_interval;
+  RollingEnabledValues diagslog_rolling_enabled;
+  int diagslog_rolling_interval;
+  int diagslog_rolling_size;
+  time_t outputlog_time_last_roll;
+  time_t diagslog_time_last_roll;
+
+  bool rebind_std_stream(StdStream stream, int new_fd);
+
+  void
+  lock() const
+  {
+    ink_mutex_acquire(&tag_table_lock);
+  }
+
+  void
+  unlock() const
+  {
+    ink_mutex_release(&tag_table_lock);
+  }
+};
 
 //////////////////////////////////////////////////////////////////////////
 //                                                                      //
@@ -58,14 +285,10 @@
 
 extern inkcoreapi Diags *diags;
 
-// Note that the log functions being implemented as a macro has the advantage
-// that the pre-compiler expands this in place such that the call to
-// MakeSourceLocation happens at the call site for the function.
-#define DiagsError(level, ...)                              \
-  do {                                                      \
-    static const SourceLocation loc = MakeSourceLocation(); \
-    static LogMessage log_message;                          \
-    log_message.message(level, loc, __VA_ARGS__);           \
+#define DiagsError(level, fmt, ...)                \
+  do {                                             \
+    SourceLocation loc = MakeSourceLocation();     \
+    diags->error(level, &loc, fmt, ##__VA_ARGS__); \
   } while (0)
 
 #define Status(...) DiagsError(DL_Status, __VA_ARGS__)       // Log information
@@ -76,40 +299,10 @@ extern inkcoreapi Diags *diags;
 #define Alert(...) DiagsError(DL_Alert, __VA_ARGS__)         // Log 
recoverable crash, fail CI, exit & restart, Ops attention
 #define Emergency(...) DiagsError(DL_Emergency, __VA_ARGS__) // Log 
unrecoverable crash, fail CI, exit, Ops attention
 
-/** Apply throttling to a log site.
- *
- * Logs using SiteThrottled* version will be throttled at a certain interval
- * that applies to the call site, regardless of whether the messages within
- * that interval are unique or not. This is helpful for logs which can be noisy
- * and frequently have differing content, such as the length of a buffer or a
- * counter. Rather than changing the log to contain less information, this can
- * be applied to the site so that when it is emitted, the information is
- * present, but the set of possibly slightly different logs will still be
- * suppressed against a configurable interval as a whole.
- */
-#define SiteThrottledDiagsError(level, ...)                 \
-  do {                                                      \
-    static const SourceLocation loc = MakeSourceLocation(); \
-    static LogMessage log_message{IS_THROTTLED};            \
-    log_message.message(level, loc, __VA_ARGS__);           \
-  } while (0)
-
-#define SiteThrottledStatus(...) SiteThrottledDiagsError(DL_Status, 
__VA_ARGS__)   // Log information
-#define SiteThrottledNote(...) SiteThrottledDiagsError(DL_Note, __VA_ARGS__)   
    // Log significant information
-#define SiteThrottledWarning(...) SiteThrottledDiagsError(DL_Warning, 
__VA_ARGS__) // Log concerning information
-#define SiteThrottledError(...) SiteThrottledDiagsError(DL_Error, __VA_ARGS__) 
    // Log operational failure, fail CI
-#define SiteThrottledFatal(...) \
-  SiteThrottledDiagsError(DL_Fatal, __VA_ARGS__) // Log recoverable crash, 
fail CI, exit & allow restart
-#define SiteThrottledAlert(...) \
-  SiteThrottledDiagsError(DL_Alert, __VA_ARGS__) // Log recoverable crash, 
fail CI, exit & restart, Ops attention
-#define SiteThrottledEmergency(...) \
-  SiteThrottledDiagsError(DL_Emergency, __VA_ARGS__) // Log unrecoverable 
crash, fail CI, exit, Ops attention
-
-#define DiagsErrorV(level, fmt, ap)                         \
-  do {                                                      \
-    static const SourceLocation loc = MakeSourceLocation(); \
-    static LogMessage log_message;                          \
-    log_message.message_va(level, loc, fmt, ap);            \
+#define DiagsErrorV(level, fmt, ap)                  \
+  do {                                               \
+    const SourceLocation loc = MakeSourceLocation(); \
+    diags->error_va(level, &loc, fmt, ap);           \
   } while (0)
 
 #define StatusV(fmt, ap) DiagsErrorV(DL_Status, fmt, ap)
@@ -120,58 +313,29 @@ extern inkcoreapi Diags *diags;
 #define AlertV(fmt, ap) DiagsErrorV(DL_Alert, fmt, ap)
 #define EmergencyV(fmt, ap) DiagsErrorV(DL_Emergency, fmt, ap)
 
-/** See the comment above SiteThrottledDiagsError for an explanation of how the
- * SiteThrottled functions behave. */
-#define SiteThrottledDiagsErrorV(level, fmt, ap)            \
-  do {                                                      \
-    static const SourceLocation loc = MakeSourceLocation(); \
-    static LogMessage log_message{IS_THROTTLED};            \
-    log_message.message_va(level, loc, fmt, ap);            \
-  } while (0)
-
-#define SiteThrottledStatusV(fmt, ap) SiteThrottledDiagsErrorV(DL_Status, fmt, 
ap)
-#define SiteThrottledNoteV(fmt, ap) SiteThrottledDiagsErrorV(DL_Note, fmt, ap)
-#define SiteThrottledWarningV(fmt, ap) SiteThrottledDiagsErrorV(DL_Warning, 
fmt, ap)
-#define SiteThrottledErrorV(fmt, ap) SiteThrottledDiagsErrorV(DL_Error, fmt, 
ap)
-#define SiteThrottledFatalV(fmt, ap) SiteThrottledDiagsErrorV(DL_Fatal, fmt, 
ap)
-#define SiteThrottledAlertV(fmt, ap) SiteThrottledDiagsErrorV(DL_Alert, fmt, 
ap)
-#define SiteThrottledEmergencyV(fmt, ap) 
SiteThrottledDiagsErrorV(DL_Emergency, fmt, ap)
-
 #if TS_USE_DIAGS
 
-/// A Diag version of the above.
-#define Diag(tag, ...)                                        \
-  do {                                                        \
-    if (unlikely(diags->on())) {                              \
-      static const SourceLocation loc = MakeSourceLocation(); \
-      static LogMessage log_message;                          \
-      log_message.diag(tag, loc, __VA_ARGS__);                \
-    }                                                         \
+#define Diag(tag, ...)                                 \
+  do {                                                 \
+    if (unlikely(diags->on())) {                       \
+      const SourceLocation loc = MakeSourceLocation(); \
+      diags->log(tag, DL_Diag, &loc, __VA_ARGS__);     \
+    }                                                  \
   } while (0)
 
-/// A Debug version of the above.
-#define Debug(tag, ...)                                       \
-  do {                                                        \
-    if (unlikely(diags->on())) {                              \
-      static const SourceLocation loc = MakeSourceLocation(); \
-      static LogMessage log_message;                          \
-      log_message.debug(tag, loc, __VA_ARGS__);               \
-    }                                                         \
+#define Debug(tag, ...)                                \
+  do {                                                 \
+    if (unlikely(diags->on())) {                       \
+      const SourceLocation loc = MakeSourceLocation(); \
+      diags->log(tag, DL_Debug, &loc, __VA_ARGS__);    \
+    }                                                  \
   } while (0)
 
-/** Same as Debug above, but this allows a positive override of the tag
- * mechanism by a flag boolean.
- *
- * @param[in] flag True if the message should be logged regardless of tag
- * configuration, false if the logging of the message should respsect the tag
- * configuration.
- */
 #define SpecificDebug(flag, tag, ...)                                          
                             \
   do {                                                                         
                             \
     if (unlikely(diags->on())) {                                               
                             \
-      static const SourceLocation loc = MakeSourceLocation();                  
                             \
-      static LogMessage log_message;                                           
                             \
-      flag ? log_message.print(tag, DL_Debug, loc, __VA_ARGS__) : 
log_message.debug(tag, loc, __VA_ARGS__); \
+      const SourceLocation loc = MakeSourceLocation();                         
                             \
+      flag ? diags->print(tag, DL_Debug, &loc, __VA_ARGS__) : diags->log(tag, 
DL_Debug, &loc, __VA_ARGS__); \
     }                                                                          
                             \
   } while (0)
 
diff --git a/include/tscore/DiagsTypes.h b/include/tscore/DiagsTypes.h
deleted file mode 100644
index 8e98242..0000000
--- a/include/tscore/DiagsTypes.h
+++ /dev/null
@@ -1,265 +0,0 @@
-/** @file
-
-  Diags type declarations.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-/****************************************************************************
-
-  DiagsTypes.h
-
-  This file contains the type declarations for Diags logging.
-
- ****************************************************************************/
-
-#pragma once
-
-#include <cstdarg>
-#include <string>
-#include <string_view>
-#include "BaseLogFile.h"
-#include "ContFlags.h"
-#include "ink_apidefs.h"
-#include "ink_inet.h"
-#include "ink_mutex.h"
-#include "Regex.h"
-#include "SourceLocation.h"
-
-#define DIAGS_MAGIC 0x12345678
-#define BYTES_IN_MB 1000000
-
-// extern int diags_on_for_plugins;
-enum DiagsTagType {
-  DiagsTagType_Debug  = 0, // do not renumber --- used as array index
-  DiagsTagType_Action = 1
-};
-
-struct DiagsModeOutput {
-  bool to_stdout;
-  bool to_stderr;
-  bool to_syslog;
-  bool to_diagslog;
-};
-
-enum DiagsLevel { // do not renumber --- used as array index
-  DL_Diag = 0,    // process does not die
-  DL_Debug,       // process does not die
-  DL_Status,      // process does not die
-  DL_Note,        // process does not die
-  DL_Warning,     // process does not die
-  DL_Error,       // process does not die
-  DL_Fatal,       // causes process termination
-  DL_Alert,       // causes process termination
-  DL_Emergency,   // causes process termination, exits with UNRECOVERABLE_EXIT
-  DL_Undefined    // must be last, used for size!
-};
-
-enum StdStream { STDOUT = 0, STDERR };
-
-enum RollingEnabledValues { NO_ROLLING = 0, ROLL_ON_TIME, ROLL_ON_SIZE, 
ROLL_ON_TIME_OR_SIZE, INVALID_ROLLING_VALUE };
-
-enum DiagsShowLocation { SHOW_LOCATION_NONE = 0, SHOW_LOCATION_DEBUG, 
SHOW_LOCATION_ALL };
-
-#define DiagsLevel_Count DL_Undefined
-
-#define DiagsLevel_IsTerminal(_l) (((_l) >= DL_Fatal) && ((_l) < DL_Undefined))
-
-// Cleanup Function Prototype - Called before ink_fatal to
-//   cleanup process state
-typedef void (*DiagsCleanupFunc)();
-
-struct DiagsConfigState {
-  // this is static to eliminate many loads from the critical path
-  static int enabled[2];                     // one debug, one action
-  DiagsModeOutput outputs[DiagsLevel_Count]; // where each level prints
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//      class Diags
-//
-//      The Diags class is used for global configuration of the run-time
-//      diagnostics system.  This class provides the following services:
-//
-//      * run-time notices, debugging, warnings, errors
-//      * debugging tags to selectively enable & disable diagnostics
-//      * action tags to selectively enable & disable code paths
-//      * configurable output to stdout, stderr, syslog, error logs
-//      * traffic_manager interface supporting on-the-fly reconfiguration
-//
-//////////////////////////////////////////////////////////////////////////////
-
-class Diags
-{
-public:
-  Diags(std::string_view prefix_string, const char *base_debug_tags, const 
char *base_action_tags, BaseLogFile *_diags_log,
-        int diags_log_perm = -1, int output_log_perm = -1);
-  virtual ~Diags();
-
-  BaseLogFile *diags_log;
-  BaseLogFile *stdout_log;
-  BaseLogFile *stderr_log;
-
-  const unsigned int magic;
-  DiagsConfigState config;
-  DiagsShowLocation show_location;
-  DiagsCleanupFunc cleanup_func;
-
-  ///////////////////////////
-  // conditional debugging //
-  ///////////////////////////
-
-  bool
-  get_override() const
-  {
-    return get_cont_flag(ContFlags::DEBUG_OVERRIDE);
-  }
-
-  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] == 1) || (config.enabled[mode] == 2 && 
this->get_override()));
-  }
-
-  bool
-  on(const char *tag, DiagsTagType mode = DiagsTagType_Debug) const
-  {
-    return this->on(mode) && tag_activated(tag, mode);
-  }
-
-  /////////////////////////////////////
-  // low-level tag inquiry functions //
-  /////////////////////////////////////
-
-  bool tag_activated(const char *tag, DiagsTagType mode = DiagsTagType_Debug) 
const;
-
-  /////////////////////////////
-  // raw printing interfaces //
-  /////////////////////////////
-
-  const char *level_name(DiagsLevel level) const;
-
-  ///////////////////////////////////////////////////////////////////////
-  // user diagnostic output interfaces --- enabled on or off based     //
-  // on the value of the enable flag, and the state of the debug tags. //
-  ///////////////////////////////////////////////////////////////////////
-
-  /// Print the log message without respect to whether the tag is enabled.
-  void
-  print(const char *tag, DiagsLevel level, const SourceLocation *loc, const 
char *fmt, ...) const TS_PRINTFLIKE(5, 6)
-  {
-    va_list ap;
-    va_start(ap, fmt);
-    print_va(tag, level, loc, fmt, ap);
-    va_end(ap);
-  }
-
-  void print_va(const char *tag, DiagsLevel level, const SourceLocation *loc, 
const char *fmt, va_list ap) const;
-
-  /// Print the log message only if tag is enabled.
-  void
-  log(const char *tag, DiagsLevel level, const SourceLocation *loc, const char 
*fmt, ...) const TS_PRINTFLIKE(5, 6)
-  {
-    if (on(tag)) {
-      va_list ap;
-      va_start(ap, fmt);
-      print_va(tag, level, loc, fmt, ap);
-      va_end(ap);
-    }
-  }
-
-  void
-  log_va(const char *tag, DiagsLevel level, const SourceLocation *loc, const 
char *fmt, va_list ap)
-  {
-    if (on(tag)) {
-      print_va(tag, level, loc, fmt, ap);
-    }
-  }
-
-  void
-  error(DiagsLevel level, const SourceLocation *loc, const char *fmt, ...) 
const TS_PRINTFLIKE(4, 5)
-  {
-    va_list ap;
-    va_start(ap, fmt);
-    error_va(level, loc, fmt, ap);
-    va_end(ap);
-  }
-
-  virtual void error_va(DiagsLevel level, const SourceLocation *loc, const 
char *fmt, va_list ap) const;
-
-  void dump(FILE *fp = stdout) const;
-
-  void activate_taglist(const char *taglist, DiagsTagType mode = 
DiagsTagType_Debug);
-
-  void deactivate_all(DiagsTagType mode = DiagsTagType_Debug);
-
-  bool setup_diagslog(BaseLogFile *blf);
-  void config_roll_diagslog(RollingEnabledValues re, int ri, int rs);
-  void config_roll_outputlog(RollingEnabledValues re, int ri, int rs);
-  bool reseat_diagslog();
-  bool should_roll_diagslog();
-  bool should_roll_outputlog();
-
-  bool set_std_output(StdStream stream, const char *file);
-
-  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 std::string prefix_str;
-  mutable ink_mutex tag_table_lock; // prevents reconfig/read races
-  DFA *activated_tags[2];           // 1 table for debug, 1 for action
-
-  // These are the default logfile permissions
-  int diags_logfile_perm  = -1;
-  int output_logfile_perm = -1;
-
-  // log rotation variables
-  RollingEnabledValues outputlog_rolling_enabled;
-  int outputlog_rolling_size;
-  int outputlog_rolling_interval;
-  RollingEnabledValues diagslog_rolling_enabled;
-  int diagslog_rolling_interval;
-  int diagslog_rolling_size;
-  time_t outputlog_time_last_roll;
-  time_t diagslog_time_last_roll;
-
-  bool rebind_std_stream(StdStream stream, int new_fd);
-
-  void
-  lock() const
-  {
-    ink_mutex_acquire(&tag_table_lock);
-  }
-
-  void
-  unlock() const
-  {
-    ink_mutex_release(&tag_table_lock);
-  }
-};
diff --git a/include/tscore/LogMessage.h b/include/tscore/LogMessage.h
deleted file mode 100644
index 69918e6..0000000
--- a/include/tscore/LogMessage.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/** @file
-
-  LogMessage declaration.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#pragma once
-
-#include "DiagsTypes.h"
-#include "SourceLocation.h"
-#include "Throttler.h"
-
-#include <atomic>
-#include <chrono>
-#include <functional>
-
-constexpr const bool IS_THROTTLED = true;
-
-/** A class implementing stateful logging behavior. */
-class LogMessage : public Throttler
-{
-public:
-  /** Create a LogMessage, optionally with throttling applied to it.
-   *
-   * If configured with throttling, the system's throttling value will be used
-   * and the throttling value will dynamically change as the user configures
-   * different values for throttling.
-   *
-   * @param[in] is_throttled Whether to apply throttling to the message. If
-   * true, the system default log throttling interval will be used.
-   */
-  LogMessage(bool is_throttled = false);
-
-  /** Create a LogMessage with an explicit throttling interval.
-   *
-   * For this message, throttling will be configured with the designated amount
-   * and will not change as the system's configured throttling interval
-   * changes.
-   *
-   * @param[in] throttling_interval The minimum number of desired
-   * milliseconds between log events. 0 implies no throttling.
-   */
-  LogMessage(std::chrono::milliseconds throttling_interval);
-
-  /* TODO: Add BufferWriter overloads for these. */
-  void diag(const char *tag, SourceLocation const &loc, const char *fmt, ...);
-  void debug(const char *tag, SourceLocation const &loc, const char *fmt, ...);
-  void status(SourceLocation const &loc, const char *fmt, ...);
-  void note(SourceLocation const &loc, const char *fmt, ...);
-  void warning(SourceLocation const &loc, const char *fmt, ...);
-  void error(SourceLocation const &loc, const char *fmt, ...);
-  void fatal(SourceLocation const &loc, const char *fmt, ...);
-  void alert(SourceLocation const &loc, const char *fmt, ...);
-  void emergency(SourceLocation const &loc, const char *fmt, ...);
-
-  void message(DiagsLevel level, SourceLocation const &loc, const char *fmt, 
...);
-  void print(const char *tag, DiagsLevel level, SourceLocation const &loc, 
const char *fmt, ...);
-
-  void diag_va(const char *tag, SourceLocation const &loc, const char *fmt, 
va_list args);
-  void debug_va(const char *tag, SourceLocation const &loc, const char *fmt, 
va_list args);
-  void status_va(SourceLocation const &loc, const char *fmt, va_list args);
-  void note_va(SourceLocation const &loc, const char *fmt, va_list args);
-  void warning_va(SourceLocation const &loc, const char *fmt, va_list args);
-  void error_va(SourceLocation const &loc, const char *fmt, va_list args);
-  void fatal_va(SourceLocation const &loc, const char *fmt, va_list args);
-  void alert_va(SourceLocation const &loc, const char *fmt, va_list args);
-  void emergency_va(SourceLocation const &loc, const char *fmt, va_list args);
-  void message_va(DiagsLevel level, SourceLocation const &loc, const char 
*fmt, va_list args);
-
-  /** Set a new system-wide default log throttling interval.
-   *
-   * @param[in] new_interval The new log throttling interval.
-   */
-  static void set_default_log_throttling_interval(std::chrono::milliseconds 
new_interval);
-
-  /** Set a new system-wide default debug log throttling interval.
-   *
-   * @param[in] new_interval The new debug log throttling interval.
-   */
-  static void set_default_debug_throttling_interval(std::chrono::milliseconds 
new_interval);
-
-private:
-  using log_function_f = std::function<void(const char *fmt, va_list args)>;
-
-  /** Encapsulate common message handling logic in a helper function.
-   *
-   * @param[in] current_configured_interval The applicable log throttling
-   * interval for this message.
-   *
-   * @param[in] log_function The function to use to emit the log message if it
-   * is not throttled.
-   *
-   * @param[in] fmt The format string for the log message.
-   *
-   * @param[in] args The parameters for the above format string.
-   */
-  void message_helper(std::chrono::microseconds current_configured_interval, 
log_function_f log_function, const char *fmt,
-                      va_list args);
-
-  /** Message handling for non-debug logs. */
-  void standard_message_helper(DiagsLevel level, SourceLocation const &loc, 
const char *fmt, va_list args);
-
-  /** Same as above, but catered for the diag and debug variants.
-   *
-   * Note that this uses the diags-log variant which takes a debug tag.
-   */
-  void message_debug_helper(const char *tag, DiagsLevel level, SourceLocation 
const &loc, const char *fmt, va_list args);
-
-  /** Same as above, but uses the tag-ignoring diags->print variant. */
-  void message_print_helper(const char *tag, DiagsLevel level, SourceLocation 
const &loc, const char *fmt, va_list args);
-
-private:
-  /** Whether the throttling value was explicitly set by the user.
-   *
-   * If the user explicitly set a throttling value, then it will not change as
-   * the configured log throttling values change.
-   */
-  bool const _throttling_value_is_explicitly_set;
-
-  /** Whether throttling should be applied to this message. */
-  bool const _is_throttled;
-
-  /** The configured, system-wide default log throttling value. */
-  static std::atomic<std::chrono::milliseconds> 
_default_log_throttling_interval;
-
-  /** The configured, system-wide default debug log throttling value. */
-  static std::atomic<std::chrono::milliseconds> 
_default_debug_throttling_interval;
-};
diff --git a/include/tscore/Ptr.h b/include/tscore/Ptr.h
index 23f0a17..3e93477 100644
--- a/include/tscore/Ptr.h
+++ b/include/tscore/Ptr.h
@@ -99,12 +99,10 @@ template <class T> class Ptr
 public:
   explicit Ptr(T *p = nullptr);
   Ptr(const Ptr<T> &);
-  Ptr(Ptr<T> &&);
   ~Ptr();
 
   void clear();
   Ptr<T> &operator=(const Ptr<T> &);
-  Ptr<T> &operator=(Ptr<T> &&);
   Ptr<T> &operator=(T *);
 
   T *
@@ -211,11 +209,6 @@ template <class T> inline Ptr<T>::Ptr(const Ptr<T> &src) : 
m_ptr(src.m_ptr)
   }
 }
 
-template <class T> inline Ptr<T>::Ptr(Ptr<T> &&src) : m_ptr(src.m_ptr)
-{
-  src.m_ptr = nullptr;
-}
-
 template <class T> inline Ptr<T>::~Ptr()
 {
   if (m_ptr && m_ptr->refcount_dec() == 0) {
@@ -264,18 +257,6 @@ Ptr<T>::operator=(const Ptr<T> &src)
   return (operator=(src.m_ptr));
 }
 
-template <class T>
-inline Ptr<T> &
-Ptr<T>::operator=(Ptr<T> &&src)
-{
-  if (this != &src) {
-    this->~Ptr();
-    m_ptr     = src.m_ptr;
-    src.m_ptr = nullptr;
-  }
-  return *this;
-}
-
 // Bit of subtly here for the flipped version of equality checks
 // With only the template versions, the compiler will try to substitute @c 
nullptr_t
 // for @c T and fail, because that's not the type and no operator will be 
found.
diff --git a/include/tscore/Throttler.h b/include/tscore/Throttler.h
deleted file mode 100644
index 974861b..0000000
--- a/include/tscore/Throttler.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/** @file
-
-  A class for generic throttling.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#pragma once
-
-#include <atomic>
-#include <chrono>
-#include <cstdint>
-
-/** A class that exposes an interface for generic throttling of some action
- * against a certain interval.
- *
- * To use:
- *
- * 1. Create an instance of this class specifying the interval for which
- * something should be throttled. Alternatively, inherit from this class to
- * have the throttling interface apply to the object you want throttling for.
- *
- * 2. Prepend each decision for a given throttled action with a call to
- * is_throttled.
- *
- *   2a. If the is_throttled is false, then at least the configured number of
- *   microseconds has elapsed since the previous call in which is_throttled
- *   returned false. The number of times the check has been called between
- *   these two times is provided in the suppressed_count output parameter.
- *
- *   2b. If is_throttled returns returns true, then not enough time has elapsed
- *   since the last time the operation returned true per the throttling
- *   interval. Thus the operation should be skipped or suppressed, depending
- *   upon the context.
- *
- * For instance:
- *
- *    void foo()
- *    {
- *      using namespace std::chrono_literals;
- *      static Throttler t(300ms);
- *      uint64_t suppressed_count;
- *      if (!t.is_throttled(suppressed_count)) {
- *        std::printf("Alan bought another monitor\n");
- *        std::printf("We ignored Alan buying a monitor %llu times\n", 
suppressed_count);
- *      }
- *    }
- */
-class Throttler
-{
-public:
-  virtual ~Throttler() = default;
-
-  /**
-   * @param[in] interval The minimum number of microseconds between
-   * calls to Throttler which should return true.
-   */
-  Throttler(std::chrono::microseconds interval);
-
-  /** Whether the current event should be suppressed because the time since the
-   * last unsuppressed event is less than the throttling interval.
-   *
-   * @param[out] suppressed_count If the return of this call is false (the 
action
-   * should not be suppressed), this is populated with the approximate number
-   * of suppressed events between the last unsuppressed event and the current
-   * one.  Otherwise the value is not set. This value is approximate because,
-   * if used in a multithreaded context, other threads may be querrying against
-   * this function as well concurrently, and their count may not be applied
-   * depending upon the timing of their query.
-   *
-   * @return True if the action is suppressed per the configured interval,
-   * false otherwise.
-   */
-  virtual bool is_throttled(uint64_t &suppressed_count);
-
-  /** Set the log throttling interval to a new value.
-   *
-   * @param[in] interval The new interval to set.
-   */
-  virtual void set_throttling_interval(std::chrono::microseconds new_interval);
-
-  /** Manually reset the throttling counter to the current time.
-   *
-   * @return the number of messages skipped since the previous positive return
-   * of the functor operator.
-   */
-  virtual uint64_t reset_counter();
-
-private:
-  /// Base clock.
-  using Clock = std::chrono::system_clock;
-  /// Time point type, based on the clock to be used.
-  using TimePoint = Clock::time_point;
-
-  /// Time that the last item was emitted.
-  // It is strange that we need to explicitly default construct this with a
-  // default constructed TimePoint. Without it, however, I get a compiler error
-  // in gcc 8.x and 9.x.  Playing around in godbolt I notice that neither clang
-  // nor gcc versions starting from 10.x require this, so I suspect it is a
-  // compiler bug.
-  std::atomic<TimePoint> _last_allowed_time{TimePoint{}};
-
-  /// The minimum number of microseconds desired between actions.
-  std::atomic<std::chrono::microseconds> 
_interval{std::chrono::microseconds{0}};
-
-  /// The number of calls to Throttler since the last
-  uint64_t _suppressed_count = 0;
-};
diff --git a/iocore/dns/DNS.cc b/iocore/dns/DNS.cc
index a2a02bf..95a913b 100644
--- a/iocore/dns/DNS.cc
+++ b/iocore/dns/DNS.cc
@@ -115,10 +115,6 @@ ink_get16(const uint8_t *src)
 static inline unsigned int
 get_rcode(char *buff)
 {
-  // 'buff' is always a HostEnt::buf which is a char array and therefore cannot
-  // be a nullptr. This assertion satisfies a mistaken clang-analyzer warning
-  // saying this can be a nullptr dereference.
-  ink_assert(buff != nullptr);
   return reinterpret_cast<HEADER *>(buff)->rcode;
 }
 
diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc
index 52309ef..556e0e1 100644
--- a/mgmt/RecordsConfig.cc
+++ b/mgmt/RecordsConfig.cc
@@ -198,8 +198,6 @@ 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.throttling_interval_msec", RECD_INT, 
"0", RECU_DYNAMIC, RR_NULL, RECC_NULL, "^[0-9]+$", RECA_NULL}
-  ,
   {RECT_CONFIG, "proxy.config.diags.debug.client_ip", RECD_STRING, nullptr, 
RECU_DYNAMIC, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
   ,
   {RECT_CONFIG, "proxy.config.diags.action.enabled", RECD_INT, "0", 
RECU_DYNAMIC, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
@@ -1046,8 +1044,6 @@ static const RecordElement RecordsConfig[] =
   // How often periodic tasks get executed in the Log.cc infrastructure
   {RECT_CONFIG, "proxy.config.log.periodic_tasks_interval", RECD_INT, "5", 
RECU_DYNAMIC, RR_NULL, RECC_NULL, "^[0-9]+$", RECA_NULL}
   ,
-  {RECT_CONFIG, "proxy.config.log.throttling_interval_msec", RECD_INT, 
"60000", RECU_DYNAMIC, RR_NULL, RECC_NULL, "^[0-9]+$", RECA_NULL}
-  ,
 
   
//##############################################################################
   //#
diff --git a/proxy/logging/Log.cc b/proxy/logging/Log.cc
index 56c373d..c5965e8 100644
--- a/proxy/logging/Log.cc
+++ b/proxy/logging/Log.cc
@@ -1386,7 +1386,7 @@ Log::flush_thread_main(void * /* args ATS_UNUSED */)
       // make sure we're open & ready to write
       logfile->check_fd();
       if (!logfile->is_open()) {
-        SiteThrottledWarning("File:%s was closed, have dropped (%d) bytes.", 
logfile->get_name(), total_bytes);
+        Warning("File:%s was closed, have dropped (%d) bytes.", 
logfile->get_name(), total_bytes);
 
         RecIncrRawStat(log_rsb, mutex->thread_holding, 
log_stat_bytes_lost_before_written_to_disk_stat, total_bytes);
         delete fdata;
@@ -1412,8 +1412,8 @@ Log::flush_thread_main(void * /* args ATS_UNUSED */)
         len = ::write(logfilefd, &buf[bytes_written], total_bytes - 
bytes_written);
 
         if (len < 0) {
-          SiteThrottledError("Failed to write log to %s: [tried %d, wrote %d, 
%s]", logfile->get_name(),
-                             total_bytes - bytes_written, bytes_written, 
strerror(errno));
+          Error("Failed to write log to %s: [tried %d, wrote %d, %s]", 
logfile->get_name(), total_bytes - bytes_written,
+                bytes_written, strerror(errno));
 
           RecIncrRawStat(log_rsb, mutex->thread_holding, 
log_stat_bytes_lost_before_written_to_disk_stat,
                          total_bytes - bytes_written);
diff --git a/proxy/logging/Log.h b/proxy/logging/Log.h
index e0b502b..50c4323 100644
--- a/proxy/logging/Log.h
+++ b/proxy/logging/Log.h
@@ -232,12 +232,6 @@ private:
 };
 
 static inline bool
-LogThrottlingIsValid(int throttling_val)
-{
-  return throttling_val >= 0;
-}
-
-static inline bool
 LogRollingEnabledIsValid(int enabled)
 {
   return (enabled >= Log::NO_ROLLING || enabled < Log::INVALID_ROLLING_VALUE);
diff --git a/proxy/logging/LogBuffer.cc b/proxy/logging/LogBuffer.cc
index 8fdfb8c..466e34f 100644
--- a/proxy/logging/LogBuffer.cc
+++ b/proxy/logging/LogBuffer.cc
@@ -504,7 +504,7 @@ LogBuffer::resolve_custom_entry(LogFieldList *fieldlist, 
char *printf_str, char
         res      = field->unmarshal(&read_from, to, write_to_len - 
bytes_written);
 
         if (res < 0) {
-          SiteThrottledNote("%s", buffer_size_exceeded_msg);
+          Note("%s", buffer_size_exceeded_msg);
           bytes_written = 0;
           break;
         }
@@ -529,7 +529,7 @@ LogBuffer::resolve_custom_entry(LogFieldList *fieldlist, 
char *printf_str, char
       if (1 + bytes_written < write_to_len) {
         write_to[bytes_written++] = printf_str[i];
       } else {
-        SiteThrottledNote("%s", buffer_size_exceeded_msg);
+        Note("%s", buffer_size_exceeded_msg);
         bytes_written = 0;
         break;
       }
diff --git a/proxy/logging/LogConfig.cc b/proxy/logging/LogConfig.cc
index 7676a6e..1a77f0d 100644
--- a/proxy/logging/LogConfig.cc
+++ b/proxy/logging/LogConfig.cc
@@ -33,9 +33,8 @@
 #include "tscore/ink_platform.h"
 #include "tscore/ink_file.h"
 
-#include "tscore/Filenames.h"
 #include "tscore/List.h"
-#include "tscore/LogMessage.h"
+#include "tscore/Filenames.h"
 
 #include "Log.h"
 #include "LogField.h"
@@ -203,20 +202,6 @@ LogConfig::read_configuration_variables()
   val                 = 
static_cast<int>(REC_ConfigReadInteger("proxy.config.log.rolling_allow_empty"));
   rolling_allow_empty = (val > 0);
 
-  // THROTTLING
-  val = 
static_cast<int>(REC_ConfigReadInteger("proxy.config.log.throttling_interval_msec"));
-  if (LogThrottlingIsValid(val)) {
-    
LogMessage::set_default_log_throttling_interval(std::chrono::milliseconds{val});
-  } else {
-    Warning("invalid value '%d' for '%s', disabling log rolling", val, 
"proxy.config.log.throttling_interval_msec");
-  }
-  val = 
static_cast<int>(REC_ConfigReadInteger("proxy.config.diags.debug.throttling_interval_msec"));
-  if (LogThrottlingIsValid(val)) {
-    
LogMessage::set_default_debug_throttling_interval(std::chrono::milliseconds{val});
-  } else {
-    Warning("invalid value '%d' for '%s', disabling log rolling", val, 
"proxy.config.diags.debug.throttling_interval_msec");
-  }
-
   // Read in min_count control values for auto deletion
   if (auto_delete_rolled_files) {
     // The majority of register_rolled_log_auto_delete() updates come in
@@ -450,27 +435,13 @@ void
 LogConfig::register_config_callbacks()
 {
   static const char *names[] = {
-    "proxy.config.log.log_buffer_size",
-    "proxy.config.log.max_secs_per_buffer",
-    "proxy.config.log.max_space_mb_for_logs",
-    "proxy.config.log.max_space_mb_headroom",
-    "proxy.config.log.logfile_perm",
-    "proxy.config.log.hostname",
-    "proxy.config.log.logfile_dir",
-    "proxy.config.log.rolling_enabled",
-    "proxy.config.log.rolling_interval_sec",
-    "proxy.config.log.rolling_offset_hr",
-    "proxy.config.log.rolling_size_mb",
-    "proxy.config.log.auto_delete_rolled_files",
-    "proxy.config.log.rolling_max_count",
-    "proxy.config.log.rolling_allow_empty",
-    "proxy.config.log.config.filename",
-    "proxy.config.log.sampling_frequency",
-    "proxy.config.log.file_stat_frequency",
-    "proxy.config.log.space_used_frequency",
+    "proxy.config.log.log_buffer_size",       
"proxy.config.log.max_secs_per_buffer", 
"proxy.config.log.max_space_mb_for_logs",
+    "proxy.config.log.max_space_mb_headroom", "proxy.config.log.logfile_perm", 
       "proxy.config.log.hostname",
+    "proxy.config.log.logfile_dir",           
"proxy.config.log.rolling_enabled",     "proxy.config.log.rolling_interval_sec",
+    "proxy.config.log.rolling_offset_hr",     
"proxy.config.log.rolling_size_mb",     
"proxy.config.log.auto_delete_rolled_files",
+    "proxy.config.log.rolling_max_count",     
"proxy.config.log.rolling_allow_empty", "proxy.config.log.config.filename",
+    "proxy.config.log.sampling_frequency",    
"proxy.config.log.file_stat_frequency", "proxy.config.log.space_used_frequency",
     "proxy.config.log.io.max_buffer_index",
-    "proxy.config.log.throttling_interval_msec",
-    "proxy.config.diags.debug.throttling_interval_msec",
   };
 
   for (unsigned i = 0; i < countof(names); ++i) {
diff --git a/proxy/logging/LogFile.cc b/proxy/logging/LogFile.cc
index 7f5ca6c..8998776 100644
--- a/proxy/logging/LogFile.cc
+++ b/proxy/logging/LogFile.cc
@@ -718,7 +718,7 @@ LogFile::writeln(char *data, int len, int fd, const char 
*path)
     }
 
     if ((bytes_this_write = static_cast<int>(::writev(fd, (const struct iovec 
*)wvec, vcnt))) < 0) {
-      SiteThrottledWarning("An error was encountered in writing to %s: %s.", 
((path) ? path : "logfile"), strerror(errno));
+      Warning("An error was encountered in writing to %s: %s.", ((path) ? path 
: "logfile"), strerror(errno));
     } else {
       total_bytes = bytes_this_write;
     }
diff --git a/proxy/logging/LogObject.cc b/proxy/logging/LogObject.cc
index 9b8ec99..82230b0 100644
--- a/proxy/logging/LogObject.cc
+++ b/proxy/logging/LogObject.cc
@@ -547,9 +547,9 @@ LogObject::log(LogAccess *lad, std::string_view text_entry)
   buffer = _checkout_write(&offset, bytes_needed);
 
   if (!buffer) {
-    SiteThrottledNote("Skipping the current log entry for %s because its size 
(%zu) exceeds "
-                      "the maximum payload space in a log buffer",
-                      m_basename, bytes_needed);
+    Note("Skipping the current log entry for %s because its size (%zu) exceeds 
"
+         "the maximum payload space in a log buffer",
+         m_basename, bytes_needed);
     return Log::FAIL;
   }
   //
diff --git a/proxy/logging/LogStandalone.cc b/proxy/logging/LogStandalone.cc
index 620ea39..b893cc5 100644
--- a/proxy/logging/LogStandalone.cc
+++ b/proxy/logging/LogStandalone.cc
@@ -209,6 +209,7 @@ init_log_standalone(const char *pgm_name, bool one_copy)
   init_system(true);
   initialize_process_manager();
   diagsConfig = new DiagsConfig(pgm_name, logfile, error_tags, action_tags);
+  diags       = diagsConfig->diags;
 }
 
 /*-------------------------------------------------------------------------
@@ -236,6 +237,7 @@ init_log_standalone_basic(const char *pgm_name)
   init_system(false);
   const bool use_records = false;
   diagsConfig            = new DiagsConfig(pgm_name, logfile, error_tags, 
action_tags, use_records);
+  diags                  = diagsConfig->diags;
   // set stdin/stdout to be unbuffered
   //
   setbuf(stdin, nullptr);
diff --git a/proxy/shared/DiagsConfig.cc b/proxy/shared/DiagsConfig.cc
index 305330c..4301c01 100644
--- a/proxy/shared/DiagsConfig.cc
+++ b/proxy/shared/DiagsConfig.cc
@@ -67,8 +67,8 @@ DiagsConfig::reconfigure_diags()
   all_found = true;
 
   // initial value set to 0 or 1 based on command line tags
-  c.enabled[DiagsTagType_Debug]  = (_diags->base_debug_tags != nullptr);
-  c.enabled[DiagsTagType_Action] = (_diags->base_action_tags != nullptr);
+  c.enabled[DiagsTagType_Debug]  = (diags->base_debug_tags != nullptr);
+  c.enabled[DiagsTagType_Action] = (diags->base_action_tags != nullptr);
 
   // enabled if records.config set
 
@@ -84,9 +84,9 @@ DiagsConfig::reconfigure_diags()
   }
   all_found = all_found && found;
 
-  e                     = 
static_cast<int>(REC_readInteger("proxy.config.diags.show_location", &found));
-  _diags->show_location = ((e == 1 && found) ? SHOW_LOCATION_DEBUG : ((e == 2 
&& found) ? SHOW_LOCATION_ALL : SHOW_LOCATION_NONE));
-  all_found             = all_found && found;
+  e                    = 
static_cast<int>(REC_readInteger("proxy.config.diags.show_location", &found));
+  diags->show_location = ((e == 1 && found) ? SHOW_LOCATION_DEBUG : ((e == 2 
&& found) ? SHOW_LOCATION_ALL : SHOW_LOCATION_NONE));
+  all_found            = all_found && found;
 
   // read output routing values
   for (i = 0;; i++) {
@@ -128,23 +128,23 @@ DiagsConfig::reconfigure_diags()
     // clear out old tag tables //
     //////////////////////////////
 
-    _diags->deactivate_all(DiagsTagType_Debug);
-    _diags->deactivate_all(DiagsTagType_Action);
+    diags->deactivate_all(DiagsTagType_Debug);
+    diags->deactivate_all(DiagsTagType_Action);
 
     //////////////////////////////////////////////////////////////////////
     // add new tag tables from records.config or command line overrides //
     //////////////////////////////////////////////////////////////////////
 
-    _diags->activate_taglist((_diags->base_debug_tags ? 
_diags->base_debug_tags : dt), DiagsTagType_Debug);
-    _diags->activate_taglist((_diags->base_action_tags ? 
_diags->base_action_tags : at), DiagsTagType_Action);
+    diags->activate_taglist((diags->base_debug_tags ? diags->base_debug_tags : 
dt), DiagsTagType_Debug);
+    diags->activate_taglist((diags->base_action_tags ? diags->base_action_tags 
: at), DiagsTagType_Action);
 
 ////////////////////////////////////
 // change the diags config values //
 ////////////////////////////////////
 #if !defined(__GNUC__)
-    _diags->config = c;
+    diags->config = c;
 #else
-    memcpy(((void *)&_diags->config), ((void *)&c), sizeof(DiagsConfigState));
+    memcpy(((void *)&diags->config), ((void *)&c), sizeof(DiagsConfigState));
 #endif
     Note("updated diags config");
   }
@@ -172,7 +172,7 @@ diags_config_callback(const char * /* name ATS_UNUSED */, 
RecDataT /* data_type
   DiagsConfig *diagsConfig;
 
   diagsConfig = static_cast<DiagsConfig *>(opaque_token);
-  ink_assert(::diags->magic == DIAGS_MAGIC);
+  ink_assert(diags->magic == DIAGS_MAGIC);
   diagsConfig->reconfigure_diags();
   return (0);
 }
@@ -217,37 +217,37 @@ DiagsConfig::config_diags_norecords()
   //////////////////////////////
   // clear out old tag tables //
   //////////////////////////////
-  _diags->deactivate_all(DiagsTagType_Debug);
-  _diags->deactivate_all(DiagsTagType_Action);
+  diags->deactivate_all(DiagsTagType_Debug);
+  diags->deactivate_all(DiagsTagType_Action);
 
   //////////////////////////////////////////////////////////////////////
   // add new tag tables from command line overrides only              //
   //////////////////////////////////////////////////////////////////////
 
-  if (_diags->base_debug_tags) {
-    _diags->activate_taglist(_diags->base_debug_tags, DiagsTagType_Debug);
+  if (diags->base_debug_tags) {
+    diags->activate_taglist(diags->base_debug_tags, DiagsTagType_Debug);
     c.enabled[DiagsTagType_Debug] = true;
   } else {
     c.enabled[DiagsTagType_Debug] = false;
   }
 
-  if (_diags->base_action_tags) {
-    _diags->activate_taglist(_diags->base_action_tags, DiagsTagType_Action);
+  if (diags->base_action_tags) {
+    diags->activate_taglist(diags->base_action_tags, DiagsTagType_Action);
     c.enabled[DiagsTagType_Action] = true;
   } else {
     c.enabled[DiagsTagType_Action] = false;
   }
 
 #if !defined(__GNUC__)
-  _diags->config = c;
+  diags->config = c;
 #else
-  memcpy(((void *)&_diags->config), ((void *)&c), sizeof(DiagsConfigState));
+  memcpy(((void *)&diags->config), ((void *)&c), sizeof(DiagsConfigState));
 #endif
 }
 
 DiagsConfig::DiagsConfig(std::string_view prefix_string, const char *filename, 
const char *tags, const char *actions,
                          bool use_records)
-  : callbacks_established(false), diags_log(nullptr), _diags(nullptr)
+  : callbacks_established(false), diags_log(nullptr), diags(nullptr)
 {
   char diags_logpath[PATH_NAME_MAX];
   ats_scoped_str logpath;
@@ -259,8 +259,7 @@ DiagsConfig::DiagsConfig(std::string_view prefix_string, 
const char *filename, c
   ////////////////////////////////////////////////////////////////////
 
   if (!use_records) {
-    _diags  = new Diags(prefix_string, tags, actions, nullptr);
-    ::diags = _diags;
+    diags = new Diags(prefix_string, tags, actions, nullptr);
     config_diags_norecords();
     return;
   }
@@ -297,11 +296,10 @@ DiagsConfig::DiagsConfig(std::string_view prefix_string, 
const char *filename, c
 
   // Set up diags, FILE streams are opened in Diags constructor
   diags_log = new BaseLogFile(diags_logpath);
-  _diags    = new Diags(prefix_string, tags, actions, diags_log, 
diags_perm_parsed, output_perm_parsed);
-  ::diags   = _diags;
-  
_diags->config_roll_diagslog(static_cast<RollingEnabledValues>(diags_log_roll_enable),
 diags_log_roll_int, diags_log_roll_size);
-  
_diags->config_roll_outputlog(static_cast<RollingEnabledValues>(output_log_roll_enable),
 output_log_roll_int,
-                                output_log_roll_size);
+  diags     = new Diags(prefix_string, tags, actions, diags_log, 
diags_perm_parsed, output_perm_parsed);
+  
diags->config_roll_diagslog(static_cast<RollingEnabledValues>(diags_log_roll_enable),
 diags_log_roll_int, diags_log_roll_size);
+  
diags->config_roll_outputlog(static_cast<RollingEnabledValues>(output_log_roll_enable),
 output_log_roll_int,
+                               output_log_roll_size);
 
   Status("opened %s", diags_logpath);
 
@@ -356,5 +354,5 @@ DiagsConfig::register_diags_callbacks()
 
 DiagsConfig::~DiagsConfig()
 {
-  delete _diags;
+  delete diags;
 }
diff --git a/proxy/shared/DiagsConfig.h b/proxy/shared/DiagsConfig.h
index d48d246..bccc071 100644
--- a/proxy/shared/DiagsConfig.h
+++ b/proxy/shared/DiagsConfig.h
@@ -32,16 +32,13 @@ struct DiagsConfig {
   void parse_output_string(char *s, DiagsModeOutput *o);
   void register_diags_callbacks();
 
-  /** DiagsConfig constructor.
-   *
-   * As a side effect, this sets the global diags pointer to newly
-   * constructed _diags value.
-   */
   DiagsConfig(std::string_view prefix_string, const char *filename, const char 
*tags, const char *actions, bool use_records = true);
   ~DiagsConfig();
 
 private:
   bool callbacks_established;
   BaseLogFile *diags_log;
-  Diags *_diags;
+
+public:
+  Diags *diags;
 };
diff --git a/src/traffic_manager/traffic_manager.cc 
b/src/traffic_manager/traffic_manager.cc
index aa1d40a..4d4ea34 100644
--- a/src/traffic_manager/traffic_manager.cc
+++ b/src/traffic_manager/traffic_manager.cc
@@ -546,6 +546,7 @@ main(int argc, const char **argv)
   // Bootstrap the Diags facility so that we can use it while starting
   //  up the manager
   diagsConfig = new DiagsConfig("Manager", DIAGS_LOG_FILENAME, debug_tags, 
action_tags, false);
+  diags       = diagsConfig->diags;
   diags->set_std_output(StdStream::STDOUT, bind_stdout);
   diags->set_std_output(StdStream::STDERR, bind_stderr);
 
@@ -589,15 +590,13 @@ main(int argc, const char **argv)
   RecLocalInitMessage();
   lmgmt->initAlarm();
 
+  if (diags) {
+    delete diagsConfig;
+  }
   // INKqa11968: need to set up callbacks and diags data structures
   // using configuration in records.config
-  DiagsConfig *old_diagsconfig = diagsConfig;
-  diagsConfig                  = new DiagsConfig("Manager", 
DIAGS_LOG_FILENAME, debug_tags, action_tags, true);
-  if (old_diagsconfig) {
-    delete old_diagsconfig;
-    old_diagsconfig = nullptr;
-  }
-
+  diagsConfig = new DiagsConfig("Manager", DIAGS_LOG_FILENAME, debug_tags, 
action_tags, true);
+  diags       = diagsConfig->diags;
   RecSetDiags(diags);
   diags->set_std_output(StdStream::STDOUT, bind_stdout);
   diags->set_std_output(StdStream::STDERR, bind_stderr);
diff --git a/src/traffic_server/traffic_server.cc 
b/src/traffic_server/traffic_server.cc
index 884e25b..2a17303 100644
--- a/src/traffic_server/traffic_server.cc
+++ b/src/traffic_server/traffic_server.cc
@@ -1778,6 +1778,7 @@ main(int /* argc ATS_UNUSED */, const char **argv)
   // This is also needed for log rotation - setting up the file can cause 
privilege
   // related errors and if diagsConfig isn't get up yet that will crash on a 
NULL pointer.
   diagsConfig = new DiagsConfig("Server", DIAGS_LOG_FILENAME, error_tags, 
action_tags, false);
+  diags       = diagsConfig->diags;
   diags->set_std_output(StdStream::STDOUT, bind_stdout);
   diags->set_std_output(StdStream::STDERR, bind_stderr);
   if (is_debug_tag_set("diags")) {
@@ -1872,6 +1873,7 @@ main(int /* argc ATS_UNUSED */, const char **argv)
   // Re-initialize diagsConfig based on records.config configuration
   DiagsConfig *old_log = diagsConfig;
   diagsConfig          = new DiagsConfig("Server", DIAGS_LOG_FILENAME, 
error_tags, action_tags, true);
+  diags                = diagsConfig->diags;
   RecSetDiags(diags);
   diags->set_std_output(StdStream::STDOUT, bind_stdout);
   diags->set_std_output(StdStream::STDERR, bind_stderr);
diff --git a/src/tscore/LogMessage.cc b/src/tscore/LogMessage.cc
deleted file mode 100644
index 91223ab..0000000
--- a/src/tscore/LogMessage.cc
+++ /dev/null
@@ -1,275 +0,0 @@
-/** @file
-
-  LogMessage implementation.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#include "tscore/LogMessage.h"
-
-#include "tscore/Diags.h"
-
-using namespace std::chrono_literals;
-
-std::atomic<std::chrono::milliseconds> 
LogMessage::_default_log_throttling_interval{0ms};
-std::atomic<std::chrono::milliseconds> 
LogMessage::_default_debug_throttling_interval{0ms};
-
-// static
-void
-LogMessage::set_default_log_throttling_interval(std::chrono::milliseconds 
new_interval)
-{
-  _default_log_throttling_interval = new_interval;
-}
-
-// static
-void
-LogMessage::set_default_debug_throttling_interval(std::chrono::milliseconds 
new_interval)
-{
-  _default_debug_throttling_interval = new_interval;
-}
-
-void
-LogMessage::message_helper(std::chrono::microseconds 
current_configured_interval, log_function_f log_function, const char *fmt,
-                           va_list args)
-{
-  if (!_is_throttled) {
-    // If throttling is disabled, make this operation as efficient as possible.
-    // Simply log and exit without consulting the Throttler API.
-    //
-    // If the user changes the throttling value from some non-zero value to
-    // zero, then we may miss out on some "The following message was
-    // suppressed" logs. However we accept this as a tradeoff to make this
-    // common case as fast as possible.
-    log_function(fmt, args);
-    return;
-  }
-  if (!_throttling_value_is_explicitly_set) {
-    set_throttling_interval(current_configured_interval);
-  }
-  uint64_t number_of_suppressions = 0;
-  if (is_throttled(number_of_suppressions)) {
-    // The messages are the same and but we're still within the throttling
-    // interval. Suppress this message.
-    return;
-  }
-  // If we get here, the message should not be suppressed.
-  if (number_of_suppressions > 0) {
-    // We use no format parameters, so we just need an empty va_list.
-    va_list empty_args;
-    std::string message =
-      std::string("The following message was suppressed ") + 
std::to_string(number_of_suppressions) + std::string(" times.");
-    log_function(message.c_str(), empty_args);
-  }
-  log_function(fmt, args);
-}
-
-void
-LogMessage::standard_message_helper(DiagsLevel level, SourceLocation const 
&loc, const char *fmt, va_list args)
-{
-  message_helper(
-    _default_log_throttling_interval.load(),
-    [level, &loc](const char *fmt, va_list args) { diags->error_va(level, 
&loc, fmt, args); }, fmt, args);
-}
-
-void
-LogMessage::message_debug_helper(const char *tag, DiagsLevel level, 
SourceLocation const &loc, const char *fmt, va_list args)
-{
-  message_helper(
-    _default_debug_throttling_interval.load(),
-    [tag, level, &loc](const char *fmt, va_list args) { diags->log_va(tag, 
level, &loc, fmt, args); }, fmt, args);
-}
-
-void
-LogMessage::message_print_helper(const char *tag, DiagsLevel level, 
SourceLocation const &loc, const char *fmt, va_list args)
-{
-  message_helper(
-    _default_debug_throttling_interval.load(),
-    [tag, level, &loc](const char *fmt, va_list args) { diags->print_va(tag, 
level, &loc, fmt, args); }, fmt, args);
-}
-
-LogMessage::LogMessage(bool is_throttled)
-  // Turn throttling off by default. Each log event will check the configured
-  // throttling interval.
-  : Throttler{std::chrono::milliseconds{0}}, 
_throttling_value_is_explicitly_set{false}, _is_throttled{is_throttled}
-{
-}
-
-LogMessage::LogMessage(std::chrono::milliseconds throttling_interval)
-  : Throttler{throttling_interval}, _throttling_value_is_explicitly_set{true}, 
_is_throttled{throttling_interval != 0ms}
-{
-}
-
-void
-LogMessage::diag(const char *tag, SourceLocation const &loc, const char *fmt, 
...)
-{
-  va_list args;
-  va_start(args, fmt);
-  message_debug_helper(tag, DL_Diag, loc, fmt, args);
-  va_end(args);
-}
-
-void
-LogMessage::debug(const char *tag, SourceLocation const &loc, const char *fmt, 
...)
-{
-  va_list args;
-  va_start(args, fmt);
-  message_debug_helper(tag, DL_Debug, loc, fmt, args);
-  va_end(args);
-}
-
-void
-LogMessage::status(SourceLocation const &loc, const char *fmt, ...)
-{
-  va_list args;
-  va_start(args, fmt);
-  standard_message_helper(DL_Status, loc, fmt, args);
-  va_end(args);
-}
-
-void
-LogMessage::note(SourceLocation const &loc, const char *fmt, ...)
-{
-  va_list args;
-  va_start(args, fmt);
-  standard_message_helper(DL_Note, loc, fmt, args);
-  va_end(args);
-}
-
-void
-LogMessage::warning(SourceLocation const &loc, const char *fmt, ...)
-{
-  va_list args;
-  va_start(args, fmt);
-  standard_message_helper(DL_Warning, loc, fmt, args);
-  va_end(args);
-}
-
-void
-LogMessage::error(SourceLocation const &loc, const char *fmt, ...)
-{
-  va_list args;
-  va_start(args, fmt);
-  standard_message_helper(DL_Error, loc, fmt, args);
-  va_end(args);
-}
-
-void
-LogMessage::fatal(SourceLocation const &loc, const char *fmt, ...)
-{
-  va_list args;
-  va_start(args, fmt);
-  standard_message_helper(DL_Fatal, loc, fmt, args);
-  va_end(args);
-}
-
-void
-LogMessage::alert(SourceLocation const &loc, const char *fmt, ...)
-{
-  va_list args;
-  va_start(args, fmt);
-  standard_message_helper(DL_Alert, loc, fmt, args);
-  va_end(args);
-}
-
-void
-LogMessage::emergency(SourceLocation const &loc, const char *fmt, ...)
-{
-  va_list args;
-  va_start(args, fmt);
-  standard_message_helper(DL_Emergency, loc, fmt, args);
-  va_end(args);
-}
-
-void
-LogMessage::message(DiagsLevel level, SourceLocation const &loc, const char 
*fmt, ...)
-{
-  va_list args;
-  va_start(args, fmt);
-  standard_message_helper(level, loc, fmt, args);
-  va_end(args);
-}
-
-void
-LogMessage::print(const char *tag, DiagsLevel level, SourceLocation const 
&loc, const char *fmt, ...)
-{
-  va_list args;
-  va_start(args, fmt);
-  message_print_helper(tag, level, loc, fmt, args);
-  va_end(args);
-}
-
-void
-LogMessage::diag_va(const char *tag, SourceLocation const &loc, const char 
*fmt, va_list args)
-{
-  message_debug_helper(tag, DL_Diag, loc, fmt, args);
-}
-
-void
-LogMessage::debug_va(const char *tag, SourceLocation const &loc, const char 
*fmt, va_list args)
-{
-  message_debug_helper(tag, DL_Debug, loc, fmt, args);
-}
-
-void
-LogMessage::status_va(SourceLocation const &loc, const char *fmt, va_list args)
-{
-  standard_message_helper(DL_Status, loc, fmt, args);
-}
-
-void
-LogMessage::note_va(SourceLocation const &loc, const char *fmt, va_list args)
-{
-  standard_message_helper(DL_Note, loc, fmt, args);
-}
-
-void
-LogMessage::warning_va(SourceLocation const &loc, const char *fmt, va_list 
args)
-{
-  standard_message_helper(DL_Warning, loc, fmt, args);
-}
-
-void
-LogMessage::error_va(SourceLocation const &loc, const char *fmt, va_list args)
-{
-  standard_message_helper(DL_Error, loc, fmt, args);
-}
-
-void
-LogMessage::fatal_va(SourceLocation const &loc, const char *fmt, va_list args)
-{
-  standard_message_helper(DL_Fatal, loc, fmt, args);
-}
-
-void
-LogMessage::alert_va(SourceLocation const &loc, const char *fmt, va_list args)
-{
-  standard_message_helper(DL_Alert, loc, fmt, args);
-}
-
-void
-LogMessage::emergency_va(SourceLocation const &loc, const char *fmt, va_list 
args)
-{
-  standard_message_helper(DL_Emergency, loc, fmt, args);
-}
-
-void
-LogMessage::message_va(DiagsLevel level, SourceLocation const &loc, const char 
*fmt, va_list args)
-{
-  standard_message_helper(level, loc, fmt, args);
-}
diff --git a/src/tscore/Makefile.am b/src/tscore/Makefile.am
index 8d53dbf..ed6788e 100644
--- a/src/tscore/Makefile.am
+++ b/src/tscore/Makefile.am
@@ -117,8 +117,6 @@ libtscore_la_SOURCES = \
        signals.cc \
        SourceLocation.cc \
        TextBuffer.cc \
-       LogMessage.cc \
-       Throttler.cc \
        Tokenizer.cc \
        ts_file.cc \
        Version.cc \
@@ -179,13 +177,12 @@ test_tscore_SOURCES = \
        unit_tests/test_List.cc \
        unit_tests/test_MemArena.cc \
        unit_tests/test_MT_hashtable.cc \
-       unit_tests/test_ParseRules.cc \
+  unit_tests/test_ParseRules.cc \
        unit_tests/test_PriorityQueue.cc \
        unit_tests/test_Ptr.cc \
        unit_tests/test_Regex.cc \
        unit_tests/test_Scalar.cc \
        unit_tests/test_scoped_resource.cc \
-       unit_tests/test_Throttler.cc \
        unit_tests/test_Tokenizer.cc \
        unit_tests/test_ts_file.cc \
        unit_tests/test_Version.cc \
diff --git a/src/tscore/Throttler.cc b/src/tscore/Throttler.cc
deleted file mode 100644
index 99ce38c..0000000
--- a/src/tscore/Throttler.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/** @file
-
-  Implement Throttler.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#include "tscore/Throttler.h"
-
-Throttler::Throttler(std::chrono::microseconds interval) : _interval{interval} 
{}
-
-bool
-Throttler::is_throttled(uint64_t &skipped_count)
-{
-  TimePoint const now = Clock::now();
-  TimePoint last_allowed_time{_last_allowed_time};
-  if ((last_allowed_time + _interval.load()) <= now) {
-    if (_last_allowed_time.compare_exchange_strong(last_allowed_time, now)) {
-      skipped_count     = _suppressed_count;
-      _suppressed_count = 0;
-      return false;
-    }
-  }
-  ++_suppressed_count;
-  return true;
-}
-
-uint64_t
-Throttler::reset_counter()
-{
-  _last_allowed_time       = Clock::now();
-  auto const skipped_count = _suppressed_count;
-  _suppressed_count        = 0;
-  return skipped_count;
-}
-
-void
-Throttler::set_throttling_interval(std::chrono::microseconds new_interval)
-{
-  _interval = new_interval;
-}
diff --git a/src/tscore/unit_tests/test_Throttler.cc 
b/src/tscore/unit_tests/test_Throttler.cc
deleted file mode 100644
index 5dba843..0000000
--- a/src/tscore/unit_tests/test_Throttler.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
-  @file Test for Regex.cc
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-*/
-
-#include "tscore/Throttler.h"
-#include "catch.hpp"
-
-#include <chrono>
-#include <thread>
-
-using namespace std::literals;
-
-TEST_CASE("Throttler", "[libts][Throttler]")
-{
-  auto const periodicity = 100ms;
-  Throttler throttler(periodicity);
-  uint64_t skipped_count = 0;
-
-  // The first check should be allowed.
-  CHECK_FALSE(throttler.is_throttled(skipped_count));
-
-  // The first time this is called, none were skipped.
-  CHECK(skipped_count == 0);
-
-  // In rapid succession, do a few more that should be skipped.
-  auto const expected_skip_count = 5u;
-  for (auto i = 0u; i < expected_skip_count; ++i) {
-    CHECK(throttler.is_throttled(skipped_count));
-  }
-
-  // Sleep more than enough time for the throttler to allow the following
-  // check.
-  std::this_thread::sleep_for(2 * periodicity);
-
-  CHECK_FALSE(throttler.is_throttled(skipped_count));
-  CHECK(skipped_count == expected_skip_count);
-}

Reply via email to