From: David Chen Date: Wed, 16 May 2018 00:50:32 +0000 (-0700) Subject: Fixes Value metrics in statsd and app upgrades. X-Git-Tag: android-x86-9.0-r1~110^2~2^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=092a5a9b85782afc2045087f9f29dfda16070f13;p=android-x86%2Fframeworks-base.git Fixes Value metrics in statsd and app upgrades. Pulled value metrics with conditions had a subtle bug that caused us to leave the condition on even if it should've been false. Bug: 79778783 Test: Added unit-test and verified on marlin-eng. Change-Id: I31f34791118319b3471f7a6ea8a024e2d511cfe7 --- diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h index 113be4b39944..a1a551101fd6 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.h +++ b/cmds/statsd/src/metrics/ValueMetricProducer.h @@ -51,7 +51,7 @@ public: const int64_t version) override { std::lock_guard lock(mMutex); - if (mPullTagId != -1) { + if (mPullTagId != -1 && (mCondition == true || mConditionTrackerIndex < 0) ) { vector> allData; mStatsPullerManager->Pull(mPullTagId, eventTimeNs, &allData); if (allData.size() == 0) { @@ -73,7 +73,9 @@ public: data->setElapsedTimestampNs(eventTimeNs); onMatchedLogEventLocked(0, *data); } - } else { // For pushed value metric, we simply flush and reset the current bucket start. + } else { + // For pushed value metric or pulled metric where condition is not true, + // we simply flush and reset the current bucket start. flushCurrentBucketLocked(eventTimeNs); mCurrentBucketStartTimeNs = eventTimeNs; } @@ -168,6 +170,7 @@ private: FRIEND_TEST(ValueMetricProducerTest, TestEventsWithNonSlicedCondition); FRIEND_TEST(ValueMetricProducerTest, TestPushedEventsWithUpgrade); FRIEND_TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade); + FRIEND_TEST(ValueMetricProducerTest, TestPulledValueWithUpgradeWhileConditionFalse); FRIEND_TEST(ValueMetricProducerTest, TestPushedEventsWithoutCondition); FRIEND_TEST(ValueMetricProducerTest, TestAnomalyDetection); FRIEND_TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition); diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp index 81d889241b73..087a612d19ce 100644 --- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp +++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp @@ -308,6 +308,57 @@ TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade) { EXPECT_EQ(30L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][1].mValue); } +TEST(ValueMetricProducerTest, TestPulledValueWithUpgradeWhileConditionFalse) { + ValueMetric metric; + metric.set_id(metricId); + metric.set_bucket(ONE_MINUTE); + metric.mutable_value_field()->set_field(tagId); + metric.mutable_value_field()->add_child()->set_field(2); + metric.set_condition(StringToId("SCREEN_ON")); + + sp wizard = new NaggyMock(); + shared_ptr pullerManager = + make_shared>(); + EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, _, _, _)).WillOnce(Return()); + EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, _)).WillOnce(Return()); + EXPECT_CALL(*pullerManager, Pull(tagId, _, _)) + .WillOnce(Invoke([](int tagId, int64_t timeNs, + vector>* data) { + data->clear(); + shared_ptr event = make_shared(tagId, bucketStartTimeNs + 10); + event->write(tagId); + event->write(100); + event->init(); + data->push_back(event); + return true; + })) + .WillOnce(Invoke([](int tagId, int64_t timeNs, + vector>* data) { + data->clear(); + shared_ptr event = make_shared(tagId, bucketStartTimeNs + 10); + event->write(tagId); + event->write(120); + event->init(); + data->push_back(event); + return true; + })); + ValueMetricProducer valueProducer(kConfigKey, metric, 1, wizard, tagId, bucketStartTimeNs, + bucketStartTimeNs, pullerManager); + valueProducer.setBucketSize(60 * NS_PER_SEC); + valueProducer.onConditionChanged(true, bucketStartTimeNs + 1); + + valueProducer.onConditionChanged(false, bucket2StartTimeNs-100); + EXPECT_FALSE(valueProducer.mCondition); + + valueProducer.notifyAppUpgrade(bucket2StartTimeNs-50, "ANY.APP", 1, 1); + // Expect one full buckets already done and starting a partial bucket. + EXPECT_EQ(bucket2StartTimeNs-50, valueProducer.mCurrentBucketStartTimeNs); + EXPECT_EQ(1UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size()); + EXPECT_EQ(bucketStartTimeNs, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketStartNs); + EXPECT_EQ(20L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mValue); + EXPECT_FALSE(valueProducer.mCondition); +} + TEST(ValueMetricProducerTest, TestPushedEventsWithoutCondition) { ValueMetric metric; metric.set_id(metricId);