@@ -420,14 +420,22 @@ VecSimDebugInfoIterator *VecSimTieredIndex<DataType, DistType>::debugInfoIterato
420420 .fieldType = INFOFIELD_UINT64,
421421 .fieldValue = {FieldValue{.uintegerValue = info.tieredInfo .bufferLimit }}});
422422
423- infoIterator->addInfoField (VecSim_InfoField{
424- .fieldName = VecSimCommonStrings::FRONTEND_INDEX_STRING,
425- .fieldType = INFOFIELD_ITERATOR,
426- .fieldValue = {FieldValue{.iteratorValue = this ->frontendIndex ->debugInfoIterator ()}}});
423+ // Acquire shared locks to safely access each sub-index's debug info during background indexing.
424+ // Only hold each lock while accessing its respective index to minimize contention.
425+ {
426+ std::shared_lock<std::shared_mutex> flat_lock (this ->flatIndexGuard );
427+ infoIterator->addInfoField (VecSim_InfoField{
428+ .fieldName = VecSimCommonStrings::FRONTEND_INDEX_STRING,
429+ .fieldType = INFOFIELD_ITERATOR,
430+ .fieldValue = {FieldValue{.iteratorValue = this ->frontendIndex ->debugInfoIterator ()}}});
431+ }
427432
428- infoIterator->addInfoField (VecSim_InfoField{
429- .fieldName = VecSimCommonStrings::BACKEND_INDEX_STRING,
430- .fieldType = INFOFIELD_ITERATOR,
431- .fieldValue = {FieldValue{.iteratorValue = this ->backendIndex ->debugInfoIterator ()}}});
433+ {
434+ std::shared_lock<std::shared_mutex> main_lock (this ->mainIndexGuard );
435+ infoIterator->addInfoField (VecSim_InfoField{
436+ .fieldName = VecSimCommonStrings::BACKEND_INDEX_STRING,
437+ .fieldType = INFOFIELD_ITERATOR,
438+ .fieldValue = {FieldValue{.iteratorValue = this ->backendIndex ->debugInfoIterator ()}}});
439+ }
432440 return infoIterator;
433441};
0 commit comments