TS-3231: add the proxy.node.config.reconfigure_required metric
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/52c9e32d Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/52c9e32d Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/52c9e32d Branch: refs/heads/master Commit: 52c9e32d701e3f7338b90d8c8d9dea029c6489b8 Parents: acaedef Author: James Peach <[email protected]> Authored: Mon Nov 17 12:42:21 2014 -0800 Committer: James Peach <[email protected]> Committed: Tue Dec 9 13:48:30 2014 -0800 ---------------------------------------------------------------------- cmd/traffic_manager/traffic_manager.cc | 1 + lib/records/RecLocal.cc | 6 ++++++ mgmt/FileManager.cc | 25 ++++++++++++++++++++++++- mgmt/FileManager.h | 4 ++++ mgmt/Rollback.cc | 28 +++++++++++++++------------- mgmt/Rollback.h | 8 +++++++- mgmt/api/CoreAPI.cc | 1 + 7 files changed, 58 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/52c9e32d/cmd/traffic_manager/traffic_manager.cc ---------------------------------------------------------------------- diff --git a/cmd/traffic_manager/traffic_manager.cc b/cmd/traffic_manager/traffic_manager.cc index 9c35bad..31576c0 100644 --- a/cmd/traffic_manager/traffic_manager.cc +++ b/cmd/traffic_manager/traffic_manager.cc @@ -686,6 +686,7 @@ main(int argc, char **argv) statProcessor = new StatProcessor(configFiles); RecRegisterStatInt(RECT_NODE, "proxy.node.config.reconfigure_time", time(NULL), RECP_NON_PERSISTENT); + RecRegisterStatInt(RECT_NODE, "proxy.node.config.reconfigure_required", 0, RECP_NON_PERSISTENT); for (;;) { lmgmt->processEventQueue(); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/52c9e32d/lib/records/RecLocal.cc ---------------------------------------------------------------------- diff --git a/lib/records/RecLocal.cc b/lib/records/RecLocal.cc index aca8eec..0245f08 100644 --- a/lib/records/RecLocal.cc +++ b/lib/records/RecLocal.cc @@ -93,7 +93,13 @@ sync_thr(void * data) rb->setLastModifiedTime(); } } + } else { + // If we didn't sync to disk, check whether we need to update .... + if (configFiles->isConfigStale()) { + RecSetRecordInt("proxy.node.config.reconfigure_required", 1); + } } + usleep(REC_REMOTE_SYNC_INTERVAL_MS * 1000); } return NULL; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/52c9e32d/mgmt/FileManager.cc ---------------------------------------------------------------------- diff --git a/mgmt/FileManager.cc b/mgmt/FileManager.cc index 2ab4952..6352e11 100644 --- a/mgmt/FileManager.cc +++ b/mgmt/FileManager.cc @@ -684,7 +684,7 @@ FileManager::rereadConfig() entry != NULL; entry = ink_hash_table_iterator_next(bindings, &iterator_state)) { rb = (Rollback *) ink_hash_table_entry_value(bindings, entry); - rb->checkForUserUpdate(); + rb->checkForUserUpdate(ROLLBACK_CHECK_AND_UPDATE); } ink_mutex_release(&accessLock); @@ -698,6 +698,29 @@ FileManager::rereadConfig() } } +bool +FileManager::isConfigStale() +{ + Rollback *rb; + InkHashTableEntry *entry; + InkHashTableIteratorState iterator_state; + bool stale = false; + + ink_mutex_acquire(&accessLock); + for (entry = ink_hash_table_iterator_first(bindings, &iterator_state); + entry != NULL; entry = ink_hash_table_iterator_next(bindings, &iterator_state)) { + + rb = (Rollback *) ink_hash_table_entry_value(bindings, entry); + if (rb->checkForUserUpdate(ROLLBACK_CHECK_ONLY)) { + stale = true; + break; + } + } + + ink_mutex_release(&accessLock); + return stale; +} + // void FileManager::displaySnapPage(textBuffer* output, httpResponse& answerHdr) // // Generates an HTML page with the add form and the list http://git-wip-us.apache.org/repos/asf/trafficserver/blob/52c9e32d/mgmt/FileManager.h ---------------------------------------------------------------------- diff --git a/mgmt/FileManager.h b/mgmt/FileManager.h index eafd86f..d82b48c 100644 --- a/mgmt/FileManager.h +++ b/mgmt/FileManager.h @@ -92,6 +92,9 @@ class ExpandingArray; // list of call files being managed by the FileManager. CALLEE // is responsible for deleting the returned object // +// isConfigStale() - returns whether the in-memory files might be stale +// compared to what is on disk. +// // takeSnap(const char* snapName) - creates a new snapshot with // passed in name // @@ -112,6 +115,7 @@ public: void fileChanged(const char *baseFileName, bool incVersion); textBuffer *filesManaged(); void rereadConfig(); + bool isConfigStale(); //SnapResult takeSnap(const char* snapName); SnapResult takeSnap(const char *snapName, const char *snapDir); //SnapResult restoreSnap(const char* snapName); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/52c9e32d/mgmt/Rollback.cc ---------------------------------------------------------------------- diff --git a/mgmt/Rollback.cc b/mgmt/Rollback.cc index 5a722ea..b2e2be3 100644 --- a/mgmt/Rollback.cc +++ b/mgmt/Rollback.cc @@ -909,7 +909,7 @@ Rollback::setLastModifiedTime() // of creating a new timestamp // bool -Rollback::checkForUserUpdate() +Rollback::checkForUserUpdate(RollBackCheckType how) { struct stat fileInfo; @@ -929,19 +929,21 @@ Rollback::checkForUserUpdate() if (fileLastModified < TS_ARCHIVE_STAT_MTIME(fileInfo)) { - // We've been modified, Roll a new version - currentVersion_local = this->getCurrentVersion(); - r = this->getVersion_ml(currentVersion_local, &buf); - if (r == OK_ROLLBACK) { - r = this->updateVersion_ml(buf, currentVersion_local); - delete buf; - } - if (r != OK_ROLLBACK) { - mgmt_log(stderr, "[Rollback::checkForUserUpdate] Failed to roll changed user file %s: %s", - fileName, RollbackStrings[r]); - } + if (how == ROLLBACK_CHECK_AND_UPDATE) { + // We've been modified, Roll a new version + currentVersion_local = this->getCurrentVersion(); + r = this->getVersion_ml(currentVersion_local, &buf); + if (r == OK_ROLLBACK) { + r = this->updateVersion_ml(buf, currentVersion_local); + delete buf; + } + if (r != OK_ROLLBACK) { + mgmt_log(stderr, "[Rollback::checkForUserUpdate] Failed to roll changed user file %s: %s", + fileName, RollbackStrings[r]); + } - mgmt_log(stderr, "User has changed config file %s\n", fileName); + mgmt_log(stderr, "User has changed config file %s\n", fileName); + } result = true; } else { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/52c9e32d/mgmt/Rollback.h ---------------------------------------------------------------------- diff --git a/mgmt/Rollback.h b/mgmt/Rollback.h index 5382343..fc09403 100644 --- a/mgmt/Rollback.h +++ b/mgmt/Rollback.h @@ -59,6 +59,12 @@ enum RollBackCodes INVALID_VERSION_ROLLBACK }; +enum RollBackCheckType +{ + ROLLBACK_CHECK_AND_UPDATE, + ROLLBACK_CHECK_ONLY +}; + class ExpandingArray; // Stores info about a backup version @@ -174,7 +180,7 @@ public: version_t extractVersionInfo(ExpandingArray * listNames, const char *testFileName); // Automatically take out lock - bool checkForUserUpdate(); + bool checkForUserUpdate(RollBackCheckType); RollBackCodes removeVersion(version_t version); RollBackCodes revertToVersion(version_t version); RollBackCodes getVersion(version_t version, textBuffer ** buffer); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/52c9e32d/mgmt/api/CoreAPI.cc ---------------------------------------------------------------------- diff --git a/mgmt/api/CoreAPI.cc b/mgmt/api/CoreAPI.cc index fe11cfc..33351c5 100644 --- a/mgmt/api/CoreAPI.cc +++ b/mgmt/api/CoreAPI.cc @@ -413,6 +413,7 @@ Reconfigure() configFiles->rereadConfig(); // TM rereads lmgmt->signalEvent(MGMT_EVENT_PLUGIN_CONFIG_UPDATE, "*"); // TS rereads RecSetRecordInt("proxy.node.config.reconfigure_time", time(NULL)); + RecSetRecordInt("proxy.node.config.reconfigure_required", 0); return TS_ERR_OKAY; }
