From 42c76b1282f10a882da4e5a4597d2c990de09726 Mon Sep 17 00:00:00 2001 From: chenzhikai <895543892@qq.com> Date: Mon, 7 Apr 2025 16:57:41 +0800 Subject: [PATCH 1/2] =?UTF-8?q?read=20write=E5=A2=9E=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md | 65 +++--- src/cmd/wrcmd.c | 3 - src/common/persist/wr_file_def.h | 2 +- src/common/wr_file.c | 14 +- src/common/wr_file.h | 2 +- src/common/wr_filesystem.c | 29 +++ src/common/wr_filesystem.h | 5 + src/common/wr_protocol.c | 2 + src/common/wr_protocol.h | 2 + src/common_api/wr_api_impl.c | 275 +++++++++----------------- src/common_api/wr_api_impl.h | 26 ++- src/interface/wr_api.c | 64 +----- src/interface/wr_api.h | 7 +- src/service/wr_service.c | 78 ++++++-- test/demo/test1.c | 5 +- test/gtest/CMakeLists.txt | 1 + test/gtest/test_wr_api.cc | 89 +++++---- 17 files changed, 320 insertions(+), 349 deletions(-) diff --git a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md index 65891e6..c5ddfdf 100644 --- a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md +++ b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md @@ -1,43 +1,54 @@ - +# Pull Request 模板 - +感谢您提交 Pull Request!请确保填写以下信息,以便于代码审查和合并。 -【标题】(请简要描述下实现的内容) +## 标题 +简要描述本次提交的主要内容。 -必填项,否则禁止合入 +## 变更内容 +- 描述本次提交实现了哪些功能或修复了哪些问题。 +- 列出主要的代码变更点。 -【实现内容】: +## 问题根因 +- 分析并描述导致问题的根本原因。 -必填项,否则禁止合入 +## 解决方案 +- 详细说明解决问题的方法和步骤。 -【根因分析】: +## 关联的需求或 Issue +- 提供相关需求或 Issue 的链接或编号。 +- 确认是否解决了相关需求或 Issue。 -必填项,否则禁止合入 +## 测试用例 +- 提供测试用例的描述或截图。 +- 确认测试用例是否覆盖了主要的功能点。 -【实现方案】: +## 代码审查 +- 提供代码审查的描述或截图。 +- 确认代码审查是否通过。 -必填项,否则禁止合入 +## 文档更新 +- 提供文档更新的描述或截图。 +- 确认文档更新是否准确反映了代码变更。 -【关联需求或issue】: +## 风险评估 +- 分析并评估本次变更可能带来的风险。 -必填项,否则禁止合入 +## 依赖关系 +- 描述本次变更依赖的其他模块或功能。 +- 确认是否需要同步其他模块或功能。 -【开发自验报告】: -1. 请附上自验结果(内容或者截图) +## 自测报告 +- 附上自测结果的描述或截图。 +- 确认是否涉及文档更新,如有,请在相关仓库中更新。 +- 确认是否涉及接口变更,如有,请在相关仓库中同步。 -必填项,否则禁止合入 +## 影响评估 +- 说明本次变更是否会影响其他模块或功能。 -2. 是否涉及资料修改,如是,请在docs仓库补充资料 +## 其他说明 +- 提供任何其他相关信息或备注。 -必填项,否则禁止合入 +--- -3. 是否涉及接口修改,如是,请在openGauss-server仓库同步 - -必填项,否则禁止合入 - -4. 是否对其他模块产生影响 - -必填项,否则禁止合入 - -【其他说明】: -选填 \ No newline at end of file +请确保所有必填项均已填写完整,以便于顺利合并。感谢您的贡献! \ No newline at end of file diff --git a/src/cmd/wrcmd.c b/src/cmd/wrcmd.c index cecbe36..360ccab 100644 --- a/src/cmd/wrcmd.c +++ b/src/cmd/wrcmd.c @@ -1135,9 +1135,6 @@ static status_t print_file_proc(wr_conn_t *conn, int32 handle, int64 offset, int int64 offset_shift = offset - row_aligned_offset; while (read_cnt < read_size) { - CM_RETURN_IFERR_EX(wr_read_file_impl(conn, handle, o_buf, sizeof(o_buf), &cur_read_size), - LOG_DEBUG_ERR("Failed to read file.\n")); - if (cur_read_size > read_size - read_cnt) { cur_read_size = read_size - read_cnt; } diff --git a/src/common/persist/wr_file_def.h b/src/common/persist/wr_file_def.h index 450c20b..ab68643 100644 --- a/src/common/persist/wr_file_def.h +++ b/src/common/persist/wr_file_def.h @@ -222,7 +222,7 @@ typedef struct st_wr_file_context { int64 vol_offset; wr_vg_info_item_t *vg_item; uint64 fid; - char vg_name[WR_MAX_NAME_LEN]; + char file_path[WR_MAX_NAME_LEN]; uint32 vgid; uint32 id; wr_file_mode_e mode; diff --git a/src/common/wr_file.c b/src/common/wr_file.c index 1ce1827..e3a9fd7 100644 --- a/src/common/wr_file.c +++ b/src/common/wr_file.c @@ -46,6 +46,7 @@ wr_env_t *wr_get_env(void) { return &g_wr_env; } + // CAUTION: wr_admin manager command just like wr_create_vg,cannot call it, wr_config_t *wr_get_inst_cfg(void) { @@ -416,14 +417,15 @@ static status_t wr_open_file_core( return CM_SUCCESS; } -status_t wr_open_file(wr_session_t *session, const char *file, int32_t flag, wr_find_node_t *find_info) +status_t wr_open_file(wr_session_t *session, const char *file, int32_t flag, int64_t *fd) { WR_LOG_DEBUG_OP("Begin to open file:%s, session id:%u.", file, session->id); - gft_node_t *out_node = NULL; - CM_RETURN_IFERR(wr_open_file_core(session, file, GFT_FILE, &out_node, find_info)); - uint64 fid = out_node->fid; - WR_LOG_DEBUG_OP("Succeed to open file:%s, fid:%llu, ftid:%s, session:%u.", file, fid, - wr_display_metaid(out_node->id), session->id); + *fd = wr_filesystem_open(file); + if (*fd == -1) { + LOG_RUN_ERR("[FS]Failed to open file:%s.", file); + return CM_ERROR; + } + WR_LOG_DEBUG_OP("Succeed to open file:%s, fd:%d, session:%u.", file, *fd, session->id); return CM_SUCCESS; } diff --git a/src/common/wr_file.h b/src/common/wr_file.h index 48ad314..e0ced99 100644 --- a/src/common/wr_file.h +++ b/src/common/wr_file.h @@ -58,7 +58,7 @@ void wr_unlock_vg_mem_and_shm(wr_session_t *session, wr_vg_info_item_t *vg_item) status_t wr_create_file(wr_session_t *session, const char *parent, const char *name, int32_t flag); status_t wr_exist_item(wr_session_t *session, const char *item, bool32 *result, gft_item_type_t *output_type); -status_t wr_open_file(wr_session_t *session, const char *file, int32_t flag, wr_find_node_t *find_info); +status_t wr_open_file(wr_session_t *session, const char *file, int32_t flag, int64_t *fd); status_t wr_close_file(wr_session_t *session, wr_vg_info_item_t *vg_item, uint64 ftid); status_t wr_extend(wr_session_t *session, wr_node_data_t *node_data); status_t wr_do_fallocate(wr_session_t *session, wr_node_data_t *node_data); diff --git a/src/common/wr_filesystem.c b/src/common/wr_filesystem.c index 7077bb1..086516b 100644 --- a/src/common/wr_filesystem.c +++ b/src/common/wr_filesystem.c @@ -73,6 +73,35 @@ status_t wr_filesystem_rm(const char *name) return CM_SUCCESS; } +status_t wr_filesystem_write(int64_t handle, int64_t offset, int64_t size, const char *buf) +{ + if (pwrite(handle, buf, size, offset) == -1) { + LOG_RUN_ERR("[FS]Failed to write handle:%lld, offset:%lld, size:%lld.", handle, offset, size); + return CM_ERROR; + } + return CM_SUCCESS; +} + +status_t wr_filesystem_pread(int64_t handle, int64_t offset, int64_t size, char *buf) +{ + if (pread(handle, buf, size, offset) == -1) { + LOG_RUN_ERR("[FS]Failed to pread handle:%lld, offset:%lld, size:%lld.", handle, offset, size); + return CM_ERROR; + } + return CM_SUCCESS; +} + +int wr_filesystem_open(const char *file_path) +{ + return open(file_path, O_RDWR, 0644); +} + +int wr_filesystem_close(int fd) +{ + return close(fd); +} + + #ifdef __cplusplus } #endif diff --git a/src/common/wr_filesystem.h b/src/common/wr_filesystem.h index dc600a7..2854a2c 100644 --- a/src/common/wr_filesystem.h +++ b/src/common/wr_filesystem.h @@ -13,6 +13,11 @@ status_t wr_filesystem_mkdir(const char *name, mode_t mode); status_t wr_filesystem_rmdir(const char *name); status_t wr_filesystem_touch(const char *name); status_t wr_filesystem_rm(const char *name); +status_t wr_filesystem_write(int64_t handle, int64_t offset, int64_t size, const char *buf); +status_t wr_filesystem_pread(int64_t handle, int64_t offset, int64_t size, char *buf); +int wr_filesystem_open(const char *file_path); +int wr_filesystem_close(int fd); + #ifdef __cplusplus } diff --git a/src/common/wr_protocol.c b/src/common/wr_protocol.c index 8135ca1..d89c1d8 100644 --- a/src/common/wr_protocol.c +++ b/src/common/wr_protocol.c @@ -37,6 +37,8 @@ static char *g_wr_cmd_desc[WR_CMD_TYPE_OFFSET(WR_CMD_END)] = { [WR_CMD_TYPE_OFFSET(WR_CMD_CLOSE_FILE)] = "close file", [WR_CMD_TYPE_OFFSET(WR_CMD_CREATE_FILE)] = "create file", [WR_CMD_TYPE_OFFSET(WR_CMD_DELETE_FILE)] = "delete file", + [WR_CMD_TYPE_OFFSET(WR_CMD_WRITE_FILE)] = "write file", + [WR_CMD_TYPE_OFFSET(WR_CMD_READ_FILE)] = "read file", [WR_CMD_TYPE_OFFSET(WR_CMD_EXTEND_FILE)] = "extend file", [WR_CMD_TYPE_OFFSET(WR_CMD_RENAME_FILE)] = "rename file", [WR_CMD_TYPE_OFFSET(WR_CMD_REFRESH_FILE)] = "refresh file", diff --git a/src/common/wr_protocol.h b/src/common/wr_protocol.h index 11d2be8..df53cf7 100644 --- a/src/common/wr_protocol.h +++ b/src/common/wr_protocol.h @@ -52,6 +52,8 @@ typedef enum { WR_CMD_CLOSE_FILE, WR_CMD_CREATE_FILE, WR_CMD_DELETE_FILE, + WR_CMD_WRITE_FILE, + WR_CMD_READ_FILE, WR_CMD_EXTEND_FILE, WR_CMD_RENAME_FILE, WR_CMD_REFRESH_FILE, diff --git a/src/common_api/wr_api_impl.c b/src/common_api/wr_api_impl.c index 395f0a1..3f93010 100644 --- a/src/common_api/wr_api_impl.c +++ b/src/common_api/wr_api_impl.c @@ -82,7 +82,7 @@ status_t wr_apply_extending_file(wr_conn_t *conn, int32 handle, int64 size, int6 send_info.ftid = *(uint64 *)&(context->node->id); send_info.offset = offset; send_info.size = size; - send_info.vg_name = context->vg_name; + // send_info.vg_name = context->vg_name; send_info.vg_id = context->vgid; return wr_msg_interact_with_stat(conn, WR_CMD_EXTEND_FILE, (void *)&send_info, NULL); } @@ -115,18 +115,7 @@ status_t wr_apply_fallocate_file(wr_conn_t *conn, int32 handle, int32 mode, int6 status_t wr_apply_refresh_file(wr_conn_t *conn, wr_file_context_t *context, int64 offset) { - ftid_t ftid = context->node->id; - LOG_DEBUG_INF( - "Apply refresh file:%s, curr size:%llu, refresh ft id:%llu, refresh entry id:%llu, refresh offset:%llu.", - context->node->name, context->node->size, WR_ID_TO_U64(ftid), WR_ID_TO_U64(context->node->entry), offset); - - wr_refresh_file_info_t send_info; - send_info.fid = context->fid; - send_info.ftid = *(uint64 *)(&ftid); - send_info.vg_name = context->vg_name; - send_info.vg_id = context->vgid; - send_info.offset = offset; - return wr_msg_interact_with_stat(conn, WR_CMD_REFRESH_FILE, (void *)&send_info, NULL); + return CM_SUCCESS; } static status_t wr_check_apply_refresh_file(wr_conn_t *conn, wr_file_context_t *context, int64 offset) @@ -151,12 +140,6 @@ static status_t wr_check_apply_refresh_file(wr_conn_t *conn, wr_file_context_t * return CM_SUCCESS; } -static status_t wr_check_refresh_file_by_offset( - wr_conn_t *conn, wr_file_context_t *context, int64 offset, bool32 is_read) -{ - return CM_SUCCESS; -} - status_t wr_lock_vg_s(wr_vg_info_item_t *vg_item, wr_session_t *session) { wr_latch_offset_t latch_offset; @@ -599,7 +582,7 @@ gft_node_t *wr_get_node_by_path_impl(wr_conn_t *conn, const char *path) WR_UNLOCK_VG_META_S(vg_item, conn->session); return node; } - +// TODO: 这里要大改 status_t wr_init_file_context( wr_file_context_t *context, gft_node_t *out_node, wr_vg_info_item_t *vg_item, wr_file_mode_e mode) { @@ -612,7 +595,7 @@ status_t wr_init_file_context( context->fid = out_node->fid; context->vol_offset = 0; context->tid = cm_get_current_thread_id(); - if (strcpy_s(context->vg_name, WR_MAX_NAME_LEN, vg_item->vg_name) != EOK) { + if (strcpy_s(context->file_path, WR_MAX_NAME_LEN, out_node->name) != EOK) { return CM_ERROR; } context->mode = mode; @@ -694,12 +677,12 @@ status_t wr_open_file_inner(wr_vg_info_item_t *vg_item, gft_node_t *ft_node, wr_ return CM_SUCCESS; } -status_t wr_open_file_on_server(wr_conn_t *conn, const char *file_path, int flag, wr_find_node_t **find_node) +status_t wr_open_file_on_server(wr_conn_t *conn, const char *file_path, int flag, int64_t *fd) { wr_open_file_info_t send_info; send_info.file_path = file_path; send_info.flag = flag; - return wr_msg_interact(conn, WR_CMD_OPEN_FILE, (void *)&send_info, (void *)find_node); + return wr_msg_interact(conn, WR_CMD_OPEN_FILE, (void*)&send_info, (void*)fd); } status_t wr_open_file_impl(wr_conn_t *conn, const char *file_path, int flag, int *handle) @@ -709,35 +692,8 @@ status_t wr_open_file_impl(wr_conn_t *conn, const char *file_path, int flag, int wr_find_node_t *find_node = NULL; LOG_DEBUG_INF("wr begin to open file, file path:%s, flag:%d", file_path, flag); WR_RETURN_IF_ERROR(wr_check_device_path(file_path)); - WR_RETURN_IF_ERROR(wr_open_file_on_server(conn, file_path, flag, &find_node)); - wr_vg_info_item_t *vg_item = wr_find_vg_item(find_node->vg_name); - if (vg_item == NULL) { - LOG_RUN_ERR("Failed to find vg, vg name %s.", find_node->vg_name); - WR_THROW_ERROR(ERR_WR_VG_NOT_EXIST, find_node->vg_name); - return CM_ERROR; - } - WR_LOCK_VG_META_S_RETURN_ERROR(vg_item, conn->session); - do { - ft_node = wr_get_ft_node_by_ftid(conn->session, vg_item, find_node->ftid, CM_FALSE, CM_FALSE); - if (ft_node == NULL) { - WR_THROW_ERROR(ERR_WR_INVALID_ID, "find_node ftid", *(uint64 *)&find_node->ftid); - status = CM_ERROR; - break; - } - status = wr_open_file_inner(vg_item, ft_node, WR_OPEN_MODE(flag), handle); - } while (0); - WR_UNLOCK_VG_META_S(vg_item, conn->session); - - if (status != CM_SUCCESS) { - // Try to close the handle opened on the server to avoid resource leakage. - // But here in theory it shouldn't depend on ft_node not being NULL - if (ft_node != NULL) { - (void)wr_close_file_on_server(conn, vg_item, ft_node->fid, ft_node->id); - } - return status; - } - LOG_DEBUG_INF("wr open file successfully, file_path:%s, flag:%d, handle:%d, fsize:%llu, fwritten_size:%llu", - file_path, flag, *handle, ft_node->size, ft_node->written_size); + WR_RETURN_IF_ERROR(wr_open_file_on_server(conn, file_path, flag, handle)); + LOG_DEBUG_INF("wr open file successfully, file_path:%s, flag:%d, handle:%d", file_path, flag, *handle); return CM_SUCCESS; } @@ -759,9 +715,9 @@ status_t wr_latch_context_by_handle( } wr_file_context_t *file_cxt = wr_get_file_context_by_handle(file_run_ctx, handle); - wr_latch(&file_cxt->latch, latch_mode, ((wr_session_t *)conn->session)->id); + // wr_latch(&file_cxt->latch, latch_mode, ((wr_session_t *)conn->session)->id); if (file_cxt->flag == WR_FILE_CONTEXT_FLAG_FREE) { - wr_unlatch(&file_cxt->latch); + // wr_unlatch(&file_cxt->latch); LOG_DEBUG_ERR("Failed to r/w, file is closed, handle:%d, context id:%u.", handle, file_cxt->id); return CM_ERROR; } @@ -769,7 +725,7 @@ status_t wr_latch_context_by_handle( WR_ASSERT_LOG(handle == (int32)file_cxt->id, "handle %d not equal to file id %u", handle, file_cxt->id); if (file_cxt->node == NULL) { - wr_unlatch(&file_cxt->latch); + // wr_unlatch(&file_cxt->latch); LOG_DEBUG_ERR("file node is null, handle:%d, context id:%u.", handle, file_cxt->id); return CM_ERROR; } @@ -783,32 +739,12 @@ status_t wr_close_file_impl(wr_conn_t *conn, int handle) char *fname = NULL; LOG_DEBUG_INF("wr close file entry, handle:%d", handle); - - wr_file_context_t *context = NULL; - WR_RETURN_IF_ERROR(wr_latch_context_by_handle(conn, handle, &context, LATCH_MODE_EXCLUSIVE)); - fname = context->node->name; - - status_t ret = wr_close_file_on_server(conn, context->vg_item, context->fid, context->node->id); + status_t ret = wr_close_file_on_server(conn, handle); if (ret != CM_SUCCESS) { - wr_unlatch(&context->latch); - LOG_DEBUG_INF("Failed to fclose, handle:%d, fname:%s, fid:%llu.", handle, fname, context->fid); + LOG_DEBUG_INF("Failed to fclose, handle:%d.", handle); return ret; } - context->flag = WR_FILE_CONTEXT_FLAG_FREE; - context->offset = 0; - context->node = NULL; - context->tid = 0; - wr_unlatch(&context->latch); - LOG_DEBUG_INF("Success to fclose, handle:%d, fname:%s, fid:%llu.", handle, fname, context->fid); - - /* release file context to freelist */ - wr_env_t *wr_env = wr_get_env(); - wr_latch_x(&wr_env->latch); - wr_file_run_ctx_t *file_run_ctx = &wr_env->file_run_ctx; - context->next = file_run_ctx->file_free_first; - file_run_ctx->file_free_first = context->id; - file_run_ctx->has_opened_files--; - wr_unlatch(&wr_env->latch); + LOG_DEBUG_INF("Success to fclose, handle:%d.", handle); return CM_SUCCESS; } @@ -945,13 +881,21 @@ int64 wr_seek_file_impl(wr_conn_t *conn, int handle, int64 offset, int origin) return new_offset; } -status_t wr_read_write_file_core(wr_rw_param_t *param, void *buf, int32 size, int32 *read_size) +status_t wr_read_write_file_core(wr_conn_t *conn, int64 offset, void *buf, int32 size, int64_t handle) { - status_t status = CM_SUCCESS; + LOG_DEBUG_INF("wr write file entry, handle:%lld, size:%d", handle, size); + wr_write_file_info_t send_info; + send_info.offset = offset; + send_info.handle = handle; + send_info.size = size; + send_info.buf = buf; + + status_t status = wr_msg_interact(conn, WR_CMD_WRITE_FILE, (void *)&send_info, NULL); + LOG_DEBUG_INF("wr write file leave"); return status; } -status_t wr_read_write_file(wr_conn_t *conn, int32 handle, void *buf, int32 size, int32 *read_size, bool32 is_read) +status_t wr_read_write_file(wr_conn_t *conn, int32 handle, void *buf, int32 size, int64 offset, bool32 is_read) { status_t status; wr_file_context_t *context = NULL; @@ -963,118 +907,65 @@ status_t wr_read_write_file(wr_conn_t *conn, int32 handle, void *buf, int32 size } LOG_DEBUG_INF("wr read write file entry, handle:%d, is_read:%u", handle, is_read); - WR_RETURN_IF_ERROR(wr_latch_context_by_handle(conn, handle, &context, LATCH_MODE_EXCLUSIVE)); + /* WR_RETURN_IF_ERROR(wr_latch_context_by_handle(conn, handle, &context, LATCH_MODE_EXCLUSIVE)); bool mode_match = is_read ? (context->mode & WR_FILE_MODE_READ) : (context->mode & WR_FILE_MODE_WRITE); if (!mode_match) { wr_unlatch(&context->latch); WR_THROW_ERROR(ERR_WR_FILE_RDWR_INSUFF_PER, is_read ? "read" : "write", context->mode); return CM_ERROR; } - wr_init_rw_param(¶m, conn, handle, context, context->offset, WR_FALSE); - param.is_read = is_read; - status = wr_read_write_file_core(¶m, buf, size, read_size); - wr_unlatch(&context->latch); + */ + // wr_init_rw_param(¶m, conn, handle, context, context->offset, WR_FALSE); + // param.is_read = is_read; + status = wr_read_write_file_core(conn, offset, buf, size, handle); + // wr_unlatch(&context->latch); LOG_DEBUG_INF("wr read write file leave"); return status; } -status_t wr_write_file_impl(wr_conn_t *conn, int handle, const void *buf, int size) +status_t wr_write_file_impl(wr_conn_t *conn, int handle, const void *buf, int size, long long offset) { - return wr_read_write_file(conn, handle, (void *)buf, size, NULL, WR_FALSE); -} - -status_t wr_read_file_impl(wr_conn_t *conn, int handle, void *buf, int size, int *read_size) -{ - if (read_size == NULL) { - return CM_ERROR; - } - - return wr_read_write_file(conn, handle, buf, size, read_size, WR_TRUE); -} - -static status_t wr_pwrite_file_prepare(wr_conn_t *conn, wr_file_context_t *context, long long offset) -{ - return CM_SUCCESS; -} - -status_t wr_pwrite_file_impl(wr_conn_t *conn, int handle, const void *buf, int size, long long offset) -{ - status_t status; wr_file_context_t *context = NULL; + wr_write_file_info_t send_info; wr_rw_param_t param; - CM_RETURN_IFERR(wr_latch_context_by_handle(conn, handle, &context, LATCH_MODE_SHARE)); - LOG_DEBUG_INF("wr pwrite file %s, handle:%d, offset:%lld, size:%d", context->node->name, handle, offset, size); - if (!(context->mode & WR_FILE_MODE_WRITE)) { - wr_unlatch(&context->latch); - WR_THROW_ERROR(ERR_WR_FILE_RDWR_INSUFF_PER, "pwrite", context->mode); + if (size < 0) { + LOG_DEBUG_ERR("File size is invalid: %d.", size); return CM_ERROR; } + LOG_DEBUG_INF("wr pwrite file entry, handle:%lld, size:%d, offset:%lld", handle, size, offset); - wr_init_rw_param(¶m, conn, handle, context, offset, WR_TRUE); - param.is_read = WR_FALSE; - wr_set_conn_wait_event(conn, WR_PWRITE_SYN_META); - if (wr_pwrite_file_prepare(conn, context, offset) != CM_SUCCESS) { - wr_unset_conn_wait_event(conn); - wr_unlatch(&context->latch); - return CM_ERROR; - } - status = wr_read_write_file_core(¶m, (void *)buf, size, NULL); - wr_unset_conn_wait_event(conn); - wr_unlatch(&context->latch); - LOG_DEBUG_INF("wr pwrite file leave, result: %d", status); + send_info.offset = offset; + send_info.handle = handle; + send_info.size = size; + send_info.buf = buf; - return status; -} + status_t status = wr_msg_interact(conn, WR_CMD_WRITE_FILE, (void *)&send_info, NULL); + LOG_DEBUG_INF("wr pwrite file leave"); -static status_t wr_pread_file_prepare( - wr_conn_t *conn, wr_file_context_t *context, int size, long long offset, bool32 *read_end) -{ - *read_end = CM_FALSE; - WR_LOCK_VG_META_S_RETURN_ERROR(context->vg_item, conn->session); - status_t status = wr_check_refresh_file_by_offset(conn, context, offset, CM_TRUE); - if (status != CM_SUCCESS) { - return status; - } - if ((uint64)offset == context->node->size || size == 0) { - *read_end = CM_TRUE; - } - WR_UNLOCK_VG_META_S(context->vg_item, conn->session); - return CM_SUCCESS; + return status; } -status_t wr_pread_file_impl(wr_conn_t *conn, int handle, void *buf, int size, long long offset, int *read_size) +status_t wr_pread_file_impl(wr_conn_t *conn, int handle, const void *buf, int size, long long offset) { - status_t status; - wr_file_context_t *context = NULL; + wr_write_file_info_t send_info; wr_rw_param_t param; - CM_RETURN_IFERR(wr_latch_context_by_handle(conn, handle, &context, LATCH_MODE_SHARE)); - LOG_DEBUG_INF( - "wr pread file entry, name:%s, handle:%d, offset:%lld, size:%d", context->node->name, handle, offset, size); - if (!(context->mode & WR_FILE_MODE_READ)) { - wr_unlatch(&context->latch); - WR_THROW_ERROR(ERR_WR_FILE_RDWR_INSUFF_PER, "pread", context->mode); + if (size < 0) { + LOG_DEBUG_ERR("File size is invalid: %d.", size); return CM_ERROR; } + LOG_DEBUG_INF("wr pwrite file entry, handle:%lld, size:%d, offset:%lld", handle, size, offset); + + send_info.offset = offset; + send_info.handle = handle; + send_info.size = size; + send_info.buf = buf; + + status_t status = wr_msg_interact(conn, WR_CMD_READ_FILE, (void *)&send_info, (void *)&send_info); + LOG_DEBUG_INF("wr pread file leave"); - wr_init_rw_param(¶m, conn, handle, context, offset, WR_TRUE); - param.is_read = WR_TRUE; - wr_set_conn_wait_event(conn, WR_PREAD_SYN_META); - do { - bool32 read_end = CM_FALSE; - status = wr_pread_file_prepare(conn, context, size, offset, &read_end); - WR_BREAK_IF_ERROR(status); - if (read_end) { - *read_size = 0; - break; - } - status = wr_read_write_file_core(¶m, buf, size, read_size); - } while (0); - wr_unset_conn_wait_event(conn); - wr_unlatch(&context->latch); - LOG_DEBUG_INF("wr pread file leave, result: %d", status); return status; } @@ -1159,7 +1050,7 @@ status_t wr_truncate_impl(wr_conn_t *conn, int handle, long long int length) send_info.fid = context->fid; send_info.ftid = *(uint64 *)&(context->node->id); send_info.length = (uint64)length; - send_info.vg_name = context->vg_name; + // send_info.vg_name = context->vg_name; send_info.vg_id = context->vgid; status_t status = wr_msg_interact(conn, WR_CMD_TRUNCATE_FILE, (void *)&send_info, NULL); wr_unlatch(&context->latch); @@ -1403,13 +1294,10 @@ status_t wr_set_main_inst_on_server(wr_conn_t *conn) return wr_msg_interact(conn, WR_CMD_SET_MAIN_INST, NULL, NULL); } -status_t wr_close_file_on_server(wr_conn_t *conn, wr_vg_info_item_t *vg_item, uint64 fid, ftid_t ftid) +status_t wr_close_file_on_server(wr_conn_t *conn, int64_t fd) { wr_close_file_info_t send_info; - send_info.fid = fid; - send_info.vg_name = vg_item->vg_name; - send_info.vg_id = vg_item->id; - send_info.ftid = *(uint64 *)&ftid; + send_info.fd = fd; return wr_msg_interact(conn, WR_CMD_CLOSE_FILE, (void *)&send_info, NULL); } @@ -1486,6 +1374,19 @@ static status_t wr_encode_handshake(wr_conn_t *conn, wr_packet_t *pack, void *se return CM_SUCCESS; } +static status_t wr_decode_read_file(wr_packet_t *ack_pack, void *ack) +{ + text_t buf = CM_NULL_TEXT; + wr_read_file_info_t *info = (wr_read_file_info_t *)ack; + CM_RETURN_IFERR(wr_get_text(ack_pack, &buf)); + errno_t errcode = memcpy_s(info->buf, info->size, buf.str, buf.len); + if (errcode != EOK) { + WR_THROW_ERROR(ERR_WR_CLI_EXEC_FAIL, wr_get_cmd_desc(WR_CMD_READ_FILE), "get read file data error"); + return CM_ERROR; + } + return CM_SUCCESS; +} + static status_t wr_decode_handshake(wr_packet_t *ack_pack, void *ack) { text_t ack_info = CM_NULL_TEXT; @@ -1579,6 +1480,25 @@ static status_t wr_encode_truncate_file(wr_conn_t *conn, wr_packet_t *pack, void return CM_SUCCESS; } +static status_t wr_encode_write_file(wr_conn_t *conn, wr_packet_t *pack, void *send_info) +{ + wr_write_file_info_t *info = (wr_write_file_info_t *)send_info; + CM_RETURN_IFERR(wr_put_int64(pack, info->offset)); + CM_RETURN_IFERR(wr_put_int64(pack, info->handle)); + CM_RETURN_IFERR(wr_put_int64(pack, info->size)); + CM_RETURN_IFERR(wr_put_data(pack, info->buf, info->size)); + return CM_SUCCESS; +} + +static status_t wr_encode_read_file(wr_conn_t *conn, wr_packet_t *pack, void *send_info) +{ + wr_read_file_info_t *info = (wr_read_file_info_t *)send_info; + CM_RETURN_IFERR(wr_put_int64(pack, info->offset)); + CM_RETURN_IFERR(wr_put_int64(pack, info->handle)); + CM_RETURN_IFERR(wr_put_int64(pack, info->size)); + return CM_SUCCESS; +} + static status_t wr_encode_extend_file(wr_conn_t *conn, wr_packet_t *pack, void *send_info) { wr_extend_info_t *info = (wr_extend_info_t *)send_info; @@ -1661,10 +1581,7 @@ static status_t wr_encode_close_dir(wr_conn_t *conn, wr_packet_t *pack, void *se static status_t wr_encode_close_file(wr_conn_t *conn, wr_packet_t *pack, void *send_info) { wr_close_file_info_t *info = (wr_close_file_info_t *)send_info; - CM_RETURN_IFERR(wr_put_int64(pack, info->fid)); - CM_RETURN_IFERR(wr_put_str(pack, info->vg_name)); - CM_RETURN_IFERR(wr_put_int32(pack, info->vg_id)); - CM_RETURN_IFERR(wr_put_int64(pack, info->ftid)); + CM_RETURN_IFERR(wr_put_int64(pack, info->fd)); return CM_SUCCESS; } @@ -1683,7 +1600,7 @@ static status_t wr_encode_delete_file(wr_conn_t *conn, wr_packet_t *pack, void * static status_t wr_decode_open_file(wr_packet_t *ack_pack, void *ack) { - CM_RETURN_IFERR(wr_get_data(ack_pack, sizeof(wr_find_node_t), (void **)ack)); + CM_RETURN_IFERR(wr_get_int64(ack_pack, (int64_t *)ack)); return CM_SUCCESS; } @@ -1713,7 +1630,9 @@ typedef struct st_wr_packet_proc { char *cmd_info; } wr_packet_proc_t; -wr_packet_proc_t g_wr_packet_proc[WR_CMD_END] = {[WR_CMD_MKDIR] = {wr_encode_make_dir, NULL, "make dir"}, +wr_packet_proc_t g_wr_packet_proc[WR_CMD_END] = +{ + [WR_CMD_MKDIR] = {wr_encode_make_dir, NULL, "make dir"}, [WR_CMD_RMDIR] = {wr_encode_remove_dir, NULL, "remove dir"}, [WR_CMD_OPEN_DIR] = {wr_encode_open_dir, wr_decode_open_dir, "open dir"}, [WR_CMD_CLOSE_DIR] = {wr_encode_close_dir, NULL, "close dir"}, @@ -1721,6 +1640,8 @@ wr_packet_proc_t g_wr_packet_proc[WR_CMD_END] = {[WR_CMD_MKDIR] = {wr_encode_mak [WR_CMD_CLOSE_FILE] = {wr_encode_close_file, NULL, "close file"}, [WR_CMD_CREATE_FILE] = {wr_encode_create_file, NULL, "create file"}, [WR_CMD_DELETE_FILE] = {wr_encode_delete_file, NULL, "delete file"}, + [WR_CMD_WRITE_FILE] = {wr_encode_write_file, NULL, "write file"}, + [WR_CMD_READ_FILE] = {wr_encode_read_file, wr_decode_read_file, "read file"}, [WR_CMD_EXTEND_FILE] = {wr_encode_extend_file, NULL, "extend file"}, [WR_CMD_RENAME_FILE] = {wr_encode_rename_file, NULL, "rename file"}, [WR_CMD_TRUNCATE_FILE] = {wr_encode_truncate_file, NULL, "truncate file"}, diff --git a/src/common_api/wr_api_impl.h b/src/common_api/wr_api_impl.h index adb2309..72d6141 100644 --- a/src/common_api/wr_api_impl.h +++ b/src/common_api/wr_api_impl.h @@ -61,10 +61,7 @@ typedef struct st_wr_open_file_info { } wr_open_file_info_t; typedef struct st_wr_close_file_info { - uint64 fid; - const char *vg_name; - uint32 vg_id; - uint64 ftid; + int64_t fd; } wr_close_file_info_t; typedef struct st_wr_create_file_info { @@ -128,6 +125,20 @@ typedef struct st_wr_truncate_file_info { uint32 vg_id; } wr_truncate_file_info_t; +typedef struct st_wr_write_file_info { + int64 offset; + int64 handle; + int64 size; + void *buf; +} wr_write_file_info_t; + +typedef struct st_wr_read_file_info { + int64 offset; + int64 handle; + int64 size; + void *buf; +} wr_read_file_info_t; + typedef struct st_wr_refresh_file_table_info { uint64 block_id; const char *vg_name; @@ -206,8 +217,7 @@ status_t wr_open_file_impl(wr_conn_t *conn, const char *file_path, int flag, int status_t wr_close_file_impl(wr_conn_t *conn, int handle); status_t wr_exist_impl(wr_conn_t *conn, const char *path, bool32 *result, gft_item_type_t *type); int64 wr_seek_file_impl(wr_conn_t *conn, int handle, int64 offset, int origin); -status_t wr_write_file_impl(wr_conn_t *conn, int handle, const void *buf, int size); -status_t wr_read_file_impl(wr_conn_t *conn, int handle, void *buf, int size, int *read_size); +status_t wr_write_file_impl(wr_conn_t *conn, int handle, const void *buf, int size, long long int offset); status_t wr_rename_file_impl(wr_conn_t *conn, const char *src, const char *dst); status_t wr_truncate_impl(wr_conn_t *conn, int handle, long long int length); status_t wr_fstat_impl(wr_conn_t *conn, int handle, wr_stat_info_t item); @@ -219,7 +229,7 @@ void wr_destroy(void); status_t wr_get_fname_impl(int handle, char *fname, int fname_size); status_t wr_pwrite_file_impl(wr_conn_t *conn, int handle, const void *buf, int size, long long offset); -status_t wr_pread_file_impl(wr_conn_t *conn, int handle, void *buf, int size, long long offset, int *read_size); +status_t wr_pread_file_impl(wr_conn_t *conn, int handle, const void *buf, int size, long long offset); status_t wr_get_addr_impl(wr_conn_t *conn, int32 handle, long long offset, char *pool_name, char *image_name, char *obj_addr, unsigned int *obj_id, unsigned long int *obj_offset); gft_node_t *wr_get_node_by_path_impl(wr_conn_t *conn, const char *path); @@ -235,7 +245,7 @@ void wr_set_conn_wait_event(wr_conn_t *conn, wr_wait_event_e event); void wr_unset_conn_wait_event(wr_conn_t *conn); status_t wr_msg_interact_with_stat(wr_conn_t *conn, uint8 cmd, void *send_info, void *ack); -status_t wr_close_file_on_server(wr_conn_t *conn, wr_vg_info_item_t *vg_item, uint64 fid, ftid_t ftid); +status_t wr_close_file_on_server(wr_conn_t *conn, int64_t fd); status_t wr_get_inst_status_on_server(wr_conn_t *conn, wr_server_status_t *wr_status); status_t wr_get_time_stat_on_server(wr_conn_t *conn, wr_stat_item_t *time_stat, uint64 size); status_t wr_set_main_inst_on_server(wr_conn_t *conn); diff --git a/src/interface/wr_api.c b/src/interface/wr_api.c index e846ae2..e175756 100644 --- a/src/interface/wr_api.c +++ b/src/interface/wr_api.c @@ -410,38 +410,6 @@ long long wr_fseek(int handle, long long offset, int origin, wr_instance_handle return status; } -int wr_file_write(int handle, const void *buf, int size, wr_instance_handle inst_handle) -{ - if (inst_handle == NULL) { - LOG_RUN_ERR("instance handle is NULL."); - return WR_ERROR; - } - st_wr_instance_handle *hdl = (st_wr_instance_handle*)inst_handle; - if (hdl->conn == NULL) { - LOG_RUN_ERR("fwrite get conn error."); - return WR_ERROR; - } - - status_t ret = wr_write_file_impl(hdl->conn, HANDLE_VALUE(handle), buf, size); - return (int)ret; -} - -int wr_file_read(int handle, void *buf, int size, int *read_size, wr_instance_handle inst_handle) -{ - if (inst_handle == NULL) { - LOG_RUN_ERR("instance handle is NULL."); - return WR_ERROR; - } - st_wr_instance_handle *hdl = (st_wr_instance_handle*)inst_handle; - if (hdl->conn == NULL) { - LOG_RUN_ERR("fread get conn error."); - return WR_ERROR; - } - - status_t ret = wr_read_file_impl(hdl->conn, HANDLE_VALUE(handle), buf, size, read_size); - return (int)ret; -} - int wr_file_pwrite(int handle, const void *buf, int size, long long offset, wr_instance_handle inst_handle) { timeval_t begin_tv; @@ -466,22 +434,18 @@ int wr_file_pwrite(int handle, const void *buf, int size, long long offset, wr_i return WR_ERROR; } - status_t ret = wr_pwrite_file_impl(hdl->conn, HANDLE_VALUE(handle), buf, size, offset); + status_t ret = wr_write_file_impl(hdl->conn, HANDLE_VALUE(handle), buf, size, offset); if (ret == CM_SUCCESS) { wr_session_end_stat(hdl->conn->session, &begin_tv, WR_PWRITE); } return (int)ret; } -int wr_file_pread(int handle, void *buf, int size, long long offset, int *read_size, wr_instance_handle inst_handle) +int wr_file_pread(int handle, void *buf, int size, long long offset, wr_instance_handle inst_handle) { timeval_t begin_tv; wr_begin_stat(&begin_tv); - if (read_size == NULL) { - WR_THROW_ERROR(ERR_WR_INVALID_PARAM, "read _size is NULL"); - return CM_ERROR; - } if (size < 0) { LOG_DEBUG_ERR("File size is invalid:%d.", size); WR_THROW_ERROR(ERR_WR_INVALID_PARAM, "size must be a positive integer"); @@ -502,7 +466,7 @@ int wr_file_pread(int handle, void *buf, int size, long long offset, int *read_s return WR_ERROR; } - status_t ret = wr_pread_file_impl(hdl->conn, HANDLE_VALUE(handle), buf, size, offset, read_size); + status_t ret = wr_pread_file_impl(hdl->conn, HANDLE_VALUE(handle), buf, size, offset); if (ret == CM_SUCCESS) { wr_session_end_stat(hdl->conn->session, &begin_tv, WR_PREAD); } @@ -623,28 +587,6 @@ int wr_fallocate(int handle, int mode, long long offset, long long length, wr_in return (int)ret; } -int wr_set_svr_path(const char *conn_path) -{ - if (conn_path == NULL) { - WR_THROW_ERROR(ERR_WR_INVALID_PARAM, "conn path"); - return WR_ERROR; - } - - size_t len = strlen(conn_path); - if (len == 0) { - WR_THROW_ERROR(ERR_WR_FILE_PATH_ILL, conn_path, ", conn path is empty"); - return WR_ERROR; - } else if (len > CM_MAX_PATH_LEN) { - WR_THROW_ERROR(ERR_WR_FILE_PATH_ILL, conn_path, ", conn path is too long"); - return WR_ERROR; - } - if (strcpy_s(g_wr_inst_path, CM_MAX_PATH_LEN, conn_path) != EOK) { - WR_THROW_ERROR(ERR_WR_FILE_PATH_ILL, conn_path, ", conn path copy fail"); - return WR_ERROR; - } - return WR_SUCCESS; -} - void wr_register_log_callback(wr_log_output cb_log_output, unsigned int log_level) { cm_log_param_instance()->log_write = (usr_cb_log_output_t)cb_log_output; diff --git a/src/interface/wr_api.h b/src/interface/wr_api.h index 5845592..25804e4 100644 --- a/src/interface/wr_api.h +++ b/src/interface/wr_api.h @@ -157,14 +157,12 @@ WR_DECLARE int wr_file_delete(const char *file, wr_instance_handle inst_handle); WR_DECLARE int wr_file_open(const char *file, int flag, int *handle, wr_instance_handle inst_handle); WR_DECLARE int wr_file_close(int handle, wr_instance_handle inst_handle); WR_DECLARE long long wr_fseek(int handle, long long offset, int origin, wr_instance_handle inst_handle); -WR_DECLARE int wr_file_write(int handle, const void *buf, int size, wr_instance_handle inst_handle); -WR_DECLARE int wr_file_read(int handle, void *buf, int size, int *read_size, wr_instance_handle inst_handle); WR_DECLARE int wr_file_rename(const char *src, const char *dst); WR_DECLARE int wr_file_truncate(int handle, long long length, wr_instance_handle inst_handle); WR_DECLARE int wr_file_size_physical(int handle, long long *fsize); WR_DECLARE void wr_file_size_maxwr(const char *fname, long long *fsize); WR_DECLARE int wr_file_pwrite(int handle, const void *buf, int size, long long offset, wr_instance_handle inst_handle); -WR_DECLARE int wr_file_pread(int handle, void *buf, int size, long long offset, int *read_size, wr_instance_handle inst_handle); +WR_DECLARE int wr_file_pread(int handle, void *buf, int size, long long offset, wr_instance_handle inst_handle); WR_DECLARE int wr_file_fallocate(int handle, int mode, long long offset, long long length); // aio @@ -180,7 +178,6 @@ WR_DECLARE int wr_init_logger( char *log_home, unsigned int log_level, unsigned int log_backup_file_count, unsigned long long log_max_file_size); WR_DECLARE void wr_refresh_logger(char *log_field, unsigned long long *value); // connection -WR_DECLARE int wr_set_svr_path(const char *conn_path); WR_DECLARE int wr_set_conn_timeout(int timeout); WR_DECLARE int wr_set_conn_opts(wr_conn_opt_key_e key, void *value, const char *addr); WR_DECLARE void wr_set_default_conn_timeout(int timeout); @@ -188,8 +185,6 @@ WR_DECLARE int wr_create_instance(const char *addr, wr_instance_handle *inst_han WR_DECLARE int wr_delete_instance(wr_instance_handle inst_handle); // instance param WR_DECLARE int wr_set_main_inst(wr_instance_handle inst_handle); -WR_DECLARE int wr_disable_grab_lock(void); -WR_DECLARE int wr_enable_grab_lock(void); WR_DECLARE int wr_get_inst_status(wr_server_status_t *wr_status, wr_instance_handle inst_handle); WR_DECLARE int wr_is_maintain(unsigned int *is_maintain, wr_instance_handle inst_handle); diff --git a/src/service/wr_service.c b/src/service/wr_service.c index 3033d54..64ceda1 100644 --- a/src/service/wr_service.c +++ b/src/service/wr_service.c @@ -28,6 +28,7 @@ #include "wr_io_fence.h" #include "wr_malloc.h" #include "wr_open_file.h" +#include "wr_filesystem.h" #include "wr_srv_proc.h" #include "wr_mes.h" #include "wr_api.h" @@ -366,36 +367,26 @@ static status_t wr_process_open_file(wr_session_t *session) WR_RETURN_IF_ERROR(wr_get_str(&session->recv_pack, &name)); WR_RETURN_IF_ERROR(wr_get_int32(&session->recv_pack, &flag)); WR_RETURN_IF_ERROR(wr_set_audit_resource(session->audit_info.resource, WR_AUDIT_MODIFY, "%s", name)); - wr_find_node_t find_info; - status_t status = wr_open_file(session, (const char *)name, flag, &find_info); + int64_t fd = 0; + char path[WR_FILE_PATH_MAX_LENGTH]; + snprintf(path, WR_FILE_PATH_MAX_LENGTH, "%s/%s", g_inst_cfg->data_dir, name); + status_t status = wr_open_file(session, (const char *)path, flag, &fd); if (status == CM_SUCCESS) { - WR_RETURN_IF_ERROR(wr_put_data(&session->send_pack, &find_info, sizeof(wr_find_node_t))); + WR_RETURN_IF_ERROR(wr_put_int64(&session->send_pack, fd)); } return status; } static status_t wr_process_close_file(wr_session_t *session) { - uint64 fid; - char *vg_name = NULL; - uint32 vgid; - ftid_t ftid; + int64_t fd; wr_init_get(&session->recv_pack); - WR_RETURN_IF_ERROR(wr_get_int64(&session->recv_pack, (int64 *)&fid)); - WR_RETURN_IF_ERROR(wr_get_str(&session->recv_pack, &vg_name)); - WR_RETURN_IF_ERROR(wr_get_int32(&session->recv_pack, (int32 *)&vgid)); - WR_RETURN_IF_ERROR(wr_get_int64(&session->recv_pack, (int64 *)&ftid)); - WR_RETURN_IF_ERROR(wr_set_audit_resource(session->audit_info.resource, WR_AUDIT_MODIFY, - "vg_name:%s, fid:%llu, ftid:%llu", vg_name, fid, *(uint64 *)&ftid)); - - wr_vg_info_item_t *vg_item = wr_find_vg_item(vg_name); - bool32 result = (bool32)(vg_item != NULL); - WR_RETURN_IF_FALSE2(result, WR_THROW_ERROR(ERR_WR_VG_NOT_EXIST, vg_name)); + WR_RETURN_IF_ERROR(wr_get_int64(&session->recv_pack, (int64 *)&fd)); + WR_RETURN_IF_ERROR(wr_set_audit_resource(session->audit_info.resource, WR_AUDIT_MODIFY, "fd:%lld", fd)); - WR_LOG_DEBUG_OP("Begin to close file, fid:%llu, %s", fid, wr_display_metaid(ftid)); - WR_RETURN_IF_ERROR(wr_close_file(session, vg_item, *(uint64 *)&ftid)); - LOG_DEBUG_INF("Succeed to close file, ftid:%s, fid:%llu, vg: %s, session pid:%llu.", wr_display_metaid(ftid), fid, - vg_item->vg_name, session->cli_info.cli_pid); + WR_LOG_DEBUG_OP("Begin to close file, fd:%lld", fd); + WR_RETURN_IF_ERROR(wr_filesystem_close(fd)); + LOG_DEBUG_INF("Succeed to close file, fd:%lld", fd); return CM_SUCCESS; } @@ -436,6 +427,49 @@ static status_t wr_process_close_dir(wr_session_t *session) return CM_SUCCESS; } +static status_t wr_process_write_file(wr_session_t *session) +{ + int64 offset; + int64 file_size; + int64 handle; + char *buf; + + wr_init_get(&session->recv_pack); + WR_RETURN_IF_ERROR(wr_get_int64(&session->recv_pack, &offset)); + WR_RETURN_IF_ERROR(wr_get_int64(&session->recv_pack, &handle)); + WR_RETURN_IF_ERROR(wr_get_int64(&session->recv_pack, &file_size)); + WR_RETURN_IF_ERROR(wr_get_data(&session->recv_pack, file_size, &buf)); + + WR_RETURN_IF_ERROR(wr_set_audit_resource( + session->audit_info.resource, WR_AUDIT_MODIFY, "handle:%lld, offset:%lld, size:%lld", handle, offset, file_size)); + + return wr_filesystem_write(handle, offset, file_size, buf); +} + +static status_t wr_process_read_file(wr_session_t *session) +{ + int64 offset; + int64 size; + int64 handle; + + wr_init_get(&session->recv_pack); + WR_RETURN_IF_ERROR(wr_get_int64(&session->recv_pack, &offset)); + WR_RETURN_IF_ERROR(wr_get_int64(&session->recv_pack, &handle)); + WR_RETURN_IF_ERROR(wr_get_int64(&session->recv_pack, &size)); + char *buf = (char *)malloc(size); + if (buf == NULL) { + LOG_DEBUG_ERR("Failed to malloc buffer for read file."); + return CM_ERROR; + } + WR_RETURN_IF_ERROR(wr_filesystem_pread(handle, offset, size, buf)); + text_t data; + cm_str2text(buf, &data); + if (buf != NULL) { + data.len++; // for keeping the '\0' + } + return wr_put_text(&session->send_pack, &data); +} + static status_t wr_process_extending_file(wr_session_t *session) { wr_node_data_t node_data; @@ -914,6 +948,8 @@ static wr_cmd_hdl_t g_wr_cmd_handle[WR_CMD_TYPE_OFFSET(WR_CMD_END)] = { [WR_CMD_TYPE_OFFSET(WR_CMD_CLOSE_FILE)] = {WR_CMD_CLOSE_FILE, wr_process_close_file, NULL, CM_FALSE}, [WR_CMD_TYPE_OFFSET(WR_CMD_CREATE_FILE)] = {WR_CMD_CREATE_FILE, wr_process_create_file, NULL, CM_TRUE}, [WR_CMD_TYPE_OFFSET(WR_CMD_DELETE_FILE)] = {WR_CMD_DELETE_FILE, wr_process_delete_file, NULL, CM_TRUE}, + [WR_CMD_TYPE_OFFSET(WR_CMD_WRITE_FILE)] = {WR_CMD_WRITE_FILE, wr_process_write_file, NULL, CM_TRUE}, + [WR_CMD_TYPE_OFFSET(WR_CMD_READ_FILE)] = {WR_CMD_READ_FILE, wr_process_read_file, NULL, CM_TRUE}, [WR_CMD_TYPE_OFFSET(WR_CMD_EXTEND_FILE)] = {WR_CMD_EXTEND_FILE, wr_process_extending_file, NULL, CM_TRUE}, [WR_CMD_TYPE_OFFSET(WR_CMD_RENAME_FILE)] = {WR_CMD_RENAME_FILE, wr_process_rename, NULL, CM_TRUE}, [WR_CMD_TYPE_OFFSET(WR_CMD_REFRESH_FILE)] = {WR_CMD_REFRESH_FILE, wr_process_refresh_file, NULL, CM_FALSE}, diff --git a/test/demo/test1.c b/test/demo/test1.c index a86ab0a..2729ae3 100644 --- a/test/demo/test1.c +++ b/test/demo/test1.c @@ -14,9 +14,8 @@ int main(void) { int fd = -1; int errorcode = 0; const char *errormsg = NULL; - char *fileName = "+data/test"; - char *targetName = "+data/name"; - ret = wr_fcreate(fileName, 0777) + char *fileName = "wr_file_write"; + int ret = wr_file_write(0x20000001, "hello world", 10); if (ret != 0) { wr_get_error(&errorcode, &errormsg); printf("%d : %s\n", errorcode, errormsg); diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt index efb6c97..330682e 100644 --- a/test/gtest/CMakeLists.txt +++ b/test/gtest/CMakeLists.txt @@ -6,6 +6,7 @@ project(WrApiTest) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) +set(CMAKE_BUILD_TYPE Debug) find_package(GTest REQUIRED) diff --git a/test/gtest/test_wr_api.cc b/test/gtest/test_wr_api.cc index a711e5a..aff32fb 100644 --- a/test/gtest/test_wr_api.cc +++ b/test/gtest/test_wr_api.cc @@ -5,27 +5,24 @@ extern "C" { } #define TEST_LOG_DIR "./test_log" #define TEST_DIR "testdir1" +#define TEST_FILE "testdir1/testfile1" #define ONE_GB 1024 * 1024 * 1024 int errorcode = 0; const char *errormsg = NULL; -wr_instance_handle *g_inst_handle; +wr_instance_handle g_inst_handle = NULL; +int handle = 0; -TEST(WrApiTest, TestInitLogger) { - int result = wr_init_logger(TEST_LOG_DIR, 255, 100, ONE_GB); - if (result != WR_SUCCESS) { - printf("wr_init_logger failed, result: %d\n", result); +class WrApiTest : public ::testing::Test { +protected: + void SetUp() override { + // 初始化日志 + int result = wr_init_logger(TEST_LOG_DIR, 255, 100, ONE_GB); + ASSERT_EQ(result, WR_SUCCESS) << "Failed to initialize logger"; } - EXPECT_EQ(result, WR_SUCCESS); -} +}; -TEST(WrApiTest, TestInitLoggerNegative) { - // Negative test case: invalid log directory - int result = wr_init_logger(NULL, 255, 100, ONE_GB); - EXPECT_NE(result, WR_SUCCESS); -} - -TEST(WrApiTest, TestWrCreateInstance) { - int result = wr_create_instance("20.20.20.135:15430", g_inst_handle); +TEST_F(WrApiTest, TestWrCreateInstance) { + int result = wr_create_instance("127.0.0.1:19225", &g_inst_handle); if (result != 0) { wr_get_error(&errorcode, &errormsg); printf("%d : %s\n", errorcode, errormsg); @@ -33,8 +30,8 @@ TEST(WrApiTest, TestWrCreateInstance) { EXPECT_EQ(result, WR_SUCCESS); } -TEST(WrApiTest, TestWrVfsCreate) { - int result = wr_vfs_create(TEST_DIR, *g_inst_handle); +TEST_F(WrApiTest, TestWrVfsCreate) { + int result = wr_vfs_create(TEST_DIR, g_inst_handle); if (result != 0) { wr_get_error(&errorcode, &errormsg); printf("%d : %s\n", errorcode, errormsg); @@ -42,36 +39,58 @@ TEST(WrApiTest, TestWrVfsCreate) { EXPECT_EQ(result, WR_SUCCESS); } -TEST(WrApiTest, TestWrVfsCreateNegative) { +TEST_F(WrApiTest, TestWrVfsCreateNegative) { // Negative test case: create directory with invalid name - int result = wr_vfs_create("", NULL); + int result = wr_vfs_create("", g_inst_handle); EXPECT_NE(result, WR_SUCCESS); } -TEST(WrApiTest, TestWrVfsCreateFile) { - char *path = (char *)malloc(strlen(TEST_DIR) + strlen("/testfile1") + 1); - strcpy(path, TEST_DIR); - strcat(path, "/testfile1"); - int result = wr_file_create(path, 0); +TEST_F(WrApiTest, TestWrVfsCreateFile) { + int result = wr_file_create(TEST_FILE, 0, g_inst_handle); if (result != 0) { wr_get_error(&errorcode, &errormsg); printf("%d : %s\n", errorcode, errormsg); } EXPECT_EQ(result, WR_SUCCESS); - free(path); } -TEST(WrApiTest, TestWrVfsCreateFileNegative) { +TEST_F(WrApiTest, TestWrVfsCreateFileNegative) { // Negative test case: create file with invalid path - int result = wr_file_create(NULL, 0); + int result = wr_file_create(NULL, 0, g_inst_handle); EXPECT_NE(result, WR_SUCCESS); } -TEST(WrApiTest, TestWrVfsDeleteFile) { +TEST_F(WrApiTest, TestWrfileOpen) { + int result = wr_file_open(TEST_FILE, 0, &handle, g_inst_handle); + EXPECT_EQ(result, WR_SUCCESS); +} + +TEST_F(WrApiTest, TestWrfileWrite) { + int result = wr_file_pwrite(handle, "hello world", sizeof("hello world"), 0, g_inst_handle); + EXPECT_EQ(result, WR_SUCCESS); +} + +TEST_F(WrApiTest, TestWrfileRead) { + char buf[100]; + int result = wr_file_pread(handle, buf, sizeof("hello world"), 0, g_inst_handle); + if (result != 0) { + wr_get_error(&errorcode, &errormsg); + printf("%d : %s\n", errorcode, errormsg); + } + EXPECT_EQ(result, WR_SUCCESS); + printf("buf: %s\n", buf); +} + +TEST_F(WrApiTest, TestWrfileClose) { + int result = wr_file_close(handle, g_inst_handle); + EXPECT_EQ(result, WR_SUCCESS); +} + +TEST_F(WrApiTest, TestWrVfsDeleteFile) { char *path = (char *)malloc(strlen(TEST_DIR) + strlen("/testfile1") + 1); strcpy(path, TEST_DIR); strcat(path, "/testfile1"); - int result = wr_file_delete(path); + int result = wr_file_delete(path, g_inst_handle); if (result != 0) { wr_get_error(&errorcode, &errormsg); printf("%d : %s\n", errorcode, errormsg); @@ -80,14 +99,14 @@ TEST(WrApiTest, TestWrVfsDeleteFile) { free(path); } -TEST(WrApiTest, TestWrVfsDeleteFileNegative) { +TEST_F(WrApiTest, TestWrVfsDeleteFileNegative) { // Negative test case: delete non-existent file - int result = wr_file_delete("non_existent_file"); + int result = wr_file_delete("non_existent_file", g_inst_handle); EXPECT_NE(result, WR_SUCCESS); } -TEST(WrApiTest, TestWrVfsDelete) { - int result = wr_vfs_delete(TEST_DIR); +TEST_F(WrApiTest, TestWrVfsDelete) { + int result = wr_vfs_delete(TEST_DIR, g_inst_handle); if (result != 0) { wr_get_error(&errorcode, &errormsg); printf("%d : %s\n", errorcode, errormsg); @@ -95,9 +114,9 @@ TEST(WrApiTest, TestWrVfsDelete) { EXPECT_EQ(result, WR_SUCCESS); } -TEST(WrApiTest, TestWrVfsDeleteNegative) { +TEST_F(WrApiTest, TestWrVfsDeleteNegative) { // Negative test case: delete non-existent directory - int result = wr_vfs_delete("non_existent_dir"); + int result = wr_vfs_delete("non_existent_dir", g_inst_handle); EXPECT_NE(result, WR_SUCCESS); } -- Gitee From 77edb08ca7b230a601b724a06fefb7a7edd03d24 Mon Sep 17 00:00:00 2001 From: chenzhikai <895543892@qq.com> Date: Wed, 9 Apr 2025 16:51:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?file=20num=E6=8E=A5=E5=8F=A3=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E9=83=A8=E5=88=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cmd/wrcmd.c | 79 ----------------------- src/common/wr_defs.h | 4 +- src/common/wr_file.c | 5 +- src/common/wr_filesystem.c | 105 +++++++++++++++++++----------- src/common/wr_filesystem.h | 5 +- src/common/wr_protocol.c | 1 + src/common/wr_protocol.h | 1 + src/common_api/wr_api_impl.c | 81 +++++++++++------------ src/common_api/wr_api_impl.h | 6 ++ src/common_api/wr_cli_conn.c | 2 +- src/common_api/wr_cli_conn.h | 2 +- src/interface/wr_api.c | 21 +++--- src/interface/wr_api.h | 3 +- src/service/wr_service.c | 37 +++++++---- src/service/wr_srv_proc.c | 6 +- test/gtest/test_wr_api.cc | 121 ++++++++++++++++------------------- 16 files changed, 216 insertions(+), 263 deletions(-) diff --git a/src/cmd/wrcmd.c b/src/cmd/wrcmd.c index 360ccab..dc91459 100644 --- a/src/cmd/wrcmd.c +++ b/src/cmd/wrcmd.c @@ -1366,85 +1366,6 @@ bool32 wr_check_software_version(int32 file_fd, int64 *offset) return CM_TRUE; } -// length| vg_num| vg_name|size|buckets|map->num| -// vg_name|size|buckets|map->num|...|pool_size|pool->addr|pool->ex_pool_addr[0]|...|pool->ex_pool_addr[excount-1]|... -status_t wr_load_buffer_cache_group_from_file( - int32 file_fd, int64 *length, const char *vg_name, wr_vg_info_item_t *vg_item) -{ - uint32 group_num = 0; - int64 offset = *length; - int32 read_size = 0; - bool32 result; - status_t status = cm_read_file(file_fd, length, sizeof(int64), &read_size); - WR_RETURN_IFERR2(status, LOG_DEBUG_ERR("Failed to read file.")); - offset += (int64)sizeof(int64); - WR_RETURN_IF_ERROR(wr_get_group_num(file_fd, &offset, &group_num)); - char read_vg_name[WR_MAX_NAME_LEN]; - uint32 i; - bool32 find = CM_FALSE; - for (i = 0; i < group_num; i++) { - status = cm_read_file(file_fd, read_vg_name, WR_MAX_NAME_LEN, &read_size); - WR_RETURN_IFERR2(status, LOG_DEBUG_ERR("Failed to read file.")); - offset += WR_MAX_NAME_LEN; - if (strcmp(vg_name, read_vg_name) != 0) { - uint64 bucket_size = WR_MAX_SEGMENT_NUM * (uint32)sizeof(uint32_t); - uint64 hashmap_size = sizeof(shm_hashmap_t) + bucket_size; - offset = offset + (int64)hashmap_size; - result = (bool32)(cm_seek_file(file_fd, offset, SEEK_SET) != -1); - WR_RETURN_IF_FALSE2(result, LOG_DEBUG_ERR("Failed to seek file %d", file_fd)); - continue; - } - WR_RETURN_IF_ERROR(wr_load_buffer_cache_from_file(file_fd, vg_item, &offset)); - find = CM_TRUE; - } - if (!find) { - LOG_DEBUG_ERR("Failed to find vg: %s.", vg_name); - return CM_ERROR; - } - WR_RETURN_IF_ERROR(wr_load_buffer_pool_from_file(file_fd, GA_8K_POOL)); - WR_RETURN_IF_ERROR(wr_load_buffer_pool_from_file(file_fd, GA_16K_POOL)); - WR_RETURN_IF_ERROR(wr_load_buffer_pool_from_file(file_fd, GA_FS_AUX_POOL)); - WR_RETURN_IF_ERROR(wr_load_buffer_pool_from_file(file_fd, GA_SEGMENT_POOL)); - return CM_SUCCESS; -} - -status_t wr_load_wr_ctrl_group_from_file( - int32 file_fd, int64 *length, const char *vg_name, wr_vg_info_item_t *vg_item) -{ - uint32 group_num = 0; - int64 offset = 0; - int32 read_size = 0; - status_t status = cm_read_file(file_fd, length, sizeof(int64), &read_size); - WR_RETURN_IFERR2(status, LOG_DEBUG_ERR("Failed to read file.")); - offset += (int64)sizeof(int64); - WR_RETURN_IF_ERROR(wr_get_group_num(file_fd, &offset, &group_num)); - char read_vg_name[WR_MAX_NAME_LEN]; - uint32 i; - bool32 find = CM_FALSE; - bool32 result = CM_FALSE; - for (i = 0; i < group_num; i++) { - WR_RETURN_IF_FALSE2(wr_check_software_version(file_fd, &offset), - LOG_DEBUG_ERR("Failed to check software_version of vg %u", i)); - status = cm_read_file(file_fd, read_vg_name, WR_MAX_NAME_LEN, &read_size); - WR_RETURN_IFERR2(status, LOG_DEBUG_ERR("Failed to read file.")); - offset += WR_MAX_NAME_LEN; - if (strcmp(vg_name, read_vg_name) != 0) { - offset += (int64)sizeof(wr_ctrl_t); - result = (bool32)(cm_seek_file(file_fd, offset, SEEK_SET) != -1); - WR_RETURN_IF_FALSE2(result, LOG_DEBUG_ERR("Failed to seek file %d", file_fd)); - continue; - } - WR_RETURN_IF_ERROR(wr_load_wr_ctrl_from_file(file_fd, vg_item)); - offset += (int64)sizeof(wr_ctrl_t); - find = CM_TRUE; - } - if (!find) { - LOG_DEBUG_ERR("Failed to find vg: %s.", vg_name); - return CM_ERROR; - } - return CM_SUCCESS; -} - static wr_args_t cmd_rename_args[] = { {'o', "old_name", CM_TRUE, CM_TRUE, wr_cmd_check_device_path, cmd_check_convert_path, cmd_clean_check_convert, 0, NULL, NULL, 0}, diff --git a/src/common/wr_defs.h b/src/common/wr_defs.h index d797d4a..7a24f94 100644 --- a/src/common/wr_defs.h +++ b/src/common/wr_defs.h @@ -192,8 +192,8 @@ extern "C" { #define WR_MIN_PORT (uint32)1024 #define CM_ALIGN_512(size) (((size) + 0x000001FF) & 0xFFFFFE00) #define WR_DEFAULT_NULL_VALUE (uint32)0xFFFFFFFF -#define WR_UDS_CONNECT_TIMEOUT (int32)(30000) /* 30 seconds */ -#define WR_UDS_SOCKET_TIMEOUT (int32)0x4FFFFFFF +#define WR_TCP_CONNECT_TIMEOUT (int32)(30000) /* 30 seconds */ +#define WR_TCP_SOCKET_TIMEOUT (int32)0x4FFFFFFF #define WR_SEEK_MAXWR 3 /* Used for seek actual file size for openGauss */ #define WR_MIN_IOTHREADS_CFG 1 diff --git a/src/common/wr_file.c b/src/common/wr_file.c index e3a9fd7..fc666e0 100644 --- a/src/common/wr_file.c +++ b/src/common/wr_file.c @@ -419,9 +419,10 @@ static status_t wr_open_file_core( status_t wr_open_file(wr_session_t *session, const char *file, int32_t flag, int64_t *fd) { + status_t status; WR_LOG_DEBUG_OP("Begin to open file:%s, session id:%u.", file, session->id); - *fd = wr_filesystem_open(file); - if (*fd == -1) { + status = wr_filesystem_open(file, fd); + if (status != CM_SUCCESS) { LOG_RUN_ERR("[FS]Failed to open file:%s.", file); return CM_ERROR; } diff --git a/src/common/wr_filesystem.c b/src/common/wr_filesystem.c index 086516b..122ced2 100644 --- a/src/common/wr_filesystem.c +++ b/src/common/wr_filesystem.c @@ -29,78 +29,109 @@ #endif // !WIN32 #include "wr_file.h" #include "wr_thv.h" +#include "wr_param.h" #ifdef __cplusplus extern "C" { #endif -status_t wr_filesystem_mkdir(const char *name, mode_t mode) -{ - if (mkdir(name, mode) != 0) { - LOG_RUN_ERR("[FS]Failed to mkdir %s.", name); - return CM_ERROR; +errno_t iret_snprintf = 0; + +#define WR_FS_GET_PATH(name) ({ \ + static char path[WR_FILE_PATH_MAX_LENGTH]; \ + iret_snprintf = snprintf_s(path, WR_FILE_PATH_MAX_LENGTH, WR_FILE_PATH_MAX_LENGTH - 1, \ + "%s/%s", g_inst_cfg->data_dir, (name)); \ + WR_SECUREC_SS_RETURN_IF_ERROR(iret_snprintf, CM_ERROR); \ + path; \ +}) + +#define LOG_AND_RETURN_ERROR(msg, ...) \ + do { \ + LOG_RUN_ERR(msg, ##__VA_ARGS__); \ + return CM_ERROR; \ + } while (0) + +status_t wr_filesystem_mkdir(const char *name, mode_t mode) { + if (mkdir(WR_FS_GET_PATH(name), mode) != 0) { + LOG_AND_RETURN_ERROR("[FS] Failed to create directory: %s", name); } return CM_SUCCESS; } -status_t wr_filesystem_rmdir(const char *name) -{ - if (rmdir(name) != 0) { - LOG_RUN_ERR("[FS]Failed to rmdir %s.", name); - return CM_ERROR; +status_t wr_filesystem_rmdir(const char *name) { + if (rmdir(WR_FS_GET_PATH(name)) != 0) { + LOG_AND_RETURN_ERROR("[FS] Failed to remove directory: %s", name); } return CM_SUCCESS; } -status_t wr_filesystem_touch(const char *name) -{ - FILE *file = fopen(name, "w"); - if (file) { - fclose(file); - } else { - LOG_RUN_ERR("[FS]Failed to touch %s.", name); - return CM_ERROR; +status_t wr_filesystem_touch(const char *name) { + FILE *file = fopen(WR_FS_GET_PATH(name), "w"); + if (!file) { + LOG_AND_RETURN_ERROR("[FS] Failed to create file: %s", name); } + fclose(file); return CM_SUCCESS; } -status_t wr_filesystem_rm(const char *name) -{ - if (unlink(name) != 0) { - LOG_RUN_ERR("[FS]Failed to rm %s.", name); - return CM_ERROR; +status_t wr_filesystem_rm(const char *name) { + if (unlink(WR_FS_GET_PATH(name)) != 0) { + LOG_AND_RETURN_ERROR("[FS] Failed to remove file: %s", name); } return CM_SUCCESS; } -status_t wr_filesystem_write(int64_t handle, int64_t offset, int64_t size, const char *buf) -{ +status_t wr_filesystem_write(int64_t handle, int64_t offset, int64_t size, const char *buf) { if (pwrite(handle, buf, size, offset) == -1) { - LOG_RUN_ERR("[FS]Failed to write handle:%lld, offset:%lld, size:%lld.", handle, offset, size); - return CM_ERROR; + LOG_AND_RETURN_ERROR("[FS] Failed to write to handle: %lld, offset: %lld, size: %lld", handle, offset, size); } return CM_SUCCESS; } -status_t wr_filesystem_pread(int64_t handle, int64_t offset, int64_t size, char *buf) -{ +status_t wr_filesystem_pread(int64_t handle, int64_t offset, int64_t size, char *buf) { if (pread(handle, buf, size, offset) == -1) { - LOG_RUN_ERR("[FS]Failed to pread handle:%lld, offset:%lld, size:%lld.", handle, offset, size); - return CM_ERROR; + LOG_AND_RETURN_ERROR("[FS] Failed to read from handle: %lld, offset: %lld, size: %lld", handle, offset, size); } return CM_SUCCESS; } -int wr_filesystem_open(const char *file_path) -{ - return open(file_path, O_RDWR, 0644); +status_t wr_filesystem_query_file_num(const char *vfs_name, uint32_t *file_num) { + if (!vfs_name || !file_num) { + LOG_AND_RETURN_ERROR("[FS] Invalid parameters: vfs_name or file_num is NULL"); + } + + DIR *dir = opendir(WR_FS_GET_PATH(vfs_name)); + if (!dir) { + LOG_AND_RETURN_ERROR("[FS] Failed to open directory: %s", vfs_name); + } + + struct dirent *entry; + *file_num = 0; + + while ((entry = readdir(dir)) != NULL) { + if (entry->d_type == DT_REG) { + (*file_num)++; + } + } + + closedir(dir); + return CM_SUCCESS; } -int wr_filesystem_close(int fd) -{ - return close(fd); +status_t wr_filesystem_open(const char *file_path, int *fd) { + *fd = open(WR_FS_GET_PATH(file_path), O_RDWR | O_SYNC, 0); + if (*fd == -1) { + LOG_AND_RETURN_ERROR("[FS] Failed to open file: %s", file_path); + } + return CM_SUCCESS; } +status_t wr_filesystem_close(int fd) { + if (close(fd) == -1) { + LOG_AND_RETURN_ERROR("[FS] Failed to close file descriptor: %d", fd); + } + return CM_SUCCESS; +} #ifdef __cplusplus } diff --git a/src/common/wr_filesystem.h b/src/common/wr_filesystem.h index 2854a2c..9abf299 100644 --- a/src/common/wr_filesystem.h +++ b/src/common/wr_filesystem.h @@ -15,8 +15,9 @@ status_t wr_filesystem_touch(const char *name); status_t wr_filesystem_rm(const char *name); status_t wr_filesystem_write(int64_t handle, int64_t offset, int64_t size, const char *buf); status_t wr_filesystem_pread(int64_t handle, int64_t offset, int64_t size, char *buf); -int wr_filesystem_open(const char *file_path); -int wr_filesystem_close(int fd); +status_t wr_filesystem_query_file_num(const char *vfs_name, uint32 *file_num); +status_t wr_filesystem_open(const char *file_path, int *fd); +status_t wr_filesystem_close(int fd); #ifdef __cplusplus diff --git a/src/common/wr_protocol.c b/src/common/wr_protocol.c index d89c1d8..fdb0000 100644 --- a/src/common/wr_protocol.c +++ b/src/common/wr_protocol.c @@ -31,6 +31,7 @@ static char *g_wr_cmd_desc[WR_CMD_TYPE_OFFSET(WR_CMD_END)] = { [WR_CMD_TYPE_OFFSET(WR_CMD_MKDIR)] = "mkdir", [WR_CMD_TYPE_OFFSET(WR_CMD_RMDIR)] = "rmdir", + [WR_CMD_TYPE_OFFSET(WR_CMD_QUERY_FILE_NUM)] = "query file num", [WR_CMD_TYPE_OFFSET(WR_CMD_OPEN_DIR)] = "open dir", [WR_CMD_TYPE_OFFSET(WR_CMD_CLOSE_DIR)] = "close dir", [WR_CMD_TYPE_OFFSET(WR_CMD_OPEN_FILE)] = "open file", diff --git a/src/common/wr_protocol.h b/src/common/wr_protocol.h index df53cf7..491bf52 100644 --- a/src/common/wr_protocol.h +++ b/src/common/wr_protocol.h @@ -46,6 +46,7 @@ typedef enum { WR_CMD_MODIFY_BEGIN = WR_CMD_BEGIN, WR_CMD_MKDIR = WR_CMD_MODIFY_BEGIN, WR_CMD_RMDIR, + WR_CMD_QUERY_FILE_NUM, WR_CMD_OPEN_DIR, WR_CMD_CLOSE_DIR, WR_CMD_OPEN_FILE, diff --git a/src/common_api/wr_api_impl.c b/src/common_api/wr_api_impl.c index 3f93010..b3430a4 100644 --- a/src/common_api/wr_api_impl.c +++ b/src/common_api/wr_api_impl.c @@ -43,7 +43,7 @@ extern "C" { #define WR_ACCMODE 00000003 #define WR_OPEN_MODE(flag) ((flag + 1) & WR_ACCMODE) -int32 g_wr_uds_conn_timeout = WR_UDS_CONNECT_TIMEOUT; +int32 g_wr_tcp_conn_timeout = WR_TCP_CONNECT_TIMEOUT; uint32 g_wr_server_pid = 0; typedef struct str_files_rw_ctx { @@ -173,46 +173,6 @@ void wr_free_conn(wr_conn_t *conn) return; } -/* -status_t wr_connect(const char *server_locator, wr_conn_opt_t *options, wr_conn_t *conn) -{ - if (server_locator == NULL) { - WR_THROW_ERROR(ERR_WR_UDS_INVALID_URL, "NULL", 0); - return CM_ERROR; - } - - if ((conn->flag == CM_TRUE) && (conn->pipe.link.uds.closed == CM_FALSE)) { - return CM_SUCCESS; - } - - conn->flag = CM_FALSE; - text_t uds = {"UDS:", 4}; - if (wr_check_url_format(server_locator, &uds) != CM_SUCCESS) { - WR_THROW_ERROR(ERR_WR_UDS_INVALID_URL, server_locator, strlen(server_locator)); - return ERR_WR_UDS_INVALID_URL; - } - conn->cli_vg_handles = NULL; - conn->pipe.options = 0; - int32 timeout = options != NULL ? options->timeout : g_wr_uds_conn_timeout; - conn->pipe.connect_timeout = timeout < 0 ? WR_UDS_CONNECT_TIMEOUT : timeout; - conn->pipe.socket_timeout = WR_UDS_SOCKET_TIMEOUT; - conn->pipe.link.uds.sock = CS_INVALID_SOCKET; - conn->pipe.link.uds.closed = CM_TRUE; - conn->pipe.type = CS_TYPE_DOMAIN_SCOKET; - conn->session = NULL; - status_t ret = cs_connect_ex( - server_locator, &conn->pipe, NULL, (const char *)(server_locator + uds.len), (const char *)CM_NULL_TEXT.str); - if (ret != CM_SUCCESS) { - LOG_DEBUG_ERR("connect server failed, uds path:%s", server_locator); - return ret; - } - wr_init_packet(&conn->pack, conn->pipe.options); - - conn->flag = CM_TRUE; - - return CM_SUCCESS; -} -*/ status_t wr_connect(const char *server_locator, wr_conn_opt_t *options, wr_conn_t *conn) { if (server_locator == NULL) { @@ -228,12 +188,12 @@ status_t wr_connect(const char *server_locator, wr_conn_opt_t *options, wr_conn_ conn->cli_vg_handles = NULL; conn->pipe.options = 0; - int32 timeout = options != NULL ? options->timeout : g_wr_uds_conn_timeout; - conn->pipe.connect_timeout = timeout < 0 ? WR_UDS_CONNECT_TIMEOUT : timeout; - conn->pipe.socket_timeout = WR_UDS_SOCKET_TIMEOUT; + int32 timeout = options != NULL ? options->timeout : g_wr_tcp_conn_timeout; + conn->pipe.connect_timeout = timeout < 0 ? WR_TCP_CONNECT_TIMEOUT : timeout; + conn->pipe.socket_timeout = WR_TCP_SOCKET_TIMEOUT; conn->pipe.link.tcp.sock = CS_INVALID_SOCKET; conn->pipe.link.tcp.closed = CM_FALSE; - conn->pipe.type = CS_TYPE_TCP; + conn->pipe.type = CS_TYPE_SSL; conn->session = NULL; status_t ret = cs_connect( server_locator, &conn->pipe, NULL); @@ -470,6 +430,22 @@ wr_vfs_t *wr_open_dir_impl(wr_conn_t *conn, const char *dir_path, bool32 refresh return wr_open_dir_impl_core(conn, find_node); } +status_t wr_vfs_query_file_num_impl(wr_conn_t *conn, const char *vfs_name, uint32 *file_num) +{ + LOG_DEBUG_INF("wr query file num entry, vfs_name:%s", vfs_name); + wr_query_file_num_info_t send_info; + send_info.vfs_name = vfs_name; + send_info.file_num = file_num; + status_t status = wr_msg_interact(conn, WR_CMD_QUERY_FILE_NUM, (void *)&send_info, (void *)&send_info); + if (status != CM_SUCCESS) { + LOG_DEBUG_ERR("wr query file num error"); + return CM_ERROR; + } + *file_num = send_info.file_num; + LOG_DEBUG_INF("wr query file num leave"); + return status; +} + gft_node_t *wr_read_dir_impl(wr_conn_t *conn, wr_vfs_t *dir, bool32 skip_delete) { return NULL; @@ -1374,6 +1350,20 @@ static status_t wr_encode_handshake(wr_conn_t *conn, wr_packet_t *pack, void *se return CM_SUCCESS; } +static status_t wr_encode_query_file_num(wr_conn_t *conn, wr_packet_t *pack, void *send_info) +{ + wr_query_file_num_info_t *info = (wr_query_file_num_info_t *)send_info; + CM_RETURN_IFERR(wr_put_str(pack, info->vfs_name)); + return CM_SUCCESS; +} + +static status_t wr_decode_query_file_num(wr_packet_t *ack_pack, void *ack) +{ + wr_query_file_num_info_t *info = (wr_query_file_num_info_t *)ack; + CM_RETURN_IFERR(wr_get_int32(ack_pack, &(info->file_num))); + return CM_SUCCESS; +} + static status_t wr_decode_read_file(wr_packet_t *ack_pack, void *ack) { text_t buf = CM_NULL_TEXT; @@ -1634,6 +1624,7 @@ wr_packet_proc_t g_wr_packet_proc[WR_CMD_END] = { [WR_CMD_MKDIR] = {wr_encode_make_dir, NULL, "make dir"}, [WR_CMD_RMDIR] = {wr_encode_remove_dir, NULL, "remove dir"}, + [WR_CMD_QUERY_FILE_NUM] = {wr_encode_query_file_num, wr_decode_query_file_num, "query file num"}, [WR_CMD_OPEN_DIR] = {wr_encode_open_dir, wr_decode_open_dir, "open dir"}, [WR_CMD_CLOSE_DIR] = {wr_encode_close_dir, NULL, "close dir"}, [WR_CMD_OPEN_FILE] = {wr_encode_open_file, wr_decode_open_file, "open file"}, diff --git a/src/common_api/wr_api_impl.h b/src/common_api/wr_api_impl.h index 72d6141..c8bbe8b 100644 --- a/src/common_api/wr_api_impl.h +++ b/src/common_api/wr_api_impl.h @@ -139,6 +139,11 @@ typedef struct st_wr_read_file_info { void *buf; } wr_read_file_info_t; +typedef struct st_wr_query_file_num_info { + const char *vfs_name; + uint32 file_num; +} wr_query_file_num_info_t; + typedef struct st_wr_refresh_file_table_info { uint64 block_id; const char *vg_name; @@ -227,6 +232,7 @@ status_t wr_cli_handshake(wr_conn_t *conn, uint32 max_open_file); status_t wr_init_client(uint32 max_open_files, char *home); void wr_destroy(void); status_t wr_get_fname_impl(int handle, char *fname, int fname_size); +status_t wr_vfs_query_file_num_impl(wr_conn_t *conn, const char *vfs_name, uint32 *file_num); status_t wr_pwrite_file_impl(wr_conn_t *conn, int handle, const void *buf, int size, long long offset); status_t wr_pread_file_impl(wr_conn_t *conn, int handle, const void *buf, int size, long long offset); diff --git a/src/common_api/wr_cli_conn.c b/src/common_api/wr_cli_conn.c index 9e0cdb7..ed8c90d 100644 --- a/src/common_api/wr_cli_conn.c +++ b/src/common_api/wr_cli_conn.c @@ -119,7 +119,7 @@ status_t wr_conn_opts_create(pointer_t *result, const char *addr) static status_t wr_conn_sync(wr_conn_opt_t *options, wr_conn_t *conn, const char *addr) { status_t ret = CM_ERROR; - int timeout = (options != NULL ? options->timeout : g_wr_uds_conn_timeout); + int timeout = (options != NULL ? options->timeout : g_wr_tcp_conn_timeout); do { ret = wr_try_conn(options, conn, addr); if (ret == CM_SUCCESS) { diff --git a/src/common_api/wr_cli_conn.h b/src/common_api/wr_cli_conn.h index f97b0cb..5230a3b 100644 --- a/src/common_api/wr_cli_conn.h +++ b/src/common_api/wr_cli_conn.h @@ -41,7 +41,7 @@ extern "C" { #define HANDLE_VALUE(handle) ((handle) - (WR_HANDLE_BASE)) #define DB_WR_DEFAULT_UDS_PATH "UDS:/tmp/.wr_unix_d_socket" extern char g_wr_inst_path[CM_MAX_PATH_LEN]; -extern int32 g_wr_uds_conn_timeout; +extern int32 g_wr_tcp_conn_timeout; typedef struct st_wr_conn { wr_packet_t pack; // for sending diff --git a/src/interface/wr_api.c b/src/interface/wr_api.c index e175756..bb56901 100644 --- a/src/interface/wr_api.c +++ b/src/interface/wr_api.c @@ -59,10 +59,10 @@ extern "C" { void wr_set_default_conn_timeout(int timeout) { if (timeout <= 0) { - g_wr_uds_conn_timeout = WR_CONN_NEVER_TIMEOUT; + g_wr_tcp_conn_timeout = WR_CONN_NEVER_TIMEOUT; return; } - g_wr_uds_conn_timeout = timeout; + g_wr_tcp_conn_timeout = timeout; } int wr_create_instance(const char *addr, wr_instance_handle *inst_handle) @@ -237,10 +237,10 @@ int wr_stat(const char *path, wr_stat_info_t item, wr_instance_handle inst_handl return ret; } -int wr_lstat(const char *path, wr_stat_info_t item, wr_instance_handle inst_handle) +int wr_vfs_query_file_num(wr_instance_handle inst_handle, const char *vfs_name, int *file_num) { - if (item == NULL) { - WR_THROW_ERROR(ERR_WR_INVALID_PARAM, "wr_stat_info_t"); + if (file_num == NULL) { + WR_THROW_ERROR(ERR_WR_INVALID_PARAM, "file_num"); return WR_ERROR; } if (inst_handle == NULL) { @@ -253,12 +253,13 @@ int wr_lstat(const char *path, wr_stat_info_t item, wr_instance_handle inst_hand return WR_ERROR; } - gft_node_t *node = wr_get_node_by_path_impl(hdl->conn, path); - if (node == NULL) { - LOG_DEBUG_INF("lstat get node by path :%s error", path); + status_t ret = wr_vfs_query_file_num_impl(hdl->conn, vfs_name, file_num); + if (ret != WR_SUCCESS) { + *file_num = 0; + LOG_DEBUG_INF("vfs query file num :%s error", vfs_name); return WR_ERROR; } - return wr_set_stat_info(item, node); + return WR_SUCCESS; } int wr_fstat(int handle, wr_stat_info_t item, wr_instance_handle inst_handle) @@ -710,7 +711,7 @@ int wr_set_conn_timeout(int32 timeout) WR_THROW_ERROR(ERR_WR_INVALID_PARAM, "invalid timeout when set connection timeout"); return CM_ERROR; } - g_wr_uds_conn_timeout = timeout; + g_wr_tcp_conn_timeout = timeout; return CM_SUCCESS; } diff --git a/src/interface/wr_api.h b/src/interface/wr_api.h index 25804e4..f3a384a 100644 --- a/src/interface/wr_api.h +++ b/src/interface/wr_api.h @@ -149,7 +149,8 @@ WR_DECLARE int wr_vfs_unmount(wr_vfs_handle vfs_handle, wr_instance_handle inst_ WR_DECLARE int wr_dread(wr_vfs_handle dir, wr_dir_item_t item, wr_dir_item_t *result, wr_instance_handle inst_handle); WR_DECLARE int wr_vfs_query_file_info(wr_vfs_handle dir, wr_dir_item_t item, wr_dir_item_t *result); -WR_DECLARE int wr_vfs_query_file_num(wr_vfs_handle dir, wr_dir_item_t item, wr_dir_item_t *result); + +WR_DECLARE int wr_vfs_query_file_num(wr_instance_handle inst_handle, const char *vfs_name, int *file_num); // file WR_DECLARE int wr_file_create(const char *name, int flag, wr_instance_handle inst_handle); diff --git a/src/service/wr_service.c b/src/service/wr_service.c index 64ceda1..48858ea 100644 --- a/src/service/wr_service.c +++ b/src/service/wr_service.c @@ -276,9 +276,7 @@ static status_t wr_process_rmdir(wr_session_t *session) WR_RETURN_IF_ERROR(wr_get_int32(&session->recv_pack, &recursive)); WR_RETURN_IF_ERROR(wr_set_audit_resource(session->audit_info.resource, WR_AUDIT_MODIFY, "%s", dir)); WR_LOG_DEBUG_OP("Begin to rmdir:%s.", dir); - char path[WR_FILE_PATH_MAX_LENGTH]; - snprintf(path, WR_FILE_PATH_MAX_LENGTH, "%s/%s", g_inst_cfg->data_dir, dir); - status_t status = wr_filesystem_rmdir(path); + status_t status = wr_filesystem_rmdir(dir); if (status == CM_SUCCESS) { LOG_DEBUG_INF("Succeed to rmdir:%s", dir); return status; @@ -286,7 +284,21 @@ static status_t wr_process_rmdir(wr_session_t *session) LOG_DEBUG_ERR("Failed to rmdir:%s", dir); return status; } -// TODO: walsender && walreceiver + +static status_t wr_process_query_file_num(wr_session_t *session) +{ + char *vfs_name = NULL; + uint32 file_num = 0; + wr_init_get(&session->recv_pack); + WR_RETURN_IF_ERROR(wr_get_str(&session->recv_pack, &vfs_name)); + if (wr_filesystem_query_file_num(vfs_name, &file_num) != CM_SUCCESS) { + LOG_DEBUG_ERR("Failed to query file num for vfs:%s", vfs_name); + return CM_ERROR; + } + (void)wr_put_int32(&session->send_pack, file_num); + return CM_SUCCESS; +} + static status_t wr_process_create_file(wr_session_t *session) { char *file_ptr = NULL; @@ -333,9 +345,7 @@ static status_t wr_process_delete_file(wr_session_t *session) WR_RETURN_IFERR2(status, LOG_DEBUG_ERR("delete file get file name failed.")); WR_RETURN_IF_ERROR(wr_set_audit_resource(session->audit_info.resource, WR_AUDIT_MODIFY, "%s", name)); WR_LOG_DEBUG_OP("Begin to rm file:%s", name); - char path[WR_FILE_PATH_MAX_LENGTH]; - snprintf(path, WR_FILE_PATH_MAX_LENGTH, "%s/%s", g_inst_cfg->data_dir, name); - status = wr_filesystem_rm(path); + status = wr_filesystem_rm(name); if (status == CM_SUCCESS) { LOG_DEBUG_INF("Succeed to rm file:%s", name); return status; @@ -368,9 +378,7 @@ static status_t wr_process_open_file(wr_session_t *session) WR_RETURN_IF_ERROR(wr_get_int32(&session->recv_pack, &flag)); WR_RETURN_IF_ERROR(wr_set_audit_resource(session->audit_info.resource, WR_AUDIT_MODIFY, "%s", name)); int64_t fd = 0; - char path[WR_FILE_PATH_MAX_LENGTH]; - snprintf(path, WR_FILE_PATH_MAX_LENGTH, "%s/%s", g_inst_cfg->data_dir, name); - status_t status = wr_open_file(session, (const char *)path, flag, &fd); + status_t status = wr_open_file(session, (const char *)name, flag, &fd); if (status == CM_SUCCESS) { WR_RETURN_IF_ERROR(wr_put_int64(&session->send_pack, fd)); } @@ -461,13 +469,13 @@ static status_t wr_process_read_file(wr_session_t *session) LOG_DEBUG_ERR("Failed to malloc buffer for read file."); return CM_ERROR; } + memset(buf, 0, size); WR_RETURN_IF_ERROR(wr_filesystem_pread(handle, offset, size, buf)); text_t data; cm_str2text(buf, &data); - if (buf != NULL) { - data.len++; // for keeping the '\0' - } - return wr_put_text(&session->send_pack, &data); + WR_RETURN_IF_ERROR(wr_put_text(&session->send_pack, &data)); + free(buf); + return CM_SUCCESS; } static status_t wr_process_extending_file(wr_session_t *session) @@ -942,6 +950,7 @@ static wr_cmd_hdl_t g_wr_cmd_handle[WR_CMD_TYPE_OFFSET(WR_CMD_END)] = { // modify [WR_CMD_TYPE_OFFSET(WR_CMD_MKDIR)] = {WR_CMD_MKDIR, wr_process_mkdir, NULL, CM_TRUE}, [WR_CMD_TYPE_OFFSET(WR_CMD_RMDIR)] = {WR_CMD_RMDIR, wr_process_rmdir, NULL, CM_TRUE}, + [WR_CMD_TYPE_OFFSET(WR_CMD_QUERY_FILE_NUM)] = {WR_CMD_QUERY_FILE_NUM, wr_process_query_file_num, NULL, CM_FALSE}, [WR_CMD_TYPE_OFFSET(WR_CMD_OPEN_DIR)] = {WR_CMD_OPEN_DIR, wr_process_open_dir, NULL, CM_FALSE}, [WR_CMD_TYPE_OFFSET(WR_CMD_CLOSE_DIR)] = {WR_CMD_CLOSE_DIR, wr_process_close_dir, NULL, CM_FALSE}, [WR_CMD_TYPE_OFFSET(WR_CMD_OPEN_FILE)] = {WR_CMD_OPEN_FILE, wr_process_open_file, NULL, CM_FALSE}, diff --git a/src/service/wr_srv_proc.c b/src/service/wr_srv_proc.c index 55514cf..7826989 100644 --- a/src/service/wr_srv_proc.c +++ b/src/service/wr_srv_proc.c @@ -361,15 +361,13 @@ status_t wr_remove_file(wr_session_t *session, const char *file) status_t wr_make_dir(wr_session_t *session, const char *dir_name) { - char path[WR_FILE_PATH_MAX_LENGTH]; - snprintf(path, WR_FILE_PATH_MAX_LENGTH, "%s/%s", g_inst_cfg->data_dir, dir_name); - return wr_filesystem_mkdir(path, 0777); + return wr_filesystem_mkdir(dir_name, 0777); } status_t wr_create_file(wr_session_t *session, const char *parent, const char *name, int32 flag) { char path[WR_FILE_PATH_MAX_LENGTH]; - snprintf(path, WR_FILE_PATH_MAX_LENGTH, "%s/%s/%s", g_inst_cfg->data_dir, parent, name); + snprintf(path, WR_FILE_PATH_MAX_LENGTH, "%s/%s", parent, name); return wr_filesystem_touch(path); } diff --git a/test/gtest/test_wr_api.cc b/test/gtest/test_wr_api.cc index aff32fb..278a420 100644 --- a/test/gtest/test_wr_api.cc +++ b/test/gtest/test_wr_api.cc @@ -5,12 +5,16 @@ extern "C" { } #define TEST_LOG_DIR "./test_log" #define TEST_DIR "testdir1" -#define TEST_FILE "testdir1/testfile1" +#define TEST_FILE1 "testdir1/testfile1" +#define TEST_FILE2 "testdir1/testfile2" +#define TEST_FILE3 "testdir1/testfile3" #define ONE_GB 1024 * 1024 * 1024 +#define SERVER_ADDR "127.0.0.1:19225" + int errorcode = 0; const char *errormsg = NULL; wr_instance_handle g_inst_handle = NULL; -int handle = 0; +int handle1 = 0, handle2 = 0, handle3 = 0; class WrApiTest : public ::testing::Test { protected: @@ -19,10 +23,17 @@ protected: int result = wr_init_logger(TEST_LOG_DIR, 255, 100, ONE_GB); ASSERT_EQ(result, WR_SUCCESS) << "Failed to initialize logger"; } + + void TearDown() override { + wr_get_error(&errorcode, &errormsg); + if (errorcode != 0) { + printf("Error code: %d, Error message: %s\n", errorcode, errormsg); + } + } }; TEST_F(WrApiTest, TestWrCreateInstance) { - int result = wr_create_instance("127.0.0.1:19225", &g_inst_handle); + int result = wr_create_instance(SERVER_ADDR, &g_inst_handle); if (result != 0) { wr_get_error(&errorcode, &errormsg); printf("%d : %s\n", errorcode, errormsg); @@ -39,85 +50,65 @@ TEST_F(WrApiTest, TestWrVfsCreate) { EXPECT_EQ(result, WR_SUCCESS); } -TEST_F(WrApiTest, TestWrVfsCreateNegative) { - // Negative test case: create directory with invalid name - int result = wr_vfs_create("", g_inst_handle); - EXPECT_NE(result, WR_SUCCESS); +TEST_F(WrApiTest, TestWrVfsCreateFiles) { + int result1 = wr_file_create(TEST_FILE1, 0, g_inst_handle); + int result2 = wr_file_create(TEST_FILE2, 0, g_inst_handle); + int result3 = wr_file_create(TEST_FILE3, 0, g_inst_handle); + EXPECT_EQ(result1, WR_SUCCESS); + EXPECT_EQ(result2, WR_SUCCESS); + EXPECT_EQ(result3, WR_SUCCESS); } -TEST_F(WrApiTest, TestWrVfsCreateFile) { - int result = wr_file_create(TEST_FILE, 0, g_inst_handle); - if (result != 0) { - wr_get_error(&errorcode, &errormsg); - printf("%d : %s\n", errorcode, errormsg); - } - EXPECT_EQ(result, WR_SUCCESS); +TEST_F(WrApiTest, TestWrfileOpen) { + int result1 = wr_file_open(TEST_FILE1, 0, &handle1, g_inst_handle); + int result2 = wr_file_open(TEST_FILE2, 0, &handle2, g_inst_handle); + int result3 = wr_file_open(TEST_FILE3, 0, &handle3, g_inst_handle); + EXPECT_EQ(result1, WR_SUCCESS); + EXPECT_EQ(result2, WR_SUCCESS); + EXPECT_EQ(result3, WR_SUCCESS); } -TEST_F(WrApiTest, TestWrVfsCreateFileNegative) { - // Negative test case: create file with invalid path - int result = wr_file_create(NULL, 0, g_inst_handle); - EXPECT_NE(result, WR_SUCCESS); -} +TEST_F(WrApiTest, TestWrfileWriteRead) { + const char *data1 = "hello world 1"; + const char *data2 = "hello world 2"; + const char *data3 = "hello world 3"; -TEST_F(WrApiTest, TestWrfileOpen) { - int result = wr_file_open(TEST_FILE, 0, &handle, g_inst_handle); - EXPECT_EQ(result, WR_SUCCESS); -} + // Write to files + EXPECT_EQ(wr_file_pwrite(handle1, data1, strlen(data1), 0, g_inst_handle), WR_SUCCESS); + EXPECT_EQ(wr_file_pwrite(handle2, data2, strlen(data2), 0, g_inst_handle), WR_SUCCESS); + EXPECT_EQ(wr_file_pwrite(handle3, data3, strlen(data3), 0, g_inst_handle), WR_SUCCESS); -TEST_F(WrApiTest, TestWrfileWrite) { - int result = wr_file_pwrite(handle, "hello world", sizeof("hello world"), 0, g_inst_handle); - EXPECT_EQ(result, WR_SUCCESS); -} + // Read from files + char buf1[100] = {0}, buf2[100] = {0}, buf3[100] = {0}; + EXPECT_EQ(wr_file_pread(handle1, buf1, strlen(data1), 0, g_inst_handle), WR_SUCCESS); + EXPECT_EQ(wr_file_pread(handle2, buf2, strlen(data2), 0, g_inst_handle), WR_SUCCESS); + EXPECT_EQ(wr_file_pread(handle3, buf3, strlen(data3), 0, g_inst_handle), WR_SUCCESS); -TEST_F(WrApiTest, TestWrfileRead) { - char buf[100]; - int result = wr_file_pread(handle, buf, sizeof("hello world"), 0, g_inst_handle); - if (result != 0) { - wr_get_error(&errorcode, &errormsg); - printf("%d : %s\n", errorcode, errormsg); - } - EXPECT_EQ(result, WR_SUCCESS); - printf("buf: %s\n", buf); + printf("buf1: %s\n", buf1); + printf("buf2: %s\n", buf2); + printf("buf3: %s\n", buf3); } TEST_F(WrApiTest, TestWrfileClose) { - int result = wr_file_close(handle, g_inst_handle); - EXPECT_EQ(result, WR_SUCCESS); + EXPECT_EQ(wr_file_close(handle1, g_inst_handle), WR_SUCCESS); + EXPECT_EQ(wr_file_close(handle2, g_inst_handle), WR_SUCCESS); + EXPECT_EQ(wr_file_close(handle3, g_inst_handle), WR_SUCCESS); } -TEST_F(WrApiTest, TestWrVfsDeleteFile) { - char *path = (char *)malloc(strlen(TEST_DIR) + strlen("/testfile1") + 1); - strcpy(path, TEST_DIR); - strcat(path, "/testfile1"); - int result = wr_file_delete(path, g_inst_handle); - if (result != 0) { - wr_get_error(&errorcode, &errormsg); - printf("%d : %s\n", errorcode, errormsg); - } - EXPECT_EQ(result, WR_SUCCESS); - free(path); +TEST_F(WrApiTest, TestWrVfsQueryFileNum) { + int file_num = 0; + EXPECT_EQ(wr_vfs_query_file_num(g_inst_handle, TEST_DIR, &file_num), WR_SUCCESS); + EXPECT_EQ(file_num, 3); } -TEST_F(WrApiTest, TestWrVfsDeleteFileNegative) { - // Negative test case: delete non-existent file - int result = wr_file_delete("non_existent_file", g_inst_handle); - EXPECT_NE(result, WR_SUCCESS); +TEST_F(WrApiTest, TestWrVfsDeleteFiles) { + EXPECT_EQ(wr_file_delete(TEST_FILE1, g_inst_handle), WR_SUCCESS); + EXPECT_EQ(wr_file_delete(TEST_FILE2, g_inst_handle), WR_SUCCESS); + EXPECT_EQ(wr_file_delete(TEST_FILE3, g_inst_handle), WR_SUCCESS); } TEST_F(WrApiTest, TestWrVfsDelete) { - int result = wr_vfs_delete(TEST_DIR, g_inst_handle); - if (result != 0) { - wr_get_error(&errorcode, &errormsg); - printf("%d : %s\n", errorcode, errormsg); - } - EXPECT_EQ(result, WR_SUCCESS); -} - -TEST_F(WrApiTest, TestWrVfsDeleteNegative) { - // Negative test case: delete non-existent directory - int result = wr_vfs_delete("non_existent_dir", g_inst_handle); - EXPECT_NE(result, WR_SUCCESS); + EXPECT_EQ(wr_vfs_delete(TEST_DIR, g_inst_handle), WR_SUCCESS); } int main(int argc, char **argv) { -- Gitee