Merge "storagemenager: Skip fstrim while doing block based checkpoint" into qt-dev

This commit is contained in:
TreeHugger Robot
2019-04-17 16:46:38 +00:00
committed by Android (Google) Code Review

View File

@@ -1074,6 +1074,15 @@ class StorageManagerService extends IStorageManager.Stub
mVold.onUserStarted(userId, packages, appIds, sandboxIds); mVold.onUserStarted(userId, packages, appIds, sandboxIds);
} }
private boolean supportsBlockCheckpoint() throws RemoteException {
// Only the system process is permitted to start checkpoints
if (Binder.getCallingUid() != android.os.Process.SYSTEM_UID) {
throw new SecurityException("no permission to check block based checkpoint support");
}
return mVold.supportsBlockCheckpoint();
}
@Override @Override
public void onAwakeStateChanged(boolean isAwake) { public void onAwakeStateChanged(boolean isAwake) {
// Ignored // Ignored
@@ -2116,6 +2125,11 @@ class StorageManagerService extends IStorageManager.Stub
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS); enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
try { try {
// Block based checkpoint process runs fstrim. So, if checkpoint is in progress
// (first boot after OTA), We skip idle maintenance and make sure the last
// fstrim time is still updated. If file based checkpoints are used, we run
// idle maintenance (GC + fstrim) regardless of checkpoint status.
if (!needsCheckpoint() || !supportsBlockCheckpoint()) {
mVold.fstrim(flags, new IVoldTaskListener.Stub() { mVold.fstrim(flags, new IVoldTaskListener.Stub() {
@Override @Override
public void onStatus(int status, PersistableBundle extras) { public void onStatus(int status, PersistableBundle extras) {
@@ -2147,6 +2161,9 @@ class StorageManagerService extends IStorageManager.Stub
// TODO: benchmark when desired // TODO: benchmark when desired
} }
}); });
} else {
Slog.i(TAG, "Skipping fstrim - block based checkpoint in progress");
}
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowAsRuntimeException(); throw e.rethrowAsRuntimeException();
} }
@@ -2156,6 +2173,11 @@ class StorageManagerService extends IStorageManager.Stub
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS); enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
try { try {
// Block based checkpoint process runs fstrim. So, if checkpoint is in progress
// (first boot after OTA), We skip idle maintenance and make sure the last
// fstrim time is still updated. If file based checkpoints are used, we run
// idle maintenance (GC + fstrim) regardless of checkpoint status.
if (!needsCheckpoint() || !supportsBlockCheckpoint()) {
mVold.runIdleMaint(new IVoldTaskListener.Stub() { mVold.runIdleMaint(new IVoldTaskListener.Stub() {
@Override @Override
public void onStatus(int status, PersistableBundle extras) { public void onStatus(int status, PersistableBundle extras) {
@@ -2168,6 +2190,9 @@ class StorageManagerService extends IStorageManager.Stub
} }
} }
}); });
} else {
Slog.i(TAG, "Skipping idle maintenance - block based checkpoint in progress");
}
} catch (Exception e) { } catch (Exception e) {
Slog.wtf(TAG, e); Slog.wtf(TAG, e);
} }