플러그인 관련 삽질기
귀찮으니 각각 간단하게 적겠다.
문제의 시작: rkyv
버그: Arc<"">
Arc<"">
를 직렬화했다가 비직렬화하면 이상한 값이 들어가있는 버그가 있었다.
리포트는 했는데 재현이 안 된다고 했다.
근데 이 직렬화 버그가 플러그인이 없는 경우에도 발생했다.
해결책: Atom
직렬화 커스터마이징
그래서 일단 두가지 패치를 했는데, 첫번째는 Arc<str>
의 직렬화/비직렬화를 커스터마이징하는 것이고 두번째는 플러그인이 없는 경우 직렬화/비직렬화를 건너뛰게 하는 것이었다.
플러그인 삽질의 시작: m1 mac에서 heap_get_oob
위의 버그를 잡고 나서는 플러그인들이 어느 정도 동작했는데, m1 mac을 포함한 일부 플랫폼에서 heap_get_oob
가 났다.
팀원분께서 bisect를 하신 결과, #5062에서 bytecheck을 추가하고 나서부터 그런 에러가 발생한다고 하셨다.
해결책: bytecheck 비활성화
그래서 일단 bytecheck를 비활성화했다.
새로운 문제: rkyv
: unreachable!()
어이없게도 그랬더니 unreachable
을 밟았다.
이것도 한참 디버깅했다.
해결책: rustc
다운그레이드
근데 이 문제는 내 실수였다.
CI 스크립트가 rustc
버전 문제 때문에 깨졌길래 별 생각 없이 rustc
의 버전을 올렸는데 그게 원인이었다.
아마 rkyv
의 잘못된 코드가 최적화가 개선되면서 깨진 것 같다.
rkyv@0.7.39
: 숫자를 날리다.
위 문제 해결하고 나서 테스트하다가 rkyv@0.7.39
에서 직렬화/비직렬화를 하면 숫자가 다 날아간다는 걸 알게 됐다.
해결책: 다운그레이드
그래서 바로 rkyv
다운그레이드 했다.
rkyv@0.7.37
: Serialize 구현 무시
duplicate shared pointer
이라는 에러가 났다.
docs.rs/rkyv/0.7.37/src/rkyv/ser/serializer..
소스코드를 보니까 Arc
나 Rc
가 없으면 절대 날 수 없는 버그였고, 백트레이스 보면서 한참 디버깅하다가 이게 swc_ecma_ast::Program
을 비직렬화할 때 생기는 문제라는 걸 알았다.
근데 Program
에 Arc
/Rc
계열의 타입은 Atom
뿐이었다.
rkyv
소스코드 보면서 디버깅하다보니까 내 구현 무시하고 Arc
의 구현을 호출하고 있었다.
해결책: Archive 타입 직접 구현
그래서 Arc
의 구현 대신 내 걸 쓰도록 패치했다.
segfault
희한하게 git이나 path로 의존하면 작동하고 배포된 swc_core
을 이용하면 에러가 났다.
해결책: 배포된 swc_core
버전 사용
이 문제는 배포된 swc_core
을 이용해서 npm의 @swc/core
을 배포하니까 해결됐다.
?????
cargo 워크스페이스 버그였던 걸로 추정중이다.
많은 삽질을 한 덕분에 이젠 플러그인들이 잘 작동하는 것 같더라.
추가 삽질: wasmer@3, rkyv 0.7.39
- github.com/swc-project/swc/pull/5507
- github.com/swc-project/swc/pull/5456
- github.com/swc-project/swc/pull/5510
8월 16일 ~ 8월 17에 wasmer
3 업데이트 때문에 추가 삽질을 했다.
PR 머지 안 하고 쌓아두면서 플러그인 관련 PR만 넣어서 테스트해봤는데 플러그인들이 깨지더라.
wasmer
3이 rkyv
^0.7.38에 의존해서 어쩔 수 없이 rkyv도 같이 올렸다.
그런데 실패하더라.
시도: rkyv
0.7.38
그래서 일단 rkyv
버전을 0.7.39 대신 0.7.38로 바꿔봤다.
그런데도 실패했다.
해결책: Revert
검증된 코드로 되돌렸다.