diff --git a/cpp/bench/ann/src/cuvs/cuvs_cagra_wrapper.h b/cpp/bench/ann/src/cuvs/cuvs_cagra_wrapper.h index f5f609710..e611ea36b 100644 --- a/cpp/bench/ann/src/cuvs/cuvs_cagra_wrapper.h +++ b/cpp/bench/ann/src/cuvs/cuvs_cagra_wrapper.h @@ -250,13 +250,17 @@ void cuvs_cagra::set_search_param(const search_param_base& param, RAFT_LOG_DEBUG("moving graph to new memory space: %s", allocator_to_string(graph_mem_).c_str()); // We create a new graph and copy to it from existing graph auto mr = get_mr(graph_mem_); - *graph_ = raft::make_device_mdarray( - handle_, mr, raft::make_extents(index_->graph().extent(0), index_->graph_degree())); - raft::copy(graph_->data_handle(), - index_->graph().data_handle(), - index_->graph().size(), + // Create a new graph, then copy, and __only then__ replace the shared pointer. + auto old_graph = + index_->graph(); // view of graph_ if it exists, of an internal index member otherwise + auto new_graph = raft::make_device_mdarray(handle_, mr, old_graph.extents()); + raft::copy(new_graph.data_handle(), + old_graph.data_handle(), + old_graph.size(), raft::resource::get_cuda_stream(handle_)); + raft::resource::sync_stream(handle_); + *graph_ = std::move(new_graph); // NB: update_graph() only stores a view in the index. We need to keep the graph object alive. index_->update_graph(handle_, make_const_mdspan(graph_->view()));