하위 상품의 파일명만 인코딩이 다르게 저장돼 있었다. 상위는 정상이고 하위만 다르니 경로가 다른 것으로 보였다.
Table of contents
Open Table of contents
찾아낸 조건 분기
새 업로더가 언제 세팅되는지를 보니 트랜잭션 깊이가 0일 때만이었다. 그러면 트랜잭션 안에서 부르는 하위 처리에서는 업로더가 비어 있게 된다.
이미지 할당 부분은 업로더가 있으면 새 경로를 쓰고 없으면 옛 경로로 떨어지는 구조였다. 하위가 트랜잭션 안에서 처리되므로 업로더가 없고 옛 경로를 타서 파일명 처리가 다르다는 설명이 깔끔하게 완성됐다.
호출부가 뒤집은 것
보고하기 전에 하나만 더 확인했다. 상위가 하위를 부를 때 무엇을 넘기는지였다.
새 업로더가 켜져 있으면 이미지 배열을 빈 값으로 채워서 넘기고 있었다. 이미지 배열이 비어 있으면 옛 경로 함수를 불러도 아무 일도 하지 않는다. 업로더가 비어 있는 것은 맞지만 처리할 이미지가 없으므로 옛 경로를 타지 않았다.
철회한 이론
내 설명이 틀렸다. 게이트에 걸리는 것은 맞지만 넘기는 것이 없어서 아무 일도 일어나지 않는 상태였다.
그러면 하위 미디어는 어디서 생기는지를 다시 찾았다. 트랜잭션이 커밋된 뒤에 상위 미디어를 복사하는 별도 경로가 있었고 파일명 처리 차이는 거기서 봐야 했다. 게이트를 찾은 것과 그 경로를 타는 것은 다르다.
멈추게 만드는 느낌
내가 왜 거기서 멈췄는지도 생각해 봤다. 조건이 있고 하위는 그 조건에 안 맞으며 다른 경로로 간다는 논리가 맞아떨어지면 설명이 완성된 느낌이 든다.
그런데 다른 경로로 간다는 것과 그 경로가 무언가를 한다는 것은 다르다. 그래서 게이트를 찾으면 어느 분기로 가는지와 그 분기에 무엇이 넘어오는지와 그것으로 무엇을 하는지 셋을 차례로 확인하기로 했다. 첫 번째만 보면 나머지 둘이 비어 있을 수 있다.
남은 미래 위험
이론은 틀렸지만 알게 된 것은 유효했다. 지금은 호출부가 빈 배열을 넘겨서 안전하다는 것이 확인된 상태다.
문제는 트랜잭션 안에서 이미지 배열을 채워 부르는 신규 경로가 추가되는 경우다. 업로더가 비어 있으므로 옛 경로로 떨어지는데 오류가 나지 않고 조용히 그렇게 된다. 새 방식으로 처리될 줄 알았는데 옛 방식으로 저장되므로 그 조건을 기록에 남겼다.
틀린 이론을 세웠다가 철회한 사실도 함께 남겼다. 지우고 맞는 것만 쓰면 다음 사람이 같은 이론을 다시 세우므로 이렇게 보이지만 아니라는 기록이 유용하다.
정리
- 게이트를 찾은 것과 그 경로를 타는 것은 다르다
- 분기로 갔어도 넘어오는 것이 없으면 아무 일도 안 일어난다
- 게이트를 찾으면 호출부에서 무엇을 넘기는지 읽는다
- 게이트를 보면 설명이 완성된 느낌이 들어 멈추게 된다
- 지금 안전한 것이 신규 경로가 추가되면 위험해질 수 있다
- 조용히 다른 경로로 떨어지는 구조는 특히 위험하다
- 틀린 이론과 철회 사실도 기록한다
- 안 남기면 다음 사람이 같은 이론을 다시 세운다