diff --git a/pkg/src/common/cm_dbs_defs.h b/pkg/src/common/cm_dbs_defs.h index 40e7a2a6e0541d33928bf41340ea318337912776..f25053e59ffa0e88d9f3812350f7a87dd0293e24 100644 --- a/pkg/src/common/cm_dbs_defs.h +++ b/pkg/src/common/cm_dbs_defs.h @@ -54,6 +54,7 @@ extern "C" { #define MAX_DBS_FILE_NAME_LEN 64 #define MAX_DBS_FILE_NUM_INDIR 1024 #define MAX_DBS_VSTORE_ID_LEN 11 +#define MAX_DBS_DIR_PATH_LEN 256 //目录路径大小 // define-namespace #define NS_MAX_NODE_NUM 64 diff --git a/pkg/src/common/cm_dbs_file.c b/pkg/src/common/cm_dbs_file.c index e2409330d54a4ed23ccb2d6240948b127f9703b8..41c47a18ab722fcfbb1b909f97cc8e730b8f44b0 100644 --- a/pkg/src/common/cm_dbs_file.c +++ b/pkg/src/common/cm_dbs_file.c @@ -1013,4 +1013,60 @@ status_t cm_dbs_ulog_archive(int32 src_file, int32 dst_file, uint64 offset, uint "[CM_ARCH] ulog archive redo successful, offset %llu, start lsn %llu, " "last lsn %llu, real_arch_size %llu.", offset, start_lsn, *last_lsn, *real_arch_size); return CT_SUCCESS; -} \ No newline at end of file +} + +//name是全路径 ,200+68 +status_t cm_dbs_query_recycle_dir_vstore_id(uint32 vstore_id, const char *name, void *file_list, uint32 *file_num, uint32 *trash_num, uint32 *capacity) +{ + if (dbs_global_handle()->dbs_file_open_root_by_vstorid == NULL) {//是否可以通过租户ID获取到根目录句柄;打开根目录 + CT_LOG_RUN_ERR("dbs_file_open_root_by_vstorid is not support\n"); + return CT_ERROR; + } + + CT_LOG_RUN_INF("[CM_DEVICE] begin to get file list, file dir %s", name); + char file_dir[MAX_DBS_FILE_PATH_LEN] = { 0 }; + MEMS_RETURN_IFERR(strcpy_sp(file_dir, MAX_DBS_FILE_PATH_LEN, name));// 200+68的文件路径(全路径) + cm_remove_extra_delim(file_dir, '/'); + if (cm_check_file_path(file_dir) != CT_SUCCESS) { + return CT_ERROR; + } + + int path_depth = 0; + if (cm_get_file_path_depth(file_dir, "/", &path_depth) != CT_SUCCESS) { + CT_LOG_RUN_ERR("[CM_DEVICE] get dbs file dir %s depth failed", file_dir); + return CT_ERROR; + } + //todo + object_id_t dir_obj_id = { 0 };//目录句柄 正常查询是传进来文件获取句柄,现在是固定目录获取固定句柄 + char fs_name[MAX_DBS_FS_NAME_LEN] = { 0 };//文件系统名字可以这样获取 + if (cm_get_fs_name(file_dir, "/", fs_name) != CT_SUCCESS) { + return CT_ERROR; + } + object_id_t root_obj_id = { 0 }; + int32 ret = dbs_global_handle()->dbs_file_open_root_by_vstorid(fs_name, vstore_id, &root_obj_id);//获取根目录的句柄 + if (ret != 0) { + CT_LOG_RUN_ERR("[CM_DEVICE] open fs root failed, ret %d, fs name %s", ret, fs_name); + return CT_ERROR; + } + + if (path_depth == 1) {//判断是不是根目录句柄 + dir_obj_id = root_obj_id; + } else { + char *fix_file_path = cm_find_fix_delim(file_dir, '/', 2); + ret = dbs_global_handle()->dbs_file_open_by_path(&root_obj_id, fix_file_path + 1, DIR_TYPE, &dir_obj_id); + if (ret != 0) { + CT_LOG_RUN_ERR("[CM_DEVICE] open file dir failed, ret %d, file dir %s", ret, file_dir); + return CT_ERROR; + } + } + if (dbs_global_handle()->dbs_view_recycle_bin_info != NULL) { + ret = dbs_global_handle()->dbs_view_recycle_bin_info(&dir_obj_id, file_list, file_num, trash_num, capacity); + } + if (ret != CT_SUCCESS) { + CT_LOG_RUN_ERR("[CM_DEVICE] Failed to get file list, ret %d, file dir %s", ret, file_dir); + return CT_ERROR; + } + + CT_LOG_RUN_INF("[CM_DEVICE] Success to get file list, file_num %u, file dir %s", *file_num, file_dir); + return CT_SUCCESS; +} diff --git a/pkg/src/common/cm_dbs_file.h b/pkg/src/common/cm_dbs_file.h index 6e363a27c0b833a1e9e5549902ea9876a6e044b9..1cc3d167d46bfa4127ff0d386201eda6b0bb3e69 100644 --- a/pkg/src/common/cm_dbs_file.h +++ b/pkg/src/common/cm_dbs_file.h @@ -58,6 +58,7 @@ void cm_remove_extra_delim(char *file_path, const char delim); // for a share file system whose vstore id is not zero status_t cm_dbs_query_dir_vstore_id(uint32 vstore_id, const char *name, void *file_list, uint32 *file_num); +status_t cm_dbs_query_recycle_dir_vstore_id(uint32 vstore_id, const char *name, void *file_list, uint32 *file_num, uint32 *trash_num, uint32 *capacity); status_t cm_dbs_remove_file_vstore_id(uint32 vstore_id, const char *name); #ifdef __cplusplus diff --git a/pkg/src/common/cm_dbstor.c b/pkg/src/common/cm_dbstor.c index 140fd7b08393c064d2c4eb3efa48d13c771cd84d..24a3d3b58c80a79bf839770ae93646bf5c030d95 100644 --- a/pkg/src/common/cm_dbstor.c +++ b/pkg/src/common/cm_dbstor.c @@ -93,6 +93,7 @@ status_t dbs_init_lib(void) (void)(dbs_load_symbol(intf->dbs_handle, "DbsGetFileSize", (void **)(&intf->dbs_get_file_size))); (void)(dbs_load_symbol(intf->dbs_handle, "DbsUlogArchive", (void **)(&intf->dbs_ulog_archive))); (void)(dbs_load_symbol(intf->dbs_handle, "DbsGetNsIoForbiddenStat", (void **)(&intf->dbs_get_ns_io_forbidden_stat))); + (void)(dbs_load_symbol(intf->dbs_handle, "DbsViewRecycleBinInfo", (void **)(&intf->dbs_view_recycle_bin_info))); // dbs (void)(dbs_load_symbol(intf->dbs_handle, "DbsQueryFsInfo", (void **)(&intf->dbs_query_fs_info))); cm_reset_error(); diff --git a/pkg/src/common/cm_dbstor.h b/pkg/src/common/cm_dbstor.h index 97c0a7c73f295a627df5856050b6d89c5e64c7ea..cd4fa71c4fa01e788356de6e7f9e7d68c3458fd0 100644 --- a/pkg/src/common/cm_dbstor.h +++ b/pkg/src/common/cm_dbstor.h @@ -96,6 +96,7 @@ typedef int (*dbs_get_ip_pairs_t)(dbs_ip_pairs *, uint32_t *); typedef int (*dbs_create_link_t)(char *, char *); typedef int (*dbs_check_single_link_t)(char *, char *, uint32_t *); typedef int (*dbs_query_fs_info_t)(char *, uint32_t, void *); +typedef int (*dbs_view_recycle_bin_info_t)(object_id_t *, void *, uint32_t *, uint32_t *, uint32_t *); //pagepool typedef int (*create_pagepool_t)(char *, PagePoolAttr *, PagePoolId *); @@ -165,7 +166,8 @@ typedef struct st_dbs_interface { dbs_create_link_t dbs_create_link; dbs_check_single_link_t dbs_check_single_link; dbs_query_fs_info_t dbs_query_fs_info; - + dbs_view_recycle_bin_info_t dbs_view_recycle_bin_info; + // pagepool create_pagepool_t create_pagepool; destroy_pagepool_t destroy_pagepool; @@ -221,7 +223,9 @@ typedef struct cm_dbstor_file_info_detail { uint64_t crtimeSec; uint64_t crtimeNsec; } dbstor_file_info_detail; - +typedef struct cm_dbstor_recycle_bin_file_info_detail { + char origin_path[MAX_DBS_DIR_PATH_LEN] ; +} dbstor_recycle_bin_file_info_detail; dbs_interface_t *dbs_global_handle(void); dbs_tool_interface_t *dbs_tool_global_handle(void); status_t dbs_init_lib(void); diff --git a/pkg/src/common/cm_device.c b/pkg/src/common/cm_device.c index 6f35ab1aa4dbe345e9cea885d3c537245230aca4..cf1f7d9b9ae9952eedc79367537c3dbeb94980db 100644 --- a/pkg/src/common/cm_device.c +++ b/pkg/src/common/cm_device.c @@ -1218,6 +1218,24 @@ status_t cm_fsync_device(device_type_t type, int32 handle) } } +status_t cm_malloc_recycle_file_list_by_version_id(void **file_list) +{ + //todo :判断是文件还是目录 + *file_list = malloc((DBS_DIR_MAX_FILE_NUM) * sizeof(dbstor_recycle_bin_file_info_detail)); + if (*file_list == NULL) { + CT_LOG_RUN_ERR("malloc dbstor arch file list array failed"); + return CT_ERROR; + } + errno_t mem_ret = memset_sp(*file_list, sizeof(dbstor_recycle_bin_file_info_detail) * (DBS_DIR_MAX_FILE_NUM), + 0, sizeof(dbstor_recycle_bin_file_info_detail) * (DBS_DIR_MAX_FILE_NUM)); + if (mem_ret != EOK) { + CT_LOG_RUN_ERR("memset dbstor arch file list array failed"); + cm_free_file_list(file_list); + return CT_ERROR; + } + return CT_SUCCESS; +} + #ifdef __cplusplus } #endif diff --git a/pkg/src/common/cm_device.h b/pkg/src/common/cm_device.h index b8283708a18d827ec2ce6c1ac4b26463cf96d143..2573d4aef2d3913a47355f256e3d83d2dd4d9fa9 100644 --- a/pkg/src/common/cm_device.h +++ b/pkg/src/common/cm_device.h @@ -79,6 +79,7 @@ typedef struct st_iocb_ex_t { #define CM_IOCB_LENTH (sizeof(cm_iocb_t) + sizeof(cm_iocb_t*) + sizeof(cm_io_event_t)) #define CM_IOCB_LENTH_EX (sizeof(cm_iocb_ex_t) + sizeof(cm_iocb_ex_t *) + sizeof(cm_io_event_t)) +#define DBS_TRASH_DIR_PATH "/dbs_recycle_bin/" typedef int (*cm_io_setup)(int maxevents, cm_io_context_t *io_ctx); typedef int (*cm_io_destroy)(cm_io_context_t ctx); @@ -246,6 +247,7 @@ void cm_raw_device_register(raw_device_op_t *device_op); void cm_free_file_list(void **file_list); status_t cm_malloc_file_list(device_type_t type, void **file_list, const char *file_path, uint32 *file_num); status_t cm_malloc_file_list_by_version_id(uint32 version, uint32 vstore_id, void **file_list, const char *file_path, uint32 *file_num); +status_t cm_malloc_recycle_file_list_by_version_id(void **file_list); char *cm_get_name_from_file_list(device_type_t type, void *list, int32 index); bool32 cm_check_dir_type_by_file_list(device_type_t type, void *list, int32 index); bool32 cm_match_arch_pattern(const char *filename); diff --git a/pkg/src/dbstool/dbs_adp.c b/pkg/src/dbstool/dbs_adp.c index 39c9c08d9bc243884be8cf08ea320ec7a399c6db..97fc5f143e94213511a54b316dbab3abdbbed74b 100644 --- a/pkg/src/dbstool/dbs_adp.c +++ b/pkg/src/dbstool/dbs_adp.c @@ -67,6 +67,7 @@ #define DBS_TOOL_PARAM_FILE_NAME "--file-name=" #define DBS_TOOL_PARAM_FILE_DIR "--file-dir=" #define DBS_TOOL_PARAM_VSTORE_ID "--vstore_id=" +#define DBS_TOOL_PARAM_DIR_PATH "--dir-path=" #define DBS_PERF_SHOW_INTERVAL "--interval=" #define DBS_PERF_SHOW_TIMES "--times=" #define DBS_TOOL_PARAM_OVERWRITE "--overwrite" @@ -99,6 +100,7 @@ #define DBS_DELETE_FILE_PRAMA_NUM 2 #define DBS_QUERY_FILE_PRAMA_NUM 3 #define DBS_QUERY_FS_INFO_PRAMA_NUM 2 +#define DBS_VIEW_RECYCLE_BIN_PRAMA_NUM 2 #define DBS_NO_CHECK_PRAMA_NUM 0 #define DBS_ARCH_EXPORT_PRAMA_CHECK_NUM 1 @@ -111,6 +113,7 @@ #define DBS_QUERY_FS_INFO_CHECK_PRAMA_NUM 2 #define DBS_PERF_SHOW_PRAMA_NUM 2 #define DBS_QUERY_FILE_CHECK_PRAMA_NUM 1 +#define DBS_VIEW_RECYCLE_BIN_CHECK_PRAMA_NUM 1 #define MODE_STR_LEN 10 #define USER_NAME_LEN 32 @@ -2433,3 +2436,90 @@ int32 dbs_perf_show(int32 argc, char *argv[]) } return ret; } + +status_t trash_info_screen_print(void *file_list, uint32 file_num, char *path, uint32 trash_num, uint32 capacity) +{ + if (file_num == 0) { + printf("No files in the %s found in trash\n", path); + } else { + printf("Files in the directory %s found in trash : %u \n", path,file_num); + printf("Number of files in the trash: %d Capacity of the trash: %dKB\n", trash_num, capacity); + for (uint32 i = 0; i < file_num; i++) { + char *origin_path = NULL; + + dbstor_recycle_bin_file_info_detail *file_info = (dbstor_recycle_bin_file_info_detail *)((char *)file_list + + i * sizeof(dbstor_recycle_bin_file_info_detail)); + + origin_path = file_info->origin_path; + if (origin_path == NULL || strlen(origin_path) == 0) { + printf("ERROR!回收站存在路径不明文件"); + continue; + } + printf("%s\n", origin_path);//不需要这么多,只需要路径名就行了 + } + } + return CT_SUCCESS; +} + + +// 是否需要租户 +// dbstor --clean-view-recycle-bin --fs-name=* --dir-path=* +int32 dbs_view_recycle_bin(int32 argc, char *argv[]) +{ + char fs_name[MAX_DBS_FS_NAME_LEN] = {0};//文件系统名称 + char dir_path[MAX_DBS_DIR_PATH_LEN] = {0};//目录路径 + uint32 capacity = 0;//容量 + uint32 trash_num = 0;//总文件数量 + //参数检测 + const char *params[] = {DBS_TOOL_PARAM_FS_NAME, DBS_TOOL_PARAM_DIR_PATH}; + char *results[] = {fs_name, dir_path}; + size_t result_lens[] = {MAX_DBS_FS_NAME_LEN, MAX_DBS_DIR_PATH_LEN}; + params_check_list_t check_list[] = {{DBS_TOOL_PARAM_FS_NAME, fs_name}}; + params_list_t params_list = {params, results, result_lens, check_list, DBS_VIEW_RECYCLE_BIN_PRAMA_NUM, + DBS_VIEW_RECYCLE_BIN_CHECK_PRAMA_NUM}; + + if (parse_params_list(argc, argv, ¶ms_list) != CT_SUCCESS) {// 1、参数校验和转换 + printf("Invalid command.\nUsage: --clean-view-recycle-bin --fs-name=xxx [--dir-path=xxx] [--vstore-id=*]\n"); + return CT_ERROR; + } + //路径长度检测 + char full_path[MAX_DBS_FS_FILE_PATH_LEN] = {0};//todo:为什么要获取全路径,文件系统名字长度和文件路径长度,这个长度如何设置 + if (strlen(dir_path) == 0) { + PRTS_RETURN_IFERR(snprintf_s(full_path, MAX_DBS_FS_FILE_PATH_LEN, + MAX_DBS_FS_FILE_PATH_LEN - 1, "/%s", fs_name)); + } else { + PRTS_RETURN_IFERR(snprintf_s(full_path, MAX_DBS_FS_FILE_PATH_LEN, + MAX_DBS_FS_FILE_PATH_LEN - 1, "/%s/%s", fs_name, dir_path)); + } + dbs_device_info_t query_info = { .handle = -1, .type = DEV_TYPE_DBSTOR_FILE, .path = "" }; //初始化的查询后的信息么? + MEMS_RETURN_IFERR(strncpy_s(query_info.path, MAX_DBS_FS_FILE_PATH_LEN, full_path, strlen(full_path))); + + void *file_list = NULL; + uint32 file_num = 0; + uint32 vstore_id_uint = 0; + + //判断函数存在,函数不存在直接返回 + if (dbs_global_handle()->dbs_view_recycle_bin_info == NULL) { + printf("dbstor client version too old!"); + return CT_ERROR; + } + //申请内存 文件列表内存 + //这个应该是放在后面,todo:返回的时候搜索是文件还是目录 + if (cm_malloc_recycle_file_list_by_version_id(&file_list) != CT_SUCCESS) { + printf("Failed to allocate memory for file list.\n"); + return CT_ERROR; + } + //查询dir + status_t ret = cm_dbs_query_recycle_dir_vstore_id(vstore_id_uint, query_info.path, file_list, &file_num, &trash_num, &capacity); + if (ret != CT_SUCCESS) { + printf("Failed to query files in directory: %s with vstore-id: %u\n", query_info.path, vstore_id_uint); + cm_free_file_list(&file_list); + return CT_ERROR; + } + MEMS_RETURN_IFERR(trash_info_screen_print(file_list, file_num, query_info.path, trash_num, capacity)); + cm_free_file_list(&file_list); + return CT_SUCCESS; +} + + + diff --git a/pkg/src/dbstool/dbs_adp.h b/pkg/src/dbstool/dbs_adp.h index c8ede9cf25116980c4f77b41474e4f2ef1c24c1e..9f9bdcc81ddacad50c493b60a184a5f53c543a10 100644 --- a/pkg/src/dbstool/dbs_adp.h +++ b/pkg/src/dbstool/dbs_adp.h @@ -46,6 +46,7 @@ #define DBS_LOGFILE_SIZE (10 * 1024 * 1024) #define DBS_TOOL_LOG_FILE_NAME "tool/dbs_tool.log" + #define DBS_PERF_ITEM_NAME_LEN 32 #define DBS_UDS_BUFFER_SIZE 1024 #define DBS_UDS_MSG_TIMEOUT_MS 10000 //10s @@ -107,3 +108,5 @@ int32 dbs_get_ns_io_forbidden_stat(int32 argc, char *argv[]); int32 dbs_get_link_timeout(int32 argc, char *argv[]); int32 dbs_query_fs_info(int32 argc, char *argv[]); int32 dbs_perf_show(int32 argc, char *argv[]); +int32 dbs_view_recycle_bin(int32 argc, char *argv[]); +status_t trash_info_screen_print(void *file_list, uint32 file_num, char *path, uint32 trash_num, uint32 capacity); diff --git a/pkg/src/dbstool/dbs_main.c b/pkg/src/dbstool/dbs_main.c index 2913fb815854947daf9622913fc9d6613e5a3b64..24a065fb601732828d14044cb3b7f9cac56726a3 100644 --- a/pkg/src/dbstool/dbs_main.c +++ b/pkg/src/dbstool/dbs_main.c @@ -105,6 +105,9 @@ dbs_cmd_def_t g_dbs_cmd_defs[] = { {{"--perf-show", "*[PARAM]"}, dbs_perf_show, "\tUsage: show dbstor perf.\n" "\tparams: [--interval=*] [--times=*]"}, + {{"--clean-view-recycle-bin", "*[PARAM]"}, dbs_view_recycle_bin, + "\tUsage: view recycle-bin.\n" + "\tparams: --fs-name=* --dir-path=*"}, }; int32 dbs_cmd_help(int32 argc, char* argv[])