InfoGrab Docs

Geo blob 복제

요약

업로드, LFS 객체, CI 잡 아티팩트와 같은 blob은 Self-Service Framework를 사용하여 보조 사이트에 복제됩니다. 아래 다이어그램에서는 blob의 한 예시로 잡 아티팩트가 사용됩니다. PostgreSQL DB 행이 복제된 후 보조 사이트:

업로드, LFS 객체, CI 잡 아티팩트와 같은 blob은 Self-Service Framework를 사용하여 보조 사이트에 복제됩니다. 동기화 상태를 추적하기 위해, 각 모델은 해당 레지스트리 테이블을 가집니다. 예를 들어, UploadPostgreSQL Geo 추적 데이터베이스Geo::UploadRegistry를 가집니다.

서비스 간 blob 복제 해피 패스 워크플로우#

아래 다이어그램에서는 blob의 한 예시로 잡 아티팩트가 사용됩니다.

새 잡 아티팩트 복제#

기본 사이트:

Mermaid 다이어그램 (10줄)
소스 코드 보기
sequenceDiagram
  participant R as Runner
  participant P as Puma
  participant DB as PostgreSQL
  participant SsP as Secondary site PostgreSQL
  R->>P: Upload artifact
  P->>DB: Insert `ci_job_artifacts` row
  P->>DB: Insert `geo_events` row
  P->>DB: Insert `geo_event_log` row
  DB->>SsP: Replicate rows
  • Runner가 아티팩트를 업로드합니다
  • Pumaci_job_artifacts 행을 삽입합니다
  • Puma가 "ID 123을 가진 잡 아티팩트가 업데이트됨"과 같은 데이터를 가진 geo_events 행을 삽입합니다
  • Puma가 geo_events 행을 가리키는 geo_event_log 행을 삽입합니다 (SSF가 일부 레거시 로직 위에 구축되었기 때문)
  • PostgreSQL 스트리밍 복제가 읽기 복제본에 행을 삽입합니다

PostgreSQL DB 행이 복제된 후 보조 사이트:

Mermaid 다이어그램 (14줄)
소스 코드 보기
sequenceDiagram
  participant DB as PostgreSQL
  participant GLC as Geo Log Cursor
  participant R as Redis
  participant S as Sidekiq
  participant TDB as PostgreSQL Tracking DB
  participant PP as Primary site Puma
  GLC->>DB: Query `geo_event_log`
  GLC->>DB: Query `geo_events`
  GLC->>R: Enqueue `Geo::EventWorker`
  S->>R: Pick up `Geo::EventWorker`
  S->>TDB: Insert to `job_artifact_registry`, "starting sync"
  S->>PP: GET <primary site internal URL>/geo/retrieve/job_artifact/123
  S->>TDB: Update `job_artifact_registry`, "synced"
  • Geo Log Cursor 루프가 새 geo_event_log 행을 찾습니다
  • Geo Log Cursor가 geo_events 행을 처리합니다
    • Geo Log Cursor가 geo_events 행 데이터를 전달하여 Geo::EventWorker 잡을 큐에 넣습니다
  • SidekiqGeo::EventWorker 잡을 가져옵니다
    • Sidekiq이 존재하지 않기 때문에 PostgreSQL Geo 추적 데이터베이스job_artifact_registry 행을 삽입하고 "동기화 시작됨"으로 표시합니다
    • Sidekiq이 기본 Geo 사이트의 API 엔드포인트에 GET 요청을 하고 파일을 다운로드합니다
    • Sidekiq이 job_artifact_registry 행을 "동기화됨"과 "검증 대기 중"으로 표시합니다

기존 잡 아티팩트 백필#

  • 시스템 관리자에게 Geo 없이 기존 GitLab 사이트가 있습니다
  • 기존 CI 잡과 잡 아티팩트가 있습니다
  • 시스템 관리자가 새 GitLab 사이트를 설정하고 보조 Geo 사이트로 구성합니다

보조 사이트:

매분 실행되는 두 개의 크론 잡이 있습니다: Geo::Secondary::RegistryConsistencyWorkerGeo::RegistrySyncWorker. 아래 워크플로우는 이러한 라인을 따라 두 부분으로 나뉩니다.

Mermaid 다이어그램 (11줄)
소스 코드 보기
sequenceDiagram
  participant SC as Sidekiq-cron
  participant R as Redis
  participant S as Sidekiq
  participant DB as PostgreSQL
  participant TDB as PostgreSQL Tracking DB
  SC->>R: Enqueue `Geo::Secondary::RegistryConsistencyWorker`
  S->>R: Pick up `Geo::Secondary::RegistryConsistencyWorker`
  S->>DB: Query `ci_job_artifacts`
  S->>TDB: Query `job_artifact_registry`
  S->>TDB: Insert to `job_artifact_registry`
  • Sidekiq-cron이 매분 Geo::Secondary::RegistryConsistencyWorker 잡을 큐에 넣습니다. 활발하게 작업을 수행하는 한(행 생성 및 삭제), 이 잡은 즉시 자체적으로 다시 큐에 넣습니다. 이 잡은 동시에 여러 인스턴스가 실행되는 것을 방지하기 위해 배타적 임대를 사용합니다.
  • SidekiqGeo::Secondary::RegistryConsistencyWorker 잡을 가져옵니다
    • Sidekiq이 최대 10000개 행에 대해 ci_job_artifacts 테이블을 쿼리합니다
    • Sidekiq이 최대 10000개 행에 대해 job_artifact_registry 테이블을 쿼리합니다
    • Sidekiq이 기존 잡 아티팩트에 해당하는 PostgreSQL Geo 추적 데이터베이스job_artifact_registry 행을 삽입합니다
Mermaid 다이어그램 (15줄)
소스 코드 보기
sequenceDiagram
  participant SC as Sidekiq-cron
  participant R as Redis
  participant S as Sidekiq
  participant DB as PostgreSQL
  participant TDB as PostgreSQL Tracking DB
  participant PP as Primary site Puma
  SC->>R: Enqueue `Geo::RegistrySyncWorker`
  S->>R: Pick up `Geo::RegistrySyncWorker`
  S->>TDB: Query `*_registry` tables
  S->>R: Enqueue `Geo::EventWorker`s
  S->>R: Pick up `Geo::EventWorker`
  S->>TDB: Insert to `job_artifact_registry`, "starting sync"
  S->>PP: GET <primary site internal URL>/geo/retrieve/job_artifact/123
  S->>TDB: Update `job_artifact_registry`, "synced"
  • Sidekiq-cron이 매분 Geo::RegistrySyncWorker 잡을 큐에 넣습니다. 활발하게 작업을 수행하는 한, 이 잡은 동기화 잡을 예약하며 최대 한 시간 동안 루프합니다. 이 잡은 동시에 여러 인스턴스가 실행되는 것을 방지하기 위해 배타적 임대를 사용합니다.
  • SidekiqGeo::RegistrySyncWorker 잡을 가져옵니다
    • Sidekiq이 "동기화 시도 없음" 행에 대해 PostgreSQL Geo 추적 데이터베이스의 모든 registry 테이블을 쿼리합니다. 각 테이블의 행을 인터리브하고 메모리 내 큐에 추가합니다.
    • 이전 단계에서 1000개 미만의 행이 반환된 경우, Sidekiq이 "동기화 실패 및 재시도 준비됨" 행에 대해 모든 registry 테이블을 쿼리하고 그것들을 인터리브하여 메모리 내 큐에 추가합니다.
    • Sidekiq이 큐의 각 항목에 대해 "ID 123을 가진 잡 아티팩트가 업데이트됨"과 같은 인수로 Geo::EventWorker 잡을 큐에 넣고, 큐에 넣어진 Sidekiq 잡 ID를 추적합니다.
    • "최대 동시성 제한" 설정에 도달하면 Sidekiq은 Geo::EventWorker 잡 큐에 넣기를 중지합니다
    • Sidekiq은 더 이상 할 작업이 없을 때까지 이런 종류의 작업을 루프합니다
  • Sidekiq이 Geo::EventWorker 잡을 가져옵니다
    • Sidekiq이 job_artifact_registry 행을 "동기화 시작됨"으로 표시합니다
    • Sidekiq이 기본 Geo 사이트의 API 엔드포인트에 GET 요청을 하고 파일을 다운로드합니다
    • Sidekiq이 job_artifact_registry 행을 "동기화됨"과 "검증 대기 중"으로 표시합니다

새 잡 아티팩트 검증#

기본 사이트:

Mermaid 다이어그램 (20줄)
소스 코드 보기
sequenceDiagram
  participant Ru as Runner
  participant P as Puma
  participant DB as PostgreSQL
  participant SC as Sidekiq-cron
  participant Rd as Redis
  participant S as Sidekiq
  participant F as Filesystem
  Ru->>P: Upload artifact
  P->>DB: Insert `ci_job_artifacts`
  P->>DB: Insert `ci_job_artifact_states`
  SC->>Rd: Enqueue `Geo::VerificationCronWorker`
  S->>Rd: Pick up `Geo::VerificationCronWorker`
  S->>DB: Query `ci_job_artifact_states`
  S->>Rd: Enqueue `Geo::VerificationBatchWorker`
  S->>Rd: Pick up `Geo::VerificationBatchWorker`
  S->>DB: Query `ci_job_artifact_states`
  S->>DB: Update `ci_job_artifact_states` row, "started"
  S->>F: Checksum file
  S->>DB: Update `ci_job_artifact_states` row, "succeeded"
  • Runner가 아티팩트를 업로드합니다
  • Pumaci_job_artifacts 행을 생성합니다
  • Puma가 검증 상태를 저장하기 위해 ci_job_artifact_states 행을 생성합니다.
    • 행은 "검증 대기 중"으로 표시됩니다
  • Sidekiq-cron이 매분 Geo::VerificationCronWorker 잡을 큐에 넣습니다
  • SidekiqGeo::VerificationCronWorker 잡을 가져옵니다
    • Sidekiq이 "검증 대기 중" 또는 "검증 실패 및 재시도 준비됨"으로 표시된 행 수에 대해 ci_job_artifact_states를 쿼리합니다
    • Sidekiq이 "최대 검증 동시성" 설정으로 제한된 하나 이상의 Geo::VerificationBatchWorker 잡을 큐에 넣습니다
  • Sidekiq이 Geo::VerificationBatchWorker 잡을 가져옵니다
    • Sidekiq이 "검증 대기 중"으로 표시된 행에 대해 ci_job_artifact_states를 쿼리합니다
    • 이전 단계에서 10개 미만의 행이 반환된 경우, Sidekiq이 "검증 실패 및 재시도 준비됨"으로 표시된 행에 대해 ci_job_artifact_states를 쿼리합니다
    • 각 행에 대해
      • Sidekiq이 "검증 시작됨"으로 표시합니다
      • Sidekiq이 파일의 SHA256 체크섬을 가져옵니다
      • Sidekiq이 체크섬을 행에 저장하고 "검증 성공"으로 표시합니다
      • 이제 보조 Geo 사이트가 이 체크섬과 비교할 수 있습니다

보조 사이트:

Mermaid 다이어그램 (17줄)
소스 코드 보기
sequenceDiagram
  participant SC as Sidekiq-cron
  participant R as Redis
  participant S as Sidekiq
  participant TDB as PostgreSQL Tracking DB
  participant F as Filesystem
  participant DB as PostgreSQL
  SC->>R: Enqueue `Geo::VerificationCronWorker`
  S->>R: Pick up `Geo::VerificationCronWorker`
  S->>TDB: Query `job_artifact_registry`
  S->>R: Enqueue `Geo::VerificationBatchWorker`
  S->>R: Pick up `Geo::VerificationBatchWorker`
  S->>TDB: Query `job_artifact_registry`
  S->>TDB: Update `job_artifact_registry` row, "started"
  S->>F: Checksum file
  S->>DB: Query `ci_job_artifact_states`
  S->>TDB: Update `job_artifact_registry` row, "succeeded"
  • 아티팩트가 성공적으로 동기화된 후, "검증 대기 중"이 됩니다
  • Sidekiq-cron이 매분 Geo::VerificationCronWorker 잡을 큐에 넣습니다
  • SidekiqGeo::VerificationCronWorker 잡을 가져옵니다
    • Sidekiq이 "검증 대기 중" 또는 "검증 실패 및 재시도 준비됨"으로 표시된 행 수에 대해 PostgreSQL Geo 추적 데이터베이스job_artifact_registry를 쿼리합니다
      • Sidekiq이 "최대 검증 동시성" 설정으로 제한된 하나 이상의 Geo::VerificationBatchWorker 잡을 큐에 넣습니다
  • Sidekiq이 Geo::VerificationBatchWorker 잡을 가져옵니다
    • Sidekiq이 "검증 대기 중"으로 표시된 행에 대해 PostgreSQL Geo 추적 데이터베이스의 job_artifact_registry를 쿼리합니다
    • 이전 단계에서 10개 미만의 행이 반환된 경우, Sidekiq이 "검증 실패 및 재시도 준비됨"으로 표시된 행에 대해 job_artifact_registry를 쿼리합니다
    • 각 행에 대해
      • Sidekiq이 "검증 시작됨"으로 표시합니다
      • Sidekiq이 파일의 SHA256 체크섬을 가져옵니다
      • Sidekiq이 행에 체크섬을 저장합니다
      • Sidekiq이 체크섬을 PostgreSQL에 의해 복제된 ci_job_artifact_states 행의 체크섬과 비교합니다
      • 체크섬이 일치하면 Sidekiq이 job_artifact_registry 행을 "검증 성공"으로 표시합니다

Geo blob 복제

원문 보기
요약

업로드, LFS 객체, CI 잡 아티팩트와 같은 blob은 Self-Service Framework를 사용하여 보조 사이트에 복제됩니다. 아래 다이어그램에서는 blob의 한 예시로 잡 아티팩트가 사용됩니다. PostgreSQL DB 행이 복제된 후 보조 사이트:

업로드, LFS 객체, CI 잡 아티팩트와 같은 blob은 Self-Service Framework를 사용하여 보조 사이트에 복제됩니다. 동기화 상태를 추적하기 위해, 각 모델은 해당 레지스트리 테이블을 가집니다. 예를 들어, UploadPostgreSQL Geo 추적 데이터베이스Geo::UploadRegistry를 가집니다.

서비스 간 blob 복제 해피 패스 워크플로우#

아래 다이어그램에서는 blob의 한 예시로 잡 아티팩트가 사용됩니다.

새 잡 아티팩트 복제#

기본 사이트:

Mermaid 다이어그램 (10줄)
소스 코드 보기
sequenceDiagram
  participant R as Runner
  participant P as Puma
  participant DB as PostgreSQL
  participant SsP as Secondary site PostgreSQL
  R->>P: Upload artifact
  P->>DB: Insert `ci_job_artifacts` row
  P->>DB: Insert `geo_events` row
  P->>DB: Insert `geo_event_log` row
  DB->>SsP: Replicate rows
  • Runner가 아티팩트를 업로드합니다
  • Pumaci_job_artifacts 행을 삽입합니다
  • Puma가 "ID 123을 가진 잡 아티팩트가 업데이트됨"과 같은 데이터를 가진 geo_events 행을 삽입합니다
  • Puma가 geo_events 행을 가리키는 geo_event_log 행을 삽입합니다 (SSF가 일부 레거시 로직 위에 구축되었기 때문)
  • PostgreSQL 스트리밍 복제가 읽기 복제본에 행을 삽입합니다

PostgreSQL DB 행이 복제된 후 보조 사이트:

Mermaid 다이어그램 (14줄)
소스 코드 보기
sequenceDiagram
  participant DB as PostgreSQL
  participant GLC as Geo Log Cursor
  participant R as Redis
  participant S as Sidekiq
  participant TDB as PostgreSQL Tracking DB
  participant PP as Primary site Puma
  GLC->>DB: Query `geo_event_log`
  GLC->>DB: Query `geo_events`
  GLC->>R: Enqueue `Geo::EventWorker`
  S->>R: Pick up `Geo::EventWorker`
  S->>TDB: Insert to `job_artifact_registry`, "starting sync"
  S->>PP: GET <primary site internal URL>/geo/retrieve/job_artifact/123
  S->>TDB: Update `job_artifact_registry`, "synced"
  • Geo Log Cursor 루프가 새 geo_event_log 행을 찾습니다
  • Geo Log Cursor가 geo_events 행을 처리합니다
    • Geo Log Cursor가 geo_events 행 데이터를 전달하여 Geo::EventWorker 잡을 큐에 넣습니다
  • SidekiqGeo::EventWorker 잡을 가져옵니다
    • Sidekiq이 존재하지 않기 때문에 PostgreSQL Geo 추적 데이터베이스job_artifact_registry 행을 삽입하고 "동기화 시작됨"으로 표시합니다
    • Sidekiq이 기본 Geo 사이트의 API 엔드포인트에 GET 요청을 하고 파일을 다운로드합니다
    • Sidekiq이 job_artifact_registry 행을 "동기화됨"과 "검증 대기 중"으로 표시합니다

기존 잡 아티팩트 백필#

  • 시스템 관리자에게 Geo 없이 기존 GitLab 사이트가 있습니다
  • 기존 CI 잡과 잡 아티팩트가 있습니다
  • 시스템 관리자가 새 GitLab 사이트를 설정하고 보조 Geo 사이트로 구성합니다

보조 사이트:

매분 실행되는 두 개의 크론 잡이 있습니다: Geo::Secondary::RegistryConsistencyWorkerGeo::RegistrySyncWorker. 아래 워크플로우는 이러한 라인을 따라 두 부분으로 나뉩니다.

Mermaid 다이어그램 (11줄)
소스 코드 보기
sequenceDiagram
  participant SC as Sidekiq-cron
  participant R as Redis
  participant S as Sidekiq
  participant DB as PostgreSQL
  participant TDB as PostgreSQL Tracking DB
  SC->>R: Enqueue `Geo::Secondary::RegistryConsistencyWorker`
  S->>R: Pick up `Geo::Secondary::RegistryConsistencyWorker`
  S->>DB: Query `ci_job_artifacts`
  S->>TDB: Query `job_artifact_registry`
  S->>TDB: Insert to `job_artifact_registry`
  • Sidekiq-cron이 매분 Geo::Secondary::RegistryConsistencyWorker 잡을 큐에 넣습니다. 활발하게 작업을 수행하는 한(행 생성 및 삭제), 이 잡은 즉시 자체적으로 다시 큐에 넣습니다. 이 잡은 동시에 여러 인스턴스가 실행되는 것을 방지하기 위해 배타적 임대를 사용합니다.
  • SidekiqGeo::Secondary::RegistryConsistencyWorker 잡을 가져옵니다
    • Sidekiq이 최대 10000개 행에 대해 ci_job_artifacts 테이블을 쿼리합니다
    • Sidekiq이 최대 10000개 행에 대해 job_artifact_registry 테이블을 쿼리합니다
    • Sidekiq이 기존 잡 아티팩트에 해당하는 PostgreSQL Geo 추적 데이터베이스job_artifact_registry 행을 삽입합니다
Mermaid 다이어그램 (15줄)
소스 코드 보기
sequenceDiagram
  participant SC as Sidekiq-cron
  participant R as Redis
  participant S as Sidekiq
  participant DB as PostgreSQL
  participant TDB as PostgreSQL Tracking DB
  participant PP as Primary site Puma
  SC->>R: Enqueue `Geo::RegistrySyncWorker`
  S->>R: Pick up `Geo::RegistrySyncWorker`
  S->>TDB: Query `*_registry` tables
  S->>R: Enqueue `Geo::EventWorker`s
  S->>R: Pick up `Geo::EventWorker`
  S->>TDB: Insert to `job_artifact_registry`, "starting sync"
  S->>PP: GET <primary site internal URL>/geo/retrieve/job_artifact/123
  S->>TDB: Update `job_artifact_registry`, "synced"
  • Sidekiq-cron이 매분 Geo::RegistrySyncWorker 잡을 큐에 넣습니다. 활발하게 작업을 수행하는 한, 이 잡은 동기화 잡을 예약하며 최대 한 시간 동안 루프합니다. 이 잡은 동시에 여러 인스턴스가 실행되는 것을 방지하기 위해 배타적 임대를 사용합니다.
  • SidekiqGeo::RegistrySyncWorker 잡을 가져옵니다
    • Sidekiq이 "동기화 시도 없음" 행에 대해 PostgreSQL Geo 추적 데이터베이스의 모든 registry 테이블을 쿼리합니다. 각 테이블의 행을 인터리브하고 메모리 내 큐에 추가합니다.
    • 이전 단계에서 1000개 미만의 행이 반환된 경우, Sidekiq이 "동기화 실패 및 재시도 준비됨" 행에 대해 모든 registry 테이블을 쿼리하고 그것들을 인터리브하여 메모리 내 큐에 추가합니다.
    • Sidekiq이 큐의 각 항목에 대해 "ID 123을 가진 잡 아티팩트가 업데이트됨"과 같은 인수로 Geo::EventWorker 잡을 큐에 넣고, 큐에 넣어진 Sidekiq 잡 ID를 추적합니다.
    • "최대 동시성 제한" 설정에 도달하면 Sidekiq은 Geo::EventWorker 잡 큐에 넣기를 중지합니다
    • Sidekiq은 더 이상 할 작업이 없을 때까지 이런 종류의 작업을 루프합니다
  • Sidekiq이 Geo::EventWorker 잡을 가져옵니다
    • Sidekiq이 job_artifact_registry 행을 "동기화 시작됨"으로 표시합니다
    • Sidekiq이 기본 Geo 사이트의 API 엔드포인트에 GET 요청을 하고 파일을 다운로드합니다
    • Sidekiq이 job_artifact_registry 행을 "동기화됨"과 "검증 대기 중"으로 표시합니다

새 잡 아티팩트 검증#

기본 사이트:

Mermaid 다이어그램 (20줄)
소스 코드 보기
sequenceDiagram
  participant Ru as Runner
  participant P as Puma
  participant DB as PostgreSQL
  participant SC as Sidekiq-cron
  participant Rd as Redis
  participant S as Sidekiq
  participant F as Filesystem
  Ru->>P: Upload artifact
  P->>DB: Insert `ci_job_artifacts`
  P->>DB: Insert `ci_job_artifact_states`
  SC->>Rd: Enqueue `Geo::VerificationCronWorker`
  S->>Rd: Pick up `Geo::VerificationCronWorker`
  S->>DB: Query `ci_job_artifact_states`
  S->>Rd: Enqueue `Geo::VerificationBatchWorker`
  S->>Rd: Pick up `Geo::VerificationBatchWorker`
  S->>DB: Query `ci_job_artifact_states`
  S->>DB: Update `ci_job_artifact_states` row, "started"
  S->>F: Checksum file
  S->>DB: Update `ci_job_artifact_states` row, "succeeded"
  • Runner가 아티팩트를 업로드합니다
  • Pumaci_job_artifacts 행을 생성합니다
  • Puma가 검증 상태를 저장하기 위해 ci_job_artifact_states 행을 생성합니다.
    • 행은 "검증 대기 중"으로 표시됩니다
  • Sidekiq-cron이 매분 Geo::VerificationCronWorker 잡을 큐에 넣습니다
  • SidekiqGeo::VerificationCronWorker 잡을 가져옵니다
    • Sidekiq이 "검증 대기 중" 또는 "검증 실패 및 재시도 준비됨"으로 표시된 행 수에 대해 ci_job_artifact_states를 쿼리합니다
    • Sidekiq이 "최대 검증 동시성" 설정으로 제한된 하나 이상의 Geo::VerificationBatchWorker 잡을 큐에 넣습니다
  • Sidekiq이 Geo::VerificationBatchWorker 잡을 가져옵니다
    • Sidekiq이 "검증 대기 중"으로 표시된 행에 대해 ci_job_artifact_states를 쿼리합니다
    • 이전 단계에서 10개 미만의 행이 반환된 경우, Sidekiq이 "검증 실패 및 재시도 준비됨"으로 표시된 행에 대해 ci_job_artifact_states를 쿼리합니다
    • 각 행에 대해
      • Sidekiq이 "검증 시작됨"으로 표시합니다
      • Sidekiq이 파일의 SHA256 체크섬을 가져옵니다
      • Sidekiq이 체크섬을 행에 저장하고 "검증 성공"으로 표시합니다
      • 이제 보조 Geo 사이트가 이 체크섬과 비교할 수 있습니다

보조 사이트:

Mermaid 다이어그램 (17줄)
소스 코드 보기
sequenceDiagram
  participant SC as Sidekiq-cron
  participant R as Redis
  participant S as Sidekiq
  participant TDB as PostgreSQL Tracking DB
  participant F as Filesystem
  participant DB as PostgreSQL
  SC->>R: Enqueue `Geo::VerificationCronWorker`
  S->>R: Pick up `Geo::VerificationCronWorker`
  S->>TDB: Query `job_artifact_registry`
  S->>R: Enqueue `Geo::VerificationBatchWorker`
  S->>R: Pick up `Geo::VerificationBatchWorker`
  S->>TDB: Query `job_artifact_registry`
  S->>TDB: Update `job_artifact_registry` row, "started"
  S->>F: Checksum file
  S->>DB: Query `ci_job_artifact_states`
  S->>TDB: Update `job_artifact_registry` row, "succeeded"
  • 아티팩트가 성공적으로 동기화된 후, "검증 대기 중"이 됩니다
  • Sidekiq-cron이 매분 Geo::VerificationCronWorker 잡을 큐에 넣습니다
  • SidekiqGeo::VerificationCronWorker 잡을 가져옵니다
    • Sidekiq이 "검증 대기 중" 또는 "검증 실패 및 재시도 준비됨"으로 표시된 행 수에 대해 PostgreSQL Geo 추적 데이터베이스job_artifact_registry를 쿼리합니다
      • Sidekiq이 "최대 검증 동시성" 설정으로 제한된 하나 이상의 Geo::VerificationBatchWorker 잡을 큐에 넣습니다
  • Sidekiq이 Geo::VerificationBatchWorker 잡을 가져옵니다
    • Sidekiq이 "검증 대기 중"으로 표시된 행에 대해 PostgreSQL Geo 추적 데이터베이스의 job_artifact_registry를 쿼리합니다
    • 이전 단계에서 10개 미만의 행이 반환된 경우, Sidekiq이 "검증 실패 및 재시도 준비됨"으로 표시된 행에 대해 job_artifact_registry를 쿼리합니다
    • 각 행에 대해
      • Sidekiq이 "검증 시작됨"으로 표시합니다
      • Sidekiq이 파일의 SHA256 체크섬을 가져옵니다
      • Sidekiq이 행에 체크섬을 저장합니다
      • Sidekiq이 체크섬을 PostgreSQL에 의해 복제된 ci_job_artifact_states 행의 체크섬과 비교합니다
      • 체크섬이 일치하면 Sidekiq이 job_artifact_registry 행을 "검증 성공"으로 표시합니다