부모 에픽: #950. 관련: #968, #953. 우선순위 P1 — 쓰기 권한 보호.
문제
페일백에서는 최초 원본 사이트가 역방향 복제의 쓰기 대상이 된다. #968의 정방향 세대 검증 및 과거 worker 회수가 startReverseTargetExport()/stopReverseTargetExport()에는 적용되지 않아 원본 사이트의 이전 worker 장애·이동·복귀에도 동일 보호가 필요하다.
이는 코드에서 확인한 계약의 비대칭이다. 역방향 실환경 동시 쓰기나 손상을 재현한 것은 아니다.
코드 근거
Cloud DrPlanOwnedTransportServiceImpl 42c43766c1: 역방향 START는 reverseTargetExport=true, workerUuid=null로 원격 dispatch하며 generation 발급/과거 writer STOP/ownershipProtocol 검증이 없다. STOP도 workerUuid=null, profile=null로 dispatch하고 일반 성공 응답만 확인한다(L140). 실시간 worker 선정은 필요하지만 그것만으로 과거 worker export가 종료됐다는 증거가 되지 않는다.
qemu gate: managed tombstone이 없는 호스트는 legacy 명령을 수용하며, managed START가 있는 경우 무세대 명령은 거절한다. 따라서 역방향 계약은 보호 누락뿐 아니라 과거 상태에 따른 호환성 차단도 점검해야 한다.
구현 방향
- 정·역방향 공통 ownership orchestration을 사용하되 site/replica/device/direction/authority 식별자를 분리한다. 서로 다른 Cloud DB의 auto-increment 숫자를 그대로 비교 가능한 전역 세대로 간주하지 않는다.
- 원본 사이트 원격 Agent API까지 grant/revoke 세대와 구조화된 ACK를 전달·검증한다. 같은 요청의 재시도는 멱등하게 처리한다.
- 이전 역방향 writer 목록과 불확실 grant를 추적하며 새 writer 허용 전 종료 또는 검증된 fencing을 요구한다. worker는 live inventory에서 고르며 Plan에 영구 pin하지 않는다.
- 원격 Mold/Agent 단절, ACK 유실, 이전 worker 복귀 및 양 사이트 역할 재전환에서 stale START/STOP을 차단한다.
- 원본 운영 VM이 살아 있는 상태에서 원본 디스크를 복제 대상으로 열지 않도록 기존 failback authority/cutover 경계를 유지한다.
- 구버전 profile/tombstone 이관 및 정방향 이후 역방향, 재보호 이후 다시 정방향의 호환성을 정의한다.
완료 기준
일반 자원 가드 #953과 중복 구현하지 않으며, 정방향 장애 호스트 회수 후속 과제와 공통 구성요소를 공유한다. 단순히 모든 원격 호스트를 매번 필수 ACK 대상으로 늘리는 방식은 피한다.
부모 에픽: #950. 관련: #968, #953. 우선순위 P1 — 쓰기 권한 보호.
문제
페일백에서는 최초 원본 사이트가 역방향 복제의 쓰기 대상이 된다. #968의 정방향 세대 검증 및 과거 worker 회수가
startReverseTargetExport()/stopReverseTargetExport()에는 적용되지 않아 원본 사이트의 이전 worker 장애·이동·복귀에도 동일 보호가 필요하다.이는 코드에서 확인한 계약의 비대칭이다. 역방향 실환경 동시 쓰기나 손상을 재현한 것은 아니다.
코드 근거
Cloud DrPlanOwnedTransportServiceImpl 42c43766c1: 역방향 START는
reverseTargetExport=true, workerUuid=null로 원격 dispatch하며 generation 발급/과거 writer STOP/ownershipProtocol 검증이 없다. STOP도 workerUuid=null, profile=null로 dispatch하고 일반 성공 응답만 확인한다(L140). 실시간 worker 선정은 필요하지만 그것만으로 과거 worker export가 종료됐다는 증거가 되지 않는다.qemu gate: managed tombstone이 없는 호스트는 legacy 명령을 수용하며, managed START가 있는 경우 무세대 명령은 거절한다. 따라서 역방향 계약은 보호 누락뿐 아니라 과거 상태에 따른 호환성 차단도 점검해야 한다.
구현 방향
완료 기준
일반 자원 가드 #953과 중복 구현하지 않으며, 정방향 장애 호스트 회수 후속 과제와 공통 구성요소를 공유한다. 단순히 모든 원격 호스트를 매번 필수 ACK 대상으로 늘리는 방식은 피한다.