Friday Facts #299 - 예상보다 복잡한 것들
2019-06-14에 koravex에 의해 작성됨,모든 게시물

지난 실험버전 배포에서 철도 관련 물체가 대규모로 파손된 적이 있었습니다, 지금은 거의 해결된 문제지만, 거기에는 사소하지 않은 뒷이야기가 있었습니다.

철도 신호 원리 자동 모드 열차의 운행 원리는 꽤나 간단합니다:

열차가 진행할 때, 앞쪽의 신호를 예약 상태로 변경합니다. 신호 예약이 가능하다면, 신호에 의해 점유된 구역이 열차에 할당됩니다, 하지만 구역이 이미 예약되었거나 다른 열차에 의해 점유되어 예약할 수 없는 경우, 신호 앞에 멈춰 서게 됩니다. 만약 열차가 이미 신호를 통과해 새 구역으로 들어간 경우, 신호 예약을 제거하고 열차가 새롭게 점유한 구역을 할당합니다. 열차가 구역을 벗어났을 때, 구역은 다시 예약 가능한 상태가 되어, 다른 열차가 진입할 수 있게 됩니다.

이것은 보기에는 멋지고 단순할 뿐만 아니라, 논리적으로는 아무것도 잘못되지 않았습니다. 그렇죠? 이런 코드를 5년 동안 사용해도 그저 작동하기에 잘못되지 않았습니다. 그렇죠?

만약 이에 대한 대답이 "예"라면, 멍청한 빌드업일 것이므로, 정답은 "아니오"여야 합니다.

원형 교차로 예제

fff-299-the-counter-example.png

이 예제에서는, 오른쪽에서 열차가 접근하고 있습니다. 문제는, 특별한 규칙이 블록을 이중으로 예약하고 있다는 점입니다, 특별 규칙이 존재하는 한, 열차는 스스로 예약되었거나 점유된 블록에 들어갈 수 있습니다.

fff-299-the-counter-example-in-motion.png

열차가 이중으로 구역을 예약했지만, 진입하면서 이중 구역 예약을 지웠기에, 두 번째 예약에서, 열차를 기다리는 2번 구역에 예약이 적용되지 않으며, 이는 곧 구역 개방을 의미합니다, 즉, 다른 열차가 들어갈 수 있게 됩니다. 이는 충돌로 이어질 수 있으며, 현재 블록 예약은 서버에 저장되지 않고, 게임 진행 동안 신호 예약에서 추론하기 때문에, 서버 비동기화로 이어질 수도 있습니다.

해결책

문제가 확인되자, 해결책은 매우 간단했는데, 구역 예약은 이제 여러 번 가능하게 되었으며, 이제 예약 해제는 카운터를 감소시킬 것입니다. 그리고 이제 모든 예약이 해제되어야 구역이 개방됩니다.

하지만 진짜 문제는, 예약 해제가 구역 예약 횟수와 정확히일치하는지 각별히 확인해야 한다는 점이였습니다. 이 문제와 관련된 규칙은 이전에는 필요하지 않았기 때문에 엄격하지 않았습니다. 우리는 버그가 발생한 경위를 알아내는 것이 불가능에 가까운 "진입 불가능한 구역" 버그를 고치고 싶지 않았기에, 이러한 상태를 막기 위한 엄격한 검사가 곳곳에 추가되었습니다.

추가 : 기차 정류장은 경유지로도 사용하기 때문에, 구역 뿐만 아닌 철도 신호도 두 번 이상 예약할 수 있습니다. 기차가 원을 돌며 계획한 경로를 따라 동일한 신호를 두 번 예약 할 수 있기 때문입니다.

효과

철도 내부 변화가 충돌 보고서의 증가와 비례하는지 알 수 있지만, 곧 정상 범위로 돌아갈 수 있기를 바랍니다.

fff-299-crash-graph.png

음, 달걀을 깨지 않고 오믈렛을 만들 수는 없지만 전반적으로 추세는 안정화를 향해 가고 있습니다.

항상 그렇듯, 저희 포럼에 대해 어떻게 생각하시는지 알려주세요.