From 8f42ba0e2c70a441bc7821dd32d5bab1c562b062 Mon Sep 17 00:00:00 2001 From: Yao Chen Date: Tue, 27 Feb 2018 15:17:07 -0800 Subject: [PATCH] Avoid reading logs that were processed before. This could happen when statsd is disconnected from logd reader. When we reconnect, we are going to get all events from the buffer again. Bug: 72379125 Test: manual Change-Id: Ie0122d5452555500c3bdfc1f905a0b1c646efdf7 --- cmds/statsd/src/StatsLogProcessor.cpp | 8 ++++++-- cmds/statsd/src/StatsLogProcessor.h | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp index 87dec5d1656d2..09fbf282a7952 100644 --- a/cmds/statsd/src/StatsLogProcessor.cpp +++ b/cmds/statsd/src/StatsLogProcessor.cpp @@ -72,7 +72,8 @@ StatsLogProcessor::StatsLogProcessor(const sp& uidMap, : mUidMap(uidMap), mAnomalyMonitor(anomalyMonitor), mSendBroadcast(sendBroadcast), - mTimeBaseSec(timeBaseSec) { + mTimeBaseSec(timeBaseSec), + mLastLogTimestamp(0) { StatsPullerManager statsPullerManager; statsPullerManager.SetTimeBaseSec(mTimeBaseSec); } @@ -133,9 +134,12 @@ void StatsLogProcessor::onIsolatedUidChangedEventLocked(const LogEvent& event) { } } -// TODO: what if statsd service restarts? How do we know what logs are already processed before? void StatsLogProcessor::OnLogEvent(LogEvent* event) { std::lock_guard lock(mMetricsMutex); + if (event->GetElapsedTimestampNs() < mLastLogTimestamp) { + return; + } + mLastLogTimestamp = event->GetElapsedTimestampNs(); StatsdStats::getInstance().noteAtomLogged( event->GetTagId(), event->GetElapsedTimestampNs() / NS_PER_SEC); diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h index 144430639d9f4..1adc6c7a8d024 100644 --- a/cmds/statsd/src/StatsLogProcessor.h +++ b/cmds/statsd/src/StatsLogProcessor.h @@ -98,6 +98,8 @@ private: const long mTimeBaseSec; + int64_t mLastLogTimestamp; + long mLastPullerCacheClearTimeSec = 0; FRIEND_TEST(StatsLogProcessorTest, TestRateLimitByteSize);