Merge "Add the ability to reset dropbox rate limiter with a shell command." am: 1a0d812cd8 am: 7f94f53ee2 am: d4e2ca0c98

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2201637

Change-Id: Icef47d84bd2ef78e01e47d2349fe2b706e1d53ca
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 8856147..bc065d1 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -17794,6 +17794,13 @@
     }
 
     /**
+     * Reset the dropbox rate limiter
+     */
+    void resetDropboxRateLimiter() {
+        mDropboxRateLimiter.reset();
+    }
+
+    /**
      * Kill processes for the user with id userId and that depend on the package named packageName
      */
     @Override
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index a3ae35e..869c6a4 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -350,6 +350,8 @@
                     return runSetBgAbusiveUids(pw);
                 case "list-bg-exemptions-config":
                     return runListBgExemptionsConfig(pw);
+                case "reset-dropbox-rate-limiter":
+                    return runResetDropboxRateLimiter();
                 default:
                     return handleDefaultCommands(cmd);
             }
@@ -3374,6 +3376,11 @@
         return 0;
     }
 
+    int runResetDropboxRateLimiter() throws RemoteException {
+        mInternal.resetDropboxRateLimiter();
+        return 0;
+    }
+
     private Resources getResources(PrintWriter pw) throws RemoteException {
         // system resources does not contain all the device configuration, construct it manually.
         Configuration config = mInterface.getConfiguration();
diff --git a/services/core/java/com/android/server/am/DropboxRateLimiter.java b/services/core/java/com/android/server/am/DropboxRateLimiter.java
index baf062d..6087f76 100644
--- a/services/core/java/com/android/server/am/DropboxRateLimiter.java
+++ b/services/core/java/com/android/server/am/DropboxRateLimiter.java
@@ -19,11 +19,13 @@
 import android.os.SystemClock;
 import android.text.format.DateUtils;
 import android.util.ArrayMap;
+import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
 
 /** Rate limiter for adding errors into dropbox. */
 public class DropboxRateLimiter {
+    private static final String TAG = "DropboxRateLimiter";
     // After RATE_LIMIT_ALLOWED_ENTRIES have been collected (for a single breakdown of
     // process/eventType) further entries will be rejected until RATE_LIMIT_BUFFER_DURATION has
     // elapsed, after which the current count for this breakdown will be reset.
@@ -105,6 +107,15 @@
         mLastMapCleanUp = now;
     }
 
+    /** Resets the rate limiter memory. */
+    void reset() {
+        synchronized (mErrorClusterRecords) {
+            mErrorClusterRecords.clear();
+        }
+        mLastMapCleanUp = 0L;
+        Slog.i(TAG, "Rate limiter reset.");
+    }
+
     String errorKey(String eventType, String processName) {
         return eventType + processName;
     }