고리가 풀던 문제
세 레슨 전에, 응답 불가인 리뷰어에 대한 답은 고리였어. 순서 있는 회전. 요청된 이름에서 진입해서 정확히 한 바퀴. 매 도약마다 직전 리뷰어를 건너뛴 이유가 기록돼. 풀던 문제에는 좋은 답이었어. 빈 자리가 리뷰로 기록되면 안 된다는 문제. 그리고 5주 동안 기본값으로 버텼어.
그러다 라운드가 샤드로 쪼개졌어. 전체 콜드 스윕이 리뷰어 한 명의 창에 안 들어갈 만큼 커졌거든. 그래서 스윕이 트랙별 샤드로 나뉘어 하나의 라운드로 돌았고, 각 샤드는 가능한 곳에서 고리에 진입했어. 라운드의 보고서는 요청된 리뷰어의 이름을 댔어. 실제로 돈 리뷰어는 여럿이었어. 보고서 등 뒤에서 보이지 않게 회전한 거야. 판정은 한 줄로 떨어졌어. 오퍼레이터가 못 보는 리뷰어 교체는 버그야.
지명된 하나, 그 외에는 아무것도
대체재는 거절이야. 그리고 거절로 진술할 가치가 있어. 모든 샤드는 지명된 리뷰어 위에서 돌아. 오퍼레이터가 요청한 그 한 명 위에서. 그 외에는 아무것도. 그 리뷰어가 응답 불가면 샤드는 실패해. 이유가 기록에 남은 채로. 다른 샤드들은 계속하고. 구멍이 드러난 부분 커버리지가 숨은 교체가 있는 전체 커버리지를 이겨. 작성자는 구멍을 판단할 수 있지만 거짓말은 판단할 수 없거든. 리뷰가 존재하는 이유인 그 성질은 경계야. 지명한 리뷰어가 넘거나, 넘지 않았다고 기록이 말하거나.
교체는 여전히 일어나. 한도 초과와 먹통이야말로 교체가 필요한 이유니까. 하지만 보이는 결정이어야 하고, 두 가지 방법 중 하나로만. 오퍼레이터가 다른 리뷰어를 지명해서 라운드를 다시 돌리는 방법. 실패한 샤드만 다시 돌아. 아니면 오퍼레이터가 미리 명시적 폴백 체인에 옵트인하는 방법. 적힌 순서대로 걸어가고, 매 도약마다 직전을 죽인 표시된 꼬리가 기록돼. 절대 일어나지 않는 건 조용한 중간이야. 회전하는 기본값.
이미 리뷰된 것은 아무것도 잃지 않아
재구축의 다른 절반은 내구성이야. 같은 시즌의 두 번째 관찰에서 태어났어. 리뷰 프로세스는 긴 프로세스고, 긴 프로세스는 세 시간째에 비정상적으로 죽을 수 있어. 누구 잘못도 아니게. 그래서 각 샤드의 파싱된 결과가 샤드가 끝나는 순간 영속돼. 지적 블록, 판정, 실제로 돈 리뷰어, 걸린 시간이 그 내용이야. 같은 라운드를 다시 돌리면 재개돼. 끝난 샤드는 재사용되고 (요청서 해시에 묶여서, 바뀐 요청서는 다시 돌아), 실패한 샤드는 같은 지명 리뷰어로 재시도해.
여기서 규칙으로 승격된 실패 모드가 하나 있어. 가장 이상하게 들리는 것. 지적 블록 없이 깔끔하게 종료한 샤드는 빈 성공이 아니라 실패한 샤드야. 강제한 사례는 이거야. 한 리뷰어의 하네스가 받은 도구 프롬프트를 전부 정중하게 자동 취소하고, 한참을 말만 하고, 종료 코드 0으로 끝났어. 깔끔한 종료, 없는 리뷰. "지적 없음"은 지적이 실제로 거기 있기 전까지는 다시는 "찾을 게 없었음"을 뜻하지 않아. 오직 "뭔가가 끝났음"만 뜻해.