diff --git a/AnyBuildLogs/latest.txt b/AnyBuildLogs/latest.txt new file mode 100644 index 000000000..38b4a947f --- /dev/null +++ b/AnyBuildLogs/latest.txt @@ -0,0 +1 @@ +20231019-111207-d314f8bf \ No newline at end of file diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index d5fbbff20..94cd42e89 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -1253,37 +1253,48 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons } #ifdef USE_BING_INFRA -bool getNextCompletedRequest(const IOContext &ctx, size_t size, int &completedIndex) +bool getNextCompletedRequest(std::shared_ptr &reader, IOContext &ctx, size_t size, + int &completedIndex) { bool waitsRemaining = false; long completeCount = ctx.m_completeCount; - do + if ((*ctx.m_pRequests)[0].m_callback) { - for (int i = 0; i < size; i++) + bool waitsRemaining = false; + long completeCount = ctx.m_completeCount; + do { - auto ithStatus = (*ctx.m_pRequestsStatus)[i]; - if (ithStatus == IOContext::Status::READ_SUCCESS) + for (int i = 0; i < size; i++) { - completedIndex = i; - return true; + auto ithStatus = (*ctx.m_pRequestsStatus)[i]; + if (ithStatus == IOContext::Status::READ_SUCCESS) + { + completedIndex = i; + return true; + } + else if (ithStatus == IOContext::Status::READ_WAIT) + { + waitsRemaining = true; + } } - else if (ithStatus == IOContext::Status::READ_WAIT) + + // if we didn't find one in READ_SUCCESS, wait for one to complete. + if (waitsRemaining) { - waitsRemaining = true; + WaitOnAddress(&ctx.m_completeCount, &completeCount, sizeof(completeCount), 100); + // this assumes the knowledge of the reader behavior (implicit + // contract). need better factoring? } - } + } while (waitsRemaining); - // if we didn't find one in READ_SUCCESS, wait for one to complete. - if (waitsRemaining) - { - WaitOnAddress(&ctx.m_completeCount, &completeCount, sizeof(completeCount), 100); - // this assumes the knowledge of the reader behavior (implicit - // contract). need better factoring? - } - } while (waitsRemaining); - - completedIndex = -1; - return false; + completedIndex = -1; + return false; + } + else + { + reader->wait(ctx, completedIndex); + return completedIndex != -1; + } } #endif @@ -1671,7 +1682,7 @@ void PQFlashIndex::cached_beam_search(const T *query1, const uint64_t long requestCount = static_cast(frontier_read_reqs.size()); // If we issued read requests and if a read is complete or there are // reads in wait state, then enter the while loop. - while (requestCount > 0 && getNextCompletedRequest(ctx, requestCount, completedIndex)) + while (requestCount > 0 && getNextCompletedRequest(reader, ctx, requestCount, completedIndex)) { assert(completedIndex >= 0); auto &frontier_nhood = frontier_nhoods[completedIndex];