[MIP-329] Windows system shutdown event hooking

Subject
Windows system shutdown event hooking


APPLIES TO:
MCCS


SYMPTOMS
"shutdown event 발생 -> mccs 리소스들이 해당 이벤트를 먼저 받아 정리 작업 -> mccs에서 장애로 표시 -> mccs agent의 terminate 명령으로 인한 mccs server 강제 종료(정확한 시나리오인지 확인 필요). 강제 종료 되기 전까지 리소스 타겟이 정리 되므로 장애로 표시되지만 결국 mccs server의 강제 종료로 인해 stanby 서버에서 failover 하므로 아무런 문제 안됨. 또한 이미 운영체제가 내려가는 중이므로 리소스가 fault인지 아닌지 신경 쓸 필요도 없음.

괴상한 방법1:
개별적 어플 작성(ShutdownDetector?) -> shutdown event 받으면 특정 종료 코드값으로 exit -> mccs에서 해당 어플을 runtime.exec로 실행 후 종료값 비교로 Shutdown event를 받았는지 말았는지 확인.
그러나 이경우에도 과연 어플이 다른 mccs 리소스 타겟들 보다 먼저 shutdown이벤트를 받는지 보장 안됨.

todo:
종료중인 상태를 가지고 오는 방법이 정말로 없는지 좀더 확인 할것.
커널 레벨에서 해당 상태를 가지고 올 수 있는 방법이 있는 지 확인. 있다면 vollock에 ioctl을 하나 추가하면 될 거 같은데... 근데 꺼림칙.
"

CAUSE
"1. Kernel에서 power state로 확인 할 수 있을까 했는데 불가능. power state는 on 또는 off이며 off 방식에 따라 state가 나뉘는거 뿐임.
2. 미리 shutdown event를 받을 수 있는 방법 없음.
3. SERVICE_ACCEPT_PRESHUTDOWN 쪽 확인 해 볼것. -> 장애 판별 안하고 종료 됨.
4. 노트패드 경우 일부러 테스트 글 써놓고 저장 확인 다이얼로그 띄우게 만든 후 가만히 놔둠.
이럴 경우 다른 프로세스가 먼저 종료 됨으로 인해 fault 처리 됨.

5. SERVICE_CONTROL_SHUTDOWN 대신에 SERVICE_CONTROL_PRESHUTDOWN에서 mccs server를 강제 종료 하도록 변경. 중지 시점을 약간 앞당긴 것 뿐이며 여전히 구멍 있음. 현재 어떠한 방법으로도 다른 프로세스에 전달되는 종료 이벤트를 막을 수 없음.
"


SOLUTION
"1. shutdown 이벤트는 시스템 전역적이며 순서도 안정해져 있음.
2. 이벤트가 전파되기 전에 shutdown 이벤트를 독자적으로 받아내고 이를 제어 할 수 있는 정상적인 방법은 존재 하지 않음."