잊을만 하면 한번씩 올라오는 '나는야 버그 제조기' 시리즈 ....
이번에는 최근 진행중이던 프로젝트 중 파일 전송부분을 개선 하는 과정에서 발생했었다.
대용량 파일 전송을 하기 때문에, 파일을 지정한 용량 별로 쪼개고 클라이언트쪽으로 하나씩 보내는 로직이었는데
가뜩이나 대용량인데 그걸 용량별로 쪼개는것도 디스크의 I/O때문에 시간을 많이 소모해서, 실제로는 쪼개지않고 보내는 데이터만 종전과 같이 보내도록 리팩토링을 했다.
그런데, 가상으로 쪼갠 파일을 합쳐서 md5 체크를 하는 단위테스트에서는 성공을 했는데, 네트워크 전송을 하는 테스트는 중간에 InputStream 에서 데이터를 읽지 못해서 에러가 발생하는 현상이 있었다.
한참을 디버깅을 하다가,
혹시(?) 해서 의심해본것이 ~~~~File.setPosition(long position) (파일 이어보내기의 경우, 설정한 위치부터 보낸다)
대략 이런 코드였다 ..
public void setPosition(long position){ ... in.skip( position) ; ... } |
종전에는 파일 클래스 별로 InputStream 이 있어서 저 method 가 이런 버그를 낼 줄은 생각을 못했다. 이번에는 InputStream 공유해서 쓰기때문에, 저 method 를 여러번 호출하게 되면
읽지도 않았는데 그냥 position 만큼 건너뛰면서 읽어서, 나중에는 더이상 읽을 데이터가 없어서 나던 버그였다.
다음과 같이 고쳐줬다 -_-;;
public void setPosition(long position){ ... in.reset(); in.skip( position) ; ... } |
오늘 약간 큰 단위 테스트를 하면서 InputStream 으로 되어있던걸
아무래도 같은 부분이 두번 정도 읽히고 skip 하는경우도 종종 있어서
RandomAccessFile 로 바꾸고
randomFile.seek( position ) ; 으로 바꿨다.