🐞 fix(TSG-7599): 上传失败也会调用回调函数,使用者可根据错误信息进行合理作业
This commit is contained in:
@@ -52,7 +52,7 @@ int file_to_buffer(const char *file, char *buffer, int size)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void callback(bool result, const char *error, const char *bucket, const char *object, void *userdata)
|
void callback(bool result, const char *bucket, const char *object, const char *errormsg, size_t errorcode, void *userdata)
|
||||||
{
|
{
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ int read_file_list(const char *path, char file_name[][STRING_SIZE])
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void callback(bool result, const char *error, const char *bucket, const char *object, void *userdata)
|
static void callback(bool result, const char *bucket, const char *object, const char *errormsg, size_t errorcode, void *userdata)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
userdata_t *data = (userdata_t *)userdata;
|
userdata_t *data = (userdata_t *)userdata;
|
||||||
|
|||||||
@@ -50,22 +50,25 @@ static void gtest_hos_instance_init(hos_instance instance)
|
|||||||
instance->hos_url_prefix = "http://127.0.0.1:9098/hos/";
|
instance->hos_url_prefix = "http://127.0.0.1:9098/hos/";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hos_callback(bool result, const char *bucket, const char *object, const char *error, void *userdata)
|
static void hos_callback(bool result, const char *bucket, const char *object, const char *error, size_t errorcode, void *userdata)
|
||||||
{
|
{
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
EXPECT_EQ(result, true);
|
EXPECT_EQ(result, true);
|
||||||
EXPECT_STREQ(bucket, HOS_BUCKET);
|
EXPECT_STREQ(bucket, HOS_BUCKET);
|
||||||
EXPECT_STREQ(object, (char *)userdata);
|
EXPECT_STREQ(object, (char *)userdata);
|
||||||
EXPECT_STREQ(error, NULL);
|
EXPECT_STREQ(error, NULL);
|
||||||
|
EXPECT_EQ(error, nullptr);
|
||||||
|
EXPECT_EQ(errorcode, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hos_bucket_not_exits_cb(bool result, const char *bucket, const char *object, const char *error, void *userdata)
|
static void hos_bucket_not_exits_cb(bool result, const char *bucket, const char *object, const char *error, size_t errorcode, void *userdata)
|
||||||
{
|
{
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
EXPECT_EQ(result, false);
|
EXPECT_EQ(result, false);
|
||||||
EXPECT_STREQ(bucket, "bucket_not_exits");
|
EXPECT_STREQ(bucket, "bucket_not_exits");
|
||||||
EXPECT_STREQ(object, (char *)userdata);
|
EXPECT_STREQ(object, (char *)userdata);
|
||||||
EXPECT_STREQ(error, "The specified bucket does not exist.");
|
EXPECT_STREQ(error, "The specified bucket does not exist.");
|
||||||
|
EXPECT_EQ(errorcode, NO_SUCH_BUCKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(hos_upload_buff, normal)
|
TEST(hos_upload_buff, normal)
|
||||||
|
|||||||
@@ -50,22 +50,25 @@ static void gtest_hos_instance_init(hos_instance instance)
|
|||||||
instance->hos_url_prefix = "http://127.0.0.1:9098/hos/";
|
instance->hos_url_prefix = "http://127.0.0.1:9098/hos/";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hos_callback(bool result, const char *bucket, const char *object, const char *error, void *userdata)
|
static void hos_callback(bool result, const char *bucket, const char *object, const char *error, size_t errorcode, void *userdata)
|
||||||
{
|
{
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
EXPECT_EQ(result, true);
|
EXPECT_EQ(result, true);
|
||||||
EXPECT_STREQ(bucket, HOS_BUCKET);
|
EXPECT_STREQ(bucket, HOS_BUCKET);
|
||||||
EXPECT_STREQ(object, (char *)userdata);
|
EXPECT_STREQ(object, (char *)userdata);
|
||||||
EXPECT_STREQ(error, NULL);
|
EXPECT_STREQ(error, NULL);
|
||||||
|
EXPECT_EQ(error, nullptr);
|
||||||
|
EXPECT_EQ(errorcode, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hos_bucket_not_exits_cb(bool result, const char *bucket, const char *object, const char *error, void *userdata)
|
static void hos_bucket_not_exits_cb(bool result, const char *bucket, const char *object, const char *error, size_t errorcode, void *userdata)
|
||||||
{
|
{
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
EXPECT_EQ(result, false);
|
EXPECT_EQ(result, false);
|
||||||
EXPECT_STREQ(bucket, HOS_CONF);
|
EXPECT_STREQ(bucket, HOS_CONF);
|
||||||
EXPECT_STREQ(object, (char *)userdata);
|
EXPECT_STREQ(object, (char *)userdata);
|
||||||
EXPECT_STREQ(error, "The specified bucket does not exist.");
|
EXPECT_STREQ(error, "The specified bucket does not exist.");
|
||||||
|
EXPECT_EQ(errorcode, NO_SUCH_BUCKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(hos_upload_file, normal)
|
TEST(hos_upload_file, normal)
|
||||||
|
|||||||
@@ -66,40 +66,44 @@ static void gtest_hos_fd_init(hos_fd_context_t *fd_info)
|
|||||||
fd_info->userdata = NULL;
|
fd_info->userdata = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hos_callback(bool result, const char *bucket, const char *object, const char *error, void *userdata)
|
static void hos_callback(bool result, const char *bucket, const char *object, const char *error, size_t errorcode, void *userdata)
|
||||||
{
|
{
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
EXPECT_EQ(result, true);
|
EXPECT_EQ(result, true);
|
||||||
EXPECT_STREQ(bucket, HOS_BUCKET);
|
EXPECT_STREQ(bucket, HOS_BUCKET);
|
||||||
EXPECT_STREQ(object, (char *)userdata);
|
EXPECT_STREQ(object, (char *)userdata);
|
||||||
EXPECT_STREQ(error, NULL);
|
EXPECT_STREQ(error, NULL);
|
||||||
|
EXPECT_EQ(errorcode, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hos_write_buff_cb(bool result, const char *bucket, const char *object, const char *error, void *userdata)
|
static void hos_write_buff_cb(bool result, const char *bucket, const char *object, const char *error, size_t errorcode, void *userdata)
|
||||||
{
|
{
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
EXPECT_EQ(result, true);
|
EXPECT_EQ(result, true);
|
||||||
EXPECT_STREQ(bucket, HOS_BUCKET);
|
EXPECT_STREQ(bucket, HOS_BUCKET);
|
||||||
EXPECT_STREQ(object, (char *)userdata);
|
EXPECT_STREQ(object, (char *)userdata);
|
||||||
EXPECT_STREQ(error, NULL);
|
EXPECT_STREQ(error, NULL);
|
||||||
|
EXPECT_EQ(errorcode, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hos_write_append_cb(bool result, const char *bucket, const char *object, const char *error, void *userdata)
|
static void hos_write_append_cb(bool result, const char *bucket, const char *object, const char *error, size_t errorcode, void *userdata)
|
||||||
{
|
{
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
EXPECT_EQ(result, true);
|
EXPECT_EQ(result, true);
|
||||||
EXPECT_STREQ(bucket, HOS_BUCKET);
|
EXPECT_STREQ(bucket, HOS_BUCKET);
|
||||||
EXPECT_STREQ(object, (char *)userdata);
|
EXPECT_STREQ(object, (char *)userdata);
|
||||||
EXPECT_STREQ(error, NULL);
|
EXPECT_STREQ(error, NULL);
|
||||||
|
EXPECT_EQ(errorcode, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hos_bucket_not_exits_cb(bool result, const char *bucket, const char *object, const char *error, void *userdata)
|
static void hos_bucket_not_exits_cb(bool result, const char *bucket, const char *object, const char *error, size_t errorcode, void *userdata)
|
||||||
{
|
{
|
||||||
SUCCEED();
|
SUCCEED();
|
||||||
EXPECT_EQ(result, false);
|
EXPECT_EQ(result, false);
|
||||||
EXPECT_STREQ(bucket, "bucket_not_exits");
|
EXPECT_STREQ(bucket, "bucket_not_exits");
|
||||||
EXPECT_STREQ(object, (char *)userdata);
|
EXPECT_STREQ(object, (char *)userdata);
|
||||||
EXPECT_STREQ(error, "The specified bucket does not exist.");
|
EXPECT_STREQ(error, "The specified bucket does not exist.");
|
||||||
|
EXPECT_EQ(errorcode, NO_SUCH_BUCKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(hos_write, normal)
|
TEST(hos_write, normal)
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ static int hos_delete_fd(size_t fd, size_t thread_id)
|
|||||||
put_finished_callback callback = (put_finished_callback)context->callback;
|
put_finished_callback callback = (put_finished_callback)context->callback;
|
||||||
if (callback)
|
if (callback)
|
||||||
{
|
{
|
||||||
callback(context->reslut, context->bucket, context->object, context->error, context->userdata);
|
callback(context->reslut, context->bucket, context->object, context->error, context->errorcode, context->userdata);
|
||||||
}
|
}
|
||||||
if (context->bucket)
|
if (context->bucket)
|
||||||
{
|
{
|
||||||
@@ -85,7 +85,6 @@ static void PutObjectAsyncFinished(const Aws::S3::S3Client* S3Client,
|
|||||||
const Aws::S3::Model::PutObjectOutcome& outcome,
|
const Aws::S3::Model::PutObjectOutcome& outcome,
|
||||||
const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context)
|
const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context)
|
||||||
{
|
{
|
||||||
const char *error = NULL;
|
|
||||||
hos_fd_context_t *a_fd_context = NULL;
|
hos_fd_context_t *a_fd_context = NULL;
|
||||||
hos_func_thread_t *hos_func = &g_hos_handle.hos_func;
|
hos_func_thread_t *hos_func = &g_hos_handle.hos_func;
|
||||||
data_info_t *data_info = NULL;
|
data_info_t *data_info = NULL;
|
||||||
@@ -109,11 +108,13 @@ static void PutObjectAsyncFinished(const Aws::S3::S3Client* S3Client,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool result = outcome.IsSuccess();
|
bool result = outcome.IsSuccess();
|
||||||
|
a_fd_context->reslut = result;
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
error = outcome.GetError().GetMessage().c_str();
|
a_fd_context->error = outcome.GetError().GetMessage().c_str();
|
||||||
|
a_fd_context->errorcode = (size_t)outcome.GetError().GetErrorType() + 1;
|
||||||
MESA_HANDLE_RUNTIME_LOG(g_hos_handle.log, RLOG_LV_FATAL, __FUNCTION__,
|
MESA_HANDLE_RUNTIME_LOG(g_hos_handle.log, RLOG_LV_FATAL, __FUNCTION__,
|
||||||
"error: [%s:%s] upload failed. error:%s", a_fd_context->bucket, a_fd_context->object, error);
|
"error: [%s:%s] upload failed. error:%s", a_fd_context->bucket, a_fd_context->object, a_fd_context->error);
|
||||||
|
|
||||||
if (hos_func->fs2_info.fs2_handle && hos_func->fs2_info.reserved)
|
if (hos_func->fs2_info.fs2_handle && hos_func->fs2_info.reserved)
|
||||||
{
|
{
|
||||||
@@ -121,6 +122,12 @@ static void PutObjectAsyncFinished(const Aws::S3::S3Client* S3Client,
|
|||||||
data_info->tx_failed_pkts[thread_id]++;
|
data_info->tx_failed_pkts[thread_id]++;
|
||||||
data_info->tx_failed_bytes[thread_id] += stream_len;
|
data_info->tx_failed_bytes[thread_id] += stream_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
put_finished_callback callback = (put_finished_callback)a_fd_context->callback;
|
||||||
|
if (callback)
|
||||||
|
{
|
||||||
|
callback(a_fd_context->reslut, a_fd_context->bucket, a_fd_context->object, a_fd_context->error, a_fd_context->errorcode, a_fd_context->userdata);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -139,9 +146,9 @@ static void PutObjectAsyncFinished(const Aws::S3::S3Client* S3Client,
|
|||||||
MESA_HANDLE_RUNTIME_LOG(g_hos_handle.log, RLOG_LV_DEBUG, __FUNCTION__,
|
MESA_HANDLE_RUNTIME_LOG(g_hos_handle.log, RLOG_LV_DEBUG, __FUNCTION__,
|
||||||
"debug: [%s:%s] upload success. stream size:%lu", a_fd_context->bucket, a_fd_context->object, stream_len);
|
"debug: [%s:%s] upload success. stream size:%lu", a_fd_context->bucket, a_fd_context->object, stream_len);
|
||||||
}
|
}
|
||||||
|
a_fd_context->error = NULL;
|
||||||
|
a_fd_context->errorcode = 0;
|
||||||
}
|
}
|
||||||
a_fd_context->reslut = result;
|
|
||||||
a_fd_context->error = error;
|
|
||||||
|
|
||||||
if (a_fd_context->mode & APPEND_MODE)
|
if (a_fd_context->mode & APPEND_MODE)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ enum s3errors
|
|||||||
OBJECT_NOT_IN_ACTIVE_TIER
|
OBJECT_NOT_IN_ACTIVE_TIER
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*put_finished_callback)(bool result, const char *bucket, const char *object, const char *errmsg, void *userdata);
|
typedef void (*put_finished_callback)(bool result, const char *bucket, const char *object, const char *errmsg, size_t errorcode, void *userdata);
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************************
|
/*************************************************************************************
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ typedef struct hos_fd_context_s
|
|||||||
#define HOS_FD_CANCEL 1
|
#define HOS_FD_CANCEL 1
|
||||||
bool reslut; /*PutObjectAsync result*/
|
bool reslut; /*PutObjectAsync result*/
|
||||||
const char *error; /*PutObjectAsync error message*/
|
const char *error; /*PutObjectAsync error message*/
|
||||||
|
size_t errorcode;
|
||||||
|
|
||||||
}hos_fd_context_t;
|
}hos_fd_context_t;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user