DONE‎ > ‎

transmission-qt delay bug

transmission의 Qt 버전은 이미 구동중인 서버에 접속하는 기능이 있다는 점에서 맨 먼저 개발된 gtk+ 버전과 차이가 있다. 설정은 다 해놨는데 프로그램이 뜨고서 바로 목록이 나오지 않는 문제가 있어서 처음엔 그러려니 했다. 원격에 접속하는 거니까 굳이 바로 접속해서 리소스를 낭비하지 않는다 뭐 그런 거겠지 했다.

그러다 이게 불편해져서 바로 접속하는 옵션이라도 넣을 수 있을까 하고 소스를 좀 봤는데 그게 그게 아니었다. 소스에는 뜨면 바로 접속하게 되어 있었다. qtrapp.cc, mainwin.cc, session.cc를 보면 app.cc에서 이것저것 쭉 하고
  • 최초 실행(settings.js 없음)이면 세션 설정창을 띄우고 아니면 세션을 restart()한다.
  • restart()session.cc에서 단순히 stop()start()의 호출인데, stop()이 http 접속을 멈추고 (이 과정에서 http error: Request aboted 라고 출력이 있다), start()는 설정에서 원격 호스트 정보를 가져다 myHttp를 다시 채우고 sourceChanged 이벤트를 발생시킨다.
  • sourceChanged 이벤트는 mainwin.cc에서 onSessionSourceChanged()를 호출하라고 연결되는데 가보면 myModel.clear() 한 줄 밖에 없다.
  • torrent-model.cc에서 clear()는 이것저것 다 clear, delete를 하고 끝에 reset()를 호출하는데, 명시적으로 연결되는 흔적이 없어서 모르겠지만 이게 아마 modelReset 이벤트를 호출하는 것으로 보인다. 이 이벤트는 mainwin.cc에서 onModelReset()를 호출하라고 연결되어 있다. 여기서는 Title, VisibleCount, ActionSensitivity, StatusBar에 대해 refresh를 수행한다.
여기까지 따라왔는데 어디를 더 살펴봐야 할지 모르겠다.

직접 세션을 연결하기 위해선 Change Session 메뉴를 통해 접속창을 띄우고 이미 설정되어 있는 것에서 확인만 누르면 된다. (간간히 일부 토런트만 받아오는 현상이 있는데 이건 일단 중요한 부분은 아니니까 패스)
이건 mainwin.ui에서 SessionDialog의 일부로 지정되어 있는데, session-dialog.cc를 열어보면 이런저런 입력폼을 구성하고 onAccepted()가 호출되면 여기서 설정을 myPrefs에 저장하고 mySession.restart() 후에 창을 숨긴다.
이러면 다시 mySession::restart()로 넘어가는 거고, 오리무중인 것이다.

실제로 접속 직후 창 하단에 있는 상태줄에 보면 네트워크 상태 아이콘이 생기는데 띄엄띄엄 불이 들어오는 걸 확인할 수 있다.
그리고 아주 오래 두면 목록이 뜬다. qtr 실행하고 목록이 뜨기까지의 전후에 date 명령을 통해 확인한 바는 다음과 같다.

$ date; qtr; date
Fri Apr 16 21:21:55 KST 2010
http error: Request aborted
[21:24:39.724] Saved “/home/keizie/.config/transmission/settings.json”
Fri Apr 16 21:24:40 KST 2010

이러면 내부적으로 타이머가 있어서 타이머에 걸린 동작이 최초 실행시에 바로 호출되지 않아서 생기는 공백이 아닐까 의심해보았다. app.cc에서 mode, stats, session에 타이머를 걸긴 하는데 MSEC이 3000들이라서 분 단위의 지연이 생길리는 없을 것 같다.
정말 연결이 생긴건데 보이지만 않는 건지 확인하기 위해, 시드를 던져주어 qtr이 뜨게 하고 확인창에서 추가하라고 확인했다. 그리고는 웹으로 접근해서 목록을 봤는데 목록에 없다. 그렇다면 보이지만 않는 것이 아니라 실제로도 세션은 없고, 네트워크 상태 아이콘은 뭔가 모를 다른 내용을 주고받는다는 건가?
창을 그대로 열어두었더니, 시간이 흐르고 (정확히 얼마인지는 모르겠다. 이걸 적고 있었으니까 분 단위일 텐데) 추가 후 지우라고 했던 시드 파일이 없어지고, 창에는 목록이 뜨고 있고 웹에도 추가된 게 보인다.
그렇다면 타이머의 첫 공백이 아니라 그때까지 뭔가 펜딩이 걸려 있다는 얘긴가?

이에 대해 https://trac.transmissionbt.com/ticket/3147에 도움을 요청했고 주변 환경의 문제가 아닌지에 대한 확인이 오간 뒤에 패치가 나왔다. Qt의 QHttp에 이상이 있어서 신호 처리가 제대로 되지 않은 것이라고 하며 QNetworkAccessManager로 교체 후 지연 증상이 없어졌다. 패치 작성자는 안정성에 대해 확신할 수 없다고 하지만 실제로 정식 코드에 적용된 뒤에도 별 다른 이상은 보이지 않는다.
Comments