Convert recursive quicksort into iterative to avoid stack overflow #9457
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Launch Checklist
We've recently switched to using the feature state property in our mapbox implementation. We found during one test - which includes rendering 30000+ points - a stack-overflow eminating from feature_position_map.js. This was in the sort function which is implemented as a custom quick sort using recursion. The issue is that there are certain circumstances where quicksort can have a worst-case scenario. The pivot position chosen can end up being the next sorted item in the list - whick leads to a recusion to sort the remaining N-1 items. If this happens continuously we can infact recurse through all items to be sorted which causes stack overflow issues. This change simply rewrites the sort to use a queue and an iterative approach.
@mapbox/map-design-team
@mapbox/static-apis
if this PR includes style spec API or visual changes@mapbox/gl-native
if this PR includes shader changes or needs a native portmapbox-gl-js
changelog:<changelog>Fix "Maximum call stack size exceeded" error when using feature-state.</changelog>