동기화 규칙과 한계
신규 · 변경 · 유지 · 삭제 · 충돌 판정표, 전송 순서, 동시 실행, 미지원 기능(주기 동기화 등)
판정표
한 번의 동기화는 원격 매니페스트를 읽어 파일마다 아래처럼 판정. 화면의 미리보기와 실제 동기화가 같은 판정 함수를 사용하므로, 미리보기 결과대로 실행.
| 판정 | 조건 | 동작 |
|---|---|---|
| 신규 | 매니페스트에 있고, 이 데이터셋에 그 file_id 로 내려받은 파일이 없음 | 내려받음 |
| 변경 | file_id 는 같고 sha256 이 다름(원격에 sha256 이 없어도 변경) | 다시 내려받아 같은 행을 교체(파일 id 유지) |
| 유지 | file_id 와 sha256 이 같음 | 변경하지 않음 |
| 삭제 | 동기화로 내려받은 파일인데 매니페스트에서 제거됨 | 저장소 객체와 행을 삭제 |
| 충돌 | 파일 이름이 직접 업로드한 파일과 중복됨 / 정리한 이름이 비어 있거나 매니페스트 내에서 중복됨 | 건너뛰고 경고를 기록 |
- 모든 쓰기는 "원격
file_id에서 온 파일" 에만 적용. 직접 업로드한 파일은 판정 대상이 아님. - 체크섬은 저장소가 실제로 기록한 바이트로 계산해 매니페스트와 비교. 전송 중 잘린 파일이 정상 파일로 통과하지 않음. 일치하지 않으면 그 파일만 폐기하고 경고 기록.
- 원격의 파일별
meta와 원래 파일 이름은 플랫폼 파일의meta.source에 보관. - 같은
file_id의 이름만 변경되고 내용(sha256)이 같으면 "유지". 플랫폼의 파일 이름은 변경되지 않음.
전송 순서
어노테이션 파일은 마지막에 내려받음. 어노테이션 검증은 데이터셋에 이미 있는 이미지와 짝을 대조. 매니페스트 순서(0001.json < 0001.png)대로 내려받으면 짝 일치율 0%. 실행 끝에 어노테이션을 한 번 더 검증해, 이미지가 이후 실행에서 추가된 경우에도 짝을 대조.
실행 제어
| 상황 | 동작 |
|---|---|
| 같은 데이터셋의 동기화가 실행 중인 상태에서 다시 시작 | 409 (a sync is already running for this dataset) |
| 취소 | 현재 내려받는 파일까지 반영하고 중단. 아직 수행하지 않은 삭제와 manifest.json 재기록은 건너뜀. 다음 동기화는 이미 내려받은 파일을 체크섬으로 확인해 건너뜀. |
| 소스가 비활성 | 연결은 유지, 새 동기화만 차단(409) |
| 동기화 중 파일 업로드 · 삭제 · 재검증, 연결 변경 · 해제 | 409 로 거부. 동기화가 끝나거나 취소된 뒤 다시 시도. |
| 매니페스트를 읽지 못함 | 실행 전체가 실패(연결 불가, 오류 상태 코드, 형식 오류, file_id · filename 이 없는 항목) |
| 서버 재시작 | 실행 중이던 동기화가 RUNNING · PENDING 으로 남아 새 동기화가 409 로 차단될 수 있음. 그 실행을 취소 한 뒤 다시 동기화하면, 이미 내려받은 파일은 체크섬으로 확인해 건너뜀. |
| 여러 데이터셋 동시 동기화 | 서버 전체에서 기본 2개까지(GEO_MLOPS_DATASET_SYNC_MAX_CONCURRENCY). 나머지는 대기. |
| 경고 | 실행 하나에 200건까지 기록 |
API 로 동기화를 시작하면 202 와 실행 행을 즉시 반환. 진행 상황은 GET /api/v1/datasets/{id}/syncs/{sync_id} 나 실행 목록을 다시 읽어 확인, 취소는 POST /api/v1/datasets/{id}/syncs/{sync_id}:cancel. status 는 PENDING → RUNNING → SUCCEEDED · FAILED · CANCELED 순.
curl -b cookies.txt -H "X-Tenant: DEMO" -X POST \
"http://localhost:10000/api/v1/datasets/<데이터셋 id>/syncs"
# 도는 중에 한 번 더 부르면:
# {"error_id":"…","code":"conflict","message":"a sync is already running for this dataset","detail":null}
서버 설정
| 환경 변수 | 기본값 | 설명 |
|---|---|---|
GEO_MLOPS_DATASET_SYNC_MAX_CONCURRENCY | 2 | 동시에 동기화하는 데이터셋 수 |
GEO_MLOPS_DATASET_SYNC_HTTP_TIMEOUT | 30 | 원격 호출 한 번의 시간 제한(초). 파일 전체가 아니라 읽기 단위에 적용. |
GEO_MLOPS_DATASET_MAX_UPLOAD_BYTES | 2 GiB | 파일 하나의 상한(업로드와 같은 값) |
미지원 기능
| 미지원 기능 | 대안 |
|---|---|
| 예약·주기 동기화 | 수동 버튼 또는 외부 스케줄러에서 API 호출 |
updated_at 기준의 동기화 생략 | 매번 매니페스트를 읽고 sha256 으로 비교(변경이 없으면 내려받는 파일 0개) |
Range 이어받기 | 실패한 파일은 다음 동기화에서 전체를 다시 내려받음 |
| 플랫폼 → DataOps 역방향 업로드(Push) | 없음. 이 연동은 Pull 전용. |
| 어노테이션 형식·클래스 표 해석 | 매니페스트의 annotation_format · classes 는 기록만 함. 라벨은 내려받은 어노테이션 파일(COCO · LabelMe · VOC)을 검증기가 직접 읽음. |