-
Notifications
You must be signed in to change notification settings - Fork 1
Refactoring
candymate edited this page Nov 27, 2021
·
4 revisions
basic flow
master -> worker: phase start
worker -> master: ok
worker: do work for phases
worker -> master: done
master -> worker: ok서버를 유지시키는 방향으로 갈지 vs 서버를 계속 껐다가 켜는 방향으로 갈지
두개 phase 이어짐
master -> worker: phase1 start
worker -> master: ok
worker: do work for phases
worker -> master: done
master -> worker: ok
master -> worker: phase2 start
worker -> master: ok
worker: do work for phases
worker -> master: done
master -> worker: ok
master → worker 2번 중복되는 경우가 있음. 하지만 이를 합치면 디자인이 더 꼬이니 건들지 않는게 나음.
master 입장
master -> worker: phase1 start
//worker -> master: ok
//worker: do work for phases
//worker -> master: done
master -> worker: ok (master server needed)
master -> worker: phase2 start
//worker -> master: ok
//worker: do work for phases
//worker -> master: done
master -> worker: ok (master server needed)
서버를 껐다가 켠다? → 언제 껐다가 켤 것인가
master -> worker: phase1 start
//worker -> master: ok (요 시점?)
//worker: do work for phases
//worker -> master: done
master -> worker: ok (master server needed)
동기화 문제가 생길 수 있다. (worker에서 요청을 보내는데 master 서버가 열려있지 않으면?)
→ 서버를 켜놓는 상태로 유지 (worker 입장에서도 마찬가지)
최우선 과제: 코드상으로 control을 깔끔하게 나타내기
worker(client) → master(server) : state transition (barrier is needed)
Total Flow
master: server open
worker(client) -> master(server): connection request
master(server) -> worker(client): connection ok
master(client) -> worker(server): worker connection info
worker(server) -> master(client): ok
master: SAMPLING_START
master(client) -> worker(server): sampling start (if all connection complete)
worker(server) -> master(client): ok
worker: SAMPLING_START (condition variable) -> sampling next
worker: do sampling
worker(client) -> master(server): sampling done (with sampled data)
master(server) -> worker(client): ok
master: SAMPLING_PIVOT (wait for all clients) (barrier)
master(client) -> worker(server): pivot (if all sampling done)
worker(server) -> master(client): ok
worker(client) -> master(server): done
master(server) -> worker(client): ok
master: SAMPLING_FINISH
master: SORT_PARTITION_START
master(client) -> worker(server): sort/partition start (if all ok sign come)
worker(client) -> master(server): ok
worker: do sort/partition
worker(client) -> master(server): sort/partition done
master(server) -> worker(client): ok
master(client) -> worker(server): shuffling start (if all ok sign come)
worker(client) -> master(server): ok
worker <-> worker: shuffling
worker(client) -> master(server): shuffling done
master(server) -> worker(client): ok
master(client) -> worker(server): merging start (if all ok sign come)
worker(client) -> master(server): ok
worker: merge
worker(client) -> master(server): merging done
master(server) -> worker(client): ok
master(client) -> worker(server): checking start (if all ok sign come)
worker(client) -> master(server): ok
worker: check
worker(client) -> master(server): checking done (with report)
master(server) -> worker(client): ok
master(client) -> worker(server): all done, finish (if all ok sign come)
worker(client) -> master(server): ok
master: finish
worker: finish
Code - master
main:
start server
while(phase != nextPhase) wait()
send next phase start request
while(phase != nextPhase) wait()
send next phase start request
...
handler:
if(done):
phase = nextPhase
notify()