From b02eecda6a12241798cdbaaa7069d19f2fc5f41f Mon Sep 17 00:00:00 2001 From: Grace Zhao Date: Thu, 8 Sep 2022 20:26:31 +0000 Subject: Sync from upstream. Descriptions: ====================================================================== [FileBackedVector Consolidation][4/x] Fix potential PWrite bug in GrowIfNecessary ====================================================================== [FileBackedVector Consolidation][5/x] Create benchmark for FileBackedVector ====================================================================== [FileBackedVector Consolidation][6/x] Avoid calling GetFileSize in GrowIfNecessary ====================================================================== [PersistentHashMap][3.3/x] Implement Delete ====================================================================== Fix the PopulateMatchedTermsStats bug ====================================================================== Add JNI latency for query latency stats breakdown. ====================================================================== [ResultStateManager] Thread safety test1 ====================================================================== [ResultStateManager][2/x] Thread safety test2 ====================================================================== Add native lock contention latency for measuring query latency ====================================================================== Fix implementation of HasMember operator in ANTLR-based list-filter prototype. ====================================================================== Fix improper uses of std::string_view ====================================================================== Extend the scale of Icing ====================================================================== Decouple the term frequency array from DocHitInfo ====================================================================== Disable hit_term_frequency for non-relevance queries ====================================================================== [ResultStateManager][3/x] Thread safety test3 ====================================================================== [PersistentHashMap][4/x] Implement iterator ======================================================================= Fix the lite index compaction bug ======================================================================= Change-Id: I0edad67affed97af107e2d7cd73770e0268c0903 --- .../google/android/icing/IcingSearchEngine.java | 35 ++++++++++++++++++---- .../android/icing/IcingSearchEngineTest.java | 20 +++++++++++++ 2 files changed, 49 insertions(+), 6 deletions(-) (limited to 'java') diff --git a/java/src/com/google/android/icing/IcingSearchEngine.java b/java/src/com/google/android/icing/IcingSearchEngine.java index 16a4a4a..b54b344 100644 --- a/java/src/com/google/android/icing/IcingSearchEngine.java +++ b/java/src/com/google/android/icing/IcingSearchEngine.java @@ -306,9 +306,14 @@ public class IcingSearchEngine implements Closeable { @NonNull ResultSpecProto resultSpec) { throwIfClosed(); + long javaToNativeStartTimestampMs = System.currentTimeMillis(); byte[] searchResultBytes = nativeSearch( - this, searchSpec.toByteArray(), scoringSpec.toByteArray(), resultSpec.toByteArray()); + this, + searchSpec.toByteArray(), + scoringSpec.toByteArray(), + resultSpec.toByteArray(), + javaToNativeStartTimestampMs); if (searchResultBytes == null) { Log.e(TAG, "Received null SearchResultProto from native."); return SearchResultProto.newBuilder() @@ -317,7 +322,10 @@ public class IcingSearchEngine implements Closeable { } try { - return SearchResultProto.parseFrom(searchResultBytes, EXTENSION_REGISTRY_LITE); + SearchResultProto.Builder searchResultProtoBuilder = + SearchResultProto.newBuilder().mergeFrom(searchResultBytes, EXTENSION_REGISTRY_LITE); + setNativeToJavaJniLatency(searchResultProtoBuilder); + return searchResultProtoBuilder.build(); } catch (InvalidProtocolBufferException e) { Log.e(TAG, "Error parsing SearchResultProto.", e); return SearchResultProto.newBuilder() @@ -330,7 +338,7 @@ public class IcingSearchEngine implements Closeable { public SearchResultProto getNextPage(long nextPageToken) { throwIfClosed(); - byte[] searchResultBytes = nativeGetNextPage(this, nextPageToken); + byte[] searchResultBytes = nativeGetNextPage(this, nextPageToken, System.currentTimeMillis()); if (searchResultBytes == null) { Log.e(TAG, "Received null SearchResultProto from native."); return SearchResultProto.newBuilder() @@ -339,7 +347,10 @@ public class IcingSearchEngine implements Closeable { } try { - return SearchResultProto.parseFrom(searchResultBytes, EXTENSION_REGISTRY_LITE); + SearchResultProto.Builder searchResultProtoBuilder = + SearchResultProto.newBuilder().mergeFrom(searchResultBytes, EXTENSION_REGISTRY_LITE); + setNativeToJavaJniLatency(searchResultProtoBuilder); + return searchResultProtoBuilder.build(); } catch (InvalidProtocolBufferException e) { Log.e(TAG, "Error parsing SearchResultProto.", e); return SearchResultProto.newBuilder() @@ -348,6 +359,16 @@ public class IcingSearchEngine implements Closeable { } } + private void setNativeToJavaJniLatency(SearchResultProto.Builder searchResultProtoBuilder) { + int nativeToJavaLatencyMs = + (int) + (System.currentTimeMillis() + - searchResultProtoBuilder.getQueryStats().getNativeToJavaStartTimestampMs()); + searchResultProtoBuilder.setQueryStats( + searchResultProtoBuilder.getQueryStats().toBuilder() + .setNativeToJavaJniLatencyMs(nativeToJavaLatencyMs)); + } + @NonNull public void invalidateNextPageToken(long nextPageToken) { throwIfClosed(); @@ -657,9 +678,11 @@ public class IcingSearchEngine implements Closeable { IcingSearchEngine instance, byte[] searchSpecBytes, byte[] scoringSpecBytes, - byte[] resultSpecBytes); + byte[] resultSpecBytes, + long javaToNativeStartTimestampMs); - private static native byte[] nativeGetNextPage(IcingSearchEngine instance, long nextPageToken); + private static native byte[] nativeGetNextPage( + IcingSearchEngine instance, long nextPageToken, long javaToNativeStartTimestampMs); private static native void nativeInvalidateNextPageToken( IcingSearchEngine instance, long nextPageToken); diff --git a/java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java b/java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java index b55cfd1..556e537 100644 --- a/java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java +++ b/java/tests/instrumentation/src/com/google/android/icing/IcingSearchEngineTest.java @@ -214,6 +214,16 @@ public final class IcingSearchEngineTest { assertStatusOk(searchResultProto.getStatus()); assertThat(searchResultProto.getResultsCount()).isEqualTo(1); assertThat(searchResultProto.getResults(0).getDocument()).isEqualTo(emailDocument); + + // TODO(b/236412954): Enable these JNI latency tests once cl/469819190 is synced to Jetpack + // Test that JNI latency has been set properly + // assertThat(searchResultProto.getQueryStats().hasNativeToJavaJniLatencyMs()).isTrue(); + // assertThat(searchResultProto.getQueryStats().hasNativeToJavaStartTimestampMs()).isTrue(); + // assertThat(searchResultProto.getQueryStats().hasJavaToNativeJniLatencyMs()).isTrue(); + // assertThat(searchResultProto.getQueryStats().getNativeToJavaJniLatencyMs()).isAtLeast(0); + // assertThat(searchResultProto.getQueryStats().getNativeToJavaStartTimestampMs()) + // .isGreaterThan(0); + // assertThat(searchResultProto.getQueryStats().getJavaToNativeJniLatencyMs()).isAtLeast(0); } @Test @@ -256,6 +266,16 @@ public final class IcingSearchEngineTest { DocumentProto resultDocument = searchResultProto.getResults(0).getDocument(); assertThat(resultDocument).isEqualTo(documents.remove(resultDocument.getUri())); + // TODO(b/236412954): Enable these JNI latency tests once cl/469819190 is synced to Jetpack + // Test that JNI latency has been set + // assertThat(searchResultProto.getQueryStats().hasNativeToJavaJniLatencyMs()).isTrue(); + // assertThat(searchResultProto.getQueryStats().hasNativeToJavaStartTimestampMs()).isTrue(); + // assertThat(searchResultProto.getQueryStats().hasJavaToNativeJniLatencyMs()).isTrue(); + // assertThat(searchResultProto.getQueryStats().getNativeToJavaJniLatencyMs()).isAtLeast(0); + // assertThat(searchResultProto.getQueryStats().getNativeToJavaStartTimestampMs()) + // .isGreaterThan(0); + // assertThat(searchResultProto.getQueryStats().getJavaToNativeJniLatencyMs()).isAtLeast(0); + // fetch rest pages for (int i = 1; i < 5; i++) { searchResultProto = icingSearchEngine.getNextPage(searchResultProto.getNextPageToken()); -- cgit v1.2.3