Ошибка загрузки Aws S3 TransferService без ошибок

Я реализовал ядро ​​AWS и S3 SDK для обработки загрузки файлов. К сожалению, загрузка иногда не работает должным образом. (кажется, только при подключении Wi-Fi, но я не уверен на 100% в этом факте)

По какой-то неизвестной причине служба aws получает успешный ответ, даже если файл не завершил загрузку, а затем все зависает.

Я вижу, что служба передачи запущена, и, например, первый файл начинает загружаться правильно и заканчивается, но второй никогда не завершает загрузку, а служба Transfer Service молча останавливается, и я не получаю никакой ошибки через слушателей передачи... я включил журналы отладки чтобы узнать, могу ли я получить больше информации через

   java.util.logging.Logger.getLogger("com.amazonaws").setLevel(java.util.logging.Level.FINEST);

А вот журнал загрузки, в котором первая загрузка файла прошла успешно, а вторая не удалась - я просто запускаю следующий файл, когда первый уведомляет о его завершении. (без имен пакетов и временных меток для более простого анализа):

D/AwsUploadManager: Uploading file: /storage/emulated/0/folder/profile20160219_123233.jpg
D/AwsUploadManager: Uploading under key: 56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/AwsUploadManager: AwsUploadManager 56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/TransferSerivce: Starting Transfer Service
D/TransferSerivce: Loading transfers from database
D/TransferSerivce: 1 transfers are loaded from database
W/TransferSerivce: Transfer has already been added: 6
D/TransferSerivce: Network connected: true
D/AwsUploadManager: onStateChanged IN_PROGRESS
D/AwsUploadManager: onProgressChanged id= 6 ::bytesCurrent0 bytesTotal16917
D/com.amazonaws.request: Sending Request: PUT.........
D/libc: [NET] android_getaddrinfofornet+,hn 41(0x6369616f2d696d),sn(),hints(known),family 0,flags 4
D/libc: [NET] android_getaddrinfofornet-, err=8
D/libc: [NET] android_getaddrinfofornet+,hn 41(0x6369616f2d696d),sn(),hints(known),family 0,flags 1024
D/libc: [NET] android_getaddrinfofornet-, pass to proxy
D/libc: [NET] android_getaddrinfo_proxy+
D/libc: [NET] android_getaddrinfo_proxy get netid:0
D/libc: [NET] android_getaddrinfo_proxy-, success
D/AwsUploadManager: onProgressChanged id= 6 ::bytesCurrent16917 bytesTotal16917
D/com.amazonaws.request: Received successful response: 200, AWS Request ID: 85952ED0E0FCF444
D/AwsUploadManager: onProgressChanged id= 6 ::bytesCurrent16917 bytesTotal16917
D/AwsUploadManager: onStateChanged COMPLETED
D/AwsUploadManager: Upload finished: 56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/AwsUploadManager: Uploaded url: https://server-name.s3.eu-central-1.amazonaws.com/56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/AwsUploadManager: Uploading file: /storage/emulated/0/folder/profile20160219_122512.jpg
D/AwsUploadManager: Uploading under key: 56cb00d2121bbfcc0e8c68e7-7ea27f9e-0e48-4fde-81a1-7d72383ada2d
D/AwsUploadManager: AwsUploadManager 56cb00d2121bbfcc0e8c68e7-7ea27f9e-0e48-4fde-81a1-7d72383ada2d
D/AwsUploadManager: onStateChanged IN_PROGRESS
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent0 bytesTotal1930575
D/com.amazonaws.request: Sending Request: PUT https://server-name.s3.eu-central-1.amazonaws.com /56cb00d2121bbfcc0e8c68e7-7ea27f9e-0e48-4fde-81a1-7d72383ada2d Headers: (x-amz-decoded-content-length: 1930575, Content-MD5....
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent655360 bytesTotal1930575
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent1048576 bytesTotal1930575
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent1310720 bytesTotal1930575
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent1703936 bytesTotal1930575
D/com.amazonaws.request: Received successful response: 200, AWS Request ID: DE9670A8450D4BAB
**D/TransferSerivce: Stop self**  --And here amazon stopped self without notifying registered listeners about transfer..

Код, используемый для вызова загрузки:

TransferObserver transferObserver = mTransferUtility.upload(BUCKET_NAME, fileKey, file);
transferObserver.setTransferListener(new TransferListener() {...}

Все стандартно из примеров, за исключением того, что я использую стандартный метод аутентификации с учетными данными ключа pub/sec вместо пула Cognito.

  mAwsCredentials = new BasicAWSCredentials(mContext.getString(R.string.aws_accress_key), context.getString(R.string.aws_secret_key));
  mAmazonS3Client = new AmazonS3Client(mAwsCredentials);
  mAmazonS3Client.setRegion(com.amazonaws.regions.Region.getRegion(REGION));
  mTransferUtility = new TransferUtility(mAmazonS3Client, mContext);

Между прочим, эта проблема иногда возникает при первой загрузке файла, иногда на третьей, она не связана с количеством файлов, которые я пытаюсь загрузить. Также иногда onProgressChanged запускается только один раз, прежде чем загрузка зависает, и я вижу полученный успешный ответ и Stop Self впоследствии.

Вопрос: Кто-нибудь сталкивался с этой проблемой раньше и с чем это может быть связано? Я испытываю это относительно часто (каждый второй раз) и поэтому не уверен, что его сеть связана. Даже если это так, я ожидал, что Amazon должным образом обработает сетевые ошибки или по крайней мере уведомит зарегистрированных слушателей. Кроме того, я просмотрел некоторый исходный код и почувствовал, что их документы считают, что они корректно решают проблемы с сетью, поэтому я прыгаю, я делаю что-то ужасно неправильное с моей стороны.

1 ответ

Решение

Недавнее изменение в v2.2.12 содержит только слабую ссылку на зарегистрированных слушателей передачи. Пользователь несет ответственность за удержание слушателя передачи до его завершения. Цель состоит в том, чтобы предотвратить утечку памяти. Однако его использование не четко задокументировано. Мы планируем настроить его в будущих выпусках. Оставайтесь в курсе.

Другие вопросы по тегам