Skip to content

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()

Clone this wiki locally