치명적 오류: 사용자 이름 변경 후 사용자 계정 오류 발생

사용자 xxx의 요청으로 해당 사용자의 사용자명을 변경했습니다. 사용자는 비활성 상태의 사용자명 yyy를 사용하고 싶어 했습니다. 그래서 먼저 비활성 사용자명 yyy를 yyy1과 같은 다른 이름으로 변경한 후, 해당 사용자의 사용자명을 xxx에서 yyy로 변경했습니다.

이 시점에서 먼저, 해당 사용자가 아무것도 게시할 수 없었고 로그에서 다음과 같은 오류를 확인했습니다:

Job exception: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_username_lower" DETAIL: Key (username_lower)=(mina) already exists. 

이전 사용자명으로 되돌리려고 시도했는데, 이제 모든 이력이 사라졌습니다. 정확히 무엇이 잘못되었나요?

이 문제를 재현해 볼 수 있을까요, @tshenry?

이제 그들의 프로필 페이지조차 열 수 없습니다. 그 사이에 이 문제를 해결할 수 있는 방법이 있을까요?

지금 말씀해 주신 단계를 하나씩 확인하고 있습니다. 결과를 알려드리겠습니다.

참고로, 이 사용자 (username_lower)=(mina)에게 왜 이런 에러가 발생하는지 모르겠어요. 이 사용자에게는 어떤 변경 사항도 적용한 적이 없고, 비활성화된 사용자처럼 보이거든요. 그런데 이 사용자의 프로필에서도 이상한 현상이 발견됩니다. 알림 페이지를 열면 404 에러가 발생해요.

네, 단계들을 따라 해보았습니다. 제가 진행한 방식이 당신과 다른 부분이 있다면 알려주세요.

사용자는 두 명입니다:

  • xxx (활성 계정)
  • yyy (비활성 계정)
  1. yyy를 yyy1로 변경
    xxx를 yyy로 변경
    ( :white_check_mark: 제 환경에서는 정상 작동했습니다)

  2. 새로 변경된 yyy 계정으로 게시글 작성 시도
    ( :white_check_mark: 제 환경에서는 정상 작동했습니다)

  3. yyy를 다시 xxx로 변경
    ( :white_check_mark: 제 환경에서는 정상 작동했으며, 사용자 히스토리가 손실되지 않았습니다)

전체 과정에서 문제가 발생하지 않았습니다. 참고할 점으로, 사용자 관리 페이지에서 사용자 이름을 변경한 후에는 “공개 프로필 보기” 버튼이 올바른 사용자로 이동하려면 페이지를 새로고침해야 합니다.

/admin/logs/staff_action_logs를 확인하여 기록된 사용자 이름 변경 사항이 모두 논리적인지 점검해 볼 수 있을까요? 목록에 있는 사용자 이름의 아바타를 클릭하면 해당 사용자의 현재 올바른 사용자 페이지로 이동해야 합니다.

네, 아바타를 클릭하면 해당 사용자의 페이지로 이동합니다. 하지만 제 생각에는 그 사용자의 페이지가 다소 비활성 상태인 것 같습니다. 예를 들어, 그 사용자의 이메일을 표시하거나 해당 계정을 사칭할 수 없습니다:

지금까지 제가 한 작업은 다음과 같습니다:

이 보고서에서 확인한 바에 따르면, 먼저 fatemeh를 fatemeh12로 변경했습니다. 그런 다음 fatemeh_baghdadi를 fatemeh로 변경했습니다. 잠시 후, 사용자는 아무것도 게시할 수 없다고 알려주었습니다. 그래서 사용자 이름 변경 과정에서 무언가 잘못되었을지도 모른다고 생각하고, 이전에 사용되지 않은 이름으로 변경해 보았습니다. 따라서 fatemeh(이전 이름 fatemeh_baghdadi)를 fatemeh74로 변경했습니다. 그러자 사용자의 히스토리가 완전히 지워진 것을 보고 당황했습니다. 그래서 처음의 이름인 fatemeh_baghdadi로 되돌리려고 fatemeh74에서 fatemeh_baghdadi로 변경해 보았습니다. 그리고 다시 fatemeh_baghdadi에서 fatemeh_baghdadi5로 변경해 보았지만, 상황이 나아지지 않았습니다. 이제 이론적으로는 한 사람이어야 하지만 실제로는 두 사람인, fatemeh74와 fatemeh_baghdadi5라는 두 명의 다른 사용자가 있습니다. 그중 하나는 제대로 작동하지 않는 것처럼 보입니다.

여기까지 이해하려고 최선을 다하고 있습니다. 매우 기이한 상황인 것 같네요!

"그들의 기록이 완전히 삭제되었다"고 말씀하실 때 정확히 어떤 의미인지 설명해 주실 수 있나요? fatemeh_baghdadi5 사용자의 프로필 활동 섹션에 다양한 주제와 답변이 나열되어야 하나요?

그렇다면 그 게시글들이 이제 fatemeh74 계정에 연결되어 있는 건가요? 게시글은 사이트 어딘가에 존재하며 특정 사용자와 연결되어야 합니다. 익명 사용자 관점에서 보면, 해당 사이트에서 fatemeh74라는 사용자名的 사용자를 찾을 수 없습니다.

12시간마다 실행되는 EnsureDbConsistency라는 백그라운드 작업이 있습니다. sidekiq에서 수동으로 트리거를 걸거나, 12시간 이내에 모든 것이 자동으로 수정되는지 기다려보는 것도 흥미로운 시도일 수 있습니다.

결국 하나로 통합되어야 할 두 개의 계정이 있는 경우, 이를 병합할 수 있어야 합니다. 다만, 병합을 시도하기 전에 반드시 백업을 해두는 것이 좋습니다.

모든 것에 대한 직접적인 접근 권한이 없기 때문에 무슨 일이 일어나고 있는지 파악하기가 매우 어렵지만, hopefully 문제를 해결할 수 있기를 바랍니다!

사용자 이름을 변경한 시점에 해당 사용자의 프로필을 확인해 보니 게시글 등이 보이지 않았습니다. 하지만 잠시 후에 다시 확인하니 정상으로 복구되었습니다. 다만 현재 fatemeh74는 실제로 올바른 사람으로 보이지만, 활동이 거의 없는 상태입니다. 말씀하신 대로, 그들의 게시글과 기타 콘텐츠는 존재하는 반면 프로필 페이지는 보이지 않는 상황입니다. 예를 들면 다음과 같습니다:

실제로 두 계정은 동일한 것이 아닙니다. 이메일과 ID를 확인해 보았는데 완전히 다릅니다. 하지만 설명하신 절차에 따라 사용자 이름을 변경했으므로, 두 계정은 동일해야 하며 실제로는 여기에서 두 명의 사용자가 존재하지 않아야 합니다.

이것은 정확히 어디에 있나요?

예시를 올려주셔서 감사합니다. 분명히 우려스러운 상황이네요.

/sidekiq/scheduler에서 목록으로 찾을 수 있습니다. 시도해볼 만하지만, 방금 올려주신 내용을 보면 더 깊은 곳에 문제가 있는 것 같습니다.

불행히도 말씀이 맞습니다. 제 문제는 해결되지 않았습니다.

@tshenry 첫 번째 단어의 대소문자만 다를 뿐 완전히 같은 두 개의 사용자명을 가질 수 있는 것이 괜찮은가요?

이것이 문제와 관련이 있을 것 같습니다.

흥미로운 관찰이네요!

사용자 이름은 실제로 대소문자를 구분하지 않으므로, 동일한 사용자 이름을 가진 두 명의 사용자가 존재할 수 없어야 합니다. 하지만:

fatemeh12를 검색할 때 서로 다른 두 개의 사용자 이름이 반환되는 것처럼 보입니다. 이런 일은 일어나지 않아야 합니다(저는 이를 재현할 수 없습니다). 두 계정은 같은 프로필로 연결되는 것으로 보입니다.

이제 어떻게 진행해야 할지 막막합니다. 내일 이 시간쯤까지 누군가 의견을 제시하지 않는다면, 새로운 아이디어를 가진 사람을 찾아볼 것입니다. 그 사이에 관련 있다고 생각되는 추가 정보를 발견하신다면, 게시해 주십시오.

지금까지 이해한 내용은 다음과 같습니다. 첫 번째 단계에서 사용자를 비활성화하기 위해 fatemeh을 fatemeh12으로 변경하려고 했습니다. 하지만 이미 Fatemeh12이라는 사용자가 존재했기 때문에, 사실 fatemeh을 fatemeh12으로 변경할 수 없어야 했습니다. 그런데 이상하게도 그 변경을 허용했고, 그 시점부터 데이터베이스가 어긋나기 시작했습니다.

@tshenry 뭔가 발견하셨나요? 지금은 사라져 있던 사용자 fatemeh74가 somehow 회복되었습니다. 정확히 어떻게 된 건지는 모르겠어요. 이런 일이 다시 일어나지 않도록 확인하고 싶어서, 왜 대소문자만 다른 같은 사용자명이 존재하는지, 그리고 왜 Discourse가 이런 것을 막지 않는지 알고 싶습니다. 제 Discourse는 이미 업데이트되어 있습니다.

안녕하세요 :wave: 좋은 소식이라 기쁩니다. 시간이 좀 지난 뒤 백그라운드 작업이 문제를 해결해 주길 바랐습니다. 말씀하신 대로 그렇게 된 것 같습니다.

아직 이 문제에 대해 더 깊이 살펴볼 여유가 없었습니다. 저희는 고객님의 사이트 데이터베이스에 접근 권한이 없어 도움을 드릴 수 있는 범위가 매우 제한적입니다. 이러한 방식으로 문제를 조사할 수 있는 경우는 호스팅 고객님에 한합니다.

이러한 문제가 발생한 사례는 처음 접하는 것이며, 저는 해당 동작을 재현할 수 없습니다. 고객님의 인스턴스特有的한 특수한 케이스일 것으로 추정됩니다. 향후 유사한 사례가 발생하지 않도록 주의 깊게 살펴볼 것입니다. 만약 더 신중하게 진행하시려면, 사용자 이름 변경 전에 동일한 사용자 이름이 이미 존재하지 않는지 한 번 더 확인해 보시는 것을 권장합니다.

문제를 찾는 데 도움이 된다면 데이터베이스 사본을 보내는 데 문제가 없습니다.

저는 아무것도 안 했는데도 유저가 또 깨져버렸어요 :expressionless: . 제 데이터베이스에 분명 뭔가 문제가 있는 것 같습니다.

저희도 이 문제를 오랫동안 겪고 있습니다. 물론 데이터베이스가 이런 상태가 된 과정을 재현할 수는 없지만, 가끔씩 사용자가 이름 변경 유예 기간 동안 중복된 이름으로 스스로 이름을 변경하는 경우가 발생합니다. 관리자 이름 변경에도 동일한 문제가 적용됩니다.

저희는 유니코드 사용자명을 사용하지 않으며, 이 문제는 때때로 매우 심각한 문제를 일으킵니다. 외부 정책 서비스에 크게 의존하는 Patreon 플러그인의 동기화 작업이 간헐적으로 중단되기 때문입니다.