스레드 안전성 악몽: 안전한 Rust에서도 ARM64에서 발생한 신비한 크래시
2025-01-22

EdgeDB에서 Python 네트워크 I/O 코드를 Rust로 이전하는 동안 ARM64 플랫폼에서 신비한 크래시가 발생했습니다. 처음에는 데드락으로 의심했지만, 최종적으로 `setenv` 및 `getenv` 함수의 스레드 안전성 문제로 밝혀졌습니다. ARM64에서 `openssl-probe` 라이브러리는 `setenv`를 사용하여 환경 변수를 설정하는 반면, 다른 스레드가 동시에 `getenv`을 호출하므로 `environ` 배열이 재할당되어 크래시가 발생합니다. 해결책으로 reqwest의 TLS 백엔드를 rust-native-tls에서 rustls로 변경했습니다. 이는 메모리 안전한 Rust에서도 C 표준 라이브러리와의 상호 작용으로 인해 스레드 안전성 문제가 발생할 수 있음을 보여줍니다.
더 보기