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

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

commit 1b4c237c9da474c7016e01d7039b56856f26af1d
Author: Damian Meden <damian.me...@oath.com>
AuthorDate: Thu Feb 27 13:34:34 2020 +0000

    Make traffic_manager be flexible when opening config files.
    
    (cherry picked from commit 9074db07b86f249dab9c3a5a8809ffb6318912cd)
---
 mgmt/ConfigManager.cc                     | 13 ++++++------
 mgmt/ConfigManager.h                      |  9 +++++++-
 mgmt/FileManager.cc                       | 11 +++++-----
 mgmt/FileManager.h                        |  7 ++++---
 src/traffic_manager/AddConfigFilesHere.cc | 35 +++++++++++++++++--------------
 5 files changed, 44 insertions(+), 31 deletions(-)

diff --git a/mgmt/ConfigManager.cc b/mgmt/ConfigManager.cc
index 1eb94aa..b2dfe79 100644
--- a/mgmt/ConfigManager.cc
+++ b/mgmt/ConfigManager.cc
@@ -42,8 +42,8 @@
 #define TS_ARCHIVE_STAT_MTIME(t) ((t).st_mtime * 1000000000)
 #endif
 
-ConfigManager::ConfigManager(const char *fileName_, const char *configName_, 
bool root_access_needed_, ConfigManager *parentConfig_)
-  : root_access_needed(root_access_needed_), parentConfig(parentConfig_)
+ConfigManager::ConfigManager(const char *fileName_, const char *configName_, 
bool root_access_needed_, bool isRequired_, ConfigManager *parentConfig_)
+  : root_access_needed(root_access_needed_),  isRequired(isRequired_), 
parentConfig(parentConfig_)
 {
   ExpandingArray existVer(25, true); // Existing versions
   struct stat fileInfo;
@@ -59,14 +59,15 @@ ConfigManager::ConfigManager(const char *fileName_, const 
char *configName_, boo
   configName = ats_strdup(configName_);
 
   ink_mutex_init(&fileAccessLock);
-
   // Check to make sure that our configuration file exists
   //
   if (statFile(&fileInfo) < 0) {
-    // If we can't find an active version because there is none we have a hard 
failure.
-    mgmt_fatal(0, "[ConfigManager::ConfigManager] Unable to find configuration 
file %s.\n\tStat failed : %s\n", fileName,
-               strerror(errno));
+    mgmt_log("[ConfigManager::ConfigManager] %s Unable to load: %s", fileName, 
strerror(errno));
 
+    if (isRequired) {
+      mgmt_fatal(0, "[ConfigManager::ConfigManager] Unable to open required 
configuration file %s.\n\tStat failed : %s\n", fileName,
+                 strerror(errno));
+    }
   } else {
     fileLastModified = TS_ARCHIVE_STAT_MTIME(fileInfo);
   }
diff --git a/mgmt/ConfigManager.h b/mgmt/ConfigManager.h
index f32cb2a..f7b3e3e 100644
--- a/mgmt/ConfigManager.h
+++ b/mgmt/ConfigManager.h
@@ -54,7 +54,7 @@ class ConfigManager
 {
 public:
   // fileName_ should be rooted or a base file name.
-  ConfigManager(const char *fileName_, const char *configName_, bool 
root_access_needed, ConfigManager *parentConfig_);
+  ConfigManager(const char *fileName_, const char *configName_, bool 
root_access_needed, bool isRequired_, ConfigManager *parentConfig_);
   ~ConfigManager();
 
   // Manual take out of lock required
@@ -104,6 +104,12 @@ public:
     return root_access_needed;
   }
 
+  bool
+  getIsRequired() const
+  {
+    return isRequired;
+  }
+
   FileManager *configFiles = nullptr; // Manager to notify on an update.
 
   // noncopyable
@@ -117,6 +123,7 @@ private:
   char *fileName;
   char *configName;
   bool root_access_needed;
+  bool isRequired;
   ConfigManager *parentConfig;
   time_t fileLastModified = 0;
 };
diff --git a/mgmt/FileManager.cc b/mgmt/FileManager.cc
index c23f17f..e38f6d3 100644
--- a/mgmt/FileManager.cc
+++ b/mgmt/FileManager.cc
@@ -92,20 +92,21 @@ FileManager::registerCallback(FileCallbackFunc func)
 //  Pointers to the new objects are stored in the bindings hashtable
 //
 void
-FileManager::addFile(const char *fileName, const char *configName, bool 
root_access_needed, ConfigManager *parentConfig)
+FileManager::addFile(const char *fileName, const char *configName, bool 
root_access_needed, bool isRequired,
+                     ConfigManager *parentConfig)
 {
   ink_mutex_acquire(&accessLock);
-  addFileHelper(fileName, configName, root_access_needed, parentConfig);
+  addFileHelper(fileName, configName, root_access_needed, isRequired, 
parentConfig);
   ink_mutex_release(&accessLock);
 }
 
 // caller must hold the lock
 void
-FileManager::addFileHelper(const char *fileName, const char *configName, bool 
root_access_needed, ConfigManager *parentConfig)
+FileManager::addFileHelper(const char *fileName, const char *configName, bool 
root_access_needed, bool isRequired, ConfigManager *parentConfig)
 {
   ink_assert(fileName != nullptr);
 
-  ConfigManager *rb = new ConfigManager(fileName, configName, 
root_access_needed, parentConfig);
+  ConfigManager *rb = new ConfigManager(fileName, configName, 
root_access_needed, isRequired, parentConfig);
   rb->configFiles   = this;
 
   bindings.emplace(rb->getFileName(), rb);
@@ -257,7 +258,7 @@ FileManager::configFileChild(const char *parent, const char 
*child)
   ink_mutex_acquire(&accessLock);
   if (auto it = bindings.find(parent); it != bindings.end()) {
     parentConfig = it->second;
-    addFileHelper(child, "", parentConfig->rootAccessNeeded(), parentConfig);
+    addFileHelper(child, "", parentConfig->rootAccessNeeded(), 
parentConfig->getIsRequired(), parentConfig);
   }
   ink_mutex_release(&accessLock);
 }
diff --git a/mgmt/FileManager.h b/mgmt/FileManager.h
index dfc59cf..8d9a899 100644
--- a/mgmt/FileManager.h
+++ b/mgmt/FileManager.h
@@ -48,7 +48,7 @@ enum lockAction_t {
 //
 //  public functions:
 //
-//  addFile(char*, char *, configFileInfo*) - adds a new config file to be
+//  addFile(char*, char *, bool, configFileInfo*) - adds a new config file to 
be
 //       managed.  A ConfigManager object is created for the file.
 //       if the file_info ptr is not NULL, a WebFileEdit object
 //       is also created
@@ -80,7 +80,8 @@ class FileManager
 public:
   FileManager();
   ~FileManager();
-  void addFile(const char *fileName, const char *configName, bool 
root_access_needed, ConfigManager *parentConfig = nullptr);
+  void addFile(const char *fileName, const char *configName, bool 
root_access_needed, bool isRequired,
+               ConfigManager *parentConfig = nullptr);
   bool getConfigObj(const char *fileName, ConfigManager **rbPtr);
   void registerCallback(FileCallbackFunc func);
   void fileChanged(const char *fileName, const char *configName);
@@ -93,7 +94,7 @@ private:
   ink_mutex cbListLock; // Protects the CallBack List
   DLL<callbackListable> cblist;
   std::unordered_map<std::string_view, ConfigManager *> bindings;
-  void addFileHelper(const char *fileName, const char *configName, bool 
root_access_needed, ConfigManager *parentConfig);
+  void addFileHelper(const char *fileName, const char *configName, bool 
root_access_needed, bool isRequired, ConfigManager *parentConfig);
 };
 
 void initializeRegistry(); // implemented in AddConfigFilesHere.cc
diff --git a/src/traffic_manager/AddConfigFilesHere.cc 
b/src/traffic_manager/AddConfigFilesHere.cc
index be91a82..1f9d2da 100644
--- a/src/traffic_manager/AddConfigFilesHere.cc
+++ b/src/traffic_manager/AddConfigFilesHere.cc
@@ -29,6 +29,9 @@
 
 extern FileManager *configFiles;
 
+
+static constexpr bool REQUIRED { true };
+static constexpr bool NOT_REQUIRED { false };
 /****************************************************************************
  *
  *  AddConfigFilesHere.cc - Structs for config files and
@@ -43,14 +46,14 @@ testcall(char *foo, char * /*configName */)
 }
 
 void
-registerFile(const char *configName, const char *defaultName)
+registerFile(const char *configName, const char *defaultName, bool isRequired)
 {
   bool found        = false;
   const char *fname = REC_readString(configName, &found);
   if (!found) {
     fname = defaultName;
   }
-  configFiles->addFile(fname, configName, false);
+  configFiles->addFile(fname, configName, false, isRequired);
 }
 
 //
@@ -73,20 +76,20 @@ initializeRegistry()
     ink_assert(!"Configuration Object Registry Initialized More than Once");
   }
 
-  registerFile("proxy.config.log.config.filename", ts::filename::LOGGING);
-  registerFile("", ts::filename::STORAGE);
-  registerFile("proxy.config.socks.socks_config_file", ts::filename::SOCKS);
-  registerFile(ts::filename::RECORDS, ts::filename::RECORDS);
-  registerFile("proxy.config.cache.control.filename", ts::filename::CACHE);
-  registerFile("proxy.config.cache.ip_allow.filename", ts::filename::IP_ALLOW);
-  registerFile("proxy.config.http.parent_proxy.file", ts::filename::PARENT);
-  registerFile("proxy.config.url_remap.filename", ts::filename::REMAP);
-  registerFile("", ts::filename::VOLUME);
-  registerFile("proxy.config.cache.hosting_filename", ts::filename::HOSTING);
-  registerFile("", ts::filename::PLUGIN);
-  registerFile("proxy.config.dns.splitdns.filename", ts::filename::SPLITDNS);
-  registerFile("proxy.config.ssl.server.multicert.filename", 
ts::filename::SSL_MULTICERT);
-  registerFile("proxy.config.ssl.servername.filename", ts::filename::SNI);
+  registerFile("proxy.config.log.config.filename", ts::filename::LOGGING, 
NOT_REQUIRED);
+  registerFile("", ts::filename::STORAGE, REQUIRED);
+  registerFile("proxy.config.socks.socks_config_file", ts::filename::SOCKS, 
NOT_REQUIRED);
+  registerFile(ts::filename::RECORDS, ts::filename::RECORDS, NOT_REQUIRED);
+  registerFile("proxy.config.cache.control.filename", ts::filename::CACHE, 
NOT_REQUIRED);
+  registerFile("proxy.config.cache.ip_allow.filename", ts::filename::IP_ALLOW, 
NOT_REQUIRED);
+  registerFile("proxy.config.http.parent_proxy.file", ts::filename::PARENT, 
NOT_REQUIRED);
+  registerFile("proxy.config.url_remap.filename", ts::filename::REMAP, 
NOT_REQUIRED);
+  registerFile("", ts::filename::VOLUME, NOT_REQUIRED);
+  registerFile("proxy.config.cache.hosting_filename", ts::filename::HOSTING, 
NOT_REQUIRED);
+  registerFile("", ts::filename::PLUGIN, NOT_REQUIRED);
+  registerFile("proxy.config.dns.splitdns.filename", ts::filename::SPLITDNS, 
NOT_REQUIRED);
+  registerFile("proxy.config.ssl.server.multicert.filename", 
ts::filename::SSL_MULTICERT, NOT_REQUIRED);
+  registerFile("proxy.config.ssl.servername.filename", ts::filename::SNI, 
NOT_REQUIRED);
 
   configFiles->registerCallback(testcall);
 }

Reply via email to