From c04feba805c5acde92638a062cc13030fc4d3308 Mon Sep 17 00:00:00 2001 From: Yangster-mac Date: Mon, 2 Apr 2018 14:37:33 -0700 Subject: [PATCH] Move forward the alarm timestamp when config is added to statsd. Test: statsd test BUG: b/77344187 Change-Id: Ieacffaa29422829b8956f2b3fcb2c647c8c3eed9 --- cmds/statsd/benchmark/metric_util.cpp | 2 +- cmds/statsd/src/StatsLogProcessor.cpp | 5 +++-- cmds/statsd/src/StatsLogProcessor.h | 3 ++- cmds/statsd/src/anomaly/AlarmTracker.cpp | 19 +++++++++++++++---- cmds/statsd/src/anomaly/AlarmTracker.h | 9 +++++---- cmds/statsd/src/anomaly/AnomalyTracker.h | 2 +- cmds/statsd/src/config/ConfigListener.h | 3 ++- cmds/statsd/src/config/ConfigManager.cpp | 4 +++- cmds/statsd/src/metrics/MetricsManager.cpp | 4 ++-- cmds/statsd/src/metrics/MetricsManager.h | 3 ++- cmds/statsd/src/metrics/metrics_manager_util.cpp | 11 +++++++---- cmds/statsd/src/metrics/metrics_manager_util.h | 2 +- cmds/statsd/tests/ConfigManager_test.cpp | 13 +++++++------ cmds/statsd/tests/MetricsManager_test.cpp | 14 +++++++------- cmds/statsd/tests/StatsLogProcessor_test.cpp | 4 ++-- cmds/statsd/tests/anomaly/AlarmTracker_test.cpp | 11 +++++------ cmds/statsd/tests/statsd_test_util.cpp | 2 +- core/res/AndroidManifest.xml | 5 +++++ .../android/server/stats/StatsCompanionService.java | 8 ++++---- 19 files changed, 75 insertions(+), 49 deletions(-) diff --git a/cmds/statsd/benchmark/metric_util.cpp b/cmds/statsd/benchmark/metric_util.cpp index 50b05cd5b1d8..fae186ad205d 100644 --- a/cmds/statsd/benchmark/metric_util.cpp +++ b/cmds/statsd/benchmark/metric_util.cpp @@ -366,7 +366,7 @@ sp CreateStatsLogProcessor(const long timeBaseSec, const Stat sp periodicAlarmMonitor; sp processor = new StatsLogProcessor( uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, [](const ConfigKey&){}); - processor->OnConfigUpdated(key, config); + processor->OnConfigUpdated(0, key, config); return processor; } diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp index 13f2679e9b0e..f00cdb318fd7 100644 --- a/cmds/statsd/src/StatsLogProcessor.cpp +++ b/cmds/statsd/src/StatsLogProcessor.cpp @@ -191,11 +191,12 @@ void StatsLogProcessor::OnLogEvent(LogEvent* event) { } } -void StatsLogProcessor::OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config) { +void StatsLogProcessor::OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key, + const StatsdConfig& config) { std::lock_guard lock(mMetricsMutex); VLOG("Updated configuration for key %s", key.ToString().c_str()); sp newMetricsManager = - new MetricsManager(key, config, mTimeBaseSec, mUidMap, + new MetricsManager(key, config, mTimeBaseSec, (timestampNs - 1) / NS_PER_SEC + 1, mUidMap, mAnomalyAlarmMonitor, mPeriodicAlarmMonitor); if (newMetricsManager->isConfigValid()) { diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h index 387a9295055f..1c4698fbd016 100644 --- a/cmds/statsd/src/StatsLogProcessor.h +++ b/cmds/statsd/src/StatsLogProcessor.h @@ -42,7 +42,8 @@ public: void OnLogEvent(LogEvent* event); - void OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config); + void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key, + const StatsdConfig& config); void OnConfigRemoved(const ConfigKey& key); size_t GetMetricsSize(const ConfigKey& key) const; diff --git a/cmds/statsd/src/anomaly/AlarmTracker.cpp b/cmds/statsd/src/anomaly/AlarmTracker.cpp index 249cb596d3c6..70e6e84cb0ed 100644 --- a/cmds/statsd/src/anomaly/AlarmTracker.cpp +++ b/cmds/statsd/src/anomaly/AlarmTracker.cpp @@ -30,7 +30,8 @@ namespace android { namespace os { namespace statsd { -AlarmTracker::AlarmTracker(uint64_t startMillis, +AlarmTracker::AlarmTracker(const uint64_t startMillis, + const uint64_t currentMillis, const Alarm& alarm, const ConfigKey& configKey, const sp& alarmMonitor) : mAlarmConfig(alarm), @@ -38,7 +39,11 @@ AlarmTracker::AlarmTracker(uint64_t startMillis, mAlarmMonitor(alarmMonitor) { VLOG("AlarmTracker() called"); mAlarmSec = (startMillis + mAlarmConfig.offset_millis()) / MS_PER_SEC; + // startMillis is the time statsd is created. We need to find the 1st alarm timestamp after + // the config is added to statsd. + mAlarmSec = findNextAlarmSec(currentMillis / MS_PER_SEC); // round up mInternalAlarm = new InternalAlarm{static_cast(mAlarmSec)}; + VLOG("AlarmTracker sets the periodic alarm at: %lld", (long long)mAlarmSec); if (mAlarmMonitor != nullptr) { mAlarmMonitor->add(mInternalAlarm); } @@ -55,9 +60,13 @@ void AlarmTracker::addSubscription(const Subscription& subscription) { mSubscriptions.push_back(subscription); } -uint64_t AlarmTracker::findNextAlarmSec(uint64_t currentTimeSec) { - int periodsForward = (currentTimeSec - mAlarmSec) * MS_PER_SEC / mAlarmConfig.period_millis(); - return mAlarmSec + (periodsForward + 1) * mAlarmConfig.period_millis() / MS_PER_SEC; +int64_t AlarmTracker::findNextAlarmSec(int64_t currentTimeSec) { + if (currentTimeSec <= mAlarmSec) { + return mAlarmSec; + } + int64_t periodsForward = + ((currentTimeSec - mAlarmSec) * MS_PER_SEC - 1) / mAlarmConfig.period_millis() + 1; + return mAlarmSec + periodsForward * mAlarmConfig.period_millis() / MS_PER_SEC; } void AlarmTracker::informAlarmsFired( @@ -68,12 +77,14 @@ void AlarmTracker::informAlarmsFired( return; } if (!mSubscriptions.empty()) { + VLOG("AlarmTracker triggers the subscribers."); triggerSubscribers(mAlarmConfig.id(), DEFAULT_METRIC_DIMENSION_KEY, mConfigKey, mSubscriptions); } firedAlarms.erase(mInternalAlarm); mAlarmSec = findNextAlarmSec((timestampNs-1) / NS_PER_SEC + 1); // round up mInternalAlarm = new InternalAlarm{static_cast(mAlarmSec)}; + VLOG("AlarmTracker sets the periodic alarm at: %lld", (long long)mAlarmSec); if (mAlarmMonitor != nullptr) { mAlarmMonitor->add(mInternalAlarm); } diff --git a/cmds/statsd/src/anomaly/AlarmTracker.h b/cmds/statsd/src/anomaly/AlarmTracker.h index 13180a53ccbf..962a014761ee 100644 --- a/cmds/statsd/src/anomaly/AlarmTracker.h +++ b/cmds/statsd/src/anomaly/AlarmTracker.h @@ -34,7 +34,8 @@ namespace statsd { class AlarmTracker : public virtual RefBase { public: - AlarmTracker(uint64_t startMillis, + AlarmTracker(const uint64_t startMillis, + const uint64_t currentMillis, const Alarm& alarm, const ConfigKey& configKey, const sp& subscriberAlarmMonitor); @@ -53,13 +54,13 @@ protected: return mInternalAlarm == nullptr ? 0 : mInternalAlarm->timestampSec; } - uint64_t findNextAlarmSec(uint64_t currentTimeMillis); + int64_t findNextAlarmSec(int64_t currentTimeMillis); // statsd_config.proto Alarm message that defines this tracker. const Alarm mAlarmConfig; // A reference to the Alarm's config key. - const ConfigKey& mConfigKey; + const ConfigKey mConfigKey; // The subscriptions that depend on this alarm. std::vector mSubscriptions; @@ -68,7 +69,7 @@ protected: sp mAlarmMonitor; // The current expected alarm time in seconds. - uint64_t mAlarmSec; + int64_t mAlarmSec; // The current alarm. sp mInternalAlarm; diff --git a/cmds/statsd/src/anomaly/AnomalyTracker.h b/cmds/statsd/src/anomaly/AnomalyTracker.h index ae0af64cfdd3..15671a6901cb 100644 --- a/cmds/statsd/src/anomaly/AnomalyTracker.h +++ b/cmds/statsd/src/anomaly/AnomalyTracker.h @@ -127,7 +127,7 @@ protected: std::vector mSubscriptions; // A reference to the Alert's config key. - const ConfigKey& mConfigKey; + const ConfigKey mConfigKey; // Number of past buckets. One less than the total number of buckets needed // for the anomaly detection (since the current bucket is not in the past). diff --git a/cmds/statsd/src/config/ConfigListener.h b/cmds/statsd/src/config/ConfigListener.h index 19ccfcfe7491..54e77701b7dc 100644 --- a/cmds/statsd/src/config/ConfigListener.h +++ b/cmds/statsd/src/config/ConfigListener.h @@ -40,7 +40,8 @@ public: /** * A configuration was added or updated. */ - virtual void OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config) = 0; + virtual void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key, + const StatsdConfig& config) = 0; /** * A configuration was removed. diff --git a/cmds/statsd/src/config/ConfigManager.cpp b/cmds/statsd/src/config/ConfigManager.cpp index ff2509149cf8..f9aaad48abf5 100644 --- a/cmds/statsd/src/config/ConfigManager.cpp +++ b/cmds/statsd/src/config/ConfigManager.cpp @@ -21,6 +21,7 @@ #include "storage/StorageManager.h" #include "guardrail/StatsdStats.h" +#include "stats_log_util.h" #include "stats_util.h" #include @@ -109,9 +110,10 @@ void ConfigManager::UpdateConfig(const ConfigKey& key, const StatsdConfig& confi } } + const int64_t timestampNs = getElapsedRealtimeNs(); // Tell everyone for (sp listener:broadcastList) { - listener->OnConfigUpdated(key, config); + listener->OnConfigUpdated(timestampNs, key, config); } } diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp index 00188e8da0fb..c61fa7663d45 100644 --- a/cmds/statsd/src/metrics/MetricsManager.cpp +++ b/cmds/statsd/src/metrics/MetricsManager.cpp @@ -49,7 +49,7 @@ namespace statsd { const int FIELD_ID_METRICS = 1; MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config, - const long timeBaseSec, + const long timeBaseSec, const long currentTimeSec, const sp &uidMap, const sp& anomalyAlarmMonitor, const sp& periodicAlarmMonitor) @@ -58,7 +58,7 @@ MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config, mLastReportWallClockNs(getWallClockNs()) { mConfigValid = initStatsdConfig(key, config, *uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, - timeBaseSec, mTagIds, mAllAtomMatchers, + timeBaseSec, currentTimeSec, mTagIds, mAllAtomMatchers, mAllConditionTrackers, mAllMetricProducers, mAllAnomalyTrackers, mAllPeriodicAlarmTrackers, mConditionToMetricMap, mTrackerToMetricMap, mTrackerToConditionMap, mNoReportMetricIds); diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h index da0cd4a29d3b..4fd64b7baf8f 100644 --- a/cmds/statsd/src/metrics/MetricsManager.h +++ b/cmds/statsd/src/metrics/MetricsManager.h @@ -36,7 +36,8 @@ namespace statsd { // A MetricsManager is responsible for managing metrics from one single config source. class MetricsManager : public PackageInfoListener { public: - MetricsManager(const ConfigKey& configKey, const StatsdConfig& config, const long timeBaseSec, + MetricsManager(const ConfigKey& configKey, const StatsdConfig& config, + const long timeBaseSec, const long currentTimeSec, const sp& uidMap, const sp& anomalyAlarmMonitor, const sp& periodicAlarmMonitor); diff --git a/cmds/statsd/src/metrics/metrics_manager_util.cpp b/cmds/statsd/src/metrics/metrics_manager_util.cpp index 50eca05918a0..b7c5795d17fd 100644 --- a/cmds/statsd/src/metrics/metrics_manager_util.cpp +++ b/cmds/statsd/src/metrics/metrics_manager_util.cpp @@ -599,10 +599,11 @@ bool initAlerts(const StatsdConfig& config, bool initAlarms(const StatsdConfig& config, const ConfigKey& key, const sp& periodicAlarmMonitor, - const long timeBaseSec, + const long timeBaseSec, const long currentTimeSec, vector>& allAlarmTrackers) { unordered_map alarmTrackerMap; uint64_t startMillis = (uint64_t)timeBaseSec * MS_PER_SEC; + uint64_t currentTimeMillis = (uint64_t)currentTimeSec * MS_PER_SEC; for (int i = 0; i < config.alarm_size(); i++) { const Alarm& alarm = config.alarm(i); if (alarm.offset_millis() <= 0) { @@ -615,7 +616,8 @@ bool initAlarms(const StatsdConfig& config, const ConfigKey& key, } alarmTrackerMap.insert(std::make_pair(alarm.id(), allAlarmTrackers.size())); allAlarmTrackers.push_back( - new AlarmTracker(startMillis, alarm, key, periodicAlarmMonitor)); + new AlarmTracker(startMillis, currentTimeMillis, + alarm, key, periodicAlarmMonitor)); } for (int i = 0; i < config.subscription_size(); ++i) { const Subscription& subscription = config.subscription(i); @@ -644,7 +646,7 @@ bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, const UidMap& uidMap, const sp& anomalyAlarmMonitor, const sp& periodicAlarmMonitor, - const long timeBaseSec, + const long timeBaseSec, const long currentTimeSec, set& allTagIds, vector>& allAtomMatchers, vector>& allConditionTrackers, @@ -682,7 +684,8 @@ bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, ALOGE("initAlerts failed"); return false; } - if (!initAlarms(config, key, periodicAlarmMonitor, timeBaseSec, allPeriodicAlarmTrackers)) { + if (!initAlarms(config, key, periodicAlarmMonitor, + timeBaseSec, currentTimeSec, allPeriodicAlarmTrackers)) { ALOGE("initAlarms failed"); return false; } diff --git a/cmds/statsd/src/metrics/metrics_manager_util.h b/cmds/statsd/src/metrics/metrics_manager_util.h index 386de0b84aa0..3754ae01b8fc 100644 --- a/cmds/statsd/src/metrics/metrics_manager_util.h +++ b/cmds/statsd/src/metrics/metrics_manager_util.h @@ -98,7 +98,7 @@ bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, const UidMap& uidMap, const sp& anomalyAlarmMonitor, const sp& periodicAlarmMonitor, - const long timeBaseSec, + const long timeBaseSec, const long currentTimeSec, std::set& allTagIds, std::vector>& allAtomMatchers, std::vector>& allConditionTrackers, diff --git a/cmds/statsd/tests/ConfigManager_test.cpp b/cmds/statsd/tests/ConfigManager_test.cpp index 838745e67aee..9455304a1af6 100644 --- a/cmds/statsd/tests/ConfigManager_test.cpp +++ b/cmds/statsd/tests/ConfigManager_test.cpp @@ -44,7 +44,8 @@ static ostream& operator<<(ostream& os, const StatsdConfig& config) { */ class MockListener : public ConfigListener { public: - MOCK_METHOD2(OnConfigUpdated, void(const ConfigKey& key, const StatsdConfig& config)); + MOCK_METHOD3(OnConfigUpdated, void(const int64_t timestampNs, const ConfigKey& key, + const StatsdConfig& config)); MOCK_METHOD1(OnConfigRemoved, void(const ConfigKey& key)); }; @@ -88,25 +89,25 @@ TEST(ConfigManagerTest, TestAddUpdateRemove) { manager->StartupForTest(); // Add another one - EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(1, StringToId("zzz")), + EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")), StatsdConfigEq(91))) .RetiresOnSaturation(); manager->UpdateConfig(ConfigKey(1, StringToId("zzz")), config91); // Update It - EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(1, StringToId("zzz")), + EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")), StatsdConfigEq(92))) .RetiresOnSaturation(); manager->UpdateConfig(ConfigKey(1, StringToId("zzz")), config92); // Add one with the same uid but a different name - EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(1, StringToId("yyy")), + EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("yyy")), StatsdConfigEq(93))) .RetiresOnSaturation(); manager->UpdateConfig(ConfigKey(1, StringToId("yyy")), config93); // Add one with the same name but a different uid - EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(2, StringToId("zzz")), + EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(2, StringToId("zzz")), StatsdConfigEq(94))) .RetiresOnSaturation(); manager->UpdateConfig(ConfigKey(2, StringToId("zzz")), config94); @@ -142,7 +143,7 @@ TEST(ConfigManagerTest, TestRemoveUid) { StatsdConfig config; - EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, _)).Times(5); + EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, _, _)).Times(5); EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("xxx")))); EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("yyy")))); EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("zzz")))); diff --git a/cmds/statsd/tests/MetricsManager_test.cpp b/cmds/statsd/tests/MetricsManager_test.cpp index 5d8c3f72551e..07378dbcce1a 100644 --- a/cmds/statsd/tests/MetricsManager_test.cpp +++ b/cmds/statsd/tests/MetricsManager_test.cpp @@ -287,7 +287,7 @@ TEST(MetricsManagerTest, TestGoodConfig) { EXPECT_TRUE(initStatsdConfig(kConfigKey, config, uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, - timeBaseSec, allTagIds, allAtomMatchers, + timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers, allConditionTrackers, allMetricProducers, allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, @@ -315,7 +315,7 @@ TEST(MetricsManagerTest, TestDimensionMetricsWithMultiTags) { EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, - timeBaseSec, allTagIds, allAtomMatchers, + timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers, allConditionTrackers, allMetricProducers, allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, @@ -340,7 +340,7 @@ TEST(MetricsManagerTest, TestCircleLogMatcherDependency) { EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, - timeBaseSec, allTagIds, allAtomMatchers, + timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers, allConditionTrackers, allMetricProducers, allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, @@ -364,7 +364,7 @@ TEST(MetricsManagerTest, TestMissingMatchers) { std::set noReportMetricIds; EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, - timeBaseSec, allTagIds, allAtomMatchers, + timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers, allConditionTrackers, allMetricProducers, allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, @@ -388,7 +388,7 @@ TEST(MetricsManagerTest, TestMissingPredicate) { std::set noReportMetricIds; EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, - timeBaseSec, allTagIds, allAtomMatchers, + timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers, allConditionTrackers, allMetricProducers, allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, @@ -413,7 +413,7 @@ TEST(MetricsManagerTest, TestCirclePredicateDependency) { EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, - timeBaseSec, allTagIds, allAtomMatchers, + timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers, allConditionTrackers, allMetricProducers, allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, @@ -438,7 +438,7 @@ TEST(MetricsManagerTest, testAlertWithUnknownMetric) { EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, - timeBaseSec, allTagIds, allAtomMatchers, + timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers, allConditionTrackers, allMetricProducers, allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, diff --git a/cmds/statsd/tests/StatsLogProcessor_test.cpp b/cmds/statsd/tests/StatsLogProcessor_test.cpp index 4b9a87d78817..5a8ba7915a00 100644 --- a/cmds/statsd/tests/StatsLogProcessor_test.cpp +++ b/cmds/statsd/tests/StatsLogProcessor_test.cpp @@ -43,7 +43,7 @@ using android::util::ProtoOutputStream; class MockMetricsManager : public MetricsManager { public: MockMetricsManager() : MetricsManager( - ConfigKey(1, 12345), StatsdConfig(), 1000, + ConfigKey(1, 12345), StatsdConfig(), 1000, 1000, new UidMap(), new AlarmMonitor(10, [](const sp&, int64_t){}, [](const sp&){}), @@ -135,7 +135,7 @@ TEST(StatsLogProcessorTest, TestUidMapHasSnapshot) { ConfigKey key(3, 4); StatsdConfig config; config.add_allowed_log_source("AID_ROOT"); - p.OnConfigUpdated(key, config); + p.OnConfigUpdated(0, key, config); // Expect to get no metrics, but snapshot specified above in uidmap. vector bytes; diff --git a/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp b/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp index 3330ee93eddf..5e6de1cc6b91 100644 --- a/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp +++ b/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp @@ -39,25 +39,24 @@ TEST(AlarmTrackerTest, TestTriggerTimestamp) { Alarm alarm; alarm.set_offset_millis(15 * MS_PER_SEC); alarm.set_period_millis(60 * 60 * MS_PER_SEC); // 1hr - uint64_t startMillis = 100000000 * MS_PER_SEC; - AlarmTracker tracker(startMillis, alarm, kConfigKey, - subscriberAlarmMonitor); + int64_t startMillis = 100000000 * MS_PER_SEC; + AlarmTracker tracker(startMillis, startMillis, alarm, kConfigKey, subscriberAlarmMonitor); - EXPECT_EQ(tracker.mAlarmSec, startMillis / MS_PER_SEC + 15); + EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15)); uint64_t currentTimeSec = startMillis / MS_PER_SEC + 10; std::unordered_set, SpHash> firedAlarmSet = subscriberAlarmMonitor->popSoonerThan(static_cast(currentTimeSec)); EXPECT_TRUE(firedAlarmSet.empty()); tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet); - EXPECT_EQ(tracker.mAlarmSec, startMillis / MS_PER_SEC + 15); + EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15)); currentTimeSec = startMillis / MS_PER_SEC + 7000; firedAlarmSet = subscriberAlarmMonitor->popSoonerThan(static_cast(currentTimeSec)); EXPECT_EQ(firedAlarmSet.size(), 1u); tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet); EXPECT_TRUE(firedAlarmSet.empty()); - EXPECT_EQ(tracker.mAlarmSec, startMillis / MS_PER_SEC + 15 + 2 * 60 * 60); + EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15 + 2 * 60 * 60)); } } // namespace statsd diff --git a/cmds/statsd/tests/statsd_test_util.cpp b/cmds/statsd/tests/statsd_test_util.cpp index d0840f050723..0acd297627d9 100644 --- a/cmds/statsd/tests/statsd_test_util.cpp +++ b/cmds/statsd/tests/statsd_test_util.cpp @@ -455,7 +455,7 @@ sp CreateStatsLogProcessor(const long timeBaseSec, const Stat [](const sp&){}); sp processor = new StatsLogProcessor( uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, [](const ConfigKey&){}); - processor->OnConfigUpdated(key, config); + processor->OnConfigUpdated(timeBaseSec, key, config); return processor; } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index f4715fc7645d..04c41306f480 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4248,6 +4248,11 @@ android:exported="false"> + + + diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java index fae0b24ff535..d4625e91c47f 100644 --- a/services/core/java/com/android/server/stats/StatsCompanionService.java +++ b/services/core/java/com/android/server/stats/StatsCompanionService.java @@ -379,7 +379,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { @Override public void onReceive(Context context, Intent intent) { if (DEBUG) - Slog.d(TAG, "Time to poll something."); + Slog.d(TAG, "Time to trigger periodic alarm."); synchronized (sStatsdLock) { if (sStatsd == null) { Slog.w(TAG, "Could not access statsd to inform it of periodic alarm firing."); @@ -455,13 +455,13 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { public void setAlarmForSubscriberTriggering(long timestampMs) { enforceCallingPermission(); if (DEBUG) - Slog.d(TAG, "Setting periodic alarm at " + timestampMs); + Slog.d(TAG, "Setting periodic alarm in about " + + (timestampMs - SystemClock.elapsedRealtime())); final long callingToken = Binder.clearCallingIdentity(); try { // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will // only fire when it awakens. - // This alarm is inexact, leaving its exactness completely up to the OS optimizations. - mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, timestampMs, mPeriodicAlarmIntent); + mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, mPeriodicAlarmIntent); } finally { Binder.restoreCallingIdentity(callingToken); } -- 2.11.0