문제

chrome extension을 제작하면서 background (persistent)에서 setInterval로 타이머를 등록해놓고,

heart beat 체크 같은 걸 하고 있는데 이게 제대로 체크가 되지 않는 현상이 발생했음.

스스로 체크 가능한 PC에선 일어나지 않고 일부 사용자들에게서만 일어나는 현상이라 디버깅이 개떡같았는데 어느정도 가닥을 잡은 듯 하여 기록을 남김.


비단 chrome extension 만의 문제는 아닌데,

원인은 PC의 idle state였다.

절전모드 등이 세팅된 PC에서 절전모드로 진입하면 OS 레벨에서 timer나 socket 등을 suspended 상태로 만든다.

그러므로 timer가 resume 될 때까지 heart beat 체크가 안되는 것이다.


직접 제작한 chrome extension의 background 에서 setInterval로 console.log() 를 1초마다 찍어봤는데,

절전모드로 진입한 이후 얼마간의 시간이 지난 뒤 wake up시키고 다시 보면 debug 창에 그 동안의 로그가 찍혀있지 않았다.




해결1

chrome extension은 system의 power management를 override할 수 있도록 chrome.power API를 제공한다.


http://developer.chrome.com/extensions/power


근데 이게 크롬북같은 모바일 디바이스 등을 위한 것 같고 PC를 위한 것 같지는 않다.

requestKeepAwake() 라는 함수에 인자값을 display, system 둘 중 하나를 넘겨줌으로써 power management를 override할 수 있다는데,

직접 테스트해 본 결과는 아래와 같다.


(절전모드 세팅은 '1분후'로 했음)

(chrome extension의 background에서 setInterval로 1초마다 로그를 찍음)


1. chrome.power.requestKeepAwake('display') 호출시 1분 후 시스템은 절전모드로 돌입한다.

어느정도 시간이 지난 후 다시 시스템에 들어가 보면 절전모드 시간동안 로그가 찍혀 있지 않았음.

결과적으로 아무것도 안한 것과 같다...;


2. chrome.power.requestKeepAwake('system') 호출시 1분 후 역시 시스템은 절전모드로 돌입하지만, 어느정도 시간이 지난 후 다시 들어가보면 절전모드 시간동안에도 로그는 1초 간격으로 꾸준히 찍혀 있음. 

heart beat 체크를 하려면 이걸로 해야함.


3. 직접 시스템종료 메뉴의 '절전'을 클릭해서 절전모드로 들어가면 뭘로 세팅해도 로그는 찍히지 않음.




해결2

chrome.power API가 시스템마다 문서에 나와있는대로 먹히지 않고,

사용자가 지맘대로 '절전'을 실행할 수도 있으므로 완벽히 커버하는 방법은 idle state까지 체크하는 방법밖에는 없을 듯 하다.

다행스럽게도 chrome extension에서는 idle state를 체크할 수 있는 chrome.idle API를 제공한다.


http://developer.chrome.com/extensions/idle


idle state는 active/idle/locked 의 3가지이며, 이 중 절전모드 진입시의 idle state는 locked이다.

chrome.idle.onStateChanged event listener를 등록하여,

newState 값이 locked일 경우 heart beat 체크에서 제외하거나 따로 expire time을 갱신하다가,

active로 바뀔 경우 다시 원상태로 복구시키는 개짜증 번거로운 구현을 해야할 듯 하다.









Posted by bloodguy
,