ES /docs

Failed to use property database: Failed to get properties and children

RCA: Failed to use property database: Failed to get properties and children

Error Log#

Datadog Logs

text
Failed to use property database: Failed to get properties and children

Impact#

  • Service: cupixworks-any-room-agent
  • 발생 횟수: 1
  • 최초 발생: 2026-04-09T06:44:25.133Z
  • 최근 발생: 2026-04-09T06:44:25.133Z
  • 영향 범위: BIM 18949 (team: exyte, user: mohammed.alshaikhli@exyte.net), facility 16862

Root Cause Summary#

BIM 18949의 SVF2 모델 파일에서 property database를 읽는 도중, object ID 759923에 접근을 시도했으나 유효 범위가 1~759922까지여서 Invalid object ID: 759923. Valid range is 1 to 759922. 오류가 발생했습니다. 이는 Autodesk Forge에서 변환된 SVF2 파일의 property database 내부에 자기 자신의 범위를 초과하는 잘못된 object ID 참조가 포함되어 있기 때문입니다. @cupix/forge-agents 라이브러리가 이 off-by-one 참조를 처리하지 못하고, 에러가 ForgeAgent.extract()RoomExtractorProcessChildProcessManagerBaseService로 전파되면서 room extraction이 실패했습니다.

Technical Analysis#

Code Path#

  • Entry point: base-service.ts:107checkingQueue에서 SQS 메시지를 수신하고 runByMessages를 호출
  • Message processing: base-service.ts:170runByMessage에서 BIM ID 18949에 대해 RoomService.run() 호출
  • Room extraction: room-service.ts:187runRoomExtractor에서 RoomExtractManager.execute() 호출
  • Child process delegation: room-extract.manager.ts:29ChildProcessManager.execute()로 child process에 작업 위임
  • SVF2 extraction: room-extractor.process.ts:40 — child process에서 ForgeAgent.extract() 호출
  • Failure point: room-extractor.process.ts:52ForgeAgent.extract() 결과에 Error가 있고, FORGE_SOURCE_INVALID_MANIFEST가 아니므로 "Failed to get rooms from svf2" throw

SVF2 extraction을 시도하는 코드:

typescript
// room-extractor.process.ts:40-52
if (params.formatType === 'svf2') {
    const result = await ForgeAgent.extract(params.apiConfig, params.urn, {
        extractRoom: true,
        extractMeta: true,
        region: params.region
    });

    if (result.Error == undefined) {
        extract = result;
    } else if (result.Error === ForgeAgentErrorCode.FORGE_SOURCE_INVALID_MANIFEST) {
        this.log('RoomExtractorProcess::execute - svf2 manifest is invalid, try svf1 process');
        extract = await RoomExtractor.room_extract(params.token, params.urn);
    } else {
        throw new Error('Failed to get rooms from svf2');  // 여기서 throw
    }
}

ForgeAgent.extract()FORGE_SOURCE_INVALID_MANIFEST 이외의 에러 코드를 반환하면 SVF1 fallback 없이 바로 예외를 throw합니다. property database의 invalid object ID 에러는 이 fallback 조건에 해당하지 않아 처리되지 못했습니다.

에러가 child process에서 parent로 전파되는 경로:

typescript
// base.process.ts:102-107
try {
    const result = await this.processMessage(message.type, data);
    this.sendSuccess(message.id, result);
} catch (error) {
    this.sendError(message.id, error);  // child process → parent로 에러 전송
}
typescript
// child-process.manager.ts:178-182
if (response.success) {
    pending.resolve(response.data);
} else {
    pending.reject(new Error(response.error || 'Unknown error'));  // parent에서 Error 재생성
}

최종 에러 처리:

typescript
// base-service.ts:290-311
private handlingMessageErrors = async (error: any): Promise<void> => {
    const errorAndMessage = {
        error: error,
        sqsMessage: {}
    };
    // ... SQS 메시지 삭제 및 에러 상태 업데이트 ...
    logger.error('BaseService::handlingMessageErrors | Error and message object - %s',
                 JSON.stringify(errorAndMessage));
};

Log Evidence#

사용한 Datadog 쿼리:

text
service:cupixworks-any-room-agent status:error @environment:production "Failed to get properties and children"
Time: 2026-04-09T05:44:25Z to 2026-04-09T07:14:25Z
text
service:cupixworks-any-room-agent @environment:production
Time: 2026-04-09T06:44:20Z to 2026-04-09T06:44:30Z (10초 window, all levels)
text
service:(cupixworks-api OR cupixworks-worker) (18949 OR "exyte") @environment:production
Time: 2026-04-09T06:39:25Z to 2026-04-09T06:49:25Z

에러 체인 타임라인 (모두 동일 호스트 ip-10-1-39-24.us-west-2.compute.internal):

text
06:44:25.132Z [error] Failed to get properties and children: Invalid object ID: 759923. Valid range is 1 to 759922.
06:44:25.132Z [error] Failed to get node: Failed to get properties and children
06:44:25.132Z [error] Failed to traverse nodes: Failed to get properties and children
06:44:25.133Z [error] Failed to use property database: Failed to get properties and children
06:44:25.133Z [error] ForgeAgents - Error: { code: 1, message: Failed to get properties and children }
06:44:25.136Z [error] Failed to get rooms from svf2 (session: b86ea29031b1c6d6458400c5946b020e97d50de9, bim.id: 18949, team: exyte)
06:44:25.138Z [warn]  Failed to get rooms from svf2
06:44:25.138Z [info]  AwsQueueManager::deleteMessage | begin
06:44:25.168Z [info]  AwsQueueManager::deleteMessage | end - message id: 1cc77d38-fb8b-4272-bbf9-13fe1fedeb7b
06:44:25.413Z [error] BaseService::handlingMessageErrors | Error and message object - {"error":"undefined response","sqsMessage":{"MessageId":"1cc77d38-fb8b-4272-bbf9-13fe1fedeb7b","Attributes":{"ApproximateReceiveCount":"1"}}}
06:44:25.948Z [info]  BaseService::runByMessage | id: 18948 (다음 BIM 처리로 이동)

API 서비스에서 BIM 18949 관련 정상 활동이 확인됨 (모두 HTTP 200):

text
06:41:50.059Z [200] PUT /api/v1/bims/18949/meta (update_meta)
06:41:50.313Z Updated last BIM revision for BIM 18949
06:44:11.074Z [200] GET /api/v1/bims/18949 (show)
06:44:12.149Z [200] PUT /api/v1/bims/18949 (update)
06:44:26.158Z [200] PUT /api/v1/bims/18949 (update) -- 에러 직후 상태 업데이트

주요 속성:

속성
BIM ID 18949
Facility ID 16862
Team exyte (id: 783)
User 39592 (mohammed.alshaikhli@exyte.net)
Session b86ea29031b1c6d6458400c5946b020e97d50de9
SQS Message ID 1cc77d38-fb8b-4272-bbf9-13fe1fedeb7b
Host ip-10-1-39-24.us-west-2.compute.internal
Invalid Object ID 759923 (valid range: 1-759922)

Fix Recommendation#

즉시 조치 (Critical)#

  • room-extractor.process.ts:44-52: ForgeAgent.extract() 에러 처리에서 property database 관련 에러(예: Invalid object ID)가 발생하면 SVF1 fallback을 시도하도록 조건을 확장. 현재는 FORGE_SOURCE_INVALID_MANIFEST만 fallback 조건이지만, property database 읽기 실패도 SVF2 파일 자체의 문제이므로 SVF1으로 재시도하는 것이 합리적입니다.

단기 개선 (1주 이내)#

  • ForgeAgent.extract()의 에러 코드 체계를 확인하고, property database 관련 에러에 대한 전용 에러 코드가 있는지 조사. 없다면 @cupix/forge-agents 라이브러리에 해당 에러 코드를 추가하여 room-agent에서 세분화된 에러 처리가 가능하도록 개선.
  • 에러 로그에 BIM ID, URN 등 컨텍스트 정보를 포함시켜 디버깅을 용이하게 개선 (현재 초기 에러 로그 4건에는 session/bim 컨텍스트가 누락됨).

장기 개선 (재발 방지)#

  • Autodesk Forge SVF2 변환 파일의 property database 무결성을 사전 검증하는 단계 추가. 변환 완료 후 object ID 범위 검증을 수행하여 잘못된 파일은 재변환을 요청하거나 SVF1으로 자동 전환.
  • ForgeAgent.extract() 에러 처리 전략을 화이트리스트(특정 에러만 fallback)에서 블랙리스트(특정 에러만 즉시 실패, 나머지는 fallback 시도) 방식으로 변경 검토. SVF2 관련 에러 대부분은 SVF1 fallback으로 복구 가능할 수 있음.

Monitoring#

  • Room agent에서 SVF2 extraction 실패율 모니터링:
text
service:cupixworks-any-room-agent "Failed to get rooms from svf2" @environment:production
  • Property database 관련 에러 추적:
text
service:cupixworks-any-room-agent "Failed to use property database" @environment:production
  • Invalid object ID 에러 빈도 추적:
text
service:cupixworks-any-room-agent "Invalid object ID" @environment:production

Risk Assessment#

  • Risk level: low — 단일 BIM 파일(18949)에 대한 1회성 발생이며, 다른 BIM 처리에는 영향 없음
  • 예상 복잡도: standard — SVF1 fallback 조건 확장은 room-extractor.process.ts의 조건문 수정으로 구현 가능하나, @cupix/forge-agents 에러 코드 체계 확인이 필요