Migrate pullDiskStats and pullDirectoryUsage

Test: atest DiskStatsProtoTest
Test: adb shell cmd stats pull-source 10025
Test: adb shell cmd stats pull-source 10026
Change-Id: Ia7c63e5d475d4d84da4fff74cda7745ff07cec31
This commit is contained in:
Jeffrey Huang
2020-01-16 11:33:58 -08:00
parent fd037c5548
commit 95765f09e8
3 changed files with 123 additions and 104 deletions

View File

@@ -722,86 +722,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
pulledData.add(e);
}
private void pullDiskStats(int tagId, long elapsedNanos, long wallClockNanos,
List<StatsLogEventWrapper> pulledData) {
// Run a quick-and-dirty performance test: write 512 bytes
byte[] junk = new byte[512];
for (int i = 0; i < junk.length; i++) junk[i] = (byte) i; // Write nonzero bytes
File tmp = new File(Environment.getDataDirectory(), "system/statsdperftest.tmp");
FileOutputStream fos = null;
IOException error = null;
long before = SystemClock.elapsedRealtime();
try {
fos = new FileOutputStream(tmp);
fos.write(junk);
} catch (IOException e) {
error = e;
} finally {
try {
if (fos != null) fos.close();
} catch (IOException e) {
// Do nothing.
}
}
long latency = SystemClock.elapsedRealtime() - before;
if (tmp.exists()) tmp.delete();
if (error != null) {
Slog.e(TAG, "Error performing diskstats latency test");
latency = -1;
}
// File based encryption.
boolean fileBased = StorageManager.isFileEncryptedNativeOnly();
//Recent disk write speed. Binder call to storaged.
int writeSpeed = -1;
try {
IBinder binder = ServiceManager.getService("storaged");
if (binder == null) {
Slog.e(TAG, "storaged not found");
}
IStoraged storaged = IStoraged.Stub.asInterface(binder);
writeSpeed = storaged.getRecentPerf();
} catch (RemoteException e) {
Slog.e(TAG, "storaged not found");
}
// Add info pulledData.
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos);
e.writeLong(latency);
e.writeBoolean(fileBased);
e.writeInt(writeSpeed);
pulledData.add(e);
}
private void pullDirectoryUsage(int tagId, long elapsedNanos, long wallClockNanos,
List<StatsLogEventWrapper> pulledData) {
StatFs statFsData = new StatFs(Environment.getDataDirectory().getAbsolutePath());
StatFs statFsSystem = new StatFs(Environment.getRootDirectory().getAbsolutePath());
StatFs statFsCache = new StatFs(Environment.getDownloadCacheDirectory().getAbsolutePath());
StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos);
e.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__DATA);
e.writeLong(statFsData.getAvailableBytes());
e.writeLong(statFsData.getTotalBytes());
pulledData.add(e);
e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos);
e.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__CACHE);
e.writeLong(statFsCache.getAvailableBytes());
e.writeLong(statFsCache.getTotalBytes());
pulledData.add(e);
e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos);
e.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__SYSTEM);
e.writeLong(statFsSystem.getAvailableBytes());
e.writeLong(statFsSystem.getTotalBytes());
pulledData.add(e);
}
private void pullAppSize(int tagId, long elapsedNanos, long wallClockNanos,
List<StatsLogEventWrapper> pulledData) {
try {
@@ -1549,16 +1469,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
break;
}
case StatsLog.DISK_STATS: {
pullDiskStats(tagId, elapsedNanos, wallClockNanos, ret);
break;
}
case StatsLog.DIRECTORY_USAGE: {
pullDirectoryUsage(tagId, elapsedNanos, wallClockNanos, ret);
break;
}
case StatsLog.APP_SIZE: {
pullAppSize(tagId, elapsedNanos, wallClockNanos, ret);
break;

View File

@@ -95,14 +95,6 @@ std::map<PullerKey, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
{{.atomTag = android::util::BATTERY_CYCLE_COUNT},
{.puller = new ResourceHealthManagerPuller(android::util::BATTERY_CYCLE_COUNT)}},
// Disk Stats
{{.atomTag = android::util::DISK_STATS},
{.puller = new StatsCompanionServicePuller(android::util::DISK_STATS)}},
// Directory usage
{{.atomTag = android::util::DIRECTORY_USAGE},
{.puller = new StatsCompanionServicePuller(android::util::DIRECTORY_USAGE)}},
// Size of app's code, data, and cache
{{.atomTag = android::util::APP_SIZE},
{.puller = new StatsCompanionServicePuller(android::util::APP_SIZE)}},

View File

@@ -198,6 +198,9 @@ public class StatsPullAtomService extends SystemService {
private final Object mThermalLock = new Object();
@GuardedBy("mThermalLock")
private IThermalService mThermalService;
private final Object mStoragedLock = new Object();
@GuardedBy("mStoragedLock")
private IStoraged mStorageService;
private final Context mContext;
private StatsManager mStatsManager;
@@ -346,6 +349,29 @@ public class StatsPullAtomService extends SystemService {
return mThermalService;
}
}
private IStoraged getIStoragedService() {
synchronized (mStoragedLock) {
if (mStorageService == null) {
mStorageService = IStoraged.Stub.asInterface(
ServiceManager.getService("storaged"));
}
if (mStorageService != null) {
try {
mStorageService.asBinder().linkToDeath(() -> {
synchronized (mStoragedLock) {
mStorageService = null;
}
}, /* flags */ 0);
} catch (RemoteException e) {
Slog.e(TAG, "linkToDeath with storagedService failed", e);
mStorageService = null;
}
}
}
return mStorageService;
}
private void registerWifiBytesTransfer() {
int tagId = StatsLog.WIFI_BYTES_TRANSFER;
PullAtomMetadata metadata = new PullAtomMetadata.Builder()
@@ -1471,19 +1497,110 @@ public class StatsPullAtomService extends SystemService {
}
private void registerDiskStats() {
// No op.
int tagId = StatsLog.DISK_STATS;
mStatsManager.registerPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
(atomTag, data) -> pullDiskStats(atomTag, data),
BackgroundThread.getExecutor()
);
}
private void pullDiskStats() {
// No op.
private int pullDiskStats(int atomTag, List<StatsEvent> pulledData) {
// Run a quick-and-dirty performance test: write 512 bytes
byte[] junk = new byte[512];
for (int i = 0; i < junk.length; i++) junk[i] = (byte) i; // Write nonzero bytes
File tmp = new File(Environment.getDataDirectory(), "system/statsdperftest.tmp");
FileOutputStream fos = null;
IOException error = null;
long before = SystemClock.elapsedRealtime();
try {
fos = new FileOutputStream(tmp);
fos.write(junk);
} catch (IOException e) {
error = e;
} finally {
try {
if (fos != null) fos.close();
} catch (IOException e) {
// Do nothing.
}
}
long latency = SystemClock.elapsedRealtime() - before;
if (tmp.exists()) tmp.delete();
if (error != null) {
Slog.e(TAG, "Error performing diskstats latency test");
latency = -1;
}
// File based encryption.
boolean fileBased = StorageManager.isFileEncryptedNativeOnly();
//Recent disk write speed. Binder call to storaged.
int writeSpeed = -1;
IStoraged storaged = getIStoragedService();
if (storaged == null) {
return StatsManager.PULL_SKIP;
}
try {
writeSpeed = storaged.getRecentPerf();
} catch (RemoteException e) {
Slog.e(TAG, "storaged not found");
}
// Add info pulledData.
StatsEvent e = StatsEvent.newBuilder()
.setAtomId(atomTag)
.writeLong(latency)
.writeBoolean(fileBased)
.writeInt(writeSpeed)
.build();
pulledData.add(e);
return StatsManager.PULL_SUCCESS;
}
private void registerDirectoryUsage() {
// No op.
int tagId = StatsLog.DIRECTORY_USAGE;
mStatsManager.registerPullAtomCallback(
tagId,
null, // use default PullAtomMetadata values
(atomTag, data) -> pullDirectoryUsage(atomTag, data),
BackgroundThread.getExecutor()
);
}
private void pullDirectoryUsage() {
// No op.
private int pullDirectoryUsage(int atomTag, List<StatsEvent> pulledData) {
StatFs statFsData = new StatFs(Environment.getDataDirectory().getAbsolutePath());
StatFs statFsSystem = new StatFs(Environment.getRootDirectory().getAbsolutePath());
StatFs statFsCache = new StatFs(Environment.getDownloadCacheDirectory().getAbsolutePath());
StatsEvent e = StatsEvent.newBuilder()
.setAtomId(atomTag)
.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__DATA)
.writeLong(statFsData.getAvailableBytes())
.writeLong(statFsData.getTotalBytes())
.build();
pulledData.add(e);
e = StatsEvent.newBuilder()
.setAtomId(atomTag)
.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__CACHE)
.writeLong(statFsCache.getAvailableBytes())
.writeLong(statFsCache.getTotalBytes())
.build();
pulledData.add(e);
e = StatsEvent.newBuilder()
.setAtomId(atomTag)
.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__SYSTEM)
.writeLong(statFsSystem.getAvailableBytes())
.writeLong(statFsSystem.getTotalBytes())
.build();
pulledData.add(e);
return StatsManager.PULL_SUCCESS;
}
private void registerAppSize() {