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

Commit bf6d07c0 authored by Junyu Lai's avatar Junyu Lai Committed by Automerger Merge Worker
Browse files

Merge "Read files in increasing timestamp order in FileRotator" into main am:...

Merge "Read files in increasing timestamp order in FileRotator" into main am: fe3deb07 am: 0e4bad82 am: 6e10088c am: 50edee26

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2674875



Change-Id: I9e027dd9fb84083b3b40ee200ace30ebff7bae50
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 36e4478c 50edee26
Loading
Loading
Loading
Loading
+17 −7
Original line number Diff line number Diff line
@@ -19,6 +19,9 @@ package com.android.internal.util;
import android.annotation.NonNull;
import android.os.FileUtils;
import android.util.Log;
import android.util.Pair;

import libcore.io.IoUtils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
@@ -28,12 +31,12 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Comparator;
import java.util.Objects;
import java.util.TreeSet;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import libcore.io.IoUtils;

/**
 * Utility that rotates files over time, similar to {@code logrotate}. There is
 * a single "active" file, which is periodically rotated into historical files,
@@ -302,18 +305,25 @@ public class FileRotator {
    public void readMatching(Reader reader, long matchStartMillis, long matchEndMillis)
            throws IOException {
        final FileInfo info = new FileInfo(mPrefix);
        final TreeSet<Pair<Long, String>> readSet = new TreeSet<>(
                Comparator.comparingLong(o -> o.first));
        for (String name : mBasePath.list()) {
            if (!info.parse(name)) continue;

            // read file when it overlaps
            // Add file to set when it overlaps.
            if (info.startMillis <= matchEndMillis && matchStartMillis <= info.endMillis) {
                if (LOGD) Log.d(TAG, "reading matching " + name);
                readSet.add(new Pair(info.startMillis, name));
            }
        }

        // Read files in ascending order of start timestamp.
        for (Pair<Long, String> pair : readSet) {
            final String name = pair.second;
            if (LOGD) Log.d(TAG, "reading matching " + name);
            final File file = new File(mBasePath, name);
            readFile(file, reader);
        }
    }
    }

    /**
     * Return the currently active file, which may not exist yet.
+11 −10
Original line number Diff line number Diff line
@@ -366,6 +366,16 @@ public class FileRotatorTest extends AndroidTestCase {
        assertReadAll(rotate, "bar");
    }

    public void testReadSorted() throws Exception {
        write("rotator.1024-2048", "2");
        write("rotator.2048-4096", "3");
        write("rotator.512-1024", "1");

        final FileRotator rotate = new FileRotator(
                mBasePath, PREFIX, SECOND_IN_MILLIS, SECOND_IN_MILLIS);
        assertReadAll(rotate, "1", "2", "3");
    }

    public void testFileSystemInaccessible() throws Exception {
        File inaccessibleDir = null;
        String dirPath = getContext().getFilesDir() + File.separator + "inaccessible";
@@ -422,16 +432,7 @@ public class FileRotatorTest extends AndroidTestCase {
        }

        public void assertRead(String... expected) {
            assertEquals(expected.length, mActual.size());

            final ArrayList<String> actualCopy = new ArrayList<String>(mActual);
            for (String value : expected) {
                if (!actualCopy.remove(value)) {
                    final String expectedString = Arrays.toString(expected);
                    final String actualString = Arrays.toString(mActual.toArray());
                    fail("expected: " + expectedString + " but was: " + actualString);
                }
            }
            assertEquals(Arrays.asList(expected), mActual);
        }
    }
}