티스토리 뷰

개요

  • 디렉토리 단위로 S3에 업로드를 할 때 TransferManager를 사용한다.
  • 간혹 디렉토리의 업로드시 누락되는 파일이 존재하였다.
  • 쓰기 작업중인 파일이 문제일 것이라고 생각하고 쓰기 작업중일 때 어떻게 에러가 발생하는지 재현하였다.

 

주의점(미리 결론)

  • 디렉토리 작업시에는 디렉토리의 작업이 완료된 것을 확인한다.
    • 재현작업에서 10개의 파일이 업로드 되기를 기대하였지만, 7개의 파일만 업로드를 시도하였다.
  • 쓰기 작업중인 파일은 업로드에 실패한다.
    • 정확히 어떤 이유로 실패인지는 검증하지 않았다.
  • 타임아웃을 꼭 넣어라.
    • 작업 완료인지는 MultipleFileUpload.Progress.PercentTransferred의 값으로 판단하게 되는데 이 값만 있다면 무한 루프에 빠질 가능성이 있다.
  • 각 파일에 대한 progress도 확인이 가능하다
    • MultipleFileUpload.subTransfers이용

 

에러 재현 방법

  • 업로드 할 디렉토리에 10개의 파일을 약간의 간격을 두고 생성한다
  • 10개의 파일은 1번째에는 1k, 2번째는 2k ... 10번째는 10k의 라인을 비동기로 쓰기작업한다.
  • 위의 작업과 동시에 TransferManager.uploadDirectory메소드를 동작한다.
  • 업로드 진행상황을 프린트 한다.

 

에러 재현 코드

TestDirCopy.java
0.00MB

 

에러 재현 결과

  • 코드 실행
    • 7개의 파일만 업로드를 시도하였다.
    • 7번째 파일은 업로드에 실패하였다.
    • 일정 시간이 지나고 타임아웃되었다.
progress:0.0
1 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@21005f6c
2 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@7e242b4d
3 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@305f031
4 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@592e843a
5 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@1d1f7216
6 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@423e4cbb
7 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@6e16b8b5
progress:83.682301438399
1 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@21005f6c
2 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@7e242b4d
3 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@305f031
4 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@592e843a
5 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@1d1f7216
6 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@423e4cbb
7 / Failed / com.amazonaws.services.s3.transfer.TransferProgress@6e16b8b5
...
progress:83.682301438399
1 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@21005f6c
2 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@7e242b4d
3 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@305f031
4 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@592e843a
5 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@1d1f7216
6 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@423e4cbb
7 / Failed / com.amazonaws.services.s3.transfer.TransferProgress@6e16b8b5
Exception in thread "main" java.lang.RuntimeException: timeout
	at TestDirCopy.main(TestDirCopy.java:35)
  • S3
    • 6개의 파일은 업로드 되었다.

  • 업로드 디렉토리
    • 10개의 파일이 생성되었다.

 

 

또 다른 결과

  • 위와 같은 조건이지만 모든 파일의 line을 10k로 동일하게 지정하였다.
  • 4번째 파일이 IO를 독점하여 업로드 동작 전에 쓰기를 완료하고 나머지 파일들은 업로드 동작중에도 쓰기 작업중이라 에러가 발생했다고 예상한다.
progress:0.0
1 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@42b64ab8
2 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@235f4c10
3 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@743cb8e0
4 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@c7a975a
5 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@2c1b9e4b
6 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@757d6814
7 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@649725e3
8 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@3c0fae6c
9 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@4c168660
10 / InProgress / com.amazonaws.services.s3.transfer.TransferProgress@52b56a3e
progress:4.5251676650994055
1 / Failed / com.amazonaws.services.s3.transfer.TransferProgress@42b64ab8
2 / Failed / com.amazonaws.services.s3.transfer.TransferProgress@235f4c10
3 / Failed / com.amazonaws.services.s3.transfer.TransferProgress@743cb8e0
4 / Completed / com.amazonaws.services.s3.transfer.TransferProgress@c7a975a
5 / Failed / com.amazonaws.services.s3.transfer.TransferProgress@2c1b9e4b
6 / Failed / com.amazonaws.services.s3.transfer.TransferProgress@757d6814
7 / Failed / com.amazonaws.services.s3.transfer.TransferProgress@649725e3
8 / Failed / com.amazonaws.services.s3.transfer.TransferProgress@3c0fae6c
9 / Failed / com.amazonaws.services.s3.transfer.TransferProgress@4c168660
10 / Failed / com.amazonaws.services.s3.transfer.TransferProgress@52b56a3e