Merge "Fix edge case in statsd alarms" am: 246140a9a3
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1352686 Change-Id: Ie35e7c86667f4cdeeeb6cea0a45b1d7d75275909
This commit is contained in:
@@ -61,11 +61,11 @@ void AlarmTracker::addSubscription(const Subscription& subscription) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int64_t AlarmTracker::findNextAlarmSec(int64_t currentTimeSec) {
|
int64_t AlarmTracker::findNextAlarmSec(int64_t currentTimeSec) {
|
||||||
if (currentTimeSec <= mAlarmSec) {
|
if (currentTimeSec < mAlarmSec) {
|
||||||
return mAlarmSec;
|
return mAlarmSec;
|
||||||
}
|
}
|
||||||
int64_t periodsForward =
|
int64_t periodsForward =
|
||||||
((currentTimeSec - mAlarmSec) * MS_PER_SEC - 1) / mAlarmConfig.period_millis() + 1;
|
((currentTimeSec - mAlarmSec) * MS_PER_SEC) / mAlarmConfig.period_millis() + 1;
|
||||||
return mAlarmSec + periodsForward * mAlarmConfig.period_millis() / MS_PER_SEC;
|
return mAlarmSec + periodsForward * mAlarmConfig.period_millis() / MS_PER_SEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,23 +40,47 @@ TEST(AlarmTrackerTest, TestTriggerTimestamp) {
|
|||||||
alarm.set_offset_millis(15 * MS_PER_SEC);
|
alarm.set_offset_millis(15 * MS_PER_SEC);
|
||||||
alarm.set_period_millis(60 * 60 * MS_PER_SEC); // 1hr
|
alarm.set_period_millis(60 * 60 * MS_PER_SEC); // 1hr
|
||||||
int64_t startMillis = 100000000 * MS_PER_SEC;
|
int64_t startMillis = 100000000 * MS_PER_SEC;
|
||||||
|
int64_t nextAlarmTime = startMillis / MS_PER_SEC + 15;
|
||||||
AlarmTracker tracker(startMillis, startMillis, alarm, kConfigKey, subscriberAlarmMonitor);
|
AlarmTracker tracker(startMillis, startMillis, alarm, kConfigKey, subscriberAlarmMonitor);
|
||||||
|
|
||||||
EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15));
|
EXPECT_EQ(tracker.mAlarmSec, nextAlarmTime);
|
||||||
|
|
||||||
uint64_t currentTimeSec = startMillis / MS_PER_SEC + 10;
|
uint64_t currentTimeSec = startMillis / MS_PER_SEC + 10;
|
||||||
std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> firedAlarmSet =
|
std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> firedAlarmSet =
|
||||||
subscriberAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
|
subscriberAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
|
||||||
EXPECT_TRUE(firedAlarmSet.empty());
|
EXPECT_TRUE(firedAlarmSet.empty());
|
||||||
tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet);
|
tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet);
|
||||||
EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15));
|
EXPECT_EQ(tracker.mAlarmSec, nextAlarmTime);
|
||||||
|
EXPECT_EQ(tracker.getAlarmTimestampSec(), nextAlarmTime);
|
||||||
|
|
||||||
currentTimeSec = startMillis / MS_PER_SEC + 7000;
|
currentTimeSec = startMillis / MS_PER_SEC + 7000;
|
||||||
|
nextAlarmTime = startMillis / MS_PER_SEC + 15 + 2 * 60 * 60;
|
||||||
firedAlarmSet = subscriberAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
|
firedAlarmSet = subscriberAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
|
||||||
EXPECT_EQ(firedAlarmSet.size(), 1u);
|
EXPECT_EQ(firedAlarmSet.size(), 1u);
|
||||||
tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet);
|
tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet);
|
||||||
EXPECT_TRUE(firedAlarmSet.empty());
|
EXPECT_TRUE(firedAlarmSet.empty());
|
||||||
EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15 + 2 * 60 * 60));
|
EXPECT_EQ(tracker.mAlarmSec, nextAlarmTime);
|
||||||
|
EXPECT_EQ(tracker.getAlarmTimestampSec(), nextAlarmTime);
|
||||||
|
|
||||||
|
// Alarm fires exactly on time.
|
||||||
|
currentTimeSec = startMillis / MS_PER_SEC + 15 + 2 * 60 * 60;
|
||||||
|
nextAlarmTime = startMillis / MS_PER_SEC + 15 + 3 * 60 * 60;
|
||||||
|
firedAlarmSet = subscriberAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
|
||||||
|
ASSERT_EQ(firedAlarmSet.size(), 1u);
|
||||||
|
tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet);
|
||||||
|
EXPECT_TRUE(firedAlarmSet.empty());
|
||||||
|
EXPECT_EQ(tracker.mAlarmSec, nextAlarmTime);
|
||||||
|
EXPECT_EQ(tracker.getAlarmTimestampSec(), nextAlarmTime);
|
||||||
|
|
||||||
|
// Alarm fires exactly 1 period late.
|
||||||
|
currentTimeSec = startMillis / MS_PER_SEC + 15 + 4 * 60 * 60;
|
||||||
|
nextAlarmTime = startMillis / MS_PER_SEC + 15 + 5 * 60 * 60;
|
||||||
|
firedAlarmSet = subscriberAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
|
||||||
|
ASSERT_EQ(firedAlarmSet.size(), 1u);
|
||||||
|
tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet);
|
||||||
|
EXPECT_TRUE(firedAlarmSet.empty());
|
||||||
|
EXPECT_EQ(tracker.mAlarmSec, nextAlarmTime);
|
||||||
|
EXPECT_EQ(tracker.getAlarmTimestampSec(), nextAlarmTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace statsd
|
} // namespace statsd
|
||||||
|
|||||||
Reference in New Issue
Block a user