From 906a2e4fb2d03d8296c6e8219334759193724da4 Mon Sep 17 00:00:00 2001 From: Tej Singh Date: Thu, 30 Jul 2020 13:40:19 -0700 Subject: [PATCH] Set up config update code path This sets up a basic code path for implementing modular config updates. Test: m statsd Change-Id: I7db188fb0ac2f6a0e021f476f4c1ae5b752dc878 --- cmds/statsd/src/StatsLogProcessor.cpp | 37 +++++++++++++------ cmds/statsd/src/StatsLogProcessor.h | 4 +- cmds/statsd/src/metrics/MetricsManager.cpp | 4 ++ cmds/statsd/src/metrics/MetricsManager.h | 2 + .../statsd/src/packages/PackageInfoListener.h | 2 + cmds/statsd/src/packages/UidMap.h | 1 - 6 files changed, 36 insertions(+), 14 deletions(-) diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp index 05e9ec3a17696..ad90269aabcf0 100644 --- a/cmds/statsd/src/StatsLogProcessor.cpp +++ b/cmds/statsd/src/StatsLogProcessor.cpp @@ -513,19 +513,34 @@ void StatsLogProcessor::OnConfigUpdated(const int64_t timestampNs, const ConfigK OnConfigUpdatedLocked(timestampNs, key, config); } -void StatsLogProcessor::OnConfigUpdatedLocked( - const int64_t timestampNs, const ConfigKey& key, const StatsdConfig& config) { +void StatsLogProcessor::OnConfigUpdatedLocked(const int64_t timestampNs, const ConfigKey& key, + const StatsdConfig& config, bool modularUpdate) { VLOG("Updated configuration for key %s", key.ToString().c_str()); - sp newMetricsManager = - new MetricsManager(key, config, mTimeBaseNs, timestampNs, mUidMap, mPullerManager, - mAnomalyAlarmMonitor, mPeriodicAlarmMonitor); - if (newMetricsManager->isConfigValid()) { - newMetricsManager->init(); - mUidMap->OnConfigUpdated(key); - newMetricsManager->refreshTtl(timestampNs); - mMetricsManagers[key] = newMetricsManager; - VLOG("StatsdConfig valid"); + // Create new config if this is not a modular update or if this is a new config. + const auto& it = mMetricsManagers.find(key); + bool configValid = false; + if (!modularUpdate || it == mMetricsManagers.end()) { + sp newMetricsManager = + new MetricsManager(key, config, mTimeBaseNs, timestampNs, mUidMap, mPullerManager, + mAnomalyAlarmMonitor, mPeriodicAlarmMonitor); + configValid = newMetricsManager->isConfigValid(); + if (configValid) { + newMetricsManager->init(); + mUidMap->OnConfigUpdated(key); + newMetricsManager->refreshTtl(timestampNs); + mMetricsManagers[key] = newMetricsManager; + VLOG("StatsdConfig valid"); + } } else { + // Preserve the existing MetricsManager, update necessary components and metadata in place. + configValid = it->second->updateConfig(timestampNs, config); + if (configValid) { + // TODO(b/162323476): refresh TTL, ensure init() is handled properly. + mUidMap->OnConfigUpdated(key); + + } + } + if (!configValid) { // If there is any error in the config, don't use it. // Remove any existing config with the same key. ALOGE("StatsdConfig NOT valid"); diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h index c0f54a0995ac1..aad543485a39d 100644 --- a/cmds/statsd/src/StatsLogProcessor.h +++ b/cmds/statsd/src/StatsLogProcessor.h @@ -183,8 +183,8 @@ private: void resetIfConfigTtlExpiredLocked(const int64_t timestampNs); - void OnConfigUpdatedLocked( - const int64_t currentTimestampNs, const ConfigKey& key, const StatsdConfig& config); + void OnConfigUpdatedLocked(const int64_t currentTimestampNs, const ConfigKey& key, + const StatsdConfig& config, bool modularUpdate = false); void GetActiveConfigsLocked(const int uid, vector& outActiveConfigs); diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp index 60de1a24cce56..189d8117ae553 100644 --- a/cmds/statsd/src/metrics/MetricsManager.cpp +++ b/cmds/statsd/src/metrics/MetricsManager.cpp @@ -195,6 +195,10 @@ MetricsManager::~MetricsManager() { VLOG("~MetricsManager()"); } +bool MetricsManager::updateConfig(const int64_t currentTimeNs, const StatsdConfig& config) { + return mConfigValid; +} + void MetricsManager::initLogSourceWhiteList() { std::lock_guard lock(mAllowedLogSourcesMutex); mAllowedLogSources.clear(); diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h index ad30a88c5d191..042de29e173d8 100644 --- a/cmds/statsd/src/metrics/MetricsManager.h +++ b/cmds/statsd/src/metrics/MetricsManager.h @@ -46,6 +46,8 @@ public: virtual ~MetricsManager(); + bool updateConfig(const int64_t currentTimeNs, const StatsdConfig& config); + // Return whether the configuration is valid. bool isConfigValid() const; diff --git a/cmds/statsd/src/packages/PackageInfoListener.h b/cmds/statsd/src/packages/PackageInfoListener.h index 6c50a8c417703..1bc84c5433f92 100644 --- a/cmds/statsd/src/packages/PackageInfoListener.h +++ b/cmds/statsd/src/packages/PackageInfoListener.h @@ -17,6 +17,8 @@ #ifndef STATSD_PACKAGE_INFO_LISTENER_H #define STATSD_PACKAGE_INFO_LISTENER_H +#include + #include namespace android { diff --git a/cmds/statsd/src/packages/UidMap.h b/cmds/statsd/src/packages/UidMap.h index 22250aee402e6..622321b804ece 100644 --- a/cmds/statsd/src/packages/UidMap.h +++ b/cmds/statsd/src/packages/UidMap.h @@ -17,7 +17,6 @@ #pragma once #include "config/ConfigKey.h" -#include "config/ConfigListener.h" #include "packages/PackageInfoListener.h" #include "stats_util.h"