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#
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() → RoomExtractorProcess → ChildProcessManager → BaseService로 전파되면서 room extraction이 실패했습니다.
Technical Analysis#
Code Path#
- Entry point:
base-service.ts:107—checkingQueue에서 SQS 메시지를 수신하고runByMessages를 호출 - Message processing:
base-service.ts:170—runByMessage에서 BIM ID 18949에 대해RoomService.run()호출 - Room extraction:
room-service.ts:187—runRoomExtractor에서RoomExtractManager.execute()호출 - Child process delegation:
room-extract.manager.ts:29—ChildProcessManager.execute()로 child process에 작업 위임 - SVF2 extraction:
room-extractor.process.ts:40— child process에서ForgeAgent.extract()호출 - Failure point:
room-extractor.process.ts:52—ForgeAgent.extract()결과에 Error가 있고,FORGE_SOURCE_INVALID_MANIFEST가 아니므로"Failed to get rooms from svf2"throw
SVF2 extraction을 시도하는 코드:
// 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로 전파되는 경로:
// 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로 에러 전송
}
// child-process.manager.ts:178-182
if (response.success) {
pending.resolve(response.data);
} else {
pending.reject(new Error(response.error || 'Unknown error')); // parent에서 Error 재생성
}
최종 에러 처리:
// 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 쿼리:
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
service:cupixworks-any-room-agent @environment:production
Time: 2026-04-09T06:44:20Z to 2026-04-09T06:44:30Z (10초 window, all levels)
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):
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):
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 실패율 모니터링:
service:cupixworks-any-room-agent "Failed to get rooms from svf2" @environment:production
- Property database 관련 에러 추적:
service:cupixworks-any-room-agent "Failed to use property database" @environment:production
- Invalid object ID 에러 빈도 추적:
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에러 코드 체계 확인이 필요