Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e53e1ed2 authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

Add verbose logging that can be eanbled to debug issues.

Test: manual
Change-Id: Ifaeaba404a8fc6a0d68a90f7330982a26a46486c
parent ae53d116
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.blob;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Environment;
import android.util.Log;
import android.util.Slog;

import java.io.File;
@@ -25,6 +26,7 @@ import java.util.concurrent.TimeUnit;

class BlobStoreConfig {
    public static final String TAG = "BlobStore";
    public static final boolean LOGV = Log.isLoggable(TAG, Log.VERBOSE);

    public static final int CURRENT_XML_VERSION = 1;

+8 −0
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@ package com.android.server.blob;

import static com.android.server.blob.BlobStoreConfig.IDLE_JOB_ID;
import static com.android.server.blob.BlobStoreConfig.IDLE_JOB_PERIOD_MILLIS;
import static com.android.server.blob.BlobStoreConfig.LOGV;
import static com.android.server.blob.BlobStoreConfig.TAG;

import android.app.job.JobInfo;
import android.app.job.JobParameters;
@@ -25,6 +27,7 @@ import android.app.job.JobService;
import android.content.ComponentName;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Slog;

import com.android.server.LocalServices;

@@ -45,6 +48,8 @@ public class BlobStoreIdleJobService extends JobService {

    @Override
    public boolean onStopJob(final JobParameters params) {
        Slog.d(TAG, "Idle maintenance job is stopped; id=" + params.getJobId()
                + ", reason=" + JobParameters.getReasonCodeDescription(params.getStopReason()));
        return false;
    }

@@ -58,5 +63,8 @@ public class BlobStoreIdleJobService extends JobService {
                        .setPeriodic(IDLE_JOB_PERIOD_MILLIS)
                        .build();
        jobScheduler.schedule(job);
        if (LOGV) {
            Slog.v(TAG, "Scheduling the idle maintenance job");
        }
    }
}
+95 −1
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
import static android.os.UserHandle.USER_NULL;

import static com.android.server.blob.BlobStoreConfig.CURRENT_XML_VERSION;
import static com.android.server.blob.BlobStoreConfig.LOGV;
import static com.android.server.blob.BlobStoreConfig.SESSION_EXPIRY_TIMEOUT_MILLIS;
import static com.android.server.blob.BlobStoreConfig.TAG;
import static com.android.server.blob.BlobStoreSession.STATE_ABANDONED;
@@ -96,6 +97,7 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@@ -268,6 +270,10 @@ public class BlobStoreManagerService extends SystemService {
                    sessionId, blobHandle, callingUid, callingPackage,
                    mSessionStateChangeListener);
            addSessionForUserLocked(session, UserHandle.getUserId(callingUid));
            if (LOGV) {
                Slog.v(TAG, "Created session for " + blobHandle
                        + "; callingUid=" + callingUid + ", callingPackage=" + callingPackage);
            }
            writeBlobSessionsAsync();
            return sessionId;
        }
@@ -295,7 +301,10 @@ public class BlobStoreManagerService extends SystemService {
                    callingUid, callingPackage);
            session.open();
            session.abandon();

            if (LOGV) {
                Slog.v(TAG, "Deleted session with id " + sessionId
                        + "; callingUid=" + callingUid + ", callingPackage=" + callingPackage);
            }
            writeBlobSessionsAsync();
        }
    }
@@ -330,6 +339,10 @@ public class BlobStoreManagerService extends SystemService {
            }
            blobMetadata.addLeasee(callingPackage, callingUid,
                    descriptionResId, leaseExpiryTimeMillis);
            if (LOGV) {
                Slog.v(TAG, "Acquired lease on " + blobHandle
                        + "; callingUid=" + callingUid + ", callingPackage=" + callingPackage);
            }
            writeBlobsInfoAsync();
        }
    }
@@ -345,6 +358,10 @@ public class BlobStoreManagerService extends SystemService {
                        + "; callingUid=" + callingUid + ", callingPackage=" + callingPackage);
            }
            blobMetadata.removeLeasee(callingPackage, callingUid);
            if (LOGV) {
                Slog.v(TAG, "Released lease on " + blobHandle
                        + "; callingUid=" + callingUid + ", callingPackage=" + callingPackage);
            }
            writeBlobsInfoAsync();
        }
    }
@@ -374,6 +391,9 @@ public class BlobStoreManagerService extends SystemService {
                    getUserSessionsLocked(UserHandle.getUserId(session.getOwnerUid()))
                            .remove(session.getSessionId());
                    mKnownBlobIds.remove(session.getSessionId());
                    if (LOGV) {
                        Slog.v(TAG, "Session is invalid; deleted " + session);
                    }
                    break;
                case STATE_COMMITTED:
                    session.verifyBlobData();
@@ -400,6 +420,9 @@ public class BlobStoreManagerService extends SystemService {
                    }
                    getUserSessionsLocked(UserHandle.getUserId(session.getOwnerUid()))
                            .remove(session.getSessionId());
                    if (LOGV) {
                        Slog.v(TAG, "Successfully committed session " + session);
                    }
                    break;
                default:
                    Slog.wtf(TAG, "Invalid session state: "
@@ -442,6 +465,9 @@ public class BlobStoreManagerService extends SystemService {
            out.endTag(null, TAG_SESSIONS);
            out.endDocument();
            sessionsIndexFile.finishWrite(fos);
            if (LOGV) {
                Slog.v(TAG, "Finished persisting sessions data");
            }
        } catch (Exception e) {
            sessionsIndexFile.failWrite(fos);
            Slog.wtf(TAG, "Error writing sessions data", e);
@@ -491,6 +517,9 @@ public class BlobStoreManagerService extends SystemService {
                    mCurrentMaxSessionId = Math.max(mCurrentMaxSessionId, session.getSessionId());
                }
            }
            if (LOGV) {
                Slog.v(TAG, "Finished reading sessions data");
            }
        } catch (Exception e) {
            Slog.wtf(TAG, "Error reading sessions data", e);
        }
@@ -524,6 +553,9 @@ public class BlobStoreManagerService extends SystemService {
            out.endTag(null, TAG_BLOBS);
            out.endDocument();
            blobsIndexFile.finishWrite(fos);
            if (LOGV) {
                Slog.v(TAG, "Finished persisting blobs data");
            }
        } catch (Exception e) {
            blobsIndexFile.failWrite(fos);
            Slog.wtf(TAG, "Error writing blobs data", e);
@@ -567,6 +599,9 @@ public class BlobStoreManagerService extends SystemService {
                    mCurrentMaxSessionId = Math.max(mCurrentMaxSessionId, blobMetadata.getBlobId());
                }
            }
            if (LOGV) {
                Slog.v(TAG, "Finished reading blobs data");
            }
        } catch (Exception e) {
            Slog.wtf(TAG, "Error reading blobs data", e);
        }
@@ -687,6 +722,10 @@ public class BlobStoreManagerService extends SystemService {
                userBlobs.removeAt(indicesToRemove.get(i));
            }
            writeBlobsInfoAsync();
            if (LOGV) {
                Slog.v(TAG, "Removed blobs data associated with pkg="
                        + packageName + ", uid=" + uid);
            }
        }
    }

@@ -711,6 +750,9 @@ public class BlobStoreManagerService extends SystemService {
                    mKnownBlobIds.remove(blobMetadata.getBlobId());
                }
            }
            if (LOGV) {
                Slog.v(TAG, "Removed blobs data in user " + userId);
            }
        }
    }

@@ -718,6 +760,7 @@ public class BlobStoreManagerService extends SystemService {
    @VisibleForTesting
    void handleIdleMaintenanceLocked() {
        // Cleanup any left over data on disk that is not part of index.
        final ArrayList<Long> deletedBlobIds = new ArrayList<>();
        final ArrayList<File> filesToDelete = new ArrayList<>();
        final File blobsDir = BlobStoreConfig.getBlobsDir();
        if (blobsDir.exists()) {
@@ -726,8 +769,10 @@ public class BlobStoreManagerService extends SystemService {
                    final long id = Long.parseLong(file.getName());
                    if (mKnownBlobIds.indexOf(id) < 0) {
                        filesToDelete.add(file);
                        deletedBlobIds.add(id);
                    }
                } catch (NumberFormatException e) {
                    Slog.wtf(TAG, "Error parsing the file name: " + file, e);
                    filesToDelete.add(file);
                }
            }
@@ -758,6 +803,7 @@ public class BlobStoreManagerService extends SystemService {
                if (shouldRemove) {
                    blobMetadata.getBlobFile().delete();
                    mKnownBlobIds.remove(blobMetadata.getBlobId());
                    deletedBlobIds.add(blobMetadata.getBlobId());
                }
                return shouldRemove;
            });
@@ -788,12 +834,17 @@ public class BlobStoreManagerService extends SystemService {
                    blobStoreSession.getSessionFile().delete();
                    mKnownBlobIds.remove(blobStoreSession.getSessionId());
                    indicesToRemove.add(j);
                    deletedBlobIds.add(blobStoreSession.getSessionId());
                }
            }
            for (int j = 0; j < indicesToRemove.size(); ++j) {
                userSessions.removeAt(indicesToRemove.get(j));
            }
        }
        if (LOGV) {
            Slog.v(TAG, "Completed idle maintenance; deleted "
                    + Arrays.toString(deletedBlobIds.toArray()));
        }
        writeBlobSessionsAsync();
    }

@@ -874,6 +925,9 @@ public class BlobStoreManagerService extends SystemService {
    private class PackageChangedReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (LOGV) {
                Slog.v(TAG, "Received " + intent);
            }
            switch (intent.getAction()) {
                case Intent.ACTION_PACKAGE_FULLY_REMOVED:
                case Intent.ACTION_PACKAGE_DATA_CLEARED:
@@ -1025,6 +1079,14 @@ public class BlobStoreManagerService extends SystemService {
            final DumpArgs dumpArgs = DumpArgs.parse(args);

            final IndentingPrintWriter fout = new IndentingPrintWriter(writer, "    ");
            if (dumpArgs.shouldDumpHelp()) {
                writer.println("dumpsys blob_store [options]:");
                fout.increaseIndent();
                dumpArgs.dumpArgsUsage(fout);
                fout.decreaseIndent();
                return;
            }

            synchronized (mBlobsLock) {
                fout.println("mCurrentMaxSessionId: " + mCurrentMaxSessionId);
                fout.println();
@@ -1058,6 +1120,7 @@ public class BlobStoreManagerService extends SystemService {
        private boolean mDumpOnlySelectedSections;
        private boolean mDumpSessions;
        private boolean mDumpBlobs;
        private boolean mDumpHelp;

        public boolean shouldDumpSession(String packageName, int uid, long blobId) {
            if (!CollectionUtils.isEmpty(mDumpPackages)
@@ -1103,6 +1166,10 @@ public class BlobStoreManagerService extends SystemService {
                    || mDumpUserIds.indexOf(userId) >= 0;
        }

        public boolean shouldDumpHelp() {
            return mDumpHelp;
        }

        private DumpArgs() {}

        public static DumpArgs parse(String[] args) {
@@ -1132,6 +1199,8 @@ public class BlobStoreManagerService extends SystemService {
                    dumpArgs.mDumpUserIds.add(getIntArgRequired(args, ++i, "userId"));
                } else if ("--blob".equals(opt) || "-b".equals(opt)) {
                    dumpArgs.mDumpBlobIds.add(getLongArgRequired(args, ++i, "blobId"));
                } else if ("--help".equals(opt) || "-h".equals(opt)) {
                    dumpArgs.mDumpHelp = true;
                } else {
                    // Everything else is assumed to be blob ids.
                    dumpArgs.mDumpBlobIds.add(getLongArgRequired(args, i, "blobId"));
@@ -1172,6 +1241,31 @@ public class BlobStoreManagerService extends SystemService {
            }
            return value;
        }

        private void dumpArgsUsage(IndentingPrintWriter pw) {
            pw.println("--help | -h");
            printWithIndent(pw, "Dump this help text");
            pw.println("--sessions");
            printWithIndent(pw, "Dump only the sessions info");
            pw.println("--blobs");
            printWithIndent(pw, "Dump only the committed blobs info");
            pw.println("--package | -p [package-name]");
            printWithIndent(pw, "Dump blobs info associated with the given package");
            pw.println("--uid | -u [uid]");
            printWithIndent(pw, "Dump blobs info associated with the given uid");
            pw.println("--user [user-id]");
            printWithIndent(pw, "Dump blobs info in the given user");
            pw.println("--blob | -b [session-id | blob-id]");
            printWithIndent(pw, "Dump blob info corresponding to the given ID");
            pw.println("--full | -f");
            printWithIndent(pw, "Dump full unredacted blobs data");
        }

        private void printWithIndent(IndentingPrintWriter pw, String str) {
            pw.increaseIndent();
            pw.println(str);
            pw.decreaseIndent();
        }
    }

    private class LocalService extends BlobStoreManagerInternal {
+14 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import static android.system.OsConstants.O_RDONLY;
import static android.system.OsConstants.O_RDWR;
import static android.system.OsConstants.SEEK_SET;

import static com.android.server.blob.BlobStoreConfig.LOGV;
import static com.android.server.blob.BlobStoreConfig.TAG;

import android.annotation.BytesLong;
@@ -390,6 +391,9 @@ class BlobStoreSession extends IBlobStoreSession.Stub {
                mState = STATE_VERIFIED_VALID;
                // Commit callback will be sent once the data is persisted.
            } else {
                if (LOGV) {
                    Slog.v(TAG, "Digest of the data didn't match the given BlobHandle.digest");
                }
                mState = STATE_VERIFIED_INVALID;
                sendCommitCallbackResult(COMMIT_RESULT_ERROR);
            }
@@ -447,6 +451,16 @@ class BlobStoreSession extends IBlobStoreSession.Stub {
        }
    }

    @Override
    public String toString() {
        return "BlobStoreSession {"
                + "id:" + mSessionId
                + ",handle:" + mBlobHandle
                + ",uid:" + mOwnerUid
                + ",pkg:" + mOwnerPackageName
                + "}";
    }

    private void assertCallerIsOwner() {
        final int callingUid = Binder.getCallingUid();
        if (callingUid != mOwnerUid) {