@@ -52,6 +52,7 @@ import org.opensearch.indexmanagement.indexstatemanagement.util.MetadataCheck
5252import  org.opensearch.indexmanagement.indexstatemanagement.util.checkMetadata 
5353import  org.opensearch.indexmanagement.indexstatemanagement.util.managedIndexMetadataID 
5454import  org.opensearch.indexmanagement.opensearchapi.parseWithType 
55+ import  org.opensearch.indexmanagement.opensearchapi.suspendUntil 
5556import  org.opensearch.indexmanagement.spi.indexstatemanagement.model.ISMIndexMetadata 
5657import  org.opensearch.indexmanagement.spi.indexstatemanagement.model.ManagedIndexMetaData 
5758import  org.opensearch.indexmanagement.util.SecurityUtils.Companion.buildUser 
@@ -343,68 +344,29 @@ class TransportExplainAction @Inject constructor(
343344            val  filteredPolicies =  mutableListOf<PolicyID ?>()
344345            val  enabledStatus =  mutableMapOf<String , Boolean >()
345346            val  filteredAppliedPolicies =  mutableMapOf<String , Policy >()
346-             filter(0 , filteredIndices, filteredMetadata, filteredPolicies, enabledStatus, filteredAppliedPolicies)
347-         }
348- 
349-         @Suppress(" LongParameterList" 
350-         private  fun  filter (
351-             current :  Int ,
352-             filteredIndices :  MutableList <String >,
353-             filteredMetadata :  MutableList <ManagedIndexMetaData ?>,
354-             filteredPolicies :  MutableList <PolicyID ?>,
355-             enabledStatus :  MutableMap <String , Boolean >,
356-             filteredAppliedPolicies :  MutableMap <String , Policy >
357-         ) {
358-             val  request =  ManagedIndexRequest ().indices(indexNames[current])
359-             client.execute(
360-                 ManagedIndexAction .INSTANCE ,
361-                 request,
362-                 object  :  ActionListener <AcknowledgedResponse > {
363-                     override  fun  onResponse (response :  AcknowledgedResponse ) {
364-                         filteredIndices.add(indexNames[current])
365-                         filteredMetadata.add(indexMetadatas[current])
366-                         filteredPolicies.add(indexPolicyIDs[current])
367-                         enabledState[indexNames[current]]?.let  { enabledStatus[indexNames[current]] =  it }
368-                         appliedPolicies[indexNames[current]]?.let  { filteredAppliedPolicies[indexNames[current]] =  it }
369-                         if  (current <  indexNames.count() -  1 ) {
370-                             //  do nothing - skip the index and go to next one
371-                             filter(current +  1 , filteredIndices, filteredMetadata, filteredPolicies, enabledStatus, filteredAppliedPolicies)
372-                         } else  {
373-                             sendResponse(
374-                                 filteredIndices, filteredMetadata, filteredPolicies, enabledStatus,
375-                                 totalManagedIndices, filteredAppliedPolicies
376-                             )
377-                         }
378-                     }
379347
380-                     override  fun  onFailure (e :  Exception ) {
381-                         when  (e is  OpenSearchSecurityException ) {
382-                             true  ->  {
383-                                 totalManagedIndices - =  1 
384-                                 if  (current <  indexNames.count() -  1 ) {
385-                                     //  do nothing - skip the index and go to next one
386-                                     filter(
387-                                         current +  1 ,
388-                                         filteredIndices,
389-                                         filteredMetadata,
390-                                         filteredPolicies,
391-                                         enabledStatus,
392-                                         filteredAppliedPolicies
393-                                     )
394-                                 } else  {
395-                                     sendResponse(
396-                                         filteredIndices, filteredMetadata, filteredPolicies, enabledStatus,
397-                                         totalManagedIndices, filteredAppliedPolicies
398-                                     )
399-                                 }
400-                             }
401-                             false  ->  {
402-                                 actionListener.onFailure(e)
403-                             }
404-                         }
348+             CoroutineScope (Dispatchers .IO ).launch {
349+                 //  filter out indicies for which user doesn't have manage index permissions
350+                 for  (i in  0  until indexNames.count()) {
351+                     val  request =  ManagedIndexRequest ().indices(indexNames[i])
352+                     try  {
353+                         client.suspendUntil<NodeClient , AcknowledgedResponse > { execute(ManagedIndexAction .INSTANCE , request, it) }
354+                         filteredIndices.add(indexNames[i])
355+                         filteredMetadata.add(indexMetadatas[i])
356+                         filteredPolicies.add(indexPolicyIDs[i])
357+                         enabledState[indexNames[i]]?.let  { enabledStatus[indexNames[i]] =  it }
358+                         appliedPolicies[indexNames[i]]?.let  { filteredAppliedPolicies[indexNames[i]] =  it }
359+                     } catch  (e:  OpenSearchSecurityException ) {
360+                         totalManagedIndices - =  1 
361+                     } catch  (e:  Exception ) {
362+                         actionListener.onFailure(e)
405363                    }
406364                }
407-             )
365+                 sendResponse(
366+                     filteredIndices, filteredMetadata, filteredPolicies, enabledStatus,
367+                     totalManagedIndices, filteredAppliedPolicies
368+                 )
369+             }
408370        }
409371
410372        @Suppress(" LongParameterList" 
0 commit comments