ES /docs

ChildProcessManager::setupEventHandlers | Child process stderr: [2026-04-06 17:43:07] [error] consum

RCA: ChildProcessManager::setupEventHandlers | websocketpp message too large

Error Log#

Datadog Logs

text
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:54MeshExtractManagerstdioMode: 'pipe'과 8시간 timeout으로 생성
typescript
// 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.js fork()로 자식 프로세스를 생성하고 setupEventHandlers()에서 stderr 파이프를 감시
typescript
// 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 모델 추출 수행
typescript
// 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 쿼리:

text
service:cupixworks-any-mesh-agent status:error @environment:production "ChildProcessManager::setupEventHandlers"
text
service:cupixworks-any-mesh-agent status:info @environment:production

BIM 18887 처리 타임라인 (host: ip-10-1-111-28, user: ttieperman@manhattanconstruction.com):

text
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

핵심 관찰:

  1. websocketpp 에러(17:43:07.540Z) 직후 mesh 추출이 16개 파일을 정상 산출(17:43:08.014Z) — 에러가 최종 결과에 영향을 미치지 않음
  2. "Offset out of bounds" 에러가 websocketpp 에러보다 ~16초 앞서 발생 — BIM 18887의 데이터가 비정상적으로 크거나 일부 구간에서 버퍼 오버플로우 발생 가능성
  3. 전체 서비스에서 websocketpp 또는 "message was too large" 에러는 이 1건만 존재 — 단발성 이벤트
  4. 동일 시간대 다른 호스트(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)의 websocketpp max_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 에러 재발 모니터링:
text
service:cupixworks-any-mesh-agent status:error "websocketpp" @environment:production
  • "Offset out of bounds" 에러 빈도 추적 (대용량 BIM 모델 패턴 파악):
text
service:cupixworks-any-mesh-agent status:error "Offset out of bounds" @environment:production

Risk Assessment#

  • Risk level: low
  • 예상 복잡도: standard (네이티브 C++ 라이브러리 변경이 필요하므로 cross-team 협업 필요)