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); }