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

Commit 96f635ed authored by Adam Lesinski's avatar Adam Lesinski Committed by Android (Google) Code Review
Browse files

Merge "UsageStatsService: Update file index to prevent double checkin" into lmp-mr1-dev

parents 9a2db6bf 0fb25fae
Loading
Loading
Loading
Loading
+22 −9
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ class UsageStatsDatabase {
    private static final String TAG = "UsageStatsDatabase";
    private static final boolean DEBUG = UsageStatsService.DEBUG;
    private static final String BAK_SUFFIX = ".bak";
    private static final String CHECKED_IN_SUFFIX = UsageStatsXml.CHECKED_IN_SUFFIX;

    private final Object mLock = new Object();
    private final File[] mIntervalDirs;
@@ -114,14 +115,17 @@ class UsageStatsDatabase {
            final TimeSparseArray<AtomicFile> files =
                    mSortedStatFiles[UsageStatsManager.INTERVAL_DAILY];
            final int fileCount = files.size();
            int start = 0;
            while (start < fileCount - 1) {
                if (!files.valueAt(start).getBaseFile().getName().endsWith("-c")) {
                    break;

            // We may have holes in the checkin (if there was an error)
            // so find the last checked-in file and go from there.
            int lastCheckin = -1;
            for (int i = 0; i < fileCount - 1; i++) {
                if (files.valueAt(i).getBaseFile().getPath().endsWith(CHECKED_IN_SUFFIX)) {
                    lastCheckin = i;
                }
                start++;
            }

            final int start = lastCheckin + 1;
            if (start == fileCount - 1) {
                return true;
            }
@@ -143,8 +147,8 @@ class UsageStatsDatabase {
            // are marked as checked-in.
            for (int i = start; i < fileCount - 1; i++) {
                final AtomicFile file = files.valueAt(i);
                final File checkedInFile = new File(file.getBaseFile().getParent(),
                        file.getBaseFile().getName() + "-c");
                final File checkedInFile = new File(
                        file.getBaseFile().getPath() + CHECKED_IN_SUFFIX);
                if (!file.getBaseFile().renameTo(checkedInFile)) {
                    // We must return success, as we've already marked some files as checked-in.
                    // It's better to repeat ourselves than to lose data.
@@ -152,6 +156,10 @@ class UsageStatsDatabase {
                            + " as checked-in");
                    return true;
                }

                // AtomicFile needs to set a new backup path with the same -c extension, so
                // we replace the old AtomicFile with the updated one.
                files.setValueAt(i, new AtomicFile(checkedInFile));
            }
        }
        return true;
@@ -240,8 +248,13 @@ class UsageStatsDatabase {
                        } catch (IOException e) {
                            // Ignore, this is just to make sure there are no backups.
                        }
                        final File newFile = new File(file.getBaseFile().getParentFile(),
                                Long.toString(newTime));

                        String newName = Long.toString(newTime);
                        if (file.getBaseFile().getName().endsWith(CHECKED_IN_SUFFIX)) {
                            newName = newName + CHECKED_IN_SUFFIX;
                        }

                        final File newFile = new File(file.getBaseFile().getParentFile(), newName);
                        Slog.i(TAG, "Moving file " + file.getBaseFile().getAbsolutePath() + " to "
                                + newFile.getAbsolutePath());
                        file.getBaseFile().renameTo(newFile);
+9 −5
Original line number Diff line number Diff line
@@ -31,17 +31,21 @@ public class UsageStatsXml {
    private static final int CURRENT_VERSION = 1;
    private static final String USAGESTATS_TAG = "usagestats";
    private static final String VERSION_ATTR = "version";
    private static final String CHECKED_IN_SUFFIX = "-c";
    static final String CHECKED_IN_SUFFIX = "-c";

    public static long parseBeginTime(AtomicFile file) {
        return parseBeginTime(file.getBaseFile());
    }

    public static long parseBeginTime(File file) {
        final String name = file.getName();
        if (name.endsWith(CHECKED_IN_SUFFIX)) {
            return Long.parseLong(
                    name.substring(0, name.length() - CHECKED_IN_SUFFIX.length()));
        String name = file.getName();

        // Eat as many occurrences of -c as possible. This is due to a bug where -c
        // would be appended more than once to a checked-in file, causing a crash
        // on boot when indexing files since Long.parseLong() will puke on anything but
        // a number.
        while (name.endsWith(CHECKED_IN_SUFFIX)) {
            name = name.substring(0, name.length() - CHECKED_IN_SUFFIX.length());
        }
        return Long.parseLong(name);
    }