MCPcopy Create free account
hub / github.com/BWbwchen/MapReduce / distributeReduceTask

Method distributeReduceTask

master/master.go:240–300  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

238}
239
240func (ms *Master) distributeReduceTask() {
241 log.Trace("[Master] Start Reduce task")
242
243 taskStates := sync.Map{}
244
245 finish := make(chan string, 100)
246 workerID := 0
247 workers, nWorkers := ms.availableWorkers(ms.numReducer)
248 for _, reduceTask := range ms.ReduceTasks {
249 reduceTask.SetState(TASK_INPROGRESS)
250 go func(task ReduceTaskInfo, id int) {
251 taskStates.Store(workers[id].UUID, task)
252 workers[id].SetState(WORKER_BUSY)
253 done := Reduce(workers[id].IP, task.toRPC())
254 if !done {
255 task.SetState(TASK_IDLE)
256 workers[id].SetState(WORKER_UNKNOWN)
257 ms.crashChan <- workers[id].UUID
258 } else {
259 task.SetState(TASK_COMPLETED)
260 workers[id].SetState(WORKER_IDLE)
261 finish <- workers[id].UUID
262 }
263 }(reduceTask, workerID)
264 workerID = (workerID + 1) % nWorkers
265 }
266
267 count := 0
268LOOP:
269 for {
270 select {
271 case <-finish:
272 count += 1
273 if count == len(ms.ReduceTasks) {
274 close(finish)
275 break LOOP
276 }
277 case crashUUID := <-ms.crashChan:
278 workers, _ = ms.availableWorkers(1)
279
280 log.Info("[Master] Re-execute Map Task from ", crashUUID, "To ", workers[0].UUID)
281 reExecuteTask, _ := taskStates.Load(crashUUID)
282 go func(task ReduceTaskInfo, id int) {
283 taskStates.Delete(crashUUID)
284 taskStates.Store(workers[id].UUID, task)
285 done := Reduce(workers[id].IP, task.toRPC())
286 if !done {
287 task.SetState(TASK_IDLE)
288 workers[id].SetState(WORKER_UNKNOWN)
289 ms.crashChan <- workers[id].UUID
290 } else {
291 task.SetState(TASK_COMPLETED)
292 workers[id].SetState(WORKER_IDLE)
293 finish <- workers[id].UUID
294 }
295 }(reExecuteTask.(ReduceTaskInfo), 0)
296 }
297 }

Callers 1

StartMasterFunction · 0.80

Calls 4

availableWorkersMethod · 0.95
ReduceFunction · 0.70
SetStateMethod · 0.45
toRPCMethod · 0.45

Tested by

no test coverage detected