blob: 0c2b6625f9266372314a1cc8a9377c057c2d7118 [file] [log] [blame]
Enrico Granata7e0150d2017-11-06 17:20:17 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package android.car.storagemonitoring;
17
18import android.annotation.SystemApi;
Enrico Granatadbda56f2017-12-18 11:53:22 -080019import android.car.storagemonitoring.IoStatsEntry.Metrics;
Enrico Granata7e0150d2017-11-06 17:20:17 -080020import android.os.Parcel;
21import android.os.Parcelable;
Enrico Granatab40b2042017-11-29 15:42:06 -080022import android.util.JsonWriter;
23import java.io.IOException;
24import java.util.ArrayList;
Enrico Granata7e0150d2017-11-06 17:20:17 -080025import java.util.List;
26import java.util.Objects;
27import java.util.StringJoiner;
Enrico Granatab40b2042017-11-29 15:42:06 -080028import org.json.JSONArray;
29import org.json.JSONException;
30import org.json.JSONObject;
Enrico Granata7e0150d2017-11-06 17:20:17 -080031
32/**
33 * Delta of uid_io stats taken at a sample point.
34 *
35 * @hide
36 */
37@SystemApi
Sarah Wittman9a5d20f2019-03-29 15:51:28 -070038public final class IoStats implements Parcelable {
Enrico Granatadbda56f2017-12-18 11:53:22 -080039 public static final Creator<IoStats> CREATOR = new Creator<IoStats>() {
Enrico Granata7e0150d2017-11-06 17:20:17 -080040 @Override
Enrico Granatadbda56f2017-12-18 11:53:22 -080041 public IoStats createFromParcel(Parcel in) {
42 return new IoStats(in);
Enrico Granata7e0150d2017-11-06 17:20:17 -080043 }
44
45 @Override
Enrico Granatadbda56f2017-12-18 11:53:22 -080046 public IoStats[] newArray(int size) {
47 return new IoStats[size];
Enrico Granata7e0150d2017-11-06 17:20:17 -080048 }
49 };
50
Enrico Granatadbda56f2017-12-18 11:53:22 -080051 private final List<IoStatsEntry> mStats;
Enrico Granata7e0150d2017-11-06 17:20:17 -080052 private final long mUptimeTimestamp;
53
Enrico Granatadbda56f2017-12-18 11:53:22 -080054 public IoStats(List<IoStatsEntry> stats, long timestamp) {
Enrico Granata7e0150d2017-11-06 17:20:17 -080055 mStats = stats;
56 mUptimeTimestamp = timestamp;
57 }
58
Enrico Granatadbda56f2017-12-18 11:53:22 -080059 public IoStats(Parcel in) {
60 mStats = in.createTypedArrayList(IoStatsEntry.CREATOR);
Enrico Granata7e0150d2017-11-06 17:20:17 -080061 mUptimeTimestamp = in.readLong();
62 }
63
Enrico Granatadbda56f2017-12-18 11:53:22 -080064 public IoStats(JSONObject in) throws JSONException {
Enrico Granatab40b2042017-11-29 15:42:06 -080065 mUptimeTimestamp = in.getInt("uptime");
66 JSONArray statsArray = in.getJSONArray("stats");
67 mStats = new ArrayList<>();
68 for(int i = 0; i < statsArray.length(); ++i) {
Enrico Granatadbda56f2017-12-18 11:53:22 -080069 mStats.add(new IoStatsEntry(statsArray.getJSONObject(i)));
Enrico Granatab40b2042017-11-29 15:42:06 -080070 }
71 }
72
Enrico Granata7e0150d2017-11-06 17:20:17 -080073 @Override
74 public void writeToParcel(Parcel dest, int flags) {
75 dest.writeTypedList(mStats);
76 dest.writeLong(mUptimeTimestamp);
77 }
78
Enrico Granatab40b2042017-11-29 15:42:06 -080079 public void writeToJson(JsonWriter jsonWriter) throws IOException {
80 jsonWriter.beginObject();
81 jsonWriter.name("uptime").value(mUptimeTimestamp);
82 jsonWriter.name("stats").beginArray();
Enrico Granatadbda56f2017-12-18 11:53:22 -080083 for (IoStatsEntry stat : mStats) {
Enrico Granatab40b2042017-11-29 15:42:06 -080084 stat.writeToJson(jsonWriter);
85 }
86 jsonWriter.endArray();
87 jsonWriter.endObject();
88 }
89
Enrico Granata7e0150d2017-11-06 17:20:17 -080090 @Override
91 public int describeContents() {
92 return 0;
93 }
94
95 public long getTimestamp() {
96 return mUptimeTimestamp;
97 }
98
Enrico Granatadbda56f2017-12-18 11:53:22 -080099 public List<IoStatsEntry> getStats() {
Enrico Granata7e0150d2017-11-06 17:20:17 -0800100 return mStats;
101 }
102
103 @Override
104 public int hashCode() {
105 return Objects.hash(mStats, mUptimeTimestamp);
106 }
107
Enrico Granatadbda56f2017-12-18 11:53:22 -0800108 public IoStatsEntry getUserIdStats(int uid) {
109 for (IoStatsEntry stats : getStats()) {
Enrico Granata7e0150d2017-11-06 17:20:17 -0800110 if (stats.uid == uid) {
111 return stats;
112 }
113 }
114
115 return null;
116 }
117
Enrico Granatadbda56f2017-12-18 11:53:22 -0800118 public IoStatsEntry.Metrics getForegroundTotals() {
Enrico Granata7e0150d2017-11-06 17:20:17 -0800119 long bytesRead = 0;
120 long bytesWritten = 0;
121 long bytesReadFromStorage = 0;
122 long bytesWrittenToStorage = 0;
123 long fsyncCalls = 0;
124
Enrico Granatadbda56f2017-12-18 11:53:22 -0800125 for (IoStatsEntry stats : getStats()) {
Enrico Granata7e0150d2017-11-06 17:20:17 -0800126 bytesRead += stats.foreground.bytesRead;
127 bytesWritten += stats.foreground.bytesWritten;
128 bytesReadFromStorage += stats.foreground.bytesReadFromStorage;
129 bytesWrittenToStorage += stats.foreground.bytesWrittenToStorage;
130 fsyncCalls += stats.foreground.fsyncCalls;
131 }
132
133 return new Metrics(bytesRead,
134 bytesWritten,
135 bytesReadFromStorage,
136 bytesWrittenToStorage,
137 fsyncCalls);
138 }
139
Enrico Granatadbda56f2017-12-18 11:53:22 -0800140 public IoStatsEntry.Metrics getBackgroundTotals() {
Enrico Granata7e0150d2017-11-06 17:20:17 -0800141 long bytesRead = 0;
142 long bytesWritten = 0;
143 long bytesReadFromStorage = 0;
144 long bytesWrittenToStorage = 0;
145 long fsyncCalls = 0;
146
Enrico Granatadbda56f2017-12-18 11:53:22 -0800147 for (IoStatsEntry stats : getStats()) {
Enrico Granata7e0150d2017-11-06 17:20:17 -0800148 bytesRead += stats.background.bytesRead;
149 bytesWritten += stats.background.bytesWritten;
150 bytesReadFromStorage += stats.background.bytesReadFromStorage;
151 bytesWrittenToStorage += stats.background.bytesWrittenToStorage;
152 fsyncCalls += stats.background.fsyncCalls;
153 }
154
155 return new Metrics(bytesRead,
156 bytesWritten,
157 bytesReadFromStorage,
158 bytesWrittenToStorage,
159 fsyncCalls);
160 }
161
Enrico Granatadbda56f2017-12-18 11:53:22 -0800162 public IoStatsEntry.Metrics getTotals() {
163 IoStatsEntry.Metrics foreground = getForegroundTotals();
164 IoStatsEntry.Metrics background = getBackgroundTotals();
Enrico Granata7e0150d2017-11-06 17:20:17 -0800165
Enrico Granatadbda56f2017-12-18 11:53:22 -0800166 return new IoStatsEntry.Metrics(foreground.bytesRead + background.bytesRead,
Enrico Granata7e0150d2017-11-06 17:20:17 -0800167 foreground.bytesWritten + background.bytesWritten,
168 foreground.bytesReadFromStorage + background.bytesReadFromStorage,
169 foreground.bytesWrittenToStorage + background.bytesWrittenToStorage,
170 foreground.fsyncCalls + background.fsyncCalls);
171 }
172
173 @Override
174 public boolean equals(Object other) {
Enrico Granatadbda56f2017-12-18 11:53:22 -0800175 if (other instanceof IoStats) {
176 IoStats delta = (IoStats)other;
Enrico Granata7e0150d2017-11-06 17:20:17 -0800177 return delta.getTimestamp() == getTimestamp() &&
178 delta.getStats().equals(getStats());
179 }
180 return false;
181 }
182
183 @Override
184 public String toString() {
185 StringJoiner stringJoiner = new StringJoiner(", ");
Enrico Granatadbda56f2017-12-18 11:53:22 -0800186 for (IoStatsEntry stats : getStats()) {
Enrico Granata7e0150d2017-11-06 17:20:17 -0800187 stringJoiner.add(stats.toString());
188 }
189 return "timestamp = " + getTimestamp() + ", stats = " + stringJoiner.toString();
190 }
191}