Skip to content

[업그레이드] Upgrade_7_0_0_alpha_15에서 chunk() 사용으로 일부 사용자 UUID 백필이 누락될 수 있습니다. #84

Description

@glitter-gim

업그레이드 경로 (필수)

  • 업그레이드 전 버전: 7.0.0-alpha.14 이하 (영향 범위)
  • 업그레이드 후(목표) 버전: 7.0.0-alpha.15 이상
  • 실행한 명령: 해당 없음 (업그레이드 코드 분석)
  • 실행 계정/권한: 해당 없음

참고: 본 이슈는 실제 업그레이드 실패를 재현한 것이 아니라 Upgrade_7_0_0_alpha_15 구현을 검토하는 과정에서 확인한 잠재적인 문제입니다.


증상

Upgrade_7_0_0_alpha_15uuid IS NULL인 사용자에게 UUID를 백필한 뒤 users.uuid 컬럼을 NOT NULL로 변경합니다.

현재 구현 흐름은 다음과 같습니다.

  1. WHERE uuid IS NULL
  2. chunk(100)으로 대상 조회
  3. 각 행을 즉시 UPDATE하여 UUID 저장
  4. UUID 백필 완료 후 NOT NULL 제약 적용

조회 조건(uuid IS NULL)에 포함되는 컬럼을 반복 처리 중 직접 변경하고 있기 때문에, chunk()가 OFFSET 기반 페이지네이션을 사용하는 경우 일부 레코드를 건너뛸 가능성이 있습니다.

예를 들어 NULL UUID가 다음과 같이 존재한다고 가정하면,

1~100
101~200
201~300

첫 번째 chunk 처리 후에는

101~200
201~300

만 남게 되고,

다음 OFFSET 조회 시

201~300

부터 조회되어

101~200

구간이 처리되지 않을 가능성이 있습니다.

이 경우

  • 일부 사용자의 UUID가 NULL로 남을 수 있고,
  • 이후 users.uuid 컬럼의 NOT NULL 변경이 실패할 가능성도 있습니다.

실제 운영 환경에서 재현한 사례는 아니며, 코드 흐름을 검토하는 과정에서 발견한 잠재적인 문제입니다.

추가로 확인한 사항입니다.

  • User 모델의 creating Hook은 거치지 않습니다.
  • UniqueIdService도 사용하지 않습니다.
  • 기존 UUID는 덮어쓰지 않고 NULL인 사용자만 처리합니다.
  • Query Builder를 이용하여 직접 UPDATE를 수행합니다.

실제로 chunk()가 이 코드에서 OFFSET 기반으로 동작하여 위와 같은 현상이 발생하는지는 확인하지 못했습니다. 코드 흐름상 검토가 필요하다고 판단하여 이슈를 남깁니다.

조회 조건이 반복 처리 중 변경되는 경우에 적합한 순회 방식인지 검토가 필요해 보이며, 필요하다면 chunkById()와 같은 방식도 검토 대상이 될 수 있을 것 같습니다.


확장·커스텀 자산 상태 (필수)

  • _bundled 아래 커스텀 확장 없음
  • public/.htaccess 및 public/storage 커스텀 없음
  • 본 이슈는 코드 분석 기반으로, 확인 대상인 커스텀 자산은 없습니다.

환경 정보

  • PHP 버전: 해당 없음 (코드 분석)
  • 웹서버·실행 방식: 해당 없음
  • DB: 해당 없음
  • OS: 해당 없음

로그·스크린샷

로그는 없습니다.

관련 코드는 upgrades/Upgrade_7_0_0_alpha_15.php의 UUID 백필 처리입니다.

혹시 제가 chunk()의 동작이나 해당 구현을 잘못 해석한 부분이 있다면 알려주시면 다시 확인해 보겠습니다.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions