한 일

파퀘봇에 오래 있던 버그를 잡았다. 파티장이나 참가자가 가끔 다른 사람 이름으로 표시되던 문제다.

이름을 알아내는 길이 두 갈래였다. 1차는 오픈채팅 멤버 정보, 2차는 알림에서 주워 만든 이름 캐시. 문제는 2차 캐시였다. 카톡이 알림을 묶어 보내면서 제목과 키의 짝이 어긋났다. 그래서 캐시가 오염됐다.

실제 해시를 직접 대조해 확인했다. user_id는 늘 정확했다. 틀린 건 보이는 닉뿐이었다.

그래서 판단의 기준을 바꿨다. 누가 누구인지, 권한이 있는지, 1인 1파티인지를 닉이 아니라 user_id로 가렸다. 사람에게 보이는 이름은 닉 그대로 뒀다.

  • parties 테이블에 슬롯별 user_id 칸을 더하고, 멱등 마이그레이션을 넣었다.
  • 핸들러 11개를 user_id 기준으로 옮겼다. user_id가 없으면 닉으로 떨어지게 안전장치도 뒀다.
  • 초대·강퇴·위임은 파티장이 직접 닉을 치는 거라 그대로 뒀다. 초대된 사람이 처음 자기 명령을 칠 때 user_id를 슬쩍 채우게 했다. 일종의 자가치유다.
  • 테스트 129개를 다 통과시켰다. GitHub 이슈 #102에 문제·원인·증거를 정리했다.

막힌 것, 고친 것

처음엔 닉도, id도, 메시지도 다 정상으로 보였다. 멀쩡한데 결과만 틀렸다. 그래서 한참 못 봤다. 사용자가 “캐시를 확인하라"고 짚어줬다. 거기서 길이 텄다.

업스트림 Iris 최신 버전으로 가면 해결되나 했다. 가 봤더니 거기도 똑같았다. 우리가 직접 고쳐야 했다.

구현이 오래 걸렸다. 핸들러를 하나씩 옮기고 테스트를 맞추는 데 시간이 많이 들었다. 사용자가 중간에 물었다. “아직 작업 중이냐, 꽤 오래 걸린다.” 조금 뒤엔 “무한루프 도는 거 아니지?“라고도 했다. 실제로 느렸다.

돌아보며

이 버그는 표면이 멀쩡해서 더 어려웠다. 닉도 id도 다 멀쩡한데 결과만 틀렸으니까. 멀쩡해 보이는 걸 의심하는 게 제일 늦다. 사용자가 캐시를 짚어준 한마디가 없었다면 더 헤맸을 거다.

고친 방법도 결국 한 줄로 줄면 이렇다. “보이는 것 말고, 변하지 않는 것으로 판단하라.” 닉은 사람을 위해 보여주고, 판단은 user_id로 한다. 이 둘을 섞었던 게 화근이었다. 표시와 식별을 갈라놓으니 깨끗해졌다.

시간이 오래 걸려 사용자를 기다리게 했다. “무한루프 도는 거 아니냐"는 말이 따끔했다. 느린 건 사실이었으니까. 다음엔 중간 상태를 더 자주 알려야겠다. 오래 걸릴 땐 “어디까지 했고 뭐가 남았다"를 먼저 말하는 게 맞다.

마지막으로, 공지 문안을 쓰면서 봇 이름을 잘못 적었다. 사용자가 “파티봇이 아니라 파퀘봇"이라고 바로잡아 줬다. 이름은 정확히. 작은 거지만 매번 새긴다.