aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMakoto Onuki <omakoto@google.com>2018-03-20 21:17:02 -0700
committerMakoto Onuki <omakoto@google.com>2018-03-22 07:46:21 -0700
commit8b924e2e51c026e769343e883ee21a5c05d1eaa1 (patch)
treee9825359cfb9de4a0405c0e729aefd9a15ebaf60
parentae1f9edc0c877c2ccc32ae8b30de974271def420 (diff)
downloadContactsProvider-8b924e2e51c026e769343e883ee21a5c05d1eaa1.tar.gz
Move provider access stats to frameworks/base
Bug: 76037330 Test: boot and dumpsys activity provider ContactsProvider2 Change-Id: I2d10d69da9ddb5536ff3ef0aef2cfc3a711a20bd
-rw-r--r--src/com/android/providers/contacts/AbstractContactsProvider.java117
-rw-r--r--src/com/android/providers/contacts/ContactsProvider2.java5
-rw-r--r--src/com/android/providers/contacts/ProfileProvider.java6
3 files changed, 33 insertions, 95 deletions
diff --git a/src/com/android/providers/contacts/AbstractContactsProvider.java b/src/com/android/providers/contacts/AbstractContactsProvider.java
index ebf0a1b9..e00bd862 100644
--- a/src/com/android/providers/contacts/AbstractContactsProvider.java
+++ b/src/com/android/providers/contacts/AbstractContactsProvider.java
@@ -16,10 +16,6 @@
package com.android.providers.contacts;
-import com.android.providers.contacts.ContactsDatabaseHelper.AccountsColumns;
-import com.android.providers.contacts.ContactsDatabaseHelper.RawContactsColumns;
-import com.android.providers.contacts.ContactsDatabaseHelper.Tables;
-
import android.content.ContentProvider;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
@@ -38,8 +34,11 @@ import android.provider.BaseColumns;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.util.Log;
-import android.util.SparseBooleanArray;
-import android.util.SparseLongArray;
+
+import com.android.internal.util.ProviderAccessStats;
+import com.android.providers.contacts.ContactsDatabaseHelper.AccountsColumns;
+import com.android.providers.contacts.ContactsDatabaseHelper.RawContactsColumns;
+import com.android.providers.contacts.ContactsDatabaseHelper.Tables;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -116,23 +115,8 @@ public abstract class AbstractContactsProvider extends ContentProvider
*/
private SQLiteTransactionListener mSerializedDbTransactionListener;
- private final long mStartTime = SystemClock.elapsedRealtime();
-
- private final Object mStatsLock = new Object();
- protected final SparseBooleanArray mAllCallingUids = new SparseBooleanArray();
- protected final SparseLongArray mQueryStats = new SparseLongArray();
- protected final SparseLongArray mBatchStats = new SparseLongArray();
- protected final SparseLongArray mInsertStats = new SparseLongArray();
- protected final SparseLongArray mUpdateStats = new SparseLongArray();
- protected final SparseLongArray mDeleteStats = new SparseLongArray();
- protected final SparseLongArray mInsertInBatchStats = new SparseLongArray();
- protected final SparseLongArray mUpdateInBatchStats = new SparseLongArray();
- protected final SparseLongArray mDeleteInBatchStats = new SparseLongArray();
- private final SparseLongArray mOperationDurationMicroStats = new SparseLongArray();
-
- private final ThreadLocal<Integer> mOperationNest = ThreadLocal.withInitial(() -> 0);
- private final ThreadLocal<Long> mOperationStartNs = ThreadLocal.withInitial(() -> 0L);
+ protected final ProviderAccessStats mStats = new ProviderAccessStats();
@Override
public boolean onCreate() {
@@ -158,47 +142,19 @@ public abstract class AbstractContactsProvider extends ContentProvider
mSerializedDbTransactionListener = listener;
}
- protected final void incrementStats(SparseLongArray stats) {
- final int callingUid = Binder.getCallingUid();
- synchronized (mStatsLock) {
- stats.put(callingUid, stats.get(callingUid) + 1);
- mAllCallingUids.put(callingUid, true);
-
- final int nest = mOperationNest.get();
- mOperationNest.set(nest + 1);
- if (nest == 0) {
- mOperationStartNs.set(SystemClock.elapsedRealtimeNanos());
- }
- }
+ public ContactsTransaction getCurrentTransaction() {
+ return mTransactionHolder.get();
}
- protected final void incrementStats(SparseLongArray statsNonBatch,
- SparseLongArray statsInBatch) {
+ private boolean isInBatch() {
final ContactsTransaction t = mTransactionHolder.get();
- final boolean inBatch = t != null && t.isBatch();
- incrementStats(inBatch ? statsInBatch : statsNonBatch);
- }
-
- protected void finishOperation() {
- final int callingUid = Binder.getCallingUid();
- synchronized (mStatsLock) {
- final int nest = mOperationNest.get();
- mOperationNest.set(nest - 1);
- if (nest == 1) {
- final long duration = SystemClock.elapsedRealtimeNanos() - mOperationStartNs.get();
- mOperationDurationMicroStats.put(callingUid,
- mOperationDurationMicroStats.get(callingUid) + duration / 1000L);
- }
- }
- }
-
- public ContactsTransaction getCurrentTransaction() {
- return mTransactionHolder.get();
+ return t != null && t.isBatch();
}
@Override
public Uri insert(Uri uri, ContentValues values) {
- incrementStats(mInsertStats, mInsertInBatchStats);
+ final int callingUid = Binder.getCallingUid();
+ mStats.incrementInsertStats(callingUid, isInBatch());
try {
ContactsTransaction transaction = startTransaction(false);
try {
@@ -212,13 +168,14 @@ public abstract class AbstractContactsProvider extends ContentProvider
endTransaction(false);
}
} finally {
- finishOperation();
+ mStats.finishOperation(callingUid);
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
- incrementStats(mDeleteStats, mDeleteInBatchStats);
+ final int callingUid = Binder.getCallingUid();
+ mStats.incrementDeleteStats(callingUid, isInBatch());
try {
ContactsTransaction transaction = startTransaction(false);
try {
@@ -232,13 +189,14 @@ public abstract class AbstractContactsProvider extends ContentProvider
endTransaction(false);
}
} finally {
- finishOperation();
+ mStats.finishOperation(callingUid);
}
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- incrementStats(mUpdateStats, mUpdateInBatchStats);
+ final int callingUid = Binder.getCallingUid();
+ mStats.incrementUpdateStats(callingUid, isInBatch());
try {
ContactsTransaction transaction = startTransaction(false);
try {
@@ -252,13 +210,14 @@ public abstract class AbstractContactsProvider extends ContentProvider
endTransaction(false);
}
} finally {
- finishOperation();
+ mStats.finishOperation(callingUid);
}
}
@Override
public int bulkInsert(Uri uri, ContentValues[] values) {
- incrementStats(mBatchStats);
+ final int callingUid = Binder.getCallingUid();
+ mStats.incrementBatchStats(callingUid);
try {
ContactsTransaction transaction = startTransaction(true);
int numValues = values.length;
@@ -282,14 +241,15 @@ public abstract class AbstractContactsProvider extends ContentProvider
}
return numValues;
} finally {
- finishOperation();
+ mStats.finishOperation(callingUid);
}
}
@Override
public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
throws OperationApplicationException {
- incrementStats(mBatchStats);
+ final int callingUid = Binder.getCallingUid();
+ mStats.incrementBatchStats(callingUid);
try {
if (VERBOSE_LOGGING) {
Log.v(TAG, "applyBatch: " + operations.size() + " ops");
@@ -331,7 +291,7 @@ public abstract class AbstractContactsProvider extends ContentProvider
endTransaction(true);
}
} finally {
- finishOperation();
+ mStats.finishOperation(callingUid);
}
}
@@ -462,32 +422,7 @@ public abstract class AbstractContactsProvider extends ContentProvider
pw.print("Database: ");
pw.println(dbName);
- pw.print(" Uptime: ");
- pw.print((SystemClock.elapsedRealtime() - mStartTime) / (60 * 1000));
- pw.println(" minutes");
-
- synchronized (mStatsLock) {
- pw.println();
- pw.println(" Client activities:");
- pw.println(" UID Query Insert Update Delete Batch Insert Update Delete"
- + " Sec");
- for (int i = 0; i < mAllCallingUids.size(); i++) {
- final int uid = mAllCallingUids.keyAt(i);
- pw.println(String.format(
- " %-9d %6d %6d %6d %6d %6d %6d %6d %6d %12.3f",
- uid,
- mQueryStats.get(uid),
- mInsertStats.get(uid),
- mUpdateStats.get(uid),
- mDeleteStats.get(uid),
- mBatchStats.get(uid),
- mInsertInBatchStats.get(uid),
- mUpdateInBatchStats.get(uid),
- mDeleteInBatchStats.get(uid),
- (mOperationDurationMicroStats.get(uid) / 1000000.0)
- ));
- }
- }
+ mStats.dump(pw, " ");
if (mDbHelper == null) {
pw.println("mDbHelper is null");
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 1d5681ac..54b4a27d 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -5545,7 +5545,8 @@ public class ContactsProvider2 extends AbstractContactsProvider
return mProfileProvider.query(uri, projection, selection, selectionArgs, sortOrder,
cancellationSignal);
}
- incrementStats(mQueryStats);
+ final int callingUid = Binder.getCallingUid();
+ mStats.incrementQueryStats(callingUid);
try {
// Otherwise proceed with a normal query against the contacts DB.
switchToContactMode();
@@ -5553,7 +5554,7 @@ public class ContactsProvider2 extends AbstractContactsProvider
return queryDirectoryIfNecessary(uri, projection, selection, selectionArgs, sortOrder,
cancellationSignal);
} finally {
- finishOperation();
+ mStats.finishOperation(callingUid);
}
}
diff --git a/src/com/android/providers/contacts/ProfileProvider.java b/src/com/android/providers/contacts/ProfileProvider.java
index 6c84e4b0..f3b6daf6 100644
--- a/src/com/android/providers/contacts/ProfileProvider.java
+++ b/src/com/android/providers/contacts/ProfileProvider.java
@@ -24,6 +24,7 @@ import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
+import android.os.Binder;
import android.os.CancellationSignal;
import android.provider.ContactsContract.Intents;
@@ -70,12 +71,13 @@ public class ProfileProvider extends AbstractContactsProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder, CancellationSignal cancellationSignal) {
- incrementStats(mQueryStats);
+ final int callingUid = Binder.getCallingUid();
+ mStats.incrementQueryStats(callingUid);
try {
return mDelegate.queryLocal(uri, projection, selection, selectionArgs, sortOrder, -1,
cancellationSignal);
} finally {
- finishOperation();
+ mStats.finishOperation(callingUid);
}
}