공짜 서버 하나를 잡으려고 재시도 프로그램을 돌려놨다. 90초마다 한 번씩 “지금 자리 있냐”고 물어보는 물건이다. 자리가 나면 잡고, 없으면 다시 잔다. 6월에 걸어놓고 잊고 있었다.
오늘 서버 상태를 훑다가 그 로그를 열었다.
19,023번 두드렸고 전부 실패했다
총 시도 19,023회. 성공 0회.
로그 파일만 5.6MB로 불어 있었다.
여기까진 그러려니 했다. 원래 자리 나기 어려운 거고, 그래서 재시도를 돌리는 거니까. 그런데 실패 사유를 세어보니 두 종류였다.
“자리 없음” 3,118회. 그리고 못 보던 에러가 14,214회.
7월 9일 밤부터 다른 에러였다
못 보던 에러가 언제부터인지 찾았다. 7월 9일 21시 22분. 그때부터 오늘까지 16일 내내 같은 에러다.
내가 적어둔 문서를 열어봤다. 7월 7일자다. “한도는 41코어나 남아 있으니 문제없고, 유일한 걸림돌은 물리적 자리뿐”이라고 써 있었다.
문서를 쓰고 이틀 뒤에 상황이 바뀌었는데, 나는 그 문서만 믿고 18일을 보냈다.
로그가 정확히 필요한 지점에서 잘려 있었다
그럼 그 에러가 뭐라고 하는지 읽으면 될 일이다. 열어봤다.
"message": "Authorization failed or requested resource not fo
여기서 끝난다. 어느 자원이 문제인지가 정확히 잘린 자리 바로 뒤에 있었다.
스크립트를 보니 에러를 300자에서 잘라 기록하고 있었다. 로그 길어지지 말라고 내가 넣은 줄이다. 며칠 전에도 똑같이 300자로 자르다가 한 번 크게 데었는데, 다른 파일에서 또 하고 있었다.
한도가 0이었다
서버에 직접 물어봤다. 무료 서버 한도가 지금 얼마냐고.
0. 코어도 0, 메모리도 0, 지역 단위로도 0.
한도가 0이면 빈자리가 아무리 많아도 안 준다. 16일 동안 벽을 두드리고 있었다는 뜻이다. 14,214번.
루프는 껐다. 한도가 0보다 커진 걸 확인하기 전에는 다시 켜지 않기로 했다.
건진 것
재시도 프로그램의 함정이 이거다. 실패를 조용히 삼킨다. 잠깐 안 되는 거랑 영원히 안 되는 걸 구분 못 하면, 영원히 안 되는 상태를 “곧 되겠지”로 착각한 채 몇 주가 간다.
게다가 나는 이 루프를 한 번 손본 적이 있다. 6월에 일시적인 오류로 혼자 죽어버려서, 어지간하면 안 멈추게 종료 조건을 좁혀놨다. 그 수정이 오늘의 16일을 만들었다. 안 멈추게 만들었더니 못 멈추게 됐다.
① 재시도 루프는 잠깐 실패와 구조적 불가를 구분한다. 같은 에러가 N번 연속이면 스스로 멈추고 알린다.
② 에러 메시지를 잘라서 기록하지 않는다. 원인은 항상 잘린 자리 뒤에 있다.
③ 판정에 쓰는 수치는 문서가 아니라 실측으로 다시 확인한다. 문서는 쓴 순간부터 낡는다.
④ “안 멈추게” 고칠 땐 멈춰야 할 조건도 같이 넣는다.