현상
에이전트 시작 경로의 CAgentHelper3::Start가 첫 SETTINGS 회차를 무한 대기했다. 그 회차가 서버 등록을 품고 있어, 커널 드라이버 로드와 이벤트 수집 시작(INITIALIZED)이 서버 상태에 묶였다.
개발 PC 실측(2026-09-03 11:13):
등록 시도 1: 원격 후보 서버:3181 → 8.1초 실패
4초 대기 → 시도 2: 192.168.0.2:3181 → 성공
CAgentHelper3::Start 13,355.9 ms
서버가 꺼져 있으면 매 시작마다 "후보 수 × 접속 실패 비용"을 낸다. 납품처는 폐쇄망이라 서버 점검·장애 중에도 단말 수집은 계속돼야 한다.
원인
이 대기는 저장소 최초 커밋부터 있던 잔재다. 대기가 지키던 전제들은 이후 보강으로 전부 코드 앞쪽으로 옮겨졌다.
- 로컬 설정 적용: Create 초입의
ApplySettings("INITIALIZE")가 이미 수행한다. - 구독 토픽 구성: Start 초입이 캐시로 이미 구성한다("전송 못 해도 나중에 나가도록"이라는 주석이 남아 있다).
- 전송: 저장 후 전송 구조(
CMessagePool)가 서버 부재를 흡수한다.
첫 회차의 실제 내용도 로컬 값 재적용 33ms + 서버 등록 13초였다. Start 이후 초기화 사슬(CEventCallback2·커널 드라이버·CProcessCallback2)이 서버 신원·서버 설정을 참조하는 곳은 0건이고, 신호(hApplied)를 소비하는 곳도 이 대기 한 곳뿐이다.
조치
- 대기 블록 삭제(
CAgentHelper3.cpp).hApplied멤버·생성·해제와 Manager 쪽SetEvent는 잔재로 유지한다. - 삭제한 자리에서
IsAgentShutdown()을 확인한 뒤 반환한다(대기가 하던 종료 감지의 대체).
검증 (빌드 후)
| 조건 | 기대 결과 |
|---|---|
| 정상 서버 | 시작 시간·동작이 기존과 동일 |
| 첫 후보 실패 후 성공 | Start가 즉시 반환, 등록은 뒤에서 완료 |
| 전 서버 실패 | 수집은 정상 시작, 데이터는 쌓였다가 연결 후 전송 |
| 완전 신규 설치 + 서버 부재 | 로컬 수집 지속, 서버가 붙으면 등록·토픽 재구성 |
| 종료 중 시작 | 삭제 자리의 종료 가드로 즉시 반환 |
| User.exe | 첫 SETTINGS push 이후 접속해도 get.SETTINGS로 정상 초기화 |
핵심은 서버 도달 가능성과 단말의 수집 시작을 분리한 것이다. 서버가 없어도 커널 드라이버 로드와 이벤트 수집은 즉시 시작하고, 등록·토픽 재구성은 서버가 붙는 순간 뒤따른다.
Orange Platform 엔드포인트 에이전트의 시작 경로 분석 리포트입니다.