I discovered multiple leaks of shuffle memory while working on my memory manager consolidation patch, which added the ability to do strict memory leak detection for the bookkeeping that used to be performed by the ShuffleMemoryManager. This uncovered a handful of places where tasks can acquire execution/shuffle memory but never release it, starving themselves of memory.
Problems that I found:
- ExternalSorter.stop() should release the sorter's shuffle/execution memory.
- BlockStoreShuffleReader should call ExternalSorter.stop() using a CompletionIterator.
- ExternalAppendOnlyMap exposes no equivalent of stop() for freeing its resources.