---
status: AISFOR_NETWORK_WORKER_STREAMING_HASH_STAGED_NOT_ACTIVATED
observed_at: 2026-08-09T15:12:50+09:00
production_process_restarted: false
production_changed: false
current_continuity: false
---

# AISFOR storage worker streaming hash 메모리 fence

## 발견

최종 운영 상태 확인 중 AISFOR Node process의 private memory가 약 2.0 GiB까지 상승하고 PM2 event-loop latency p95가 약 8.7초로 관측됐다. V8 heap은 약 55 MiB였고 private memory는 뒤이어 약 366 MiB까지 내려와, 지속 heap leak보다는 반복적인 대형 Buffer 할당과 회수가 의심됐다.

코드 대조 결과 1분 주기 network worker가 기본값으로 최대 250개 encrypted chunk와 80개 원본 파일을 순차 검사하면서 각 파일을 `fs.readFileSync()`로 통째로 Buffer에 올려 SHA-256을 계산했다. 파일 크기가 큰 경우 메모리 spike와 synchronous event-loop block을 일으킬 수 있는 경로다.

## 보완

`E:\aisfor\services\distributedStorageService.js`의 반복 검사 두 경로를 단 하나의 256 KiB Buffer를 재사용하는 비동기 `FileHandle.read()` SHA-256으로 변경했다. 첫 `createReadStream()` 보완을 운영 관측했을 때 최대 2.29 GiB 파일을 읽는 동안 새 chunk Buffer 할당과 외부 메모리 회수가 경합해 private memory가 다시 약 4.5 GiB까지 올라가는 것을 확인해 재사용 buffer로 강화했다.

- chunk cache 무결성 검사
- 원본 파일 무결성/복구 판단
- 기존 순차 처리와 hash 결과 규약 유지
- 파일 부재/stream 오류는 빈 hash로 fail-closed

64 MiB 합성 파일 자체시험에서 SHA-256 일치, event-loop yield, 누락 파일 fail-closed, 임시 데이터 삭제를 확인했다. 읽기 전용 production 진단에서는 최근 worker 대상에 최대 2.29 GiB 파일이 있음을 identifier 없이 확인했다. 서비스 파일과 시험 파일은 `node --check`를 통과했다.

## 경계

운영 AISFOR process는 재시작하지 않았으므로 이 보완은 아직 활성화되지 않았다. 기존 서비스 traffic과 DB는 변경하지 않았다. 다음 승인된 maintenance restart 뒤 worker duration, private memory, event-loop p95를 다시 관측해야 효과를 최종 판정할 수 있다.

증거: `evidence/network-worker-streaming-hash-stage-redacted.json`
