Загрузка списка файлов с помощью aws-sdk-cpp

Я пытаюсь загрузить список файлов на aws s3, используя cpp sdk. Но загружаются только несколько файлов, и он завершается перед загрузкой всех файлов. Я использую API загрузки aws s3 cpp sdk.

 bool OnUpload_test(bool status, const char* carouselname, void* userdata){
        cout << "status" << status<< endl;
        cout << "Objectname =" << carouselname << endl;
        return true;

}


bool upload_thread(Proxy* proxy, const char* file,const char* path, int duration)
{
        char output_file[512];
        snprintf(output_file,512,"%s/%s",path,file);
        proxy->Upload(file, output_file,duration,OnUpload_test,nullptr);
        return true;
}

int main(){
     
        char filename[9][128];
        int i = 0, num_thread = 10,j=0,k=0;

        thread *thread_count[num_thread];
        Proxy *m_proxy = new Proxy("123","bucket_name",20);

        //creating thread to test upload
        for (int i = 1, j = 0; i<=9; i++, j++)
        {
             
                snprintf(filename[j],128,"centos%d.mp4",i);
                cout << "count = " << j << endl;

                thread_count[i] = new thread(upload_thread, m_proxy,(const char*) filename[j],"path",20);
           

        }
        for (i = 1; i<=9; i++)
        {
                thread_count[i]->join();
               

        }
       sleep(120);
}

Функция загрузки s3 Api для загрузки данных в s3. размер файлов в среднем 40 мб. Я пытаюсь загрузить 9 файлов.

////////////////////////////////////////////////////////////////////

 bool UploadData::Uploaddata(string bucketName, string objname, string 
           objdata,int duration,const char* id)
{


        Aws::String bcktName(bucketName.c_str(), bucketName.size());
        Aws::String obj(objname.c_str(), objname.size());
        Aws::String objdt(objdata.c_str(), objdata.size());

        Aws::Client::ClientConfiguration config;
        config.connectTimeoutMs = 5000000;
        config.requestTimeoutMs = 6000000;

        const Aws::String user_region = "ap-south-1";
        config.region = user_region;
        Aws::S3::S3Client client(config);

        Aws::S3::Model::PutObjectRequest request;

        request.SetBucket(bcktName);
        request.SetKey(obj);

        
        const std::shared_ptr<Aws::IOStream> input_data = Aws::MakeShared<Aws::FStream>(obj.c_str(),objdt.c_str(),std::ios_base::in | std::ios_base::binary);
        

        input_data->seekg(0, input_data->end);

        int fsize = input_data->tellg();
        input_data->seekg(0, input_data->beg);
        
        request.SetContentLength(fsize);
        request.SetBody(input_data);


        auto outcome = client.PutObject(request);
        if (!outcome.IsSuccess()) {
                std::cout <<"UploadObject error = "<< outcome.GetError().GetMessage().c_str() << std::endl;
                return false;
        }
}

person Mohsin Khan    schedule 26.11.2020    source источник


Ответы (1)


Поскольку вы не опубликовали другие важные части кода, такие как конфигурация клиента S3, я могу только догадываться. Может быть, тайм-аута недостаточно? Попробуйте увеличить requestTimeoutMs и connectTimeoutMs в конфигурации клиента.

Изменить

Ваш код не является mwe (например, что такое прокси?). Нет инициализации и завершения работы AWS SDK.

Это то, что работает для меня с использованием потоков:

#include <iostream>
#include <fstream>
#include <thread>
#include <vector>
#include <unistd.h>
#include <aws/core/Aws.h>
#include <aws/core/auth/AWSCredentialsProvider.h>
#include <aws/core/utils/StringUtils.h>
#include <aws/s3/S3Client.h>
#include <aws/s3/model/GetObjectRequest.h>
#include <aws/s3/model/PutObjectRequest.h>
#include <aws/s3/model/Bucket.h>

using namespace std;
using namespace Aws;

const Aws::String AWS_ACCESS_KEY_ID = "<your ACCESS KEY>";
const Aws::String AWS_SECRET_ACCESS_KEY = "<your SECRET ACCESS KEY>";

bool Uploaddata(string bucketName, string objname)
{


       Aws::String bcktName = Aws::String (bucketName.c_str());
       Aws::String obj = Aws::String (objname.c_str());

       Aws::Client::ClientConfiguration config;
       config.scheme = Aws::Http::Scheme::HTTPS;
       config.connectTimeoutMs = 5000000;
       config.requestTimeoutMs = 6000000;
       config.region = Aws::Region::EU_WEST_1;

       Aws::S3::S3Client client(Aws::Auth::AWSCredentials(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY), config);


       Aws::S3::Model::PutObjectRequest request;

       request.SetBucket(bcktName);
       request.SetKey(obj);

       auto requestStream = Aws::MakeShared<Aws::FStream>("PutObjectInputStream", obj.c_str(), std::ios_base::in | std::ios_base::binary);
       request.SetBody(requestStream);

       auto outcome = client.PutObject(request);
       if (!outcome.IsSuccess()) {
               std::cout <<"UploadObject error = "<< outcome.GetError().GetMessage().c_str() << std::endl;
               return false;
       }
}


int main(){

       char filename[9][128];
       std::string name_bucket = "<your bucket>";
       std::vector<std::thread> threads;

       Aws::SDKOptions options;
       Aws::InitAPI(options);
       {
           //creating thread to test upload
           for (int j = 1; j<=9; j++)
           {
                   snprintf(filename[j],128,"centos%d.txt",j);
                   cout << "count = " << j << endl;
                   threads.push_back(std::thread(Uploaddata,name_bucket,filename[j]));

           }
          for (auto& th : threads) th.join();
          sleep(120);
       }
       Aws::ShutdownAPI(options);
}
person rok    schedule 26.11.2020
comment
@ rok, как вы предложили, я увеличил requestTimeoutMs и connectTimeoutMs по-прежнему. - person Mohsin Khan; 27.11.2020
comment
на сколько вы увеличили? Увеличилось ли количество загружаемых файлов? - person rok; 27.11.2020
comment
@rok раньше было вот это config.connectTimeoutMs = 50000; config.requestTimeoutMs = 600000; теперь config.connectTimeoutMs = 5000000; config.requestTimeoutMs = 6000000; Нет, все еще загружаются только 2 файла. - person Mohsin Khan; 27.11.2020
comment
вы получаете какую-либо ошибку? - person rok; 27.11.2020
comment
@ rok нет, это нормально после сна. - person Mohsin Khan; 28.11.2020
comment
добавил рабочее решение, посмотрите - person rok; 28.11.2020
comment
я пробовал ваш код, но я получаю ошибки. На самом деле после загрузки объектов я применяю правило жизненного цикла к этим объектам и получаю следующую ошибку. ОШИБКА:: OperationAborted: Невозможно проанализировать ExceptionName: OperationAborted Сообщение: В настоящее время выполняется конфликтующая условная операция с этим ресурсом. Пожалуйста, попробуйте еще раз. - person Mohsin Khan; 30.11.2020
comment
Это еще один вопрос. Вы должны открыть новый вопрос о публикации жизненного цикла, что вы делаете. Загрузка с моим кодом работает? Если это не работает, какие ошибки вы получаете? - person rok; 30.11.2020
comment
@ rok на самом деле загружено всего несколько видеофайлов. Не все файлы загружаются. Я открыл новый вопрос, связанный с правилом жизненного цикла. - person Mohsin Khan; 30.11.2020
comment
Я только что попробовал свой код с 9 файлами ~ 50 МБ, и все работает, так что ваша проблема не в коде, а в правиле жизненного цикла? Может закачка прошла успешно но правило как-то удаляет часть файлов? Если что-то пойдет не так с загрузкой, вы должны получить сообщение об ошибке от AWS. - person rok; 30.11.2020