SPARK-2638 MapOutputTracker concurrency improvement

Spark-2638 Improve concurrency of fetching Map outputs

This issue was noticed while perusing the MapOutputTracker source code. Notice that the synchronization is on the containing "fetching" collection - which makes ALL fetches wait if any fetch were occurring.
The fix is to synchronize instead on the shuffleId (interned as a string to ensure JVM wide visibility).

For further details please refer to the JIRA.
Yes I see your  point and agree there is a problem in the proposed fix..  My fix is incorrect in that we need to match the outer shuffleId.toString.intern.synchronized to the inner shuffleId.toString.intern.wait(). 

Then the code should look like this:

val monitor = shuffleId.toString.intern
monitor.synchronized {
   ..
         monitor.wait()
}

Do you agree?