Skip to content

Commit abce93b

Browse files
Removed recursion from Explain Action to avoid stackoverflow in some situations (#419) (#421) (#425)
Signed-off-by: Petar Dzepina <petar.dzepina@gmail.com> (cherry picked from commit 76de976) Co-authored-by: Petar Dzepina <petar.dzepina@gmail.com> (cherry picked from commit b63320b) Co-authored-by: opensearch-trigger-bot[bot] <98922864+opensearch-trigger-bot[bot]@users.noreply.github.com>
1 parent 734fbed commit abce93b

File tree

1 file changed

+21
-59
lines changed

1 file changed

+21
-59
lines changed

src/main/kotlin/org/opensearch/indexmanagement/indexstatemanagement/transport/action/explain/TransportExplainAction.kt

Lines changed: 21 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import org.opensearch.indexmanagement.indexstatemanagement.util.MetadataCheck
5252
import org.opensearch.indexmanagement.indexstatemanagement.util.checkMetadata
5353
import org.opensearch.indexmanagement.indexstatemanagement.util.managedIndexMetadataID
5454
import org.opensearch.indexmanagement.opensearchapi.parseWithType
55+
import org.opensearch.indexmanagement.opensearchapi.suspendUntil
5556
import org.opensearch.indexmanagement.spi.indexstatemanagement.model.ISMIndexMetadata
5657
import org.opensearch.indexmanagement.spi.indexstatemanagement.model.ManagedIndexMetaData
5758
import 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

Comments
 (0)