diff --git a/example/demo/hos_write_demo.cpp b/example/demo/hos_write_demo.cpp index 7092c0a0..7f794e20 100644 --- a/example/demo/hos_write_demo.cpp +++ b/example/demo/hos_write_demo.cpp @@ -52,7 +52,7 @@ int file_to_buffer(const char *file, char *buffer, int size) 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 ; } diff --git a/example/performance/HosClientPerformance.cpp b/example/performance/HosClientPerformance.cpp index 120c4194..cee829f7 100644 --- a/example/performance/HosClientPerformance.cpp +++ b/example/performance/HosClientPerformance.cpp @@ -78,7 +78,7 @@ int read_file_list(const char *path, char file_name[][STRING_SIZE]) 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 userdata_t *data = (userdata_t *)userdata; diff --git a/gtest/gtest_hos_upload_buff.cpp b/gtest/gtest_hos_upload_buff.cpp index 9ac78b06..c12eaf26 100644 --- a/gtest/gtest_hos_upload_buff.cpp +++ b/gtest/gtest_hos_upload_buff.cpp @@ -50,22 +50,25 @@ static void gtest_hos_instance_init(hos_instance instance) 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(); EXPECT_EQ(result, true); EXPECT_STREQ(bucket, HOS_BUCKET); EXPECT_STREQ(object, (char *)userdata); 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(); EXPECT_EQ(result, false); EXPECT_STREQ(bucket, "bucket_not_exits"); EXPECT_STREQ(object, (char *)userdata); EXPECT_STREQ(error, "The specified bucket does not exist."); + EXPECT_EQ(errorcode, NO_SUCH_BUCKET); } TEST(hos_upload_buff, normal) diff --git a/gtest/gtest_hos_upload_file.cpp b/gtest/gtest_hos_upload_file.cpp index 57a22e72..23c47010 100644 --- a/gtest/gtest_hos_upload_file.cpp +++ b/gtest/gtest_hos_upload_file.cpp @@ -50,22 +50,25 @@ static void gtest_hos_instance_init(hos_instance instance) 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(); EXPECT_EQ(result, true); EXPECT_STREQ(bucket, HOS_BUCKET); EXPECT_STREQ(object, (char *)userdata); 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(); EXPECT_EQ(result, false); EXPECT_STREQ(bucket, HOS_CONF); EXPECT_STREQ(object, (char *)userdata); EXPECT_STREQ(error, "The specified bucket does not exist."); + EXPECT_EQ(errorcode, NO_SUCH_BUCKET); } TEST(hos_upload_file, normal) diff --git a/gtest/gtest_hos_write.cpp b/gtest/gtest_hos_write.cpp index 9f46d6f3..256fe014 100644 --- a/gtest/gtest_hos_write.cpp +++ b/gtest/gtest_hos_write.cpp @@ -66,40 +66,44 @@ static void gtest_hos_fd_init(hos_fd_context_t *fd_info) 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(); EXPECT_EQ(result, true); EXPECT_STREQ(bucket, HOS_BUCKET); EXPECT_STREQ(object, (char *)userdata); 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(); EXPECT_EQ(result, true); EXPECT_STREQ(bucket, HOS_BUCKET); EXPECT_STREQ(object, (char *)userdata); 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(); EXPECT_EQ(result, true); EXPECT_STREQ(bucket, HOS_BUCKET); EXPECT_STREQ(object, (char *)userdata); 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(); EXPECT_EQ(result, false); EXPECT_STREQ(bucket, "bucket_not_exits"); EXPECT_STREQ(object, (char *)userdata); EXPECT_STREQ(error, "The specified bucket does not exist."); + EXPECT_EQ(errorcode, NO_SUCH_BUCKET); } TEST(hos_write, normal) diff --git a/src/hos_client.cpp b/src/hos_client.cpp index a6cbf4e6..225de569 100644 --- a/src/hos_client.cpp +++ b/src/hos_client.cpp @@ -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; 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) { @@ -85,7 +85,6 @@ static void PutObjectAsyncFinished(const Aws::S3::S3Client* S3Client, const Aws::S3::Model::PutObjectOutcome& outcome, const std::shared_ptr& context) { - const char *error = NULL; hos_fd_context_t *a_fd_context = NULL; hos_func_thread_t *hos_func = &g_hos_handle.hos_func; data_info_t *data_info = NULL; @@ -109,11 +108,13 @@ static void PutObjectAsyncFinished(const Aws::S3::S3Client* S3Client, else { bool result = outcome.IsSuccess(); + a_fd_context->reslut = 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__, - "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) { @@ -121,6 +122,12 @@ static void PutObjectAsyncFinished(const Aws::S3::S3Client* S3Client, data_info->tx_failed_pkts[thread_id]++; 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 { @@ -139,9 +146,9 @@ static void PutObjectAsyncFinished(const Aws::S3::S3Client* S3Client, 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); } + 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) { diff --git a/src/hos_client.h b/src/hos_client.h index b1b85491..e5b775dc 100644 --- a/src/hos_client.h +++ b/src/hos_client.h @@ -78,7 +78,7 @@ enum s3errors 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); /************************************************************************************* diff --git a/src/hos_common.h b/src/hos_common.h index b6583053..ec4a8467 100644 --- a/src/hos_common.h +++ b/src/hos_common.h @@ -135,6 +135,7 @@ typedef struct hos_fd_context_s #define HOS_FD_CANCEL 1 bool reslut; /*PutObjectAsync result*/ const char *error; /*PutObjectAsync error message*/ + size_t errorcode; }hos_fd_context_t;