Skip to content

Commit 76de976

Browse files
authored
Removed recursion from Explain Action to avoid stackoverflow in some situations (opensearch-project#419)
Signed-off-by: Petar Dzepina <petar.dzepina@gmail.com>
1 parent b586ec8 commit 76de976

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
@@ -339,68 +340,29 @@ class TransportExplainAction @Inject constructor(
339340
val filteredPolicies = mutableListOf<PolicyID?>()
340341
val enabledStatus = mutableMapOf<String, Boolean>()
341342
val filteredAppliedPolicies = mutableMapOf<String, Policy>()
342-
filter(0, filteredIndices, filteredMetadata, filteredPolicies, enabledStatus, filteredAppliedPolicies)
343-
}
344-
345-
@Suppress("LongParameterList")
346-
private fun filter(
347-
current: Int,
348-
filteredIndices: MutableList<String>,
349-
filteredMetadata: MutableList<ManagedIndexMetaData?>,
350-
filteredPolicies: MutableList<PolicyID?>,
351-
enabledStatus: MutableMap<String, Boolean>,
352-
filteredAppliedPolicies: MutableMap<String, Policy>
353-
) {
354-
val request = ManagedIndexRequest().indices(indexNames[current])
355-
client.execute(
356-
ManagedIndexAction.INSTANCE,
357-
request,
358-
object : ActionListener<AcknowledgedResponse> {
359-
override fun onResponse(response: AcknowledgedResponse) {
360-
filteredIndices.add(indexNames[current])
361-
filteredMetadata.add(indexMetadatas[current])
362-
filteredPolicies.add(indexPolicyIDs[current])
363-
enabledState[indexNames[current]]?.let { enabledStatus[indexNames[current]] = it }
364-
appliedPolicies[indexNames[current]]?.let { filteredAppliedPolicies[indexNames[current]] = it }
365-
if (current < indexNames.count() - 1) {
366-
// do nothing - skip the index and go to next one
367-
filter(current + 1, filteredIndices, filteredMetadata, filteredPolicies, enabledStatus, filteredAppliedPolicies)
368-
} else {
369-
sendResponse(
370-
filteredIndices, filteredMetadata, filteredPolicies, enabledStatus,
371-
totalManagedIndices, filteredAppliedPolicies
372-
)
373-
}
374-
}
375343

376-
override fun onFailure(e: Exception) {
377-
when (e is OpenSearchSecurityException) {
378-
true -> {
379-
totalManagedIndices -= 1
380-
if (current < indexNames.count() - 1) {
381-
// do nothing - skip the index and go to next one
382-
filter(
383-
current + 1,
384-
filteredIndices,
385-
filteredMetadata,
386-
filteredPolicies,
387-
enabledStatus,
388-
filteredAppliedPolicies
389-
)
390-
} else {
391-
sendResponse(
392-
filteredIndices, filteredMetadata, filteredPolicies, enabledStatus,
393-
totalManagedIndices, filteredAppliedPolicies
394-
)
395-
}
396-
}
397-
false -> {
398-
actionListener.onFailure(e)
399-
}
400-
}
344+
CoroutineScope(Dispatchers.IO).launch {
345+
// filter out indicies for which user doesn't have manage index permissions
346+
for (i in 0 until indexNames.count()) {
347+
val request = ManagedIndexRequest().indices(indexNames[i])
348+
try {
349+
client.suspendUntil<NodeClient, AcknowledgedResponse> { execute(ManagedIndexAction.INSTANCE, request, it) }
350+
filteredIndices.add(indexNames[i])
351+
filteredMetadata.add(indexMetadatas[i])
352+
filteredPolicies.add(indexPolicyIDs[i])
353+
enabledState[indexNames[i]]?.let { enabledStatus[indexNames[i]] = it }
354+
appliedPolicies[indexNames[i]]?.let { filteredAppliedPolicies[indexNames[i]] = it }
355+
} catch (e: OpenSearchSecurityException) {
356+
totalManagedIndices -= 1
357+
} catch (e: Exception) {
358+
actionListener.onFailure(e)
401359
}
402360
}
403-
)
361+
sendResponse(
362+
filteredIndices, filteredMetadata, filteredPolicies, enabledStatus,
363+
totalManagedIndices, filteredAppliedPolicies
364+
)
365+
}
404366
}
405367

406368
@Suppress("LongParameterList")

0 commit comments

Comments
 (0)