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 2019/09/03 13:56:39 UTC

[trafficserver] 01/02: pipe buffer size for log.pipe should be configurable

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

commit 45592cff2f8e424f87c80059a62befdbfdd06633
Author: Eric Schwartz <es...@gmail.com>
AuthorDate: Thu Aug 22 14:36:44 2019 +0000

    pipe buffer size for log.pipe should be configurable
    
    Conflicts:
    	proxy/logging/YamlLogConfig.cc
---
 proxy/logging/LogFile.cc       | 28 ++++++++++++++++++++++++++--
 proxy/logging/LogFile.h        |  3 ++-
 proxy/logging/LogObject.cc     | 12 ++++++++----
 proxy/logging/LogObject.h      |  5 ++++-
 proxy/logging/YamlLogConfig.cc | 23 +++++++++++++++++------
 5 files changed, 57 insertions(+), 14 deletions(-)

diff --git a/proxy/logging/LogFile.cc b/proxy/logging/LogFile.cc
index c0928be..c9e911c 100644
--- a/proxy/logging/LogFile.cc
+++ b/proxy/logging/LogFile.cc
@@ -63,12 +63,13 @@
   -------------------------------------------------------------------------*/
 
 LogFile::LogFile(const char *name, const char *header, LogFileFormat format, uint64_t signature, size_t ascii_buffer_size,
-                 size_t max_line_size)
+                 size_t max_line_size, int pipe_buffer_size)
   : m_file_format(format),
     m_name(ats_strdup(name)),
     m_header(ats_strdup(header)),
     m_signature(signature),
-    m_max_line_size(max_line_size)
+    m_max_line_size(max_line_size),
+    m_pipe_buffer_size(pipe_buffer_size)
 {
   if (m_file_format != LOG_FILE_PIPE) {
     m_log = new BaseLogFile(name, m_signature);
@@ -97,6 +98,7 @@ LogFile::LogFile(const LogFile &copy)
     m_signature(copy.m_signature),
     m_ascii_buffer_size(copy.m_ascii_buffer_size),
     m_max_line_size(copy.m_max_line_size),
+    m_pipe_buffer_size(copy.m_pipe_buffer_size),
     m_fd(copy.m_fd)
 {
   ink_release_assert(m_ascii_buffer_size >= m_max_line_size);
@@ -185,6 +187,28 @@ LogFile::open_file()
       Debug("log-file", "no readers for pipe %s", m_name);
       return LOG_FILE_NO_PIPE_READERS;
     }
+
+    // adjust pipe size if necessary
+    if (m_pipe_buffer_size) {
+      long pipe_size = (long)fcntl(m_fd, F_GETPIPE_SZ);
+      if (pipe_size == -1) {
+        Error("get pipe size failed for pipe %s", m_name);
+      } else {
+        Debug("log-file", "Default pipe size for pipe %s = %ld", m_name, pipe_size);
+      }
+
+      int ret = fcntl(m_fd, F_SETPIPE_SZ, m_pipe_buffer_size);
+      if (ret == -1) {
+        Error("set pipe size failed for pipe %s", m_name);
+      }
+
+      pipe_size = (long)fcntl(m_fd, F_GETPIPE_SZ);
+      if (pipe_size == -1) {
+        Error("get pipe size failed for pipe %s", m_name);
+      } else {
+        Debug("log-file", "NEW pipe size for pipe %s = %ld", m_name, pipe_size);
+      }
+    }
   } else {
     if (m_log) {
       int status = m_log->open_file(Log::config->logfile_perm);
diff --git a/proxy/logging/LogFile.h b/proxy/logging/LogFile.h
index 4f2fd65..1a9a7f1 100644
--- a/proxy/logging/LogFile.h
+++ b/proxy/logging/LogFile.h
@@ -43,7 +43,7 @@ class LogFile : public LogBufferSink, public RefCountObj
 {
 public:
   LogFile(const char *name, const char *header, LogFileFormat format, uint64_t signature, size_t ascii_buffer_size = 4 * 9216,
-          size_t max_line_size = 9216);
+          size_t max_line_size = 9216, int pipe_buffer_size = 0);
   LogFile(const LogFile &);
   ~LogFile() override;
 
@@ -120,6 +120,7 @@ public:
   uint64_t m_signature;       // signature of log object stored
   size_t m_ascii_buffer_size; // size of ascii buffer
   size_t m_max_line_size;     // size of longest log line (record)
+  int m_pipe_buffer_size;     // this is the size of the pipe buffer set by fcntl
   int m_fd;                   // this could back m_log or a pipe, depending on the situation
 
 public:
diff --git a/proxy/logging/LogObject.cc b/proxy/logging/LogObject.cc
index 8032dbd..f1c2337 100644
--- a/proxy/logging/LogObject.cc
+++ b/proxy/logging/LogObject.cc
@@ -90,7 +90,8 @@ LogBufferManager::preproc_buffers(LogBufferSink *sink)
 
 LogObject::LogObject(const LogFormat *format, const char *log_dir, const char *basename, LogFileFormat file_format,
                      const char *header, Log::RollingEnabledValues rolling_enabled, int flush_threads, int rolling_interval_sec,
-                     int rolling_offset_hr, int rolling_size_mb, bool auto_created, int max_rolled, bool reopen_after_rolling)
+                     int rolling_offset_hr, int rolling_size_mb, bool auto_created, int max_rolled, bool reopen_after_rolling,
+                     int pipe_buffer_size)
   : m_alt_filename(nullptr),
     m_flags(0),
     m_signature(0),
@@ -101,7 +102,8 @@ LogObject::LogObject(const LogFormat *format, const char *log_dir, const char *b
     m_last_roll_time(0),
     m_max_rolled(max_rolled),
     m_reopen_after_rolling(reopen_after_rolling),
-    m_buffer_manager_idx(0)
+    m_buffer_manager_idx(0),
+    m_pipe_buffer_size(pipe_buffer_size)
 {
   ink_release_assert(format);
   m_format         = new LogFormat(*format);
@@ -118,7 +120,8 @@ LogObject::LogObject(const LogFormat *format, const char *log_dir, const char *b
   // compute_signature is a static function
   m_signature = compute_signature(m_format, m_basename, m_flags);
 
-  m_logFile = new LogFile(m_filename, header, file_format, m_signature, Log::config->ascii_buffer_size, Log::config->max_line_size);
+  m_logFile = new LogFile(m_filename, header, file_format, m_signature, Log::config->ascii_buffer_size, Log::config->max_line_size,
+                          m_pipe_buffer_size);
 
   if (m_reopen_after_rolling) {
     m_logFile->open_file();
@@ -148,7 +151,8 @@ LogObject::LogObject(LogObject &rhs)
     m_last_roll_time(rhs.m_last_roll_time),
     m_max_rolled(rhs.m_max_rolled),
     m_reopen_after_rolling(rhs.m_reopen_after_rolling),
-    m_buffer_manager_idx(rhs.m_buffer_manager_idx)
+    m_buffer_manager_idx(rhs.m_buffer_manager_idx),
+    m_pipe_buffer_size(rhs.m_pipe_buffer_size)
 {
   m_format         = new LogFormat(*(rhs.m_format));
   m_buffer_manager = new LogBufferManager[m_flush_threads];
diff --git a/proxy/logging/LogObject.h b/proxy/logging/LogObject.h
index fcf6046..32dafb1 100644
--- a/proxy/logging/LogObject.h
+++ b/proxy/logging/LogObject.h
@@ -95,7 +95,8 @@ public:
 
   LogObject(const LogFormat *format, const char *log_dir, const char *basename, LogFileFormat file_format, const char *header,
             Log::RollingEnabledValues rolling_enabled, int flush_threads, int rolling_interval_sec = 0, int rolling_offset_hr = 0,
-            int rolling_size_mb = 0, bool auto_created = false, int rolling_max_count = 0, bool reopen_after_rolling = false);
+            int rolling_size_mb = 0, bool auto_created = false, int rolling_max_count = 0, bool reopen_after_rolling = false,
+            int pipe_buffer_size = 0);
   LogObject(LogObject &);
   ~LogObject() override;
 
@@ -285,6 +286,8 @@ private:
   unsigned m_buffer_manager_idx;
   LogBufferManager *m_buffer_manager;
 
+  int m_pipe_buffer_size;
+
   void generate_filenames(const char *log_dir, const char *basename, LogFileFormat file_format);
   void _setup_rolling(Log::RollingEnabledValues rolling_enabled, int rolling_interval_sec, int rolling_offset_hr,
                       int rolling_size_mb);
diff --git a/proxy/logging/YamlLogConfig.cc b/proxy/logging/YamlLogConfig.cc
index 398bfcb..1011445 100644
--- a/proxy/logging/YamlLogConfig.cc
+++ b/proxy/logging/YamlLogConfig.cc
@@ -111,7 +111,8 @@ TsEnumDescriptor ROLLING_MODE_LUA  = {
 
 std::set<std::string> valid_log_object_keys = {
   "filename",          "format",          "mode",    "header",    "rolling_enabled",   "rolling_interval_sec",
-  "rolling_offset_hr", "rolling_size_mb", "filters", "min_count", "rolling_max_count", "rolling_allow_empty"};
+  "rolling_offset_hr", "rolling_size_mb", "filters", "min_count", "rolling_max_count", "rolling_allow_empty",
+  "pipe_buffer_size"};
 
 LogObject *
 YamlLogConfig::decodeLogObject(const YAML::Node &node)
@@ -196,11 +197,21 @@ YamlLogConfig::decodeLogObject(const YAML::Node &node)
     Warning("Invalid log rolling value '%d' in log object", obj_rolling_enabled);
   }
 
-  auto logObject =
-    new LogObject(fmt, Log::config->logfile_dir, filename.c_str(), file_type, header.c_str(),
-                  static_cast<Log::RollingEnabledValues>(obj_rolling_enabled), Log::config->preproc_threads,
-                  obj_rolling_interval_sec, obj_rolling_offset_hr, obj_rolling_size_mb, /* auto_created */ false,
-                  /* rolling_max_count */ obj_rolling_max_count, /* reopen_after_rolling */ obj_rolling_allow_empty > 0);
+  // get buffer for pipe
+  int pipe_buffer_size = 0;
+  if (node["pipe_buffer_size"]) {
+    if (file_type != LOG_FILE_PIPE) {
+      Warning("Pipe buffer size field should only be set for log.pipe object.");
+    } else {
+      pipe_buffer_size = node["pipe_buffer_size"].as<int>();
+    }
+  }
+
+  auto logObject = new LogObject(fmt, Log::config->logfile_dir, filename.c_str(), file_type, header.c_str(),
+                                 static_cast<Log::RollingEnabledValues>(obj_rolling_enabled), Log::config->preproc_threads,
+                                 obj_rolling_interval_sec, obj_rolling_offset_hr, obj_rolling_size_mb, /* auto_created */ false,
+                                 /* rolling_max_count */ obj_rolling_max_count,
+                                 /* reopen_after_rolling */ obj_rolling_allow_empty > 0, pipe_buffer_size);
 
   // Generate LogDeletingInfo entry for later use
   std::string ext;