()
| 238 | } |
| 239 | |
| 240 | func (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 |
| 268 | LOOP: |
| 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 | } |
no test coverage detected