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

Commit 01e08016 authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Update ProtoLog hash function to 64 bit

To avoid hash collisions now that we have more messages.

Flag: ACONFIG android.tracing.Flags.perfettoProtolog DEVELOPMENT
Bug: 276432490
Test: atest FrameworksServicesTests
Change-Id: Ia252f1fc60deb2beaf177b0782a8723e39f90a7e
parent f44daf99
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ message ProtoLogMessage {
    option (.android.msg_privacy).dest = DEST_LOCAL;

    /* log statement identifier, created from message string and log level. */
    optional sfixed32 message_hash = 1;
    optional sfixed32 message_hash_legacy = 1 [deprecated = true];
    /* log time, relative to the elapsed system time clock. */
    optional fixed64 elapsed_realtime_nanos = 2;
    /* string parameters passed to the log call. */
@@ -38,6 +38,9 @@ message ProtoLogMessage {
    repeated double double_params = 5 [packed=true];
    /* boolean parameters passed to the log call. */
    repeated bool boolean_params = 6 [packed=true];

    /* log statement identifier, created from message string and log level. */
    optional sfixed64 message_hash = 7;
}

/* represents a log file containing ProtoLog log entries.
+6 −6
Original line number Diff line number Diff line
@@ -144,7 +144,7 @@ public class ProtoLogImplTest {
        ProtoLogImpl.d(TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d");
        verify(mockedProtoLog).log(eq(ProtoLogImpl.LogLevel.DEBUG), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
    }

    @Test
@@ -154,7 +154,7 @@ public class ProtoLogImplTest {
        ProtoLogImpl.v(TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d");
        verify(mockedProtoLog).log(eq(ProtoLogImpl.LogLevel.VERBOSE), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
    }

    @Test
@@ -164,7 +164,7 @@ public class ProtoLogImplTest {
        ProtoLogImpl.i(TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d");
        verify(mockedProtoLog).log(eq(ProtoLogImpl.LogLevel.INFO), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
    }

    @Test
@@ -175,7 +175,7 @@ public class ProtoLogImplTest {
                4321, "test %d");
        verify(mockedProtoLog).log(eq(ProtoLogImpl.LogLevel.WARN), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
    }

    @Test
@@ -185,7 +185,7 @@ public class ProtoLogImplTest {
        ProtoLogImpl.e(TestProtoLogGroup.TEST_GROUP, 1234, 4321, "test %d");
        verify(mockedProtoLog).log(eq(ProtoLogImpl.LogLevel.ERROR), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
    }

    @Test
@@ -196,7 +196,7 @@ public class ProtoLogImplTest {
                1234, 4321, "test %d");
        verify(mockedProtoLog).log(eq(ProtoLogImpl.LogLevel.WTF), eq(
                TestProtoLogGroup.TEST_GROUP),
                eq(1234), eq(4321), eq("test %d"), eq(new Object[]{}));
                eq(1234L), eq(4321), eq("test %d"), eq(new Object[]{}));
    }

    @Test
+9 −3
Original line number Diff line number Diff line
@@ -22,15 +22,21 @@ import com.github.javaparser.ast.ImportDeclaration
import com.github.javaparser.ast.expr.BinaryExpr
import com.github.javaparser.ast.expr.Expression
import com.github.javaparser.ast.expr.StringLiteralExpr
import java.util.UUID

object CodeUtils {
    /**
     * Returns a stable hash of a string.
     * We reimplement String::hashCode() for readability reasons.
     */
    fun hash(position: String, messageString: String, logLevel: LogLevel, logGroup: LogGroup): Int {
        return (position + messageString + logLevel.name + logGroup.name)
                .map { c -> c.code }.reduce { h, c -> h * 31 + c }
    fun hash(
        position: String,
        messageString: String,
        logLevel: LogLevel,
        logGroup: LogGroup
    ): Long {
        val fullStringIdentifier = position + messageString + logLevel.name + logGroup.name
        return UUID.nameUUIDFromBytes(fullStringIdentifier.toByteArray()).mostSignificantBits
    }

    fun checkWildcardStaticImported(code: CompilationUnit, className: String, fileName: String) {
+5 −5
Original line number Diff line number Diff line
@@ -28,31 +28,31 @@ import org.junit.Test
class CodeUtilsTest {
    @Test
    fun hash() {
        assertEquals(-1259556708, CodeUtils.hash("Test.java:50", "test",
        assertEquals(3883826472308915399, CodeUtils.hash("Test.java:50", "test",
                LogLevel.DEBUG, LogGroup("test", true, true, "TAG")))
    }

    @Test
    fun hash_changeLocation() {
        assertEquals(15793504, CodeUtils.hash("Test.java:10", "test2",
        assertEquals(4125273133972468649, CodeUtils.hash("Test.java:10", "test2",
                LogLevel.DEBUG, LogGroup("test", true, true, "TAG")))
    }

    @Test
    fun hash_changeLevel() {
        assertEquals(-731772463, CodeUtils.hash("Test.java:50", "test",
        assertEquals(2618535069521361990, CodeUtils.hash("Test.java:50", "test",
                LogLevel.ERROR, LogGroup("test", true, true, "TAG")))
    }

    @Test
    fun hash_changeMessage() {
        assertEquals(-2026343204, CodeUtils.hash("Test.java:50", "test2",
        assertEquals(8907822592109789043, CodeUtils.hash("Test.java:50", "test2",
                LogLevel.DEBUG, LogGroup("test", true, true, "TAG")))
    }

    @Test
    fun hash_changeGroup() {
        assertEquals(1607870166, CodeUtils.hash("Test.java:50", "test2",
        assertEquals(-1299517016176640015, CodeUtils.hash("Test.java:50", "test2",
                LogLevel.DEBUG, LogGroup("test2", true, true, "TAG")))
    }