aboutsummaryrefslogtreecommitdiff
path: root/car-lib/src/android/car/storagemonitoring
diff options
context:
space:
mode:
authorEnrico Granata <egranata@google.com>2017-11-06 17:20:17 -0800
committerEnrico Granata <egranata@google.com>2017-11-09 19:12:28 +0000
commit7e0150d162aaca5db326360f924c093f50a0dc3a (patch)
tree50294506706a93889b6be39af389cf679d6624f0 /car-lib/src/android/car/storagemonitoring
parent0f72b74e45e22603b9f7697b9b4cb062e2cf4d21 (diff)
downloadCar-7e0150d162aaca5db326360f924c093f50a0dc3a.tar.gz
Implement CarStorageMonitoringManager::getIoStatsDeltas
This API gives access to the periodic snapshot deltas of I/O activity calculated by CarStorageMonitoringService Bug: 32512551 Bug: 65846699 Test: bit CarServiceTest:com.android.car.CarStorageMonitoringTest bit CarServiceUnitTest:com.android.car.storagemonitoring.CarStorageMonitoringTest Change-Id: I833d4b4d0e63d6356b34584dbde3ba563e4aa899
Diffstat (limited to 'car-lib/src/android/car/storagemonitoring')
-rw-r--r--car-lib/src/android/car/storagemonitoring/CarStorageMonitoringManager.java22
-rw-r--r--car-lib/src/android/car/storagemonitoring/ICarStorageMonitoring.aidl5
-rw-r--r--car-lib/src/android/car/storagemonitoring/UidIoRecord.java (renamed from car-lib/src/android/car/storagemonitoring/UidIoStatsRecord.java)27
-rw-r--r--car-lib/src/android/car/storagemonitoring/UidIoStats.java62
-rw-r--r--car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.aidl19
-rw-r--r--car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.java166
6 files changed, 266 insertions, 35 deletions
diff --git a/car-lib/src/android/car/storagemonitoring/CarStorageMonitoringManager.java b/car-lib/src/android/car/storagemonitoring/CarStorageMonitoringManager.java
index 51d77d106c..cc32acc2ba 100644
--- a/car-lib/src/android/car/storagemonitoring/CarStorageMonitoringManager.java
+++ b/car-lib/src/android/car/storagemonitoring/CarStorageMonitoringManager.java
@@ -162,4 +162,26 @@ public final class CarStorageMonitoringManager implements CarManagerBase {
return Collections.emptyList();
}
+ /**
+ * This method returns a list of the I/O stats deltas currently stored by the system.
+ *
+ * Periodically, the system gathers I/O activity metrics and computes and stores a delta from
+ * the previous cycle. The timing and the number of these stored samples are configurable
+ * by the OEM.
+ *
+ * The samples are returned in order from the oldest to the newest.
+ *
+ * If the information is not available, an empty list will be returned.
+ */
+ @RequiresPermission(value=Car.PERMISSION_STORAGE_MONITORING)
+ public List<UidIoStatsDelta> getIoStatsDeltas() throws CarNotConnectedException {
+ try {
+ return mService.getIoStatsDeltas();
+ } catch (IllegalStateException e) {
+ checkCarNotConnectedExceptionFromCarService(e);
+ } catch (RemoteException e) {
+ throw new CarNotConnectedException();
+ }
+ return Collections.emptyList();
+ }
}
diff --git a/car-lib/src/android/car/storagemonitoring/ICarStorageMonitoring.aidl b/car-lib/src/android/car/storagemonitoring/ICarStorageMonitoring.aidl
index cedb3433f2..d8183d6628 100644
--- a/car-lib/src/android/car/storagemonitoring/ICarStorageMonitoring.aidl
+++ b/car-lib/src/android/car/storagemonitoring/ICarStorageMonitoring.aidl
@@ -17,6 +17,7 @@
package android.car.storagemonitoring;
import android.car.storagemonitoring.UidIoStats;
+import android.car.storagemonitoring.UidIoStatsDelta;
import android.car.storagemonitoring.WearEstimate;
import android.car.storagemonitoring.WearEstimateChange;
@@ -47,4 +48,8 @@ interface ICarStorageMonitoring {
*/
List<UidIoStats> getAggregateIoStats() = 5;
+ /**
+ * Return the I/O stats deltas currently known to the service.
+ */
+ List<UidIoStatsDelta> getIoStatsDeltas() = 6;
}
diff --git a/car-lib/src/android/car/storagemonitoring/UidIoStatsRecord.java b/car-lib/src/android/car/storagemonitoring/UidIoRecord.java
index abd9ee04be..196c83ce05 100644
--- a/car-lib/src/android/car/storagemonitoring/UidIoStatsRecord.java
+++ b/car-lib/src/android/car/storagemonitoring/UidIoRecord.java
@@ -23,7 +23,7 @@ import android.annotation.SystemApi;
* @hide
*/
@SystemApi
-public final class UidIoStatsRecord {
+public final class UidIoRecord {
public final int uid;
@@ -39,7 +39,7 @@ public final class UidIoStatsRecord {
public final long background_write_bytes;
public final long background_fsync;
- public UidIoStatsRecord(int uid,
+ public UidIoRecord(int uid,
long foreground_rchar,
long foreground_wchar,
long foreground_read_bytes,
@@ -66,12 +66,12 @@ public final class UidIoStatsRecord {
}
/** @hide */
- public UidIoStatsRecord delta(UidIoStats other) {
+ public UidIoRecord delta(UidIoStats other) {
if (uid != other.uid) {
throw new IllegalArgumentException("cannot calculate delta between different user IDs");
}
- return new UidIoStatsRecord(uid,
+ return new UidIoRecord(uid,
foreground_rchar - other.foreground.bytesRead,
foreground_wchar - other.foreground.bytesWritten,
foreground_read_bytes - other.foreground.bytesReadFromStorage,
@@ -83,4 +83,23 @@ public final class UidIoStatsRecord {
background_write_bytes - other.background.bytesWrittenToStorage,
background_fsync - other.background.fsyncCalls);
}
+
+ /** @hide */
+ public UidIoRecord delta(UidIoRecord other) {
+ if (uid != other.uid) {
+ throw new IllegalArgumentException("cannot calculate delta between different user IDs");
+ }
+
+ return new UidIoRecord(uid,
+ foreground_rchar - other.foreground_rchar,
+ foreground_wchar - other.foreground_wchar,
+ foreground_read_bytes - other.foreground_read_bytes,
+ foreground_write_bytes - other.foreground_write_bytes,
+ foreground_fsync - other.foreground_fsync,
+ background_rchar - other.background_rchar,
+ background_wchar - other.background_wchar,
+ background_read_bytes - other.background_read_bytes,
+ background_write_bytes - other.background_write_bytes,
+ background_fsync - other.background_fsync);
+ }
}
diff --git a/car-lib/src/android/car/storagemonitoring/UidIoStats.java b/car-lib/src/android/car/storagemonitoring/UidIoStats.java
index 3b8ae93379..13db298ef9 100644
--- a/car-lib/src/android/car/storagemonitoring/UidIoStats.java
+++ b/car-lib/src/android/car/storagemonitoring/UidIoStats.java
@@ -66,15 +66,15 @@ public final class UidIoStats implements Parcelable {
/**
* Statistics for apps running in foreground.
*/
- public final PerStateMetrics foreground;
+ public final UidIoStats.Metrics foreground;
/**
* Statistics for apps running in background.
*/
- public final PerStateMetrics background;
+ public final UidIoStats.Metrics background;
public UidIoStats(int uid,
- long runtimeMillis, PerStateMetrics foreground, PerStateMetrics background) {
+ long runtimeMillis, UidIoStats.Metrics foreground, UidIoStats.Metrics background) {
this.uid = uid;
this.runtimeMillis = runtimeMillis;
this.foreground = Objects.requireNonNull(foreground);
@@ -84,19 +84,19 @@ public final class UidIoStats implements Parcelable {
public UidIoStats(Parcel in) {
uid = in.readInt();
runtimeMillis = in.readLong();
- foreground = in.readParcelable(PerStateMetrics.class.getClassLoader());
- background = in.readParcelable(PerStateMetrics.class.getClassLoader());
+ foreground = in.readParcelable(UidIoStats.Metrics.class.getClassLoader());
+ background = in.readParcelable(UidIoStats.Metrics.class.getClassLoader());
}
- public UidIoStats(UidIoStatsRecord record, long runtimeMillis) {
+ public UidIoStats(UidIoRecord record, long runtimeMillis) {
uid = record.uid;
this.runtimeMillis = runtimeMillis;
- foreground = new PerStateMetrics(record.foreground_rchar,
+ foreground = new UidIoStats.Metrics(record.foreground_rchar,
record.foreground_wchar,
record.foreground_read_bytes,
record.foreground_write_bytes,
record.foreground_fsync);
- background = new PerStateMetrics(record.background_rchar,
+ background = new UidIoStats.Metrics(record.background_rchar,
record.background_wchar,
record.background_read_bytes,
record.background_write_bytes,
@@ -128,8 +128,8 @@ public final class UidIoStats implements Parcelable {
public UidIoStats(JSONObject in) throws JSONException {
uid = in.getInt("uid");
runtimeMillis = in.getLong("runtimeMillis");
- foreground = new PerStateMetrics(in.getJSONObject("foreground"));
- background = new PerStateMetrics(in.getJSONObject("background"));
+ foreground = new UidIoStats.Metrics(in.getJSONObject("foreground"));
+ background = new UidIoStats.Metrics(in.getJSONObject("background"));
}
/**
@@ -181,7 +181,7 @@ public final class UidIoStats implements Parcelable {
* It matches UID, and I/O activity values, but ignores runtime.
* @hide
*/
- public boolean representsSameMetrics(UidIoStatsRecord record) {
+ public boolean representsSameMetrics(UidIoRecord record) {
return record.uid == uid &&
record.foreground_rchar == foreground.bytesRead &&
record.foreground_wchar == foreground.bytesWritten &&
@@ -198,16 +198,16 @@ public final class UidIoStats implements Parcelable {
/**
* I/O activity metrics that pertain to either the foreground or the background state.
*/
- public static final class PerStateMetrics implements Parcelable {
+ public static final class Metrics implements Parcelable {
- public static final Parcelable.Creator<PerStateMetrics> CREATOR =
- new Parcelable.Creator<PerStateMetrics>() {
- public PerStateMetrics createFromParcel(Parcel in) {
- return new PerStateMetrics(in);
+ public static final Parcelable.Creator<UidIoStats.Metrics> CREATOR =
+ new Parcelable.Creator<UidIoStats.Metrics>() {
+ public UidIoStats.Metrics createFromParcel(Parcel in) {
+ return new UidIoStats.Metrics(in);
}
- public PerStateMetrics[] newArray(int size) {
- return new PerStateMetrics[size];
+ public UidIoStats.Metrics[] newArray(int size) {
+ return new UidIoStats.Metrics[size];
}
};
@@ -240,7 +240,7 @@ public final class UidIoStats implements Parcelable {
*/
public final long fsyncCalls;
- public PerStateMetrics(long bytesRead, long bytesWritten, long bytesReadFromStorage,
+ public Metrics(long bytesRead, long bytesWritten, long bytesReadFromStorage,
long bytesWrittenToStorage, long fsyncCalls) {
this.bytesRead = bytesRead;
this.bytesWritten = bytesWritten;
@@ -273,7 +273,7 @@ public final class UidIoStats implements Parcelable {
jsonWriter.endObject();
}
- public PerStateMetrics(Parcel in) {
+ public Metrics(Parcel in) {
bytesRead = in.readLong();
bytesWritten = in.readLong();
bytesReadFromStorage = in.readLong();
@@ -281,7 +281,7 @@ public final class UidIoStats implements Parcelable {
fsyncCalls = in.readLong();
}
- public PerStateMetrics(JSONObject in) throws JSONException {
+ public Metrics(JSONObject in) throws JSONException {
bytesRead = in.getLong("bytesRead");
bytesWritten = in.getLong("bytesWritten");
bytesReadFromStorage = in.getLong("bytesReadFromStorage");
@@ -298,8 +298,8 @@ public final class UidIoStats implements Parcelable {
*
* @hide
*/
- public PerStateMetrics delta(PerStateMetrics other) {
- return new PerStateMetrics(bytesRead-other.bytesRead,
+ public Metrics delta(Metrics other) {
+ return new Metrics(bytesRead-other.bytesRead,
bytesWritten-other.bytesWritten,
bytesReadFromStorage-other.bytesReadFromStorage,
bytesWrittenToStorage-other.bytesWrittenToStorage,
@@ -308,14 +308,14 @@ public final class UidIoStats implements Parcelable {
@Override
public boolean equals(Object other) {
- if (other instanceof PerStateMetrics) {
- PerStateMetrics perStateMetrics = (PerStateMetrics)other;
-
- return (bytesRead == perStateMetrics.bytesRead) &&
- (bytesWritten == perStateMetrics.bytesWritten) &&
- (bytesReadFromStorage == perStateMetrics.bytesReadFromStorage) &&
- (bytesWrittenToStorage == perStateMetrics.bytesWrittenToStorage) &&
- (fsyncCalls == perStateMetrics.fsyncCalls);
+ if (other instanceof Metrics) {
+ Metrics metrics = (Metrics)other;
+
+ return (bytesRead == metrics.bytesRead) &&
+ (bytesWritten == metrics.bytesWritten) &&
+ (bytesReadFromStorage == metrics.bytesReadFromStorage) &&
+ (bytesWrittenToStorage == metrics.bytesWrittenToStorage) &&
+ (fsyncCalls == metrics.fsyncCalls);
}
return false;
}
diff --git a/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.aidl b/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.aidl
new file mode 100644
index 0000000000..7ffb6f585e
--- /dev/null
+++ b/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.car.storagemonitoring;
+
+parcelable UidIoStatsDelta;
diff --git a/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.java b/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.java
new file mode 100644
index 0000000000..ffcd85f79f
--- /dev/null
+++ b/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.car.storagemonitoring;
+
+import android.annotation.SystemApi;
+import android.car.storagemonitoring.UidIoStats.Metrics;
+import android.os.Parcel;
+import android.os.Parcelable;
+import java.util.List;
+import java.util.Objects;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+/**
+ * Delta of uid_io stats taken at a sample point.
+ *
+ * @hide
+ */
+@SystemApi
+public class UidIoStatsDelta implements Parcelable {
+ public static final Creator<UidIoStatsDelta> CREATOR = new Creator<UidIoStatsDelta>() {
+ @Override
+ public UidIoStatsDelta createFromParcel(Parcel in) {
+ return new UidIoStatsDelta(in);
+ }
+
+ @Override
+ public UidIoStatsDelta[] newArray(int size) {
+ return new UidIoStatsDelta[size];
+ }
+ };
+
+ private final List<UidIoStats> mStats;
+ private final long mUptimeTimestamp;
+
+ public UidIoStatsDelta(List<UidIoStats> stats, long timestamp) {
+ mStats = stats;
+ mUptimeTimestamp = timestamp;
+ }
+
+ public UidIoStatsDelta(Parcel in) {
+ mStats = in.createTypedArrayList(UidIoStats.CREATOR);
+ mUptimeTimestamp = in.readLong();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeTypedList(mStats);
+ dest.writeLong(mUptimeTimestamp);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ public long getTimestamp() {
+ return mUptimeTimestamp;
+ }
+
+ public List<UidIoStats> getStats() {
+ return mStats;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mStats, mUptimeTimestamp);
+ }
+
+ public UidIoStats getUserIdStats(int uid) {
+ for (UidIoStats stats : getStats()) {
+ if (stats.uid == uid) {
+ return stats;
+ }
+ }
+
+ return null;
+ }
+
+ public UidIoStats.Metrics getForegroundTotals() {
+ long bytesRead = 0;
+ long bytesWritten = 0;
+ long bytesReadFromStorage = 0;
+ long bytesWrittenToStorage = 0;
+ long fsyncCalls = 0;
+
+ for (UidIoStats stats : getStats()) {
+ bytesRead += stats.foreground.bytesRead;
+ bytesWritten += stats.foreground.bytesWritten;
+ bytesReadFromStorage += stats.foreground.bytesReadFromStorage;
+ bytesWrittenToStorage += stats.foreground.bytesWrittenToStorage;
+ fsyncCalls += stats.foreground.fsyncCalls;
+ }
+
+ return new Metrics(bytesRead,
+ bytesWritten,
+ bytesReadFromStorage,
+ bytesWrittenToStorage,
+ fsyncCalls);
+ }
+
+ public UidIoStats.Metrics getBackgroundTotals() {
+ long bytesRead = 0;
+ long bytesWritten = 0;
+ long bytesReadFromStorage = 0;
+ long bytesWrittenToStorage = 0;
+ long fsyncCalls = 0;
+
+ for (UidIoStats stats : getStats()) {
+ bytesRead += stats.background.bytesRead;
+ bytesWritten += stats.background.bytesWritten;
+ bytesReadFromStorage += stats.background.bytesReadFromStorage;
+ bytesWrittenToStorage += stats.background.bytesWrittenToStorage;
+ fsyncCalls += stats.background.fsyncCalls;
+ }
+
+ return new Metrics(bytesRead,
+ bytesWritten,
+ bytesReadFromStorage,
+ bytesWrittenToStorage,
+ fsyncCalls);
+ }
+
+ public UidIoStats.Metrics getTotals() {
+ UidIoStats.Metrics foreground = getForegroundTotals();
+ UidIoStats.Metrics background = getBackgroundTotals();
+
+ return new UidIoStats.Metrics(foreground.bytesRead + background.bytesRead,
+ foreground.bytesWritten + background.bytesWritten,
+ foreground.bytesReadFromStorage + background.bytesReadFromStorage,
+ foreground.bytesWrittenToStorage + background.bytesWrittenToStorage,
+ foreground.fsyncCalls + background.fsyncCalls);
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof UidIoStatsDelta) {
+ UidIoStatsDelta delta = (UidIoStatsDelta)other;
+ return delta.getTimestamp() == getTimestamp() &&
+ delta.getStats().equals(getStats());
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ StringJoiner stringJoiner = new StringJoiner(", ");
+ for (UidIoStats stats : getStats()) {
+ stringJoiner.add(stats.toString());
+ }
+ return "timestamp = " + getTimestamp() + ", stats = " + stringJoiner.toString();
+ }
+}