ChildProcessManager::setupEventHandlers | Child process stderr: [2026-04-06 17:43:07] [error] consum
RCA: ChildProcessManager::setupEventHandlers | websocketpp message too large
Error Log#
ChildProcessManager::setupEventHandlers | Child process stderr: [2026-04-06 17:43:07] [error] consume error: websocketpp.processor:4 (A message was too large)
[2026-04-06 17:43:07] [info] asio async_shutdown error: asio.ssl:167772451 (application data after close notify (SSL routines))
Impact#
- Service:
cupixworks-any-mesh-agent - Team: manhattan
- 발생 횟수: 1
- 최초 발생: 2026-04-06T17:43:07.540Z
- 최근 발생: 2026-04-06T17:43:07.540Z
Root Cause Summary#
네이티브 C++ 라이브러리 @cupix-compute/forge_bimmodel_extractor가 Autodesk Forge/APS 서비스와 WebSocket 통신 중 수신한 메시지가 websocketpp의 기본 최대 메시지 크기 제한(일반적으로 16MB)을 초과하여 websocketpp.processor:4 (A message was too large) 에러가 발생했습니다. 이 에러로 WebSocket 연결이 비정상 종료되면서 SSL shutdown 에러(asio.ssl:167772451)가 후속으로 발생했습니다. 그러나 Datadog 로그 분석 결과, 해당 BIM 18887의 mesh 추출 파이프라인은 에러 이후에도 정상 완료되었으며(S3 업로드, cleanup, SQS 삭제 모두 성공), 단발성(1회) 발생으로 서비스 영향은 제한적이었습니다.
Technical Analysis#
Code Path#
- Entry point:
mesh-service.ts:54—MeshExtractManager를stdioMode: 'pipe'과 8시간 timeout으로 생성
// applications/agents/packages/cupix-tesla-mesh-agent/src/mesh-service.ts:54-57
this._meshExtractManager = new MeshExtractManager({
stdioMode: 'pipe',
executeTimeoutMs: Environment.CPX_EXTRACTOR_TIMEOUT,
});
ChildProcessManager가 Node.jsfork()로 자식 프로세스를 생성하고setupEventHandlers()에서 stderr 파이프를 감시
// applications/agents/packages/base/src/manager/child-process.manager.ts:138-141
this.process.stderr?.on('data', (data: Buffer) => {
const text = data.toString();
logger.error(`ChildProcessManager::setupEventHandlers | Child process stderr: ${text}`);
});
- 자식 프로세스(
MeshExtractorProcess)가 네이티브 C++ 라이브러리@cupix-compute/forge_bimmodel_extractor를 로드하여 BIM 모델 추출 수행
// applications/agents/packages/cupix-tesla-mesh-agent/src/process/mesh-extractor.process.ts:129-138
const extractBIMModel = new BIM_MODEL_EXTRACTOR.extract_bimmodel();
const envName = CPX_ENVIRONMENT_NAME?.toLowerCase();
extractBIMModel.setServer(envName);
extractBIMModel.setModelUrn(params.urn);
extractBIMModel.setOutputDirpath(params.path);
const result = extractBIMModel.process();
-
Failure point: 네이티브 라이브러리 내부의 websocketpp 레이어 —
extract_bimmodel.process()실행 중 Forge 서비스로부터 수신한 WebSocket 메시지가 websocketpp의max_message_size제한을 초과. 이 제한값은 컴파일된 바이너리 내부에 설정되어 있어 TypeScript 레이어에서 조정 불가. -
에러 후 처리 흐름: websocketpp 에러에도 불구하고
extractBIMModel.process()가true를 반환하여 파이프라인이 계속 진행됨 (CPBim::fromMeshExtractor→ S3 업로드 → cleanup → SQS 삭제).
Log Evidence#
사용한 Datadog 쿼리:
service:cupixworks-any-mesh-agent status:error @environment:production "ChildProcessManager::setupEventHandlers"
service:cupixworks-any-mesh-agent status:info @environment:production
BIM 18887 처리 타임라인 (host: ip-10-1-111-28, user: ttieperman@manhattanconstruction.com):
17:42:43.765Z AwsS3Manager::constructor | region: us-west-2
17:42:44.009Z BaseService::runByMessage | id: 18887
17:42:44.047Z CupixAuth::setSession | session_id: ac66280a...8dc87f
17:42:45.798Z [ERROR] AWS SDK v2 deprecation warning
17:42:45.833Z [ERROR] sentry initialization failed
17:42:51.301Z [ERROR] Warning: Offset out of bounds (offset: 11421839360, buffer size: 69220)
17:43:07.540Z [ERROR] consume error: websocketpp.processor:4 (A message was too large)
17:43:08.014Z CPBim::fromMeshExtractor | filepaths count: 16
17:43:15.541Z AwsS3Manager::setCredentials | begin
17:43:15.550Z AwsS3Manager::setCredentials | end
17:43:15.550Z AwsS3Manager::uploadFileStreamToS3 | begin - filePath: /tmp/workspace/18887/mesh_archive/18887.zip
17:43:22.791Z MeshService::uploadBimMeshArchiveFile | end
17:43:23.427Z BaseService::cleanUpAnythingRelatedModel | path: /tmp/workspace/18887
17:43:23.461Z AwsQueueManager::deleteMessage | begin
17:43:23.493Z AwsQueueManager::deleteMessage | end
핵심 관찰:
- websocketpp 에러(17:43:07.540Z) 직후 mesh 추출이 16개 파일을 정상 산출(17:43:08.014Z) — 에러가 최종 결과에 영향을 미치지 않음
- "Offset out of bounds" 에러가 websocketpp 에러보다 ~16초 앞서 발생 — BIM 18887의 데이터가 비정상적으로 크거나 일부 구간에서 버퍼 오버플로우 발생 가능성
- 전체 서비스에서
websocketpp또는 "message was too large" 에러는 이 1건만 존재 — 단발성 이벤트 - 동일 시간대 다른 호스트(ip-10-1-35-29, ip-10-1-109-8, ip-10-1-172-211)의 다른 BIM 처리는 동일한 sentry/AWS SDK 에러를 겪었으나 websocketpp 에러 없이 정상 완료
Fix Recommendation#
즉시 조치 (Critical)#
- 즉시 조치가 필요한 수준은 아님. 에러가 단발성이며 파이프라인 결과에 영향을 미치지 않았음.
단기 개선 (1주 이내)#
@cupix-compute/forge_bimmodel_extractor네이티브 라이브러리(현재 v0.0.148)의 websocketppmax_message_size설정을 확인하고, 대용량 BIM 모델을 안정적으로 처리할 수 있도록 메시지 크기 제한을 상향 조정하는 것을 검토. 이는 C++ 라이브러리 빌드 시 설정되므로 해당 라이브러리 팀과 협의 필요.child-process.manager.ts:138-141의 stderr 핸들러에서 websocketpp 에러를 파싱하여 구조화된 로그로 남기도록 개선하면 모니터링 가시성이 향상됨.
장기 개선 (재발 방지)#
@cupix-compute/forge_bimmodel_extractor라이브러리에 WebSocket 메시지 크기 제한을 런타임 설정 가능하도록 API를 추가하여 TypeScript 레이어에서 조정할 수 있게 함.- sentry initialization 실패 및 AWS SDK v2 deprecation warning이 모든 세션에서 반복 발생하고 있어 별도 클러스터로 추적하여 해결 권장.
Monitoring#
- websocketpp 에러 재발 모니터링:
service:cupixworks-any-mesh-agent status:error "websocketpp" @environment:production
- "Offset out of bounds" 에러 빈도 추적 (대용량 BIM 모델 패턴 파악):
service:cupixworks-any-mesh-agent status:error "Offset out of bounds" @environment:production
Risk Assessment#
- Risk level: low
- 예상 복잡도: standard (네이티브 C++ 라이브러리 변경이 필요하므로 cross-team 협업 필요)