[DR 통합] 복제·복구 오류 수정과 운영자 복구 경로 개선 - #1022
Merged
dhslove merged 67 commits intoSep 12, 2026
Merged
Conversation
검증 근거와 제한 시간을 DB에 보존하고 KVM guest-ping 응답 이후에만 테스트를 성공 처리한다. QGA 미응답 실패와 정리 경합을 처리하고 검증 모드 및 결과를 UI에 표시한다. Refs: ablecloud-team#963
This was referenced Sep 12, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
최종 병합·이슈 관리 상태
병합 완료: Cloud #1022 → ablestack-europa (
4c42a079caf8), qemu #56 → main (9184ecd8ef16). 기존 오류 수정과 강제 삭제/수동 정리 핵심 구현을 포함한다.사용자 요청에 따라 연결 개별 완료 이슈는 종료하고, 아래 잔여 범위는 별도 열린 이슈로 관리한다. 본문 아래의 과거 ‘Draft/충돌/병합 대기/이슈 OPEN 유지’ 설명은 당시 작업 이력이며 현재 상태가 아니다.
검증은 각 문서에 명시된 모듈/UI/실환경 범위로 한정한다. 이슈 종료가 미실행 전체 릴리즈 시험의 PASS를 의미하지 않는다.
구현·검증 및 병합 과정의 상세 이력
#1020 핵심 구현·배포·UI 검증 완료 — 2026-09-11
기존 #1021/#1018까지 보존한 양쪽
codex/fix-1020-reverse-progress에서 구현하고 통합 브랜치codex/fix-1012-1013-dr-recovery에 fast-forward 반영했습니다. Cloudf492aa3317e27f331190f217b34721bdf1337030(구현377c17835e3), qemufe490da675e5a0d128eb0dda49e96799a5ae84b9(구현687cff4). 강제 푸시·upstream 병합은 하지 않았습니다.21878e31-6fc0-4e7c-9012-5a21527b589a, Failback945af7c9-cb5c-4a95-b79d-6b94ffb4676e. 19:42:52 KST UI/DB 모두 SUCCEEDED/completed/100%, 오류 없음. 수동 Resume/DB 수리 없이 후속 durable checkpoint315(요구186)를 확인했고 READY/ENABLED/RUNNING/HEALTHY로 복귀했습니다.코드 수준 설계 · 실행·검증 범위와 배포 근거
실제 qcow2 전체 UI failback 및 모든 물리 장애·migration·OS 조합을 이번에 새로 검증한 것으로 계산하지 않습니다. Cloud PR #1022의 기존 충돌은 별도 병합 작업으로 남깁니다. 이슈는 upstream 병합 완료와 구분하여 열어 둡니다.
Nutanix 제외 잔여 개발/보완 18건(Cloud17+qemu1), 핵심 구현·명시 범위 시험 완료/병합·잔여 검증 37건입니다. 다음 DR P2 #962 확장 + #1006(기존 최소 강제 삭제 재개발 없이 수동·잔여 자원 정리/보존 정책). 이후 #951→#952→#953, #1001→#986, #973→#966→#1019, #1028→#1027, #1033+#978+#1010+qemu#55, P3#955. Diplo #1029는 별도 P1입니다.
#1021 + #1018 핵심 구현·배포·UI 검증 완료 — 2026-09-11
기존 #954까지 보존한 양쪽
codex/fix-1021-1018-recovery-evidence에서 구현하고 통합 브랜치codex/fix-1012-1013-dr-recovery로 fast-forward 반영했습니다. Cloudb822ca532da(구현5cf94b79cd1), qemuf379fe2(구현e5c6a0a).2fd79125-1598-4498-86d7-7811fecaf701, Failback Run93a89a1c-5be7-411a-a80a-d8fd6b39b49e모두 UI/DB SUCCEEDED. 18:31:26 KST 최종 완료.상세 설계 · 검증 범위와 결과
qcow2 전체 UI failback 체인 및 모든 물리 장애/배치/OS 조합을 이번에 새로 완료했다고 주장하지 않습니다. 시험 중 오래된 역복제 진행률/조기 완료 안내를 재현하여 기존 #1020에 증거를 추가했습니다. 해당 UI 오류는 별도 후속이며 이번 기능 PASS와 구분합니다. upstream 병합은 아직 하지 않았고 Cloud PR #1022의 기존 충돌은 별도 통합 검증 대상으로 남깁니다.
Nutanix 제외 잔여 개발/보완 19건(Cloud18+qemu1), 핵심 구현·시험 완료/병합·잔여 검증 36건. 다음 DR P2 #1020 → #962 확장 + #1006, Diplo #1029 별도 P1입니다.
#980 구현·배포·UI 검증 완료 — 2026-09-11
codex/fix-980-cleanup-resume-idempotency, 기준 [DR][P1] 전체 재동기화 Run이 요청 FULL_RESEED 영속화 전에 성공하는 경합 수정 #96743330d38e3→ 구현65d5f3798a→ 검증 기록c117226bc8. 기존 변경을 보존하여 통합 브랜치/PR #1022로 fast-forward 반영했다.코드 수준 설계 · 실행 Run/증거/제한 상세
upstream 병합은 아직 하지 않았다. 다음 P1은 #954, Diplo #1029는 별도 트랙. Nutanix 제외 잔여 개발/보완22건, 구현·핵심 검증/병합·잔여 시험33건으로 Epic #950을 갱신한다.
최신 반영: #1034 + #962 최소 잔여 (2026-09-11)
손상된 과거 completed evidence가 새 체크포인트 승인까지 막던 경로를 보완했다. Agent의 제한된 후보 보존, broker의 실패 전달/오래된 호스트 fallback 방지, Cloud CONFLICT boundary 및 target COMMITTED/동일 identity/digest 확인 후 ACK를 포함한다. 레거시 소스의 빈 active_side를 호환하며 Cloud SOURCE 권한과 TARGET/lifecycle 경계는 유지한다.
16b3e03b34, qemufb6df9b. 안전 브랜치codex/fix-1034-962-ui-recovery; 기존 PR HEAD에서 fast-forward만 수행했다.10d7d270-0c5b-4be1-8b2a-36cc7340eb23SUCCEEDED, 새 FULL_SEED checkpoint 1924(디스크 2개 COMMITTED proof 검증), 후속 증분 1925 자동 완료. 최종 요청 뒤 서비스 재시작/상태 보정/DB repair/수동 ACK 없음.상세: 설계, 검증 기록.
남은 우선순위: P1 #967 → #980 → #954, 별도 Diplo #1029. #962 확장 및 증거/보존/자원 경계/운영 지원은 P2, #955 P3. Nutanix 제외 관리 대기열은 잔여 24건 / 구현·핵심 시험 완료 및 병합·잔여 검증 31건. 기존 PR 충돌 해소와 최종 병합 검증은 별도이며 이번에 병합하지 않았다.
연동 PR: ablecloud-team/ablestack-qemu-exec-tools#56
현재 GitHub 병합 판정: CONFLICTING. 최신 ablestack-europa와 충돌이 확인됐으며, 기존 검증 HEAD를 보존한 상태에서 충돌 해결과 회귀 검증을 다음 통합 작업으로 수행해야 합니다.
저장소별 변경
Cloud 변경: 기존 100파일/39커밋에 이번 설계·검증 문서 2파일/1커밋을 추가했습니다. 비교 시 upstream 전용 95개 커밋이 있어 아직 최신 upstream 통합 전입니다. PR #983 NIC 드라이버 수정은 기존 브랜치에 통합되어 중복 구현하지 않았습니다. 관리/Agent/UI/schema 변경이 포함되며 관리 webapp 배포는 WEB-INF 보존 원칙을 따릅니다.
목적과 관리 범위
DR 계획의 설정·복제·테스트·재해 전환·페일백에서 발견한 오류 수정과 검증 기록을 누적 관리합니다. 원본 단절 중에도 대상의 유효 체크포인트로 복구할 수 있고, 실패 후 사용자가 정리·강제 등록 삭제를 수행할 수 있도록 개선합니다.
에픽: #950. 현재 검증 브랜치
codex/fix-1012-1013-dr-recovery를 그대로 PR head로 사용하며 이후 관련 후속 변경과 검증 결과를 이 PR에서 추적합니다. 이 PR은 초안이며 이슈를 자동 종료하지 않습니다.진행 상황
위 체크는 구현 및 각 문서에 명시된 시험 범위의 완료이며 모든 경로 또는 이슈 전체 수용 조건 완료를 뜻하지 않습니다. 특히 #962의 원격 orphan 추적·정리 전체는 미완료입니다.
검증 근거
상세:
docs/ftctl/issue-1012-1013-validation.md및 각 이슈별 설계·검증 문서. 과거 배포 중 보정/재시작이 필요했던 시도와 최종 무보정 성공을 문서에서 구분했습니다. 현재 PR 생성은 최신 upstream 통합 후 재검증이나 새 CI 성공을 의미하지 않습니다.후속 작업 대기열 — 2026-09-11 갱신
최신 전체 상태/우선순위는 Cloud 에픽 #950 본문을 따른다. 다음은 #1034 + #962 최소 복구 출구 → #967 → #980(P1 상향) → #954(P1 상향). 이미 구현된 #1023/#1030~#1032는 재개발하지 않는다. Diplo #1029와 PR 충돌 해소·최종 병합 검증은 별도 트랙이다. Nutanix #956~#959는 이번 대기열에서 제외한다.
#1007 / #972 통합 반영 (2026-09-11)
codex/fix-1007-972-scheduler-resume브랜치 생성, force 없이 기존 PR 브랜치에 fast-forward 반영Cloud commit
1269c4066b, qemu commit091a8da. 상세 설계·검증:docs/ftctl/issue-1007-972-design.md,docs/ftctl/issue-1007-972-validation.md.원본 13 관리 서버 DB pool 고갈로 첫 qcow2 Pause가 실패한 별도 문제는 P1 #1023으로 등록했습니다. 관리 서비스 임시 복구 후 본 변경을 시험했으며, 그 수동 복구를 무개입 장애 복원 PASS로 계산하지 않습니다. 기존 상태 표시 #973도 후속 관리합니다.
이번 PASS는 프로세스 재시작/소실과 UI 제어·체크포인트 증분에 대한 결과입니다. 장시간 물리 host reboot, management/Agent 각각의 장애 주입, 새 게스트 변경 데이터 해시 비교 및 전체 재해 전환 UI 체인은 이번에 추가 실행하지 않았습니다. 기존 lifecycle 계약 회귀를 통과했으며 VMware 양단 QGA 제외를 유지합니다. 잔여 수용 조건과 최신 upstream 통합 검증 때문에 이슈 자동 종료 및 PR 병합은 수행하지 않습니다.
#1023 공통 DB 연결 누수 수정 (2026-09-11)
codex/fix-1023-db-connection-lifecycle에서 기존 HEAD1269c4066b를 보존하고c558c69f02를 fast-forward 반영했습니다. qemu 변경은 없습니다.설계/검증:
docs/ftctl/issue-1023-design.md,docs/ftctl/issue-1023-validation.md. API 로컬 의존 버전을 맞춘 후 변경 모듈을 빌드했으며 전체 Cloud 빌드는 실행하지 않았습니다. DB pool 크기나 HA 판정/펜싱 정책을 바꾸지 않았습니다.추가 감사: #1027 통합 JAR Hikari NOPLogger, #1028 invalid connection 참조 유실은 별도 후속입니다. 사용자 요청으로 Diplo P1 #1029를 등록했고 최신 Diplo에도 동일 HA 경로를 확인했습니다. Diplo에는 아직 적용·배포하지 않았습니다.
UI 검증 중 별도 P1 #1030을 발견했습니다. qcow2의 살아 있는 worker에서 Resume 후 다음 candidate producer Run이 불일치해 재시작을 반복합니다. 첫 전체 재동기화 Run의 SUCCEEDED도 실제 복제 복구를 의미하지 않았습니다. 기존 durable1554는 보존됐으며 해당 scheduler만 종료한 뒤 새 UI 전체 재동기화로 운영자 복구를 진행했습니다. 이 결과를 #1023 DB 반환 PASS와 분리해 기록합니다. source-unreachable 재해 전환 및 VMware 양단 QGA 제외 정책은 변경하지 않았습니다.
#1030 복구 결과 및 검증 한계
해당 scheduler만 수동 종료하고 UI 전체 재동기화 Run
562a81d3-1ce4-4e6c-a0a1-90d64a6fb751를 실행한 결과 checkpoint1557이 FULL_SEED / READY로 확정됐다. UI 동기화 이력에서 원본 시각09:40:44, 대상 준비09:42:02, 읽기/쓰기/전송150GiB를 확인했고 runtime도 READY / HEALTHY / IDLE, pending 없음으로 확인했다. 증거는qcow2-recovery.json이다. 이는 운영자 복구 성공이며 #1030 수정 완료 또는 무개입 자동 복원 PASS가 아니다.반복 오류의 원인은 기존 worker의 producerRunUuid와 새 Resume가 기록한 profile Run의 수명이 다른데 candidate 생성에서 이를 혼용하는 경로다. 이전 #1007/#972의 worker 소실 후 Resume 시험은 새 worker와 profile ID가 일치하므로 이 결함을 검출하지 못했다. 살아 있는 worker의 Pause/Resume 후 다음 변경 체크포인트까지의 검증이 누락됐다. 후속 #1030에서는 제어 작업 ID와 복제 생산자 ID를 분리하고, 기존 worker 유지/소실 각각에서 변경 데이터 확정 및 실패 후 UI 복구를 수용 기준으로 검증해야 한다. 작업 이력 SUCCEEDED만으로 복제 완료를 판단하지 않는다.
2026-09-11: #1030/#1031/#1032 메뉴 및 호스트 이동 복구 보완
Pause/Resume의 제어 Run이 실제 체크포인트 producer를 덮어쓰거나, 정상 단일 LIVE scheduler를 미정리 작업으로 판정해 메뉴를 차단하는 문제를 수정했습니다. 원본 VM 이동 후에는 현재 배치를 다시 확인하며, 이전 호스트의 원본 부재 상태보다 정상 작업자를 선택합니다. VM migration 제한은 추가하지 않았습니다.
기존 손상된 completed snapshot은 시험 중 수동으로 실제 증거를 복원해야 했습니다. 이를 UI-only 성공으로 계산하지 않으며 #1034(P1)에서 처리합니다. 기존 관리 패키지의 누락 의존성과 배포 사전 점검은 #1033(P2)입니다. 상세 설계와 실패/성공 기록:
docs/ftctl/issue-1030-design.md,docs/ftctl/issue-1030-validation.md.#967 전체 재동기화 조기 성공 수정
대상 VM 준비 완료 callback이 새 FULL_RESEED의 실제 완료를 우회하여 Run을 성공 처리하던 경로를 제거했다. 요청별 checkpoint 검증은 기존 #1013/#1030 구현을 재사용한다.
안전 브랜치
codex/fix-967-full-reseed-completion, 구현281f4a96a7.수정 전 callback 재현 실패, 수정 후 DR 모듈 461 tests PASS. qemu lifecycle 71 / tombstone / checkpoint 13 PASS.
관리 서버 13/22/31/32에 변경 클래스 배포 및 해시·HTTP·서비스 확인.
UI qcow2 요청 checkpoint 1931: durable 14:11:58 → Run 성공 14:12:47. RBD checkpoint 4689: durable 14:14:26 → Run 성공 14:14:59. 전송 중 ACCEPTED 유지 및 target COMMITTED proof 확인.
qemu/Agent/UI 코드 변경 없음. VMware 양단 QGA 제외 유지.
설계, 검증 기록과 범위.
[DR][P1] 전체 재동기화 Run이 요청 FULL_RESEED 영속화 전에 성공하는 경합 수정 #967 최종 자동 복귀: 수동 재개 없이 qcow2 1932 / RBD 4690 / VMware 258 CBT_INCREMENTAL, 모두 READY·HEALTHY·IDLE 및 동일 scheduler PID 확인.
#954 핵심 구현·배포·UI 검증 완료 — 2026-09-11
기존 #980까지 보존한
codex/fix-954-target-compute-sizing에서 구현c740c03069, 부분 편집 보존 수정6717ea73d7, 검증 기록2e3d3168643을 통합 브랜치/PR #1022로 fast-forward 반영했습니다. qemu 운영 소스 변경은 없습니다.코드 수준 설계 · UI 단계·해시·검증 범위
실제 기존 대상 VM resize/실행별 override는 #955입니다. 권한·quota 모든 조합 및 전체 failover/failback 체인을 이번에 새로 검증한 것으로 계산하지 않습니다. upstream 병합은 하지 않았으며 PR #1022의 기존 충돌은 별도 통합 작업으로 남아 있습니다.
Nutanix 제외 잔여 개발/보완 21건(Cloud20+qemu1), 핵심 구현·시험 완료/병합·잔여 검증 34건. 다음 DR P2 #1021→#1018, Diplo #1029 별도 P1입니다.
#962 확장 + #1006 수동 정리 핵심 구현 완료 (2026-09-11)
과거 불변 체크포인트를 사용자가 선택해 정리하고, 최신·참조·clone 사용 세트를 보존한다. 정책 저장은 자동 삭제를 시작하지 않는다. 강제 등록 해제 후에는 별도 독립 자원 기록을 UI에서 확인할 수 있다.
codex/fix-962-1006-checkpoint-cleanup; 기존 통합 head가 조상임을 확인하고 fast-forward 반영. 이전 개선 누락/강제 push 없음.bd5eba6905f, qemu headc9997b2; Cloud DR 모듈 477 tests, UI 5 tests/production build, qemu 정리 14 tests/DR lifecycle 71 cases/release tombstone/기존 checkpoint 13 tests PASS.Cloud 검증 기록 · qemu 검증 기록
기존 오류 수정·강제 삭제 범위 통합 병합 검증 (2026-09-12)
CI 상태와 제한
전체 pre-commit은 기존 upstream과 동일 blob/mode인 broken symlink, 실행 비트, noVNC 파일 및 문서 오류를 포함한다. #1044에 재현/비교 증거를 등록했다. 모든 lint 실패가 기존 문제라는 뜻은 아니며 이번 DR 문서·license/import 문제는 현재 PR에서 보완했다.
fork 토큰이 충돌 해소 라벨을 제거하지 못해 triage가 실패한 것은 #1043에 등록했다. 실제 merge conflict는 해결했고 stale 라벨을 제거했다.
PR push로 자동 시작되는 전체 Build/UI/RPM CI는 모듈 검증과 별도다. 그 완료를 전체 릴리즈 검증 PASS로 선행 주장하지 않는다. 이번 병합 작업 중 테스트 클러스터 재배포·UI 전체 체인은 반복하지 않았으며 기존 배포/UI 증거는 #962/#1006 검증 기록을 따른다.
잔여 범위
원격 잔여 자원 재정리/완료 추적(#962), 자동 GC 및 qcow2 복사 비용(#1006)은 여전히 미완료다. 신규 #1043/#1044는 CI P2 후속으로 관리. 다음 DR 구현 순서는 #951→#952→#953, 별도 P1은 Diplo #1029.