@@ -589,6 +589,53 @@ class MapOutputTrackerSuite extends SparkFunSuite with LocalSparkContext {
589589 }
590590 }
591591
592+ test(" SPARK-32921: test new protocol changes fetching both Map and Merge status in single RPC" ) {
593+ val newConf = new SparkConf
594+ newConf.set(RPC_MESSAGE_MAX_SIZE , 1 )
595+ newConf.set(RPC_ASK_TIMEOUT , " 1" ) // Fail fast
596+ newConf.set(SHUFFLE_MAPOUTPUT_MIN_SIZE_FOR_BROADCAST , 10240L ) // 10 KiB << 1MiB framesize
597+ newConf.set(PUSH_BASED_SHUFFLE_ENABLED , true )
598+ newConf.set(IS_TESTING , true )
599+
600+ // needs TorrentBroadcast so need a SparkContext
601+ withSpark(new SparkContext (" local" , " MapOutputTrackerSuite" , newConf)) { sc =>
602+ val masterTracker = sc.env.mapOutputTracker.asInstanceOf [MapOutputTrackerMaster ]
603+ val rpcEnv = sc.env.rpcEnv
604+ val masterEndpoint = new MapOutputTrackerMasterEndpoint (rpcEnv, masterTracker, newConf)
605+ rpcEnv.stop(masterTracker.trackerEndpoint)
606+ rpcEnv.setupEndpoint(MapOutputTracker .ENDPOINT_NAME , masterEndpoint)
607+ val bitmap1 = new RoaringBitmap ()
608+ bitmap1.add(1 )
609+
610+ masterTracker.registerShuffle(20 , 100 , MergeStatus .SHUFFLE_PUSH_DUMMY_NUM_REDUCES )
611+ (0 until 100 ).foreach { i =>
612+ masterTracker.registerMapOutput(20 , i, new CompressedMapStatus (
613+ BlockManagerId (" 999" , " mps" , 1000 ), Array .fill[Long ](4000000 )(0 ), 5 ))
614+ }
615+ masterTracker.registerMergeResult(20 , 0 , MergeStatus (BlockManagerId (" 999" , " mps" , 1000 ),
616+ bitmap1, 1000L ))
617+
618+ val mapWorkerRpcEnv = createRpcEnv(" spark-worker" , " localhost" , 0 , new SecurityManager (conf))
619+ val mapWorkerTracker = new MapOutputTrackerWorker (conf)
620+ mapWorkerTracker.trackerEndpoint =
621+ mapWorkerRpcEnv.setupEndpointRef(rpcEnv.address, MapOutputTracker .ENDPOINT_NAME )
622+
623+ val fetchedBytes = mapWorkerTracker.trackerEndpoint
624+ .askSync[(Array [Byte ], Array [Byte ])](GetMapAndMergeResultStatuses (20 ))
625+ assert(masterTracker.getNumAvailableMergeResults(20 ) == 1 )
626+ assert(masterTracker.getNumAvailableOutputs(20 ) == 100 )
627+
628+ val mapOutput =
629+ MapOutputTracker .deserializeOutputStatuses[MapStatus ](fetchedBytes._1, newConf)
630+ val mergeOutput =
631+ MapOutputTracker .deserializeOutputStatuses[MergeStatus ](fetchedBytes._2, newConf)
632+ assert(mapOutput.length == 100 )
633+ assert(mergeOutput.length == 1 )
634+ mapWorkerTracker.stop()
635+ masterTracker.stop()
636+ }
637+ }
638+
592639 test(" SPARK-32921: unregister merge result if it is present and contains the map Id" ) {
593640 val rpcEnv = createRpcEnv(" test" )
594641 val tracker = newTrackerMaster()
0 commit comments