diff --git a/storage-manager/src/S3Storage.cpp b/storage-manager/src/S3Storage.cpp index f37e5d90a..0195341e4 100644 --- a/storage-manager/src/S3Storage.cpp +++ b/storage-manager/src/S3Storage.cpp @@ -89,7 +89,7 @@ S3Storage::ScopedConnection::~ScopedConnection() s3->returnConnection(conn); } -S3Storage::S3Storage() +S3Storage::S3Storage(bool skipRetry) : skipRetryableErrors(skipRetry) { /* Check creds from envvars Get necessary vars from config @@ -239,6 +239,10 @@ int S3Storage::getObject(const string &_sourceKey, boost::shared_array else logger->log(LOG_ERR, "S3Storage::getObject(): failed to GET, got '%s'. bucket = %s, key = %s. Retrying...", s3err_msgs[err], bucket.c_str(), sourceKey.c_str()); + if (skipRetryableErrors) + { + return -1; + } sleep(5); } } while (err && retryable_error(err)); @@ -329,6 +333,10 @@ int S3Storage::putObject(const boost::shared_array data, size_t len, co else logger->log(LOG_ERR, "S3Storage::putObject(): failed to PUT, got '%s'. bucket = %s, key = %s." " Retrying...", s3err_msgs[s3err], bucket.c_str(), destKey.c_str()); + if (skipRetryableErrors) + { + return -1; + } sleep(5); } } while (s3err && retryable_error(s3err)); @@ -363,6 +371,10 @@ int S3Storage::deleteObject(const string &_key) else logger->log(LOG_ERR, "S3Storage::deleteObject(): failed to DELETE, got '%s'. bucket = %s, key = %s. Retrying...", s3err_msgs[s3err], bucket.c_str(), key.c_str()); + if (skipRetryableErrors) + { + return -1; + } sleep(5); } } while (s3err && s3err != MS3_ERR_NOT_FOUND && retryable_error(s3err)); @@ -398,6 +410,10 @@ int S3Storage::copyObject(const string &_sourceKey, const string &_destKey) else logger->log(LOG_ERR, "S3Storage::copyObject(): failed to copy, got '%s'. bucket = %s, srckey = %s, " " destkey = %s. Retrying...", s3err_msgs[s3err], bucket.c_str(), sourceKey.c_str(), destKey.c_str()); + if (skipRetryableErrors) + { + return -1; + } sleep(5); } } while (s3err && retryable_error(s3err)); @@ -447,6 +463,10 @@ int S3Storage::exists(const string &_key, bool *out) else logger->log(LOG_ERR, "S3Storage::exists(): failed to HEAD, got '%s'. bucket = %s, key = %s. Retrying...", s3err_msgs[s3err], bucket.c_str(), key.c_str()); + if (skipRetryableErrors) + { + return -1; + } sleep(5); } } while (s3err && s3err != MS3_ERR_NOT_FOUND && retryable_error(s3err)); diff --git a/storage-manager/src/S3Storage.h b/storage-manager/src/S3Storage.h index 3b9b4ae2a..ba20a6b7c 100644 --- a/storage-manager/src/S3Storage.h +++ b/storage-manager/src/S3Storage.h @@ -30,7 +30,8 @@ namespace storagemanager class S3Storage : public CloudStorage { public: - S3Storage(); + S3Storage(bool skipRetry = false); + virtual ~S3Storage(); int getObject(const std::string &sourceKey, const std::string &destFile, size_t *size = NULL); @@ -46,6 +47,8 @@ class S3Storage : public CloudStorage ms3_st *getConnection(); void returnConnection(ms3_st *); + bool skipRetryableErrors; + std::string bucket; // might store this as a char *, since it's only used that way std::string prefix; std::string region; diff --git a/storage-manager/src/testS3Connection.cpp b/storage-manager/src/testS3Connection.cpp index aa0071d1b..a20d8d828 100644 --- a/storage-manager/src/testS3Connection.cpp +++ b/storage-manager/src/testS3Connection.cpp @@ -35,7 +35,7 @@ int s3TestConnection() int ret = 0; try { - S3Storage* s3 = new S3Storage(); + S3Storage* s3 = new S3Storage(true); cout << "S3 Storage Manager Configuration OK" << endl; delete s3; }