3.0 KiB
3.0 KiB
id, status
| id | status |
|---|---|
| ac-0027 | active |
Strategy-instance별 state identity와 version 격리
Criterion
trex-core는 각 slot의 strategy state를 data[strategy_instance_id] = {version, data, updated_at} 형태의 하나의 slot-scoped map으로 저장해야 한다. strategy_instance_id는 entry의 저장·조회·CAS key이며 entry에 별도의 strategy_id metadata를 저장해서는 안 된다. strategy_state.set은 {slot_id, strategy_instance_id, expected_version, data}를 받아 required non-empty string instance ID, active slot, opaque data size limit와 해당 entry의 version만 검증해야 한다. Entry가 없을 때 expected_version=0인 성공 write는 version 1 entry를 만들고, 이후 성공 write는 그 entry의 version만 1 증가시켜야 한다. 같은 slot의 서로 다른 instance entry와 version은 서로 격리되어야 하며, 서로 다른 entry에 대한 동시 성공 write는 어느 entry도 유실하지 않고 모두 보존해야 한다. 기존 state에 대한 strategy_id → strategy_instance_id mapping·backfill·귀속 정책과 core-side instance registry를 도입해서는 안 된다.
Verification
- 저장 형태: 한 slot에 instance A와 B를 저장하면 persistence round-trip 결과가 A·B key 아래 각각
{version, data, updated_at}를 보존하고 entry 내부에strategy_id,occupancy_seq또는 다른 identity metadata를 포함하지 않는다. Innerdata는 입력한 opaque string과 byte 단위로 동일해야 한다. - Version 조건: 새 A에
expected_version=0write는 A version 1을 만들고 후속 성공 write는 A만 증가시킨다. B의 version과 data는 변하지 않는다. 존재하는 A에expected_version=0또는 stale version을 보내면version_conflict로 거부하고 A·B 어느 entry도 변경하지 않는다. - 동시성 조건: 같은 slot의 A와 B에 동시에 유효한 write를 수행하면 둘 다 성공하고 두 entry의 새 data와 version이 모두 남아야 한다. 같은 entry에 경쟁하는 write는 version CAS에 따라 최대 한 건만 해당 expected version에서 성공하며 lost update가 없어야 한다.
- Identity 조건: 같은 전략 종류의 서로 다른
strategy_instance_id는 독립 entry를 사용하고 다른 ID의 state를 상속하지 않는다. 재시작 뒤 같은 ID를 사용하는 owner는 기존 entry를 이어 사용한다. 누락·비문자열·빈 ID write는 non-retryablebad_request로 거부되어 map을 만들거나 변경하지 않는다. - 비변경 조건: active-slot gate와 data size limit를 우회하지 않으며
slot_inactive·state_too_large·bad_request:*거부가 다른 entry를 변경하지 않는다.correlation_id재사용만으로 write가 deduplicate되어서는 안 된다. - 검사 방법: InMemory/PostgreSQL 공통 contract suite, 실제 PostgreSQL row-lock 또는 동등한 원자적 update fixture, migration 및 restart round-trip에서 create/update/conflict, same-type instance 격리, A·B 동시 write, same-entry 경쟁, malformed ID와 다른 entry 무변경을 검증한다.