Назад | Перейти на главную страницу

Невозможно загрузить файлы размером более 8 ГБ в Amazon S3 путем многократной загрузки из-за сломанной трубы

Я реализовал загрузку нескольких частей S3, как высокоуровневую, так и низкоуровневую версию, на основе примера кода из http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?HLuploadFileJava.html и http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?llJavaUploadFile.html

Когда я загрузил файлы размером менее 4 ГБ, процессы загрузки завершились без проблем. Когда я загрузил файл размером 13 ГБ, код начал показывать исключение ввода-вывода, сломанные каналы. После повторных попыток это все равно не удалось.

Вот способ повторить сценарий. Возьмите релиз 1.1.7.1,

  1. создать новую корзину в стандартном регионе США
  2. создать большой экземпляр EC2 в качестве клиента для загрузки файла
  3. создайте файл размером 13 ГБ на экземпляре EC2.
  4. запустите образец кода на одной из страниц документации API S3 высокого или низкого уровня из экземпляра EC2
  5. протестируйте один из трех размеров части: размер части по умолчанию (5 МБ) или установите размер части 100 000 000 или 200 000 000 байт.

Пока проблема обнаруживается стабильно. Я приложил сюда файл tcpdump для сравнения. Там хост на стороне S3 продолжал сбрасывать сокет.

Хотя это код C #, он показывает настройки таймаута и разделения, которые я использую для успешного копирования файлов размером до 15 ГБ. Возможно, для AutoCloseStream необходимо установить значение false.

using (FileStream fileStream = File.OpenRead(file.FullName))
                    {

                        TransferUtilityUploadRequest request = new TransferUtilityUploadRequest()
                        {
                            AutoCloseStream = false,
                            Timeout = 1200000,
                            BucketName = Settings.Bucket,
                            Key = file.Name,
                            InputStream = fileStream,
                            PartSize = 6291456 // 6MB
                        };

                        Console.Write("{0}...", file.Name);
                        Begin();
                        tu.Upload(request);
                        End();
                        Console.WriteLine("Done. [{0}]", Duration());
                    }