From 6c5c8abcd8151a1f1d793af7e6a432eb298a688c Mon Sep 17 00:00:00 2001 From: Marcin Oczeretko Date: Tue, 15 Feb 2022 15:32:33 +0000 Subject: [PATCH] Change PerfettoTrigger throttling to be per trigger name This is to allow us to collect more representative traces even if one of the triggers is invoked more frequently than other. Increased the throttling to be 5min per trigger name Bug: 213920740 Test: manual - flashed and checked logcat Change-Id: I078c640cc1e72c4ce8641b047fc90eb13bc8f2a4 --- .../internal/util/PerfettoTrigger.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/core/java/com/android/internal/util/PerfettoTrigger.java b/core/java/com/android/internal/util/PerfettoTrigger.java index c7585046cf9c6..f3af52819eb81 100644 --- a/core/java/com/android/internal/util/PerfettoTrigger.java +++ b/core/java/com/android/internal/util/PerfettoTrigger.java @@ -18,6 +18,7 @@ package com.android.internal.util; import android.os.SystemClock; import android.util.Log; +import android.util.SparseLongArray; import java.io.IOException; @@ -28,8 +29,9 @@ import java.io.IOException; public class PerfettoTrigger { private static final String TAG = "PerfettoTrigger"; private static final String TRIGGER_COMMAND = "/system/bin/trigger_perfetto"; - private static final long THROTTLE_MILLIS = 60000; - private static volatile long sLastTriggerTime = -THROTTLE_MILLIS; + private static final long THROTTLE_MILLIS = 300000; + private static final SparseLongArray sLastInvocationPerTrigger = new SparseLongArray(100); + private static final Object sLock = new Object(); /** * @param triggerName The name of the trigger. Must match the value defined in the AOT @@ -38,18 +40,23 @@ public class PerfettoTrigger { public static void trigger(String triggerName) { // Trace triggering has a non-negligible cost (fork+exec). // To mitigate potential excessive triggering by the API client we ignore calls that happen - // too quickl after the most recent trigger. - long sinceLastTrigger = SystemClock.elapsedRealtime() - sLastTriggerTime; - if (sinceLastTrigger < THROTTLE_MILLIS) { - Log.v(TAG, "Not triggering " + triggerName + " - not enough time since last trigger"); - return; + // too quickly after the most recent trigger. + synchronized (sLock) { + long lastTrigger = sLastInvocationPerTrigger.get(triggerName.hashCode()); + long sinceLastTrigger = SystemClock.elapsedRealtime() - lastTrigger; + if (sinceLastTrigger < THROTTLE_MILLIS) { + Log.v(TAG, "Not triggering " + triggerName + + " - not enough time since last trigger"); + return; + } + + sLastInvocationPerTrigger.put(triggerName.hashCode(), SystemClock.elapsedRealtime()); } try { ProcessBuilder pb = new ProcessBuilder(TRIGGER_COMMAND, triggerName); Log.v(TAG, "Triggering " + String.join(" ", pb.command())); pb.start(); - sLastTriggerTime = SystemClock.elapsedRealtime(); } catch (IOException e) { Log.w(TAG, "Failed to trigger " + triggerName, e); }