Guardrail for pull cooldown/timeout
Enforce a 1 second minimum cooldown and a 10 second maximum timeout on
pullers.
Test: bit statsd_test:*
Test: atest LibStatsPullTests
Test: atest GtsStatsdHostTestCases
Bug: 152543610
Change-Id: Ida0047235a7e56d7b700f1a7ab5cfbc2a147caeb
diff --git a/apex/statsd/framework/java/android/app/StatsManager.java b/apex/statsd/framework/java/android/app/StatsManager.java
index f021dcf..62badb4 100644
--- a/apex/statsd/framework/java/android/app/StatsManager.java
+++ b/apex/statsd/framework/java/android/app/StatsManager.java
@@ -616,7 +616,7 @@
/**
* Set the cool down time of the pull in milliseconds. If two successive pulls are
* issued within the cool down, a cached version of the first pull will be used for the
- * second pull.
+ * second pull. The minimum allowed cool down is 1 second.
*/
@NonNull
public Builder setCoolDownMillis(long coolDownMillis) {
@@ -625,7 +625,8 @@
}
/**
- * Set the maximum time the pull can take in milliseconds.
+ * Set the maximum time the pull can take in milliseconds. The maximum allowed timeout
+ * is 10 seconds.
*/
@NonNull
public Builder setTimeoutMillis(long timeoutMillis) {
diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp
index 4ffa3d8..a3701a7 100644
--- a/cmds/statsd/src/external/StatsPullerManager.cpp
+++ b/cmds/statsd/src/external/StatsPullerManager.cpp
@@ -313,8 +313,10 @@
// TODO(b/146439412): linkToDeath with the callback so that we can remove it
// and delete the puller.
StatsdStats::getInstance().notePullerCallbackRegistrationChanged(atomTag, /*registered=*/true);
- kAllPullAtomInfo[{.atomTag = atomTag, .uid = useUid ? uid : -1}] =
- new StatsCallbackPuller(atomTag, callback, coolDownNs, timeoutNs, additiveFields);
+ int64_t actualCoolDownNs = coolDownNs < kMinCoolDownNs ? kMinCoolDownNs : coolDownNs;
+ int64_t actualTimeoutNs = timeoutNs > kMaxTimeoutNs ? kMaxTimeoutNs : timeoutNs;
+ kAllPullAtomInfo[{.atomTag = atomTag, .uid = useUid ? uid : -1}] = new StatsCallbackPuller(
+ atomTag, callback, actualCoolDownNs, actualTimeoutNs, additiveFields);
}
void StatsPullerManager::UnregisterPullAtomCallback(const int uid, const int32_t atomTag) {
diff --git a/cmds/statsd/src/external/StatsPullerManager.h b/cmds/statsd/src/external/StatsPullerManager.h
index 714b0ae..c5824a8 100644
--- a/cmds/statsd/src/external/StatsPullerManager.h
+++ b/cmds/statsd/src/external/StatsPullerManager.h
@@ -66,6 +66,7 @@
virtual ~StatsPullerManager() {
}
+
// Registers a receiver for tagId. It will be pulled on the nextPullTimeNs
// and then every intervalNs thereafter.
virtual void RegisterReceiver(int tagId, const ConfigKey& configKey,
@@ -124,6 +125,8 @@
std::map<const PullerKey, sp<StatsPuller>> kAllPullAtomInfo;
private:
+ const static int64_t kMinCoolDownNs = NS_PER_SEC;
+ const static int64_t kMaxTimeoutNs = 10 * NS_PER_SEC;
shared_ptr<IStatsCompanionService> mStatsCompanionService = nullptr;
// A struct containing an atom id and a Config Key