diff options
author | Tim Barron <tjbarron@google.com> | 2023-06-02 06:14:34 +0000 |
---|---|---|
committer | Tim Barron <tjbarron@google.com> | 2023-06-02 06:14:34 +0000 |
commit | b87146567e78489269a627348e7ba98e97530faa (patch) | |
tree | 3982f63f9e8f46d5a4484c9e915ef14db1aa817f /icing/store | |
parent | 818e087b7b1108bc871bbe462d7d8fbf83d82d00 (diff) | |
download | icing-b87146567e78489269a627348e7ba98e97530faa.tar.gz |
Update Icing from upstream.
Descriptions:
========================================================================
Eliminate unnecessary GetCurrentTime syscalls in various hotspots.
========================================================================
Fix MSAN failure in SchemaStore::Header::Write.
========================================================================
Bug: 282308801
Change-Id: Ifb11f890485329e6b0bc1a9cbf2bf046e39b7854
Diffstat (limited to 'icing/store')
-rw-r--r-- | icing/store/document-store.cc | 79 | ||||
-rw-r--r-- | icing/store/document-store.h | 12 | ||||
-rw-r--r-- | icing/store/document-store_benchmark.cc | 10 | ||||
-rw-r--r-- | icing/store/document-store_test.cc | 282 | ||||
-rw-r--r-- | icing/store/suggestion-result-checker-impl.h | 10 |
5 files changed, 248 insertions, 145 deletions
diff --git a/icing/store/document-store.cc b/icing/store/document-store.cc index b49d0de..e99bacf 100644 --- a/icing/store/document-store.cc +++ b/icing/store/document-store.cc @@ -1010,7 +1010,8 @@ libtextclassifier3::StatusOr<DocumentId> DocumentStore::InternalPut( // Delete the old document. It's fine if it's not found since it might have // been deleted previously. - auto delete_status = Delete(old_document_id); + auto delete_status = + Delete(old_document_id, clock_.GetSystemTimeMilliseconds()); if (!delete_status.ok() && !absl_ports::IsNotFound(delete_status)) { // Real error, pass it up. return delete_status; @@ -1055,7 +1056,9 @@ libtextclassifier3::StatusOr<DocumentProto> DocumentStore::Get( libtextclassifier3::StatusOr<DocumentProto> DocumentStore::Get( DocumentId document_id, bool clear_internal_fields) const { - auto document_filter_data_optional_ = GetAliveDocumentFilterData(document_id); + int64_t current_time_ms = clock_.GetSystemTimeMilliseconds(); + auto document_filter_data_optional_ = + GetAliveDocumentFilterData(document_id, current_time_ms); if (!document_filter_data_optional_) { // The document doesn't exist. Let's check if the document id is invalid, we // will return InvalidArgumentError. Otherwise we should return NOT_FOUND @@ -1118,6 +1121,7 @@ std::vector<std::string> DocumentStore::GetAllNamespaces() const { GetNamespaceIdsToNamespaces(namespace_mapper_.get()); std::unordered_set<NamespaceId> existing_namespace_ids; + int64_t current_time_ms = clock_.GetSystemTimeMilliseconds(); for (DocumentId document_id = 0; document_id < filter_cache_->num_elements(); ++document_id) { // filter_cache_->Get can only fail if document_id is < 0 @@ -1130,7 +1134,7 @@ std::vector<std::string> DocumentStore::GetAllNamespaces() const { } const DocumentFilterData* data = status_or_data.ValueOrDie(); - if (GetAliveDocumentFilterData(document_id)) { + if (GetAliveDocumentFilterData(document_id, current_time_ms)) { existing_namespace_ids.insert(data->namespace_id()); } } @@ -1144,14 +1148,11 @@ std::vector<std::string> DocumentStore::GetAllNamespaces() const { } std::optional<DocumentFilterData> DocumentStore::GetAliveDocumentFilterData( - DocumentId document_id) const { - if (!IsDocumentIdValid(document_id)) { - return std::nullopt; - } + DocumentId document_id, int64_t current_time_ms) const { if (IsDeleted(document_id)) { return std::nullopt; } - return GetNonExpiredDocumentFilterData(document_id); + return GetNonExpiredDocumentFilterData(document_id, current_time_ms); } bool DocumentStore::IsDeleted(DocumentId document_id) const { @@ -1171,7 +1172,8 @@ bool DocumentStore::IsDeleted(DocumentId document_id) const { // Returns DocumentFilterData if the document is not expired. Otherwise, // std::nullopt. std::optional<DocumentFilterData> -DocumentStore::GetNonExpiredDocumentFilterData(DocumentId document_id) const { +DocumentStore::GetNonExpiredDocumentFilterData(DocumentId document_id, + int64_t current_time_ms) const { auto filter_data_or = filter_cache_->GetCopy(document_id); if (!filter_data_or.ok()) { // This would only happen if document_id is out of range of the @@ -1184,15 +1186,15 @@ DocumentStore::GetNonExpiredDocumentFilterData(DocumentId document_id) const { DocumentFilterData document_filter_data = filter_data_or.ValueOrDie(); // Check if it's past the expiration time - if (clock_.GetSystemTimeMilliseconds() >= - document_filter_data.expiration_timestamp_ms()) { + if (current_time_ms >= document_filter_data.expiration_timestamp_ms()) { return std::nullopt; } return document_filter_data; } libtextclassifier3::Status DocumentStore::Delete( - const std::string_view name_space, const std::string_view uri) { + const std::string_view name_space, const std::string_view uri, + int64_t current_time_ms) { // Try to get the DocumentId first auto document_id_or = GetDocumentId(name_space, uri); if (!document_id_or.ok()) { @@ -1201,11 +1203,13 @@ libtextclassifier3::Status DocumentStore::Delete( absl_ports::StrCat("Failed to delete Document. namespace: ", name_space, ", uri: ", uri)); } - return Delete(document_id_or.ValueOrDie()); + return Delete(document_id_or.ValueOrDie(), current_time_ms); } -libtextclassifier3::Status DocumentStore::Delete(DocumentId document_id) { - auto document_filter_data_optional_ = GetAliveDocumentFilterData(document_id); +libtextclassifier3::Status DocumentStore::Delete(DocumentId document_id, + int64_t current_time_ms) { + auto document_filter_data_optional_ = + GetAliveDocumentFilterData(document_id, current_time_ms); if (!document_filter_data_optional_) { // The document doesn't exist. We should return InvalidArgumentError if the // document id is invalid. Otherwise we should return NOT_FOUND error. @@ -1292,24 +1296,16 @@ libtextclassifier3::StatusOr<int32_t> DocumentStore::GetResultGroupingEntryId( libtextclassifier3::StatusOr<DocumentAssociatedScoreData> DocumentStore::GetDocumentAssociatedScoreData(DocumentId document_id) const { - if (!GetAliveDocumentFilterData(document_id)) { - return absl_ports::NotFoundError(IcingStringUtil::StringPrintf( - "Can't get usage scores, document id '%d' doesn't exist", document_id)); - } - auto score_data_or = score_cache_->GetCopy(document_id); if (!score_data_or.ok()) { ICING_LOG(ERROR) << " while trying to access DocumentId " << document_id << " from score_cache_"; - return score_data_or.status(); + return absl_ports::NotFoundError( + std::move(score_data_or).status().error_message()); } DocumentAssociatedScoreData document_associated_score_data = std::move(score_data_or).ValueOrDie(); - if (document_associated_score_data.document_score() < 0) { - // An negative / invalid score means that the score data has been deleted. - return absl_ports::NotFoundError("Document score data not found."); - } return document_associated_score_data; } @@ -1344,9 +1340,9 @@ DocumentStore::GetCorpusAssociatedScoreDataToUpdate(CorpusId corpus_id) const { // TODO(b/273826815): Decide on and adopt a consistent pattern for handling // NOT_FOUND 'errors' returned by our internal classes. std::optional<UsageStore::UsageScores> DocumentStore::GetUsageScores( - DocumentId document_id) const { + DocumentId document_id, int64_t current_time_ms) const { std::optional<DocumentFilterData> opt = - GetAliveDocumentFilterData(document_id); + GetAliveDocumentFilterData(document_id, current_time_ms); if (!opt) { return std::nullopt; } @@ -1370,7 +1366,8 @@ libtextclassifier3::Status DocumentStore::ReportUsage( // We can use the internal version here because we got our document_id from // our internal data structures. We would have thrown some error if the // namespace and/or uri were incorrect. - if (!GetAliveDocumentFilterData(document_id)) { + int64_t current_time_ms = clock_.GetSystemTimeMilliseconds(); + if (!GetAliveDocumentFilterData(document_id, current_time_ms)) { // Document was probably deleted or expired. return absl_ports::NotFoundError(absl_ports::StrCat( "Couldn't report usage on a nonexistent document: (namespace: '", @@ -1446,6 +1443,7 @@ libtextclassifier3::StatusOr<int> DocumentStore::BatchDelete( // Traverse FilterCache and delete all docs that match namespace_id and // schema_type_id. + int64_t current_time_ms = clock_.GetSystemTimeMilliseconds(); for (DocumentId document_id = 0; document_id < filter_cache_->num_elements(); ++document_id) { // filter_cache_->Get can only fail if document_id is < 0 @@ -1473,7 +1471,8 @@ libtextclassifier3::StatusOr<int> DocumentStore::BatchDelete( // The document has the desired namespace and schema type, it either // exists or has expired. - libtextclassifier3::Status delete_status = Delete(document_id); + libtextclassifier3::Status delete_status = + Delete(document_id, current_time_ms); if (absl_ports::IsNotFound(delete_status)) { continue; } else if (!delete_status.ok()) { @@ -1545,6 +1544,7 @@ DocumentStorageInfoProto DocumentStore::CalculateDocumentStatusCounts( std::unordered_map<std::string, NamespaceStorageInfoProto> namespace_to_storage_info; + int64_t current_time_ms = clock_.GetSystemTimeMilliseconds(); for (DocumentId document_id = 0; document_id < document_id_mapper_->num_elements(); ++document_id) { // Check if it's deleted first. @@ -1588,7 +1588,7 @@ DocumentStorageInfoProto DocumentStore::CalculateDocumentStatusCounts( UsageStore::UsageScores usage_scores = usage_scores_or.ValueOrDie(); // Update our stats - if (!GetNonExpiredDocumentFilterData(document_id)) { + if (!GetNonExpiredDocumentFilterData(document_id, current_time_ms)) { ++total_num_expired; namespace_storage_info.set_num_expired_documents( namespace_storage_info.num_expired_documents() + 1); @@ -1651,6 +1651,7 @@ libtextclassifier3::Status DocumentStore::UpdateSchemaStore( document_validator_.UpdateSchemaStore(schema_store); int size = document_id_mapper_->num_elements(); + int64_t current_time_ms = clock_.GetSystemTimeMilliseconds(); for (DocumentId document_id = 0; document_id < size; document_id++) { auto document_or = Get(document_id); if (absl_ports::IsNotFound(document_or.status())) { @@ -1680,7 +1681,8 @@ libtextclassifier3::Status DocumentStore::UpdateSchemaStore( } else { // Document is no longer valid with the new SchemaStore. Mark as // deleted - auto delete_status = Delete(document.namespace_(), document.uri()); + auto delete_status = + Delete(document.namespace_(), document.uri(), current_time_ms); if (!delete_status.ok() && !absl_ports::IsNotFound(delete_status)) { // Real error, pass up return delete_status; @@ -1704,8 +1706,9 @@ libtextclassifier3::Status DocumentStore::OptimizedUpdateSchemaStore( document_validator_.UpdateSchemaStore(schema_store); int size = document_id_mapper_->num_elements(); + int64_t current_time_ms = clock_.GetSystemTimeMilliseconds(); for (DocumentId document_id = 0; document_id < size; document_id++) { - if (!GetAliveDocumentFilterData(document_id)) { + if (!GetAliveDocumentFilterData(document_id, current_time_ms)) { // Skip nonexistent documents continue; } @@ -1749,7 +1752,7 @@ libtextclassifier3::Status DocumentStore::OptimizedUpdateSchemaStore( if (delete_document) { // Document is no longer valid with the new SchemaStore. Mark as deleted - auto delete_status = Delete(document_id); + auto delete_status = Delete(document_id, current_time_ms); if (!delete_status.ok() && !absl_ports::IsNotFound(delete_status)) { // Real error, pass up return delete_status; @@ -1791,12 +1794,14 @@ DocumentStore::OptimizeInto(const std::string& new_directory, int num_expired = 0; UsageStore::UsageScores default_usage; std::vector<DocumentId> document_id_old_to_new(size, kInvalidDocumentId); + int64_t current_time_ms = clock_.GetSystemTimeMilliseconds(); for (DocumentId document_id = 0; document_id < size; document_id++) { auto document_or = Get(document_id, /*clear_internal_fields=*/false); if (absl_ports::IsNotFound(document_or.status())) { if (IsDeleted(document_id)) { ++num_deleted; - } else if (!GetNonExpiredDocumentFilterData(document_id)) { + } else if (!GetNonExpiredDocumentFilterData(document_id, + current_time_ms)) { ++num_expired; } continue; @@ -1866,9 +1871,10 @@ DocumentStore::GetOptimizeInfo() const { // Figure out our ratio of optimizable/total docs. int32_t num_documents = document_id_mapper_->num_elements(); + int64_t current_time_ms = clock_.GetSystemTimeMilliseconds(); for (DocumentId document_id = kMinDocumentId; document_id < num_documents; ++document_id) { - if (!GetAliveDocumentFilterData(document_id)) { + if (!GetAliveDocumentFilterData(document_id, current_time_ms)) { ++optimize_info.optimizable_docs; } @@ -1979,9 +1985,10 @@ DocumentStore::CollectCorpusInfo() const { std::unordered_map<NamespaceId, std::string> namespace_id_to_namespace = GetNamespaceIdsToNamespaces(namespace_mapper_.get()); const SchemaProto* schema_proto = schema_proto_or.ValueOrDie(); + int64_t current_time_ms = clock_.GetSystemTimeMilliseconds(); for (DocumentId document_id = 0; document_id < filter_cache_->num_elements(); ++document_id) { - if (!GetAliveDocumentFilterData(document_id)) { + if (!GetAliveDocumentFilterData(document_id, current_time_ms)) { continue; } ICING_ASSIGN_OR_RETURN(const DocumentFilterData* filter_data, diff --git a/icing/store/document-store.h b/icing/store/document-store.h index 3bb04f4..3941f6d 100644 --- a/icing/store/document-store.h +++ b/icing/store/document-store.h @@ -229,7 +229,8 @@ class DocumentStore { // NOT_FOUND if no document exists with namespace, uri // INTERNAL_ERROR on IO error libtextclassifier3::Status Delete(std::string_view name_space, - std::string_view uri); + std::string_view uri, + int64_t current_time_ms); // Deletes the document identified by the given document_id. The document // proto will be erased immediately. @@ -243,7 +244,8 @@ class DocumentStore { // NOT_FOUND if the document doesn't exist (i.e. deleted or expired) // INTERNAL_ERROR on IO error // INVALID_ARGUMENT if document_id is invalid. - libtextclassifier3::Status Delete(DocumentId document_id); + libtextclassifier3::Status Delete(DocumentId document_id, + int64_t current_time_ms); // Returns the NamespaceId of the string namespace // @@ -339,7 +341,7 @@ class DocumentStore { // True:DocumentFilterData if the given document exists. // False if the given document doesn't exist. std::optional<DocumentFilterData> GetAliveDocumentFilterData( - DocumentId document_id) const; + DocumentId document_id, int64_t current_time_ms) const; // Gets the usage scores of a document. // @@ -347,7 +349,7 @@ class DocumentStore { // UsageScores on success // nullopt if there are no usage scores stored for the requested docid. std::optional<UsageStore::UsageScores> GetUsageScores( - DocumentId document_id) const; + DocumentId document_id, int64_t current_time_ms) const; // Reports usage. The corresponding usage scores of the specified document in // the report will be updated. @@ -714,7 +716,7 @@ class DocumentStore { // True:DocumentFilterData if the given document isn't expired. // False if the given doesn't document is expired. std::optional<DocumentFilterData> GetNonExpiredDocumentFilterData( - DocumentId document_id) const; + DocumentId document_id, int64_t current_time_ms) const; // Updates the entry in the score cache for document_id. libtextclassifier3::Status UpdateDocumentAssociatedScoreCache( diff --git a/icing/store/document-store_benchmark.cc b/icing/store/document-store_benchmark.cc index 61906a9..75995e9 100644 --- a/icing/store/document-store_benchmark.cc +++ b/icing/store/document-store_benchmark.cc @@ -162,7 +162,8 @@ void BM_DoesDocumentExistBenchmark(benchmark::State& state) { // stuff. ICING_ASSERT_OK(document_store->Put( CreateDocument("namespace", /*uri=*/std::to_string(i)))); - document_store->Delete("namespace", /*uri=*/std::to_string(i)); + document_store->Delete("namespace", /*uri=*/std::to_string(i), + clock.GetSystemTimeMilliseconds()); } std::default_random_engine random; @@ -171,8 +172,8 @@ void BM_DoesDocumentExistBenchmark(benchmark::State& state) { // Check random document ids to see if they exist. Hopefully to simulate // page faulting in different sections of our mmapped derived files. int document_id = dist(random); - benchmark::DoNotOptimize( - document_store->GetAliveDocumentFilterData(document_id)); + benchmark::DoNotOptimize(document_store->GetAliveDocumentFilterData( + document_id, clock.GetSystemTimeMilliseconds())); } } BENCHMARK(BM_DoesDocumentExistBenchmark); @@ -259,7 +260,8 @@ void BM_Delete(benchmark::State& state) { ICING_ASSERT_OK(document_store->Put(document)); state.ResumeTiming(); - benchmark::DoNotOptimize(document_store->Delete("namespace", "uri")); + benchmark::DoNotOptimize(document_store->Delete( + "namespace", "uri", clock.GetSystemTimeMilliseconds())); } } BENCHMARK(BM_Delete); diff --git a/icing/store/document-store_test.cc b/icing/store/document-store_test.cc index 146191f..9a1f4a6 100644 --- a/icing/store/document-store_test.cc +++ b/icing/store/document-store_test.cc @@ -71,7 +71,6 @@ using ::testing::Ge; using ::testing::Gt; using ::testing::HasSubstr; using ::testing::IsEmpty; -using ::testing::IsFalse; using ::testing::IsTrue; using ::testing::Not; using ::testing::Return; @@ -373,22 +372,27 @@ TEST_F(DocumentStoreTest, IsDocumentExistingWithoutStatus) { ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, doc_store->Put(DocumentProto(test_document2_))); - EXPECT_TRUE(doc_store->GetAliveDocumentFilterData(document_id1)); - EXPECT_TRUE(doc_store->GetAliveDocumentFilterData(document_id2)); + EXPECT_TRUE(doc_store->GetAliveDocumentFilterData( + document_id1, fake_clock_.GetSystemTimeMilliseconds())); + EXPECT_TRUE(doc_store->GetAliveDocumentFilterData( + document_id2, fake_clock_.GetSystemTimeMilliseconds())); DocumentId invalid_document_id_negative = -1; - EXPECT_FALSE( - doc_store->GetAliveDocumentFilterData(invalid_document_id_negative)); + EXPECT_FALSE(doc_store->GetAliveDocumentFilterData( + invalid_document_id_negative, fake_clock_.GetSystemTimeMilliseconds())); DocumentId invalid_document_id_greater_than_max = kMaxDocumentId + 2; EXPECT_FALSE(doc_store->GetAliveDocumentFilterData( - invalid_document_id_greater_than_max)); + invalid_document_id_greater_than_max, + fake_clock_.GetSystemTimeMilliseconds())); - EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(kInvalidDocumentId)); + EXPECT_FALSE(doc_store->GetAliveDocumentFilterData( + kInvalidDocumentId, fake_clock_.GetSystemTimeMilliseconds())); DocumentId invalid_document_id_out_of_range = document_id2 + 1; - EXPECT_FALSE( - doc_store->GetAliveDocumentFilterData(invalid_document_id_out_of_range)); + EXPECT_FALSE(doc_store->GetAliveDocumentFilterData( + invalid_document_id_out_of_range, + fake_clock_.GetSystemTimeMilliseconds())); } TEST_F(DocumentStoreTest, GetDeletedDocumentNotFound) { @@ -404,8 +408,9 @@ TEST_F(DocumentStoreTest, GetDeletedDocumentNotFound) { document_store->Get(test_document1_.namespace_(), test_document1_.uri()), IsOkAndHolds(EqualsProto(test_document1_))); - ICING_EXPECT_OK(document_store->Delete(test_document1_.namespace_(), - test_document1_.uri())); + ICING_EXPECT_OK(document_store->Delete( + test_document1_.namespace_(), test_document1_.uri(), + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT( document_store->Get(test_document1_.namespace_(), test_document1_.uri()), StatusIs(libtextclassifier3::StatusCode::NOT_FOUND)); @@ -488,9 +493,9 @@ TEST_F(DocumentStoreTest, DeleteNonexistentDocumentNotFound) { DocumentLogCreator::GetDocumentLogFilename()) .c_str()); - EXPECT_THAT( - document_store->Delete("nonexistent_namespace", "nonexistent_uri"), - StatusIs(libtextclassifier3::StatusCode::NOT_FOUND)); + EXPECT_THAT(document_store->Delete("nonexistent_namespace", "nonexistent_uri", + fake_clock_.GetSystemTimeMilliseconds()), + StatusIs(libtextclassifier3::StatusCode::NOT_FOUND)); int64_t document_log_size_after = filesystem_.GetFileSize( absl_ports::StrCat(document_store_dir_, "/", @@ -514,8 +519,8 @@ TEST_F(DocumentStoreTest, DeleteNonexistentDocumentPrintableErrorMessage) { DocumentLogCreator::GetDocumentLogFilename()) .c_str()); - libtextclassifier3::Status status = - document_store->Delete("android$contacts/", "661"); + libtextclassifier3::Status status = document_store->Delete( + "android$contacts/", "661", fake_clock_.GetSystemTimeMilliseconds()); EXPECT_THAT(status, StatusIs(libtextclassifier3::StatusCode::NOT_FOUND)); for (char c : status.error_message()) { EXPECT_THAT(std::isprint(c), IsTrue()); @@ -539,12 +544,14 @@ TEST_F(DocumentStoreTest, DeleteAlreadyDeletedDocumentNotFound) { ICING_EXPECT_OK(document_store->Put(test_document1_)); // First time is OK - ICING_EXPECT_OK(document_store->Delete(test_document1_.namespace_(), - test_document1_.uri())); + ICING_EXPECT_OK(document_store->Delete( + test_document1_.namespace_(), test_document1_.uri(), + fake_clock_.GetSystemTimeMilliseconds())); // Deleting it again is NOT_FOUND EXPECT_THAT(document_store->Delete(test_document1_.namespace_(), - test_document1_.uri()), + test_document1_.uri(), + fake_clock_.GetSystemTimeMilliseconds()), StatusIs(libtextclassifier3::StatusCode::NOT_FOUND)); } @@ -626,8 +633,9 @@ TEST_F(DocumentStoreTest, DeleteByNamespaceNoExistingDocumentsNotFound) { std::move(create_result.document_store); ICING_EXPECT_OK(document_store->Put(test_document1_)); - ICING_EXPECT_OK(document_store->Delete(test_document1_.namespace_(), - test_document1_.uri())); + ICING_EXPECT_OK(document_store->Delete( + test_document1_.namespace_(), test_document1_.uri(), + fake_clock_.GetSystemTimeMilliseconds())); // At this point, there are no existing documents with the namespace, even // though Icing's derived files know about this namespace. We should still @@ -829,8 +837,9 @@ TEST_F(DocumentStoreTest, DeleteBySchemaTypeNoExistingDocumentsNotFound) { std::move(create_result.document_store); ICING_EXPECT_OK(document_store->Put(test_document1_)); - ICING_EXPECT_OK(document_store->Delete(test_document1_.namespace_(), - test_document1_.uri())); + ICING_EXPECT_OK(document_store->Delete( + test_document1_.namespace_(), test_document1_.uri(), + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT( document_store->DeleteBySchemaType(test_document1_.schema()).status, @@ -925,8 +934,9 @@ TEST_F(DocumentStoreTest, PutDeleteThenPut) { std::unique_ptr<DocumentStore> doc_store = std::move(create_result.document_store); ICING_EXPECT_OK(doc_store->Put(test_document1_)); - ICING_EXPECT_OK( - doc_store->Delete(test_document1_.namespace_(), test_document1_.uri())); + ICING_EXPECT_OK(doc_store->Delete(test_document1_.namespace_(), + test_document1_.uri(), + fake_clock_.GetSystemTimeMilliseconds())); ICING_EXPECT_OK(doc_store->Put(test_document1_)); } @@ -1092,7 +1102,8 @@ TEST_F(DocumentStoreTest, OptimizeInto) { // is deleted ASSERT_TRUE(filesystem_.DeleteDirectoryRecursively(optimized_dir.c_str())); ASSERT_TRUE(filesystem_.CreateDirectoryRecursively(optimized_dir.c_str())); - ICING_ASSERT_OK(doc_store->Delete("namespace", "uri1")); + ICING_ASSERT_OK(doc_store->Delete("namespace", "uri1", + fake_clock_.GetSystemTimeMilliseconds())); // DocumentId 0 is removed. EXPECT_THAT(doc_store->OptimizeInto(optimized_dir, lang_segmenter_.get(), /*namespace_id_fingerprint=*/false), @@ -1121,7 +1132,8 @@ TEST_F(DocumentStoreTest, OptimizeInto) { // Delete the last document ASSERT_TRUE(filesystem_.DeleteDirectoryRecursively(optimized_dir.c_str())); ASSERT_TRUE(filesystem_.CreateDirectoryRecursively(optimized_dir.c_str())); - ICING_ASSERT_OK(doc_store->Delete("namespace", "uri2")); + ICING_ASSERT_OK(doc_store->Delete("namespace", "uri2", + fake_clock_.GetSystemTimeMilliseconds())); // DocumentId 0 and 1 is removed, and DocumentId 2 is expired. EXPECT_THAT(doc_store->OptimizeInto(optimized_dir, lang_segmenter_.get(), /*namespace_id_fingerprint=*/false), @@ -1184,7 +1196,9 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromDataLoss) { /*num_docs=*/2, /*sum_length_in_tokens=*/8))); // Delete document 1 - EXPECT_THAT(doc_store->Delete("icing", "email/1"), IsOk()); + EXPECT_THAT(doc_store->Delete("icing", "email/1", + fake_clock_.GetSystemTimeMilliseconds()), + IsOk()); EXPECT_THAT(doc_store->Get(document_id1), StatusIs(libtextclassifier3::StatusCode::NOT_FOUND)); EXPECT_THAT(doc_store->Get(document_id2), @@ -1218,7 +1232,8 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromDataLoss) { // Checks derived filter cache ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData doc_filter_data, - doc_store->GetAliveDocumentFilterData(document_id2)); + doc_store->GetAliveDocumentFilterData( + document_id2, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(doc_filter_data, Eq(DocumentFilterData( /*namespace_id=*/0, @@ -1271,7 +1286,9 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromCorruptDerivedFile) { IsOkAndHolds(CorpusAssociatedScoreData( /*num_docs=*/2, /*sum_length_in_tokens=*/8))); // Delete document 1 - EXPECT_THAT(doc_store->Delete("icing", "email/1"), IsOk()); + EXPECT_THAT(doc_store->Delete("icing", "email/1", + fake_clock_.GetSystemTimeMilliseconds()), + IsOk()); EXPECT_THAT(doc_store->Get(document_id1), StatusIs(libtextclassifier3::StatusCode::NOT_FOUND)); EXPECT_THAT(doc_store->Get(document_id2), @@ -1316,7 +1333,8 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromCorruptDerivedFile) { // Checks derived filter cache ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData doc_filter_data, - doc_store->GetAliveDocumentFilterData(document_id2)); + doc_store->GetAliveDocumentFilterData( + document_id2, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(doc_filter_data, Eq(DocumentFilterData( /*namespace_id=*/0, @@ -1336,8 +1354,10 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromCorruptDerivedFile) { // scratch. UsageStore::UsageScores expected_scores; expected_scores.usage_type1_count = 1; - ICING_ASSERT_HAS_VALUE_AND_ASSIGN(UsageStore::UsageScores actual_scores, - doc_store->GetUsageScores(document_id2)); + ICING_ASSERT_HAS_VALUE_AND_ASSIGN( + UsageStore::UsageScores actual_scores, + doc_store->GetUsageScores(document_id2, + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); } @@ -1377,7 +1397,9 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromDiscardDerivedFiles) { IsOkAndHolds(CorpusAssociatedScoreData( /*num_docs=*/2, /*sum_length_in_tokens=*/8))); // Delete document 1 - EXPECT_THAT(doc_store->Delete("icing", "email/1"), IsOk()); + EXPECT_THAT(doc_store->Delete("icing", "email/1", + fake_clock_.GetSystemTimeMilliseconds()), + IsOk()); EXPECT_THAT(doc_store->Get(document_id1), StatusIs(libtextclassifier3::StatusCode::NOT_FOUND)); EXPECT_THAT(doc_store->Get(document_id2), @@ -1409,7 +1431,8 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromDiscardDerivedFiles) { // Checks derived filter cache ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData doc_filter_data, - doc_store->GetAliveDocumentFilterData(document_id2)); + doc_store->GetAliveDocumentFilterData( + document_id2, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(doc_filter_data, Eq(DocumentFilterData( /*namespace_id=*/0, @@ -1429,8 +1452,10 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromDiscardDerivedFiles) { // scratch. UsageStore::UsageScores expected_scores; expected_scores.usage_type1_count = 1; - ICING_ASSERT_HAS_VALUE_AND_ASSIGN(UsageStore::UsageScores actual_scores, - doc_store->GetUsageScores(document_id2)); + ICING_ASSERT_HAS_VALUE_AND_ASSIGN( + UsageStore::UsageScores actual_scores, + doc_store->GetUsageScores(document_id2, + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); } @@ -1469,7 +1494,9 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromBadChecksum) { EXPECT_THAT(doc_store->GetCorpusAssociatedScoreData(/*corpus_id=*/0), IsOkAndHolds(CorpusAssociatedScoreData( /*num_docs=*/2, /*sum_length_in_tokens=*/8))); - EXPECT_THAT(doc_store->Delete("icing", "email/1"), IsOk()); + EXPECT_THAT(doc_store->Delete("icing", "email/1", + fake_clock_.GetSystemTimeMilliseconds()), + IsOk()); EXPECT_THAT(doc_store->Get(document_id1), StatusIs(libtextclassifier3::StatusCode::NOT_FOUND)); EXPECT_THAT(doc_store->Get(document_id2), @@ -1493,7 +1520,8 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromBadChecksum) { // Checks derived filter cache ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData doc_filter_data, - doc_store->GetAliveDocumentFilterData(document_id2)); + doc_store->GetAliveDocumentFilterData( + document_id2, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(doc_filter_data, Eq(DocumentFilterData( /*namespace_id=*/0, @@ -1568,7 +1596,8 @@ TEST_F(DocumentStoreTest, MaxDocumentId) { EXPECT_THAT(doc_store->last_added_document_id(), Eq(document_id1)); // Still returns the last DocumentId even if it was deleted - ICING_ASSERT_OK(doc_store->Delete("icing", "email/1")); + ICING_ASSERT_OK(doc_store->Delete("icing", "email/1", + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(doc_store->last_added_document_id(), Eq(document_id1)); ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, @@ -1904,7 +1933,8 @@ TEST_F(DocumentStoreTest, NonexistentDocumentFilterDataNotFound) { std::unique_ptr<DocumentStore> doc_store = std::move(create_result.document_store); - EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(/*document_id=*/0)); + EXPECT_FALSE(doc_store->GetAliveDocumentFilterData( + /*document_id=*/0, fake_clock_.GetSystemTimeMilliseconds())); } TEST_F(DocumentStoreTest, DeleteClearsFilterCache) { @@ -1920,15 +1950,18 @@ TEST_F(DocumentStoreTest, DeleteClearsFilterCache) { ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData doc_filter_data, - doc_store->GetAliveDocumentFilterData(document_id)); + doc_store->GetAliveDocumentFilterData( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(doc_filter_data, Eq(DocumentFilterData( /*namespace_id=*/0, /*schema_type_id=*/0, document1_expiration_timestamp_))); - ICING_ASSERT_OK(doc_store->Delete("icing", "email/1")); + ICING_ASSERT_OK(doc_store->Delete("icing", "email/1", + fake_clock_.GetSystemTimeMilliseconds())); // Associated entry of the deleted document is removed. - EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(document_id)); + EXPECT_FALSE(doc_store->GetAliveDocumentFilterData( + document_id, fake_clock_.GetSystemTimeMilliseconds())); } TEST_F(DocumentStoreTest, DeleteClearsScoreCache) { @@ -1949,10 +1982,15 @@ TEST_F(DocumentStoreTest, DeleteClearsScoreCache) { /*creation_timestamp_ms=*/document1_creation_timestamp_, /*length_in_tokens=*/4))); - ICING_ASSERT_OK(doc_store->Delete("icing", "email/1")); + ICING_ASSERT_OK(doc_store->Delete("icing", "email/1", + fake_clock_.GetSystemTimeMilliseconds())); // Associated entry of the deleted document is removed. - EXPECT_THAT(doc_store->GetDocumentAssociatedScoreData(document_id), - StatusIs(libtextclassifier3::StatusCode::NOT_FOUND)); + EXPECT_THAT( + doc_store->GetDocumentAssociatedScoreData(document_id), + IsOkAndHolds(DocumentAssociatedScoreData(kInvalidCorpusId, + /*document_score=*/-1, + /*creation_timestamp_ms=*/-1, + /*length_in_tokens=*/0))); } TEST_F(DocumentStoreTest, DeleteShouldPreventUsageScores) { @@ -1974,12 +2012,15 @@ TEST_F(DocumentStoreTest, DeleteShouldPreventUsageScores) { UsageStore::UsageScores expected_scores; expected_scores.usage_type1_count = 1; - ICING_ASSERT_HAS_VALUE_AND_ASSIGN(UsageStore::UsageScores actual_scores, - doc_store->GetUsageScores(document_id)); + ICING_ASSERT_HAS_VALUE_AND_ASSIGN( + UsageStore::UsageScores actual_scores, + doc_store->GetUsageScores(document_id, + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); // Delete the document. - ICING_ASSERT_OK(doc_store->Delete("icing", "email/1")); + ICING_ASSERT_OK(doc_store->Delete("icing", "email/1", + fake_clock_.GetSystemTimeMilliseconds())); // Can't report or get usage scores on the deleted document ASSERT_THAT( @@ -1987,7 +2028,8 @@ TEST_F(DocumentStoreTest, DeleteShouldPreventUsageScores) { StatusIs(libtextclassifier3::StatusCode::NOT_FOUND, HasSubstr("Couldn't report usage on a nonexistent document"))); - EXPECT_FALSE(doc_store->GetUsageScores(document_id)); + EXPECT_FALSE(doc_store->GetUsageScores( + document_id, fake_clock_.GetSystemTimeMilliseconds())); } TEST_F(DocumentStoreTest, ExpirationShouldPreventUsageScores) { @@ -2021,8 +2063,10 @@ TEST_F(DocumentStoreTest, ExpirationShouldPreventUsageScores) { UsageStore::UsageScores expected_scores; expected_scores.usage_type1_count = 1; - ICING_ASSERT_HAS_VALUE_AND_ASSIGN(UsageStore::UsageScores actual_scores, - doc_store->GetUsageScores(document_id)); + ICING_ASSERT_HAS_VALUE_AND_ASSIGN( + UsageStore::UsageScores actual_scores, + doc_store->GetUsageScores(document_id, + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); // Some arbitrary time past the document's creation time (10) + ttl (100) @@ -2034,7 +2078,8 @@ TEST_F(DocumentStoreTest, ExpirationShouldPreventUsageScores) { StatusIs(libtextclassifier3::StatusCode::NOT_FOUND, HasSubstr("Couldn't report usage on a nonexistent document"))); - EXPECT_FALSE(doc_store->GetUsageScores(document_id)); + EXPECT_FALSE(doc_store->GetUsageScores( + document_id, fake_clock_.GetSystemTimeMilliseconds())); } TEST_F(DocumentStoreTest, @@ -2056,7 +2101,8 @@ TEST_F(DocumentStoreTest, ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id, doc_store->Put(document)); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData doc_filter_data, - doc_store->GetAliveDocumentFilterData(document_id)); + doc_store->GetAliveDocumentFilterData( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(doc_filter_data, Eq(DocumentFilterData( /*namespace_id=*/0, /*schema_type_id=*/0, @@ -2082,7 +2128,8 @@ TEST_F(DocumentStoreTest, ExpirationTimestampIsInt64MaxIfTtlIsZero) { ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData doc_filter_data, - doc_store->GetAliveDocumentFilterData(document_id)); + doc_store->GetAliveDocumentFilterData( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT( doc_filter_data, @@ -2112,7 +2159,8 @@ TEST_F(DocumentStoreTest, ExpirationTimestampIsInt64MaxOnOverflow) { ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData doc_filter_data, - doc_store->GetAliveDocumentFilterData(document_id)); + doc_store->GetAliveDocumentFilterData( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT( doc_filter_data, @@ -2318,7 +2366,8 @@ TEST_F(DocumentStoreTest, RegenerateDerivedFilesSkipsUnknownSchemaTypeIds) { IsOkAndHolds(EqualsProto(email_document))); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData email_data, - document_store->GetAliveDocumentFilterData(email_document_id)); + document_store->GetAliveDocumentFilterData( + email_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(email_data.schema_type_id(), Eq(email_schema_type_id)); email_namespace_id = email_data.namespace_id(); email_expiration_timestamp = email_data.expiration_timestamp_ms(); @@ -2331,7 +2380,8 @@ TEST_F(DocumentStoreTest, RegenerateDerivedFilesSkipsUnknownSchemaTypeIds) { IsOkAndHolds(EqualsProto(message_document))); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData message_data, - document_store->GetAliveDocumentFilterData(message_document_id)); + document_store->GetAliveDocumentFilterData( + message_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(message_data.schema_type_id(), Eq(message_schema_type_id)); message_namespace_id = message_data.namespace_id(); message_expiration_timestamp = message_data.expiration_timestamp_ms(); @@ -2373,7 +2423,8 @@ TEST_F(DocumentStoreTest, RegenerateDerivedFilesSkipsUnknownSchemaTypeIds) { IsOkAndHolds(EqualsProto(email_document))); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData email_data, - document_store->GetAliveDocumentFilterData(email_document_id)); + document_store->GetAliveDocumentFilterData( + email_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(email_data.schema_type_id(), Eq(email_schema_type_id)); // Make sure that all the other fields are stll valid/the same EXPECT_THAT(email_data.namespace_id(), Eq(email_namespace_id)); @@ -2385,7 +2436,8 @@ TEST_F(DocumentStoreTest, RegenerateDerivedFilesSkipsUnknownSchemaTypeIds) { IsOkAndHolds(EqualsProto(message_document))); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData message_data, - document_store->GetAliveDocumentFilterData(message_document_id)); + document_store->GetAliveDocumentFilterData( + message_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(message_data.schema_type_id(), Eq(-1)); // Make sure that all the other fields are stll valid/the same EXPECT_THAT(message_data.namespace_id(), Eq(message_namespace_id)); @@ -2441,14 +2493,16 @@ TEST_F(DocumentStoreTest, UpdateSchemaStoreUpdatesSchemaTypeIds) { document_store->Put(email_document)); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData email_data, - document_store->GetAliveDocumentFilterData(email_document_id)); + document_store->GetAliveDocumentFilterData( + email_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(email_data.schema_type_id(), Eq(old_email_schema_type_id)); ICING_ASSERT_OK_AND_ASSIGN(DocumentId message_document_id, document_store->Put(message_document)); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData message_data, - document_store->GetAliveDocumentFilterData(message_document_id)); + document_store->GetAliveDocumentFilterData( + message_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(message_data.schema_type_id(), Eq(old_message_schema_type_id)); // Rearrange the schema types. Since SchemaTypeId is assigned based on order, @@ -2476,12 +2530,14 @@ TEST_F(DocumentStoreTest, UpdateSchemaStoreUpdatesSchemaTypeIds) { // Check that the FilterCache holds the new SchemaTypeIds ICING_ASSERT_HAS_VALUE_AND_ASSIGN( email_data, - document_store->GetAliveDocumentFilterData(email_document_id)); + document_store->GetAliveDocumentFilterData( + email_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(email_data.schema_type_id(), Eq(new_email_schema_type_id)); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( message_data, - document_store->GetAliveDocumentFilterData(message_document_id)); + document_store->GetAliveDocumentFilterData( + message_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(message_data.schema_type_id(), Eq(new_message_schema_type_id)); } @@ -2683,14 +2739,16 @@ TEST_F(DocumentStoreTest, OptimizedUpdateSchemaStoreUpdatesSchemaTypeIds) { document_store->Put(email_document)); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData email_data, - document_store->GetAliveDocumentFilterData(email_document_id)); + document_store->GetAliveDocumentFilterData( + email_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(email_data.schema_type_id(), Eq(old_email_schema_type_id)); ICING_ASSERT_OK_AND_ASSIGN(DocumentId message_document_id, document_store->Put(message_document)); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData message_data, - document_store->GetAliveDocumentFilterData(message_document_id)); + document_store->GetAliveDocumentFilterData( + message_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(message_data.schema_type_id(), Eq(old_message_schema_type_id)); // Rearrange the schema types. Since SchemaTypeId is assigned based on order, @@ -2721,12 +2779,14 @@ TEST_F(DocumentStoreTest, OptimizedUpdateSchemaStoreUpdatesSchemaTypeIds) { // Check that the FilterCache holds the new SchemaTypeIds ICING_ASSERT_HAS_VALUE_AND_ASSIGN( email_data, - document_store->GetAliveDocumentFilterData(email_document_id)); + document_store->GetAliveDocumentFilterData( + email_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(email_data.schema_type_id(), Eq(new_email_schema_type_id)); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( message_data, - document_store->GetAliveDocumentFilterData(message_document_id)); + document_store->GetAliveDocumentFilterData( + message_document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(message_data.schema_type_id(), Eq(new_message_schema_type_id)); } @@ -2909,8 +2969,9 @@ TEST_F(DocumentStoreTest, GetOptimizeInfo) { EXPECT_THAT(optimize_info.estimated_optimizable_bytes, Eq(0)); // Delete a document. Now something is optimizable - ICING_EXPECT_OK(document_store->Delete(test_document1_.namespace_(), - test_document1_.uri())); + ICING_EXPECT_OK(document_store->Delete( + test_document1_.namespace_(), test_document1_.uri(), + fake_clock_.GetSystemTimeMilliseconds())); ICING_ASSERT_OK_AND_ASSIGN(optimize_info, document_store->GetOptimizeInfo()); EXPECT_THAT(optimize_info.total_docs, Eq(1)); EXPECT_THAT(optimize_info.optimizable_docs, Eq(1)); @@ -2990,13 +3051,15 @@ TEST_F(DocumentStoreTest, GetAllNamespaces) { // After deleting namespace2_uri1, there's still namespace2_uri2, so // "namespace2" still shows up in results - ICING_EXPECT_OK(document_store->Delete("namespace2", "uri1")); + ICING_EXPECT_OK(document_store->Delete( + "namespace2", "uri1", fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(document_store->GetAllNamespaces(), UnorderedElementsAre("namespace1", "namespace2", "namespace3")); // After deleting namespace2_uri2, there's no more documents in "namespace2" - ICING_EXPECT_OK(document_store->Delete("namespace2", "uri2")); + ICING_EXPECT_OK(document_store->Delete( + "namespace2", "uri2", fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(document_store->GetAllNamespaces(), UnorderedElementsAre("namespace1", "namespace3")); @@ -3030,7 +3093,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) { ++expected_scores.usage_type1_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( UsageStore::UsageScores actual_scores, - document_store->GetUsageScores(document_id)); + document_store->GetUsageScores(document_id, + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); // Report usage with type 1 and time 5, time should be updated. @@ -3042,7 +3106,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) { expected_scores.usage_type1_last_used_timestamp_s = 5; ++expected_scores.usage_type1_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( - actual_scores, document_store->GetUsageScores(document_id)); + actual_scores, document_store->GetUsageScores( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); // Report usage with type 2 and time 1. @@ -3054,7 +3119,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) { expected_scores.usage_type2_last_used_timestamp_s = 1; ++expected_scores.usage_type2_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( - actual_scores, document_store->GetUsageScores(document_id)); + actual_scores, document_store->GetUsageScores( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); // Report usage with type 2 and time 5. @@ -3066,7 +3132,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) { expected_scores.usage_type2_last_used_timestamp_s = 5; ++expected_scores.usage_type2_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( - actual_scores, document_store->GetUsageScores(document_id)); + actual_scores, document_store->GetUsageScores( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); // Report usage with type 3 and time 1. @@ -3078,7 +3145,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) { expected_scores.usage_type3_last_used_timestamp_s = 1; ++expected_scores.usage_type3_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( - actual_scores, document_store->GetUsageScores(document_id)); + actual_scores, document_store->GetUsageScores( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); // Report usage with type 3 and time 5. @@ -3090,7 +3158,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) { expected_scores.usage_type3_last_used_timestamp_s = 5; ++expected_scores.usage_type3_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( - actual_scores, document_store->GetUsageScores(document_id)); + actual_scores, document_store->GetUsageScores( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); } @@ -3115,7 +3184,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTypesAndGetUsageScores) { ++expected_scores.usage_type1_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( UsageStore::UsageScores actual_scores, - document_store->GetUsageScores(document_id)); + document_store->GetUsageScores(document_id, + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); // Report usage with type 2. @@ -3126,7 +3196,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTypesAndGetUsageScores) { ++expected_scores.usage_type2_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( - actual_scores, document_store->GetUsageScores(document_id)); + actual_scores, document_store->GetUsageScores( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); // Report usage with type 3. @@ -3137,7 +3208,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTypesAndGetUsageScores) { ++expected_scores.usage_type3_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( - actual_scores, document_store->GetUsageScores(document_id)); + actual_scores, document_store->GetUsageScores( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); } @@ -3164,7 +3236,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldNotBeClearedOnChecksumMismatch) { ++expected_scores.usage_type1_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( UsageStore::UsageScores actual_scores, - document_store->GetUsageScores(document_id)); + document_store->GetUsageScores( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); } @@ -3180,7 +3253,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldNotBeClearedOnChecksumMismatch) { // Usage scores should be the same. ICING_ASSERT_HAS_VALUE_AND_ASSIGN( UsageStore::UsageScores actual_scores, - document_store->GetUsageScores(document_id)); + document_store->GetUsageScores(document_id, + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); } @@ -3207,7 +3281,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldBeAvailableAfterDataLoss) { ++expected_scores.usage_type1_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( UsageStore::UsageScores actual_scores, - document_store->GetUsageScores(document_id)); + document_store->GetUsageScores( + document_id, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); } @@ -3234,7 +3309,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldBeAvailableAfterDataLoss) { // Usage scores should still be available. ICING_ASSERT_HAS_VALUE_AND_ASSIGN( UsageStore::UsageScores actual_scores, - document_store->GetUsageScores(document_id)); + document_store->GetUsageScores(document_id, + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); } @@ -3260,7 +3336,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldBeCopiedOverToUpdatedDocument) { ++expected_scores.usage_type1_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( UsageStore::UsageScores actual_scores, - document_store->GetUsageScores(document_id)); + document_store->GetUsageScores(document_id, + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); // Update the document. @@ -3272,7 +3349,9 @@ TEST_F(DocumentStoreTest, UsageScoresShouldBeCopiedOverToUpdatedDocument) { // Usage scores should be the same. ICING_ASSERT_HAS_VALUE_AND_ASSIGN( - actual_scores, document_store->GetUsageScores(updated_document_id)); + actual_scores, + document_store->GetUsageScores(updated_document_id, + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); } @@ -3290,7 +3369,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldPersistOnOptimize) { ICING_ASSERT_OK_AND_ASSIGN( DocumentId document_id2, document_store->Put(DocumentProto(test_document2_))); - ICING_ASSERT_OK(document_store->Delete(document_id1)); + ICING_ASSERT_OK(document_store->Delete( + document_id1, fake_clock_.GetSystemTimeMilliseconds())); // Report usage of document 2. UsageReport usage_report = CreateUsageReport( @@ -3302,7 +3382,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldPersistOnOptimize) { ++expected_scores.usage_type1_count; ICING_ASSERT_HAS_VALUE_AND_ASSIGN( UsageStore::UsageScores actual_scores, - document_store->GetUsageScores(document_id2)); + document_store->GetUsageScores(document_id2, + fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); // Run optimize @@ -3323,7 +3404,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldPersistOnOptimize) { // The original document_id2 should have become document_id2 - 1. ICING_ASSERT_HAS_VALUE_AND_ASSIGN( actual_scores, - optimized_document_store->GetUsageScores(document_id2 - 1)); + optimized_document_store->GetUsageScores( + document_id2 - 1, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(actual_scores, Eq(expected_scores)); } @@ -3542,7 +3624,8 @@ TEST_F(DocumentStoreTest, DocumentStoreStorageInfo) { ICING_ASSERT_OK(doc_store->ReportUsage(usage_report_type1)); // Delete the first doc. - ICING_ASSERT_OK(doc_store->Delete(document1.namespace_(), document1.uri())); + ICING_ASSERT_OK(doc_store->Delete(document1.namespace_(), document1.uri(), + fake_clock_.GetSystemTimeMilliseconds())); // Expire the second doc. fake_clock_.SetSystemTimeMilliseconds(document2.creation_timestamp_ms() + @@ -3649,7 +3732,8 @@ TEST_F(DocumentStoreTest, InitializeForceRecoveryUpdatesTypeIds) { ICING_ASSERT_OK_AND_ASSIGN(docid, doc_store->Put(doc)); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData filter_data, - doc_store->GetAliveDocumentFilterData(docid)); + doc_store->GetAliveDocumentFilterData( + docid, fake_clock_.GetSystemTimeMilliseconds())); ASSERT_THAT(filter_data.schema_type_id(), Eq(0)); } @@ -3697,7 +3781,8 @@ TEST_F(DocumentStoreTest, InitializeForceRecoveryUpdatesTypeIds) { // Ensure that the type id of the email document has been correctly updated. ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData filter_data, - doc_store->GetAliveDocumentFilterData(docid)); + doc_store->GetAliveDocumentFilterData( + docid, fake_clock_.GetSystemTimeMilliseconds())); EXPECT_THAT(filter_data.schema_type_id(), Eq(1)); EXPECT_THAT(initialize_stats.document_store_recovery_cause(), Eq(InitializeStatsProto::SCHEMA_CHANGES_OUT_OF_SYNC)); @@ -3758,7 +3843,8 @@ TEST_F(DocumentStoreTest, InitializeDontForceRecoveryDoesntUpdateTypeIds) { ICING_ASSERT_OK_AND_ASSIGN(docid, doc_store->Put(doc)); ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData filter_data, - doc_store->GetAliveDocumentFilterData(docid)); + doc_store->GetAliveDocumentFilterData( + docid, fake_clock_.GetSystemTimeMilliseconds())); ASSERT_THAT(filter_data.schema_type_id(), Eq(0)); } @@ -3800,7 +3886,8 @@ TEST_F(DocumentStoreTest, InitializeDontForceRecoveryDoesntUpdateTypeIds) { // Check that the type id of the email document has not been updated. ICING_ASSERT_HAS_VALUE_AND_ASSIGN( DocumentFilterData filter_data, - doc_store->GetAliveDocumentFilterData(docid)); + doc_store->GetAliveDocumentFilterData( + docid, fake_clock_.GetSystemTimeMilliseconds())); ASSERT_THAT(filter_data.schema_type_id(), Eq(0)); } } @@ -4256,7 +4343,8 @@ TEST_F(DocumentStoreTest, GetDebugInfo) { EqualsProto(info3))); // Delete document3. - ICING_ASSERT_OK(document_store->Delete("namespace2", "email/3")); + ICING_ASSERT_OK(document_store->Delete( + "namespace2", "email/3", fake_clock_.GetSystemTimeMilliseconds())); ICING_ASSERT_OK_AND_ASSIGN( DocumentDebugInfoProto out2, document_store->GetDebugInfo(DebugInfoVerbosity::DETAILED)); diff --git a/icing/store/suggestion-result-checker-impl.h b/icing/store/suggestion-result-checker-impl.h index f6789e8..4e01f81 100644 --- a/icing/store/suggestion-result-checker-impl.h +++ b/icing/store/suggestion-result-checker-impl.h @@ -33,7 +33,8 @@ class SuggestionResultCheckerImpl : public SuggestionResultChecker { document_id_filter_map, std::unordered_set<SchemaTypeId> target_schema_type_ids, std::unordered_map<SchemaTypeId, SectionIdMask> property_filter_map, - std::string target_section, std::unordered_set<DocumentId> search_base) + std::string target_section, std::unordered_set<DocumentId> search_base, + int64_t current_time_ms) : document_store_(*document_store), schema_store_(*schema_store), target_namespace_ids_(std::move(target_namespace_ids)), @@ -41,7 +42,8 @@ class SuggestionResultCheckerImpl : public SuggestionResultChecker { target_schema_type_ids_(std::move(target_schema_type_ids)), property_filter_map_(std::move(property_filter_map)), target_section_(std::move(target_section)), - search_base_(std::move(search_base)) {} + search_base_(std::move(search_base)), + current_time_ms_(current_time_ms) {} bool MatchesTargetNamespace(NamespaceId namespace_id) const { return target_namespace_ids_.empty() || @@ -102,7 +104,8 @@ class SuggestionResultCheckerImpl : public SuggestionResultChecker { SectionId section_id) const override { // Get the document filter data first. auto document_filter_data_optional_ = - document_store_.GetAliveDocumentFilterData(document_id); + document_store_.GetAliveDocumentFilterData(document_id, + current_time_ms_); if (!document_filter_data_optional_) { // The document doesn't exist. return false; @@ -142,6 +145,7 @@ class SuggestionResultCheckerImpl : public SuggestionResultChecker { std::unordered_map<SchemaTypeId, SectionIdMask> property_filter_map_; std::string target_section_; std::unordered_set<DocumentId> search_base_; + int64_t current_time_ms_; }; } // namespace lib |