@@ -61,6 +61,10 @@ class FakeReader : public GlobalIndexReader {
6161 has_scored_result_ = true ;
6262 }
6363
64+ void SetThreadSafe (bool thread_safe) {
65+ thread_safe_ = thread_safe;
66+ }
67+
6468 // / Counts how many times any Visit* method was invoked. Useful to assert all readers
6569 // / are exercised by UnionGlobalIndexReader.
6670 int InvocationCount () const {
@@ -147,7 +151,7 @@ class FakeReader : public GlobalIndexReader {
147151 }
148152
149153 bool IsThreadSafe () const override {
150- return true ;
154+ return thread_safe_ ;
151155 }
152156
153157 std::string GetIndexType () const override {
@@ -176,6 +180,7 @@ class FakeReader : public GlobalIndexReader {
176180 std::vector<int64_t > scored_row_ids_;
177181 std::vector<float > scored_scores_;
178182 bool has_scored_result_ = false ;
183+ bool thread_safe_ = true ;
179184 std::atomic<int32_t > invocation_count_{0 };
180185};
181186
@@ -515,12 +520,24 @@ TEST_F(UnionGlobalIndexReaderTest, TestVisitVectorSearchErrorPropagation) {
515520 ASSERT_NOK_WITH_MSG (union_reader.VisitVectorSearch (nullptr ), " vector search failure" );
516521}
517522
518- TEST_F (UnionGlobalIndexReaderTest, TestIsThreadSafeAlwaysFalse) {
519- auto reader = std::make_shared<FakeReader>();
520- std::vector<std::shared_ptr<GlobalIndexReader>> readers = {reader};
523+ TEST_F (UnionGlobalIndexReaderTest, TestIsThreadSafeReturnsTrueWhenAllReadersAreSafe) {
524+ auto reader1 = std::make_shared<FakeReader>();
525+ auto reader2 = std::make_shared<FakeReader>();
526+
527+ std::vector<std::shared_ptr<GlobalIndexReader>> readers = {reader1, reader2};
528+ UnionGlobalIndexReader union_reader (std::move (readers), nullptr );
529+
530+ ASSERT_TRUE (union_reader.IsThreadSafe ());
531+ }
532+
533+ TEST_F (UnionGlobalIndexReaderTest, TestIsThreadSafeReturnsFalseWhenAnyReaderIsNotSafe) {
534+ auto reader1 = std::make_shared<FakeReader>();
535+ auto reader2 = std::make_shared<FakeReader>();
536+ reader2->SetThreadSafe (false );
537+
538+ std::vector<std::shared_ptr<GlobalIndexReader>> readers = {reader1, reader2};
521539 UnionGlobalIndexReader union_reader (std::move (readers), nullptr );
522540
523- // UnionGlobalIndexReader is not thread-safe regardless of inner readers
524541 ASSERT_FALSE (union_reader.IsThreadSafe ());
525542}
526543
0 commit comments