Commit 60c385ed authored by David Maunder's avatar David Maunder Committed by Commit Bot

Add metrics to PersistedTabData and FilePersistedTabDataStorage

PersistedTabData stores tab metadata across restarts and
FilePersistedTabDataStorage is the method of persisting the data
in a file.

Various use cases such as serialization, save, restore and delete
now have metrics associated with them.

Bug: 1059635
Change-Id: I3f7d267227819eefb30b23b95a85a637e22fef7d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2125229
Commit-Queue: David Maunder <davidjm@chromium.org>
Reviewed-by: default avatarTommy Nyquist <nyquist@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarIlya Sherman <isherman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#784335}
parent 79a2c08b
......@@ -155,7 +155,7 @@ public class CriticalPersistedTabData extends PersistedTabData {
}
@Override
void deserialize(byte[] bytes) {
boolean deserialize(byte[] bytes) {
try {
CriticalPersistedTabDataProto criticalPersistedTabDataProto =
CriticalPersistedTabDataProto.parseFrom(bytes);
......@@ -168,13 +168,19 @@ public class CriticalPersistedTabData extends PersistedTabData {
mThemeColor = criticalPersistedTabDataProto.getThemeColor();
mTabLaunchTypeAtCreation =
getLaunchType(criticalPersistedTabDataProto.getLaunchTypeAtCreation());
return true;
} catch (InvalidProtocolBufferException e) {
// TODO(crbug.com/1059635) add in metrics
Log.e(TAG,
String.format(Locale.ENGLISH,
"There was a problem deserializing Tab %d. Details: %s", mTab.getId(),
e.getMessage()));
}
return false;
}
@Override
public String getUmaTag() {
return "Critical";
}
private static @TabLaunchType int getLaunchType(
......
......@@ -12,6 +12,7 @@ import org.chromium.base.Callback;
import org.chromium.base.Log;
import org.chromium.base.StreamUtil;
import org.chromium.base.ThreadUtils;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.task.AsyncTask;
import org.chromium.base.task.PostTask;
import org.chromium.chrome.browser.tabpersistence.TabStateDirectory;
......@@ -165,9 +166,11 @@ public class FilePersistedTabDataStorage implements PersistedTabDataStorage {
@Override
protected Void doInBackground() {
FileOutputStream outputStream = null;
boolean success = false;
try {
outputStream = new FileOutputStream(mFile);
outputStream.write(mData);
success = true;
} catch (FileNotFoundException e) {
Log.e(TAG,
String.format(Locale.ENGLISH,
......@@ -183,6 +186,8 @@ public class FilePersistedTabDataStorage implements PersistedTabDataStorage {
} finally {
StreamUtil.closeQuietly(outputStream);
}
RecordHistogram.recordBooleanHistogram(
"Tabs.PersistedTabData.Storage.Save." + getUmaTag(), success);
return null;
}
......@@ -223,11 +228,16 @@ public class FilePersistedTabDataStorage implements PersistedTabDataStorage {
return new AsyncTask<Void>() {
@Override
protected Void doInBackground() {
if (!mFile.exists()) {
boolean exists = mFile.exists();
RecordHistogram.recordBooleanHistogram(
"Tabs.PersistedTabData.Storage.Exists." + getUmaTag(), exists);
if (!exists) {
return null;
}
boolean res = mFile.delete();
if (!res) {
boolean success = mFile.delete();
RecordHistogram.recordBooleanHistogram(
"Tabs.PersistedTabData.Storage.Delete." + getUmaTag(), success);
if (!success) {
Log.e(TAG, String.format(Locale.ENGLISH, "Error deleting file %s", mFile));
}
return null;
......@@ -270,9 +280,12 @@ public class FilePersistedTabDataStorage implements PersistedTabDataStorage {
return new AsyncTask<byte[]>() {
@Override
protected byte[] doInBackground() {
boolean success = false;
byte[] res = null;
try {
AtomicFile atomicFile = new AtomicFile(mFile);
return atomicFile.readFully();
res = atomicFile.readFully();
success = true;
} catch (FileNotFoundException e) {
Log.e(TAG,
String.format(Locale.ENGLISH,
......@@ -286,7 +299,9 @@ public class FilePersistedTabDataStorage implements PersistedTabDataStorage {
+ "%s. Details: %s",
mFile, e.getMessage()));
}
return null;
RecordHistogram.recordBooleanHistogram(
"Tabs.PersistedTabData.Storage.Restore." + getUmaTag(), success);
return res;
}
@Override
......@@ -309,4 +324,9 @@ public class FilePersistedTabDataStorage implements PersistedTabDataStorage {
if (mQueue.isEmpty()) return;
mQueue.poll().getAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
@Override
public String getUmaTag() {
return "File";
}
}
......@@ -71,10 +71,16 @@ public class MockPersistedTabData extends PersistedTabData {
}
@Override
public void deserialize(byte[] data) {
public boolean deserialize(byte[] data) {
mField = ByteBuffer.wrap(data).getInt();
return true;
}
@Override
public void destroy() {}
@Override
public String getUmaTag() {
return "MockCritical";
}
}
......@@ -11,6 +11,7 @@ import org.chromium.base.Callback;
import org.chromium.base.ThreadUtils;
import org.chromium.base.UserData;
import org.chromium.base.UserDataHost;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.tab.Tab;
......@@ -44,7 +45,7 @@ public abstract class PersistedTabData implements UserData {
PersistedTabData(Tab tab, byte[] data, PersistedTabDataStorage persistedTabDataStorage,
String persistedTabDataId) {
this(tab, persistedTabDataStorage, persistedTabDataId);
deserialize(data);
deserializeAndLog(data);
}
/**
......@@ -161,7 +162,7 @@ public abstract class PersistedTabData implements UserData {
*/
@VisibleForTesting
protected void save() {
mPersistedTabDataStorage.save(mTab.getId(), mPersistedTabDataId, serialize());
mPersistedTabDataStorage.save(mTab.getId(), mPersistedTabDataId, serializeAndLog());
}
/**
......@@ -169,12 +170,25 @@ public abstract class PersistedTabData implements UserData {
*/
abstract byte[] serialize();
private byte[] serializeAndLog() {
byte[] res = serialize();
RecordHistogram.recordBooleanHistogram(
"Tabs.PersistedTabData.Serialize." + getUmaTag(), res != null);
return res;
}
/**
* Deserialize serialized {@link PersistedTabData} and
* assign to fields in {@link PersistedTabData}
* @param bytes serialized PersistedTabData
*/
abstract void deserialize(@Nullable byte[] bytes);
abstract boolean deserialize(@Nullable byte[] bytes);
private void deserializeAndLog(@Nullable byte[] bytes) {
boolean success = deserialize(bytes);
RecordHistogram.recordBooleanHistogram(
"Tabs.PersistedTabData.Deserialize." + getUmaTag(), success);
}
/**
* Delete {@link PersistedTabData} for a tab id
......@@ -191,4 +205,9 @@ public abstract class PersistedTabData implements UserData {
*/
@Override
public abstract void destroy();
/**
* @return unique tag for logging in Uma
*/
public abstract String getUmaTag();
}
......@@ -29,4 +29,9 @@ public interface PersistedTabDataStorage {
* @param tabDataId unique identifier representing the type of {@link PersistedTabData}
*/
void delete(int tabId, String tabDataId);
/**
* @return unique tag appended to the end of metrics for Uma
*/
String getUmaTag();
}
......@@ -175841,6 +175841,84 @@ should be kept until we use this API. -->
</summary>
</histogram>
<histogram name="Tabs.PersistedTabData.Deserialize.Critical"
enum="BooleanSuccess" expires_after="2021-03-25">
<owner>yusufo@chromium.org</owner>
<owner>nyquist@chromium.org</owner>
<owner>dtrainor@chromium.org</owner>
<owner>davidjm@chromium.org</owner>
<summary>
CriticalPersistedTabData stores data pertinent to the running of the app
such as tab id, parent id, web contents. This data is serialized and stored
across restarts. This records if the deserialization succeeds or fails.
</summary>
</histogram>
<histogram name="Tabs.PersistedTabData.Serialize.Critical"
enum="BooleanSuccess" expires_after="2021-03-25">
<owner>yusufo@chromium.org</owner>
<owner>nyquist@chromium.org</owner>
<owner>dtrainor@chromium.org</owner>
<owner>davidjm@chromium.org</owner>
<summary>
CriticalPersistedTabData stores data pertinent to the running of the app
such as tab id, parent id, web contents. This data is serialized and stored
across restarts. This records if the serialization succeeds or fails.
</summary>
</histogram>
<histogram name="Tabs.PersistedTabData.Storage.Delete.File"
enum="BooleanSuccess" expires_after="2021-03-25">
<owner>yusufo@chromium.org</owner>
<owner>nyquist@chromium.org</owner>
<owner>dtrainor@chromium.org</owner>
<owner>davidjm@chromium.org</owner>
<summary>
FilePersistedTabData storage stores serialized PersistedTabData (metadata
persisted across restarts) in a file. This metric records if a delete was
successful or unsuccessful.
</summary>
</histogram>
<histogram name="Tabs.PersistedTabData.Storage.Exists.File"
enum="BooleanSuccess" expires_after="2021-03-25">
<owner>yusufo@chromium.org</owner>
<owner>nyquist@chromium.org</owner>
<owner>dtrainor@chromium.org</owner>
<owner>davidjm@chromium.org</owner>
<summary>
FilePersistedTabData storage stores serialized PersistedTabData (metadata
persisted across restarts) in a file. This metric records if a delete
operation was found to have the file not existing.
</summary>
</histogram>
<histogram name="Tabs.PersistedTabData.Storage.Restore.File"
enum="BooleanSuccess" expires_after="2021-03-25">
<owner>yusufo@chromium.org</owner>
<owner>nyquist@chromium.org</owner>
<owner>dtrainor@chromium.org</owner>
<owner>davidjm@chromium.org</owner>
<summary>
FilePersistedTabData storage stores serialized PersistedTabData (metadata
persisted across restarts) in a file. This metric records if a restore was
successful or unsuccessful.
</summary>
</histogram>
<histogram name="Tabs.PersistedTabData.Storage.Save.File" enum="BooleanSuccess"
expires_after="2021-03-25">
<owner>yusufo@chromium.org</owner>
<owner>nyquist@chromium.org</owner>
<owner>dtrainor@chromium.org</owner>
<owner>davidjm@chromium.org</owner>
<summary>
FilePersistedTabData storage stores serialized PersistedTabData (metadata
persisted across restarts) in a file. This metric records if a save was
successful or unsuccessful.
</summary>
</histogram>
<histogram name="Tabs.SadTab.CrashCreated" units="tabs"
expires_after="2021-06-01">
<owner>sonnyrao@chromium.org</owner>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment