From a87fab667c44260fc159d8e2c4f386359be2ebb2 Mon Sep 17 00:00:00 2001 From: Marcin Oczeretko Date: Wed, 10 Feb 2021 14:26:26 +0000 Subject: [PATCH] Limit PerfettoTrigger to max 1 trigger per minute Test: manual Bug: 161781469 Change-Id: Ie35e1fe7e6a12ab75a60c21f442adcd73372050f --- .../android/internal/util/PerfettoTrigger.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/util/PerfettoTrigger.java b/core/java/com/android/internal/util/PerfettoTrigger.java index 9c87c697a7376..c7585046cf9c6 100644 --- a/core/java/com/android/internal/util/PerfettoTrigger.java +++ b/core/java/com/android/internal/util/PerfettoTrigger.java @@ -16,6 +16,7 @@ package com.android.internal.util; +import android.os.SystemClock; import android.util.Log; import java.io.IOException; @@ -27,16 +28,28 @@ 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; /** * @param triggerName The name of the trigger. Must match the value defined in the AOT * Perfetto config. */ 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; + } + try { ProcessBuilder pb = new ProcessBuilder(TRIGGER_COMMAND, triggerName); Log.v(TAG, "Triggering " + String.join(" ", pb.command())); - Process process = pb.start(); + pb.start(); + sLastTriggerTime = SystemClock.elapsedRealtime(); } catch (IOException e) { Log.w(TAG, "Failed to trigger " + triggerName, e); }