diff --git a/src/common/dss_defs.h b/src/common/dss_defs.h index 3da3ffb013b2064c8945aad8934e724c2e18dc4e..c1af6eefbd02f17a903f61668d9121a71665f2c4 100644 --- a/src/common/dss_defs.h +++ b/src/common/dss_defs.h @@ -332,6 +332,22 @@ extern "C" { } \ } while (0) +#define DSS_RETURN_VALUE_IF_HOOK(cond, value, hook) \ + do { \ + if (cond) { \ + hook; \ + return value; \ + } \ + } while (0) + +#define DSS_RETURN_IF(cond, value) \ + do { \ + if (cond) { \ + return value; \ + } \ + } while (0) + + #ifdef WIN32 #define DSS_LOG_WITH_OS_MSG(user_fmt_str, ...) \ do { \ diff --git a/src/common/dss_file.c b/src/common/dss_file.c index 01bb463cb1d2a55182d6d94e47068298c1d1df3c..10b036498ddc0032cfa2adc8cfbf98456a6d5649 100644 --- a/src/common/dss_file.c +++ b/src/common/dss_file.c @@ -322,50 +322,48 @@ void dss_unlock_vg_mem_and_shm_ex(dss_session_t *session, char *vg_name) } } -void dss_mv_to_recycle_dir(dss_session_t *session, dss_vg_info_item_t *vg_item, gft_node_t *node) +void dss_mv_to_specific_dir( + dss_session_t *session, dss_vg_info_item_t *vg_item, gft_node_t *node, gft_node_t *specific_node) { CM_ASSERT(vg_item != NULL); CM_ASSERT(node != NULL); + CM_ASSERT(specific_node != NULL); gft_node_t *last_node = NULL; - dss_au_root_t *dss_au_root = DSS_GET_AU_ROOT(vg_item->dss_ctrl); - ftid_t recycle_ftid = *(ftid_t *)(&dss_au_root->free_root); - gft_node_t *recycle_node = dss_get_ft_node_by_ftid(session, vg_item, recycle_ftid, CM_TRUE, CM_FALSE); - CM_ASSERT(recycle_node != NULL); - - LOG_DEBUG_INF("[FT][RECYCLE] Begin to mv node to recycle dir, name:%s, node:%s, recycle dir count:%u.", node->name, - dss_display_metaid(node->id), recycle_node->items.count); - LOG_DEBUG_INF("[FT][RECYCLE] Now recycle dir first node:%s.", dss_display_metaid(recycle_node->items.first)); - LOG_DEBUG_INF("[FT][RECYCLE] Now recycle dir last node:%s.", dss_display_metaid(recycle_node->items.last)); - recycle_node->items.count++; - node->prev = recycle_node->items.last; - node->parent = recycle_ftid; + + LOG_DEBUG_INF("[FT] Begin to mv node to specific dir, name:%s, node:%s, specific dir count:%u.", node->name, + dss_display_metaid(node->id), specific_node->items.count); + LOG_DEBUG_INF("[FT] Now specific dir first node:%s.", dss_display_metaid(specific_node->items.first)); + LOG_DEBUG_INF("[FT] Now specific dir last node:%s.", dss_display_metaid(specific_node->items.last)); + specific_node->items.count++; + node->prev = specific_node->items.last; + node->parent = specific_node->id; dss_set_blockid(&node->next, DSS_INVALID_64); - bool32 cmp = dss_cmp_blockid(recycle_node->items.last, DSS_INVALID_64); + bool32 cmp = dss_cmp_blockid(specific_node->items.last, DSS_INVALID_64); if (cmp) { - recycle_node->items.first = node->id; + specific_node->items.first = node->id; } else { last_node = - (gft_node_t *)dss_get_ft_node_by_ftid(session, vg_item, recycle_node->items.last, CM_TRUE, CM_FALSE); + (gft_node_t *)dss_get_ft_node_by_ftid(session, vg_item, specific_node->items.last, CM_TRUE, CM_FALSE); CM_ASSERT(last_node != NULL); last_node->next = node->id; } - recycle_node->items.last = node->id; + specific_node->items.last = node->id; - dss_redo_recycle_ft_node_t redo; - redo.node[DSS_REDO_RECYCLE_FT_NODE_SELF_INDEX] = *node; + dss_redo_move_ft_node_t redo; + redo.node[DSS_REDO_MOVE_FT_NODE_SELF_INDEX] = *node; if (last_node != NULL) { - redo.node[DSS_REDO_RECYCLE_FT_NODE_LAST_INDEX] = *last_node; + redo.node[DSS_REDO_MOVE_FT_NODE_LAST_INDEX] = *last_node; } else { - dss_set_auid(&redo.node[DSS_REDO_RECYCLE_FT_NODE_LAST_INDEX].id, CM_INVALID_ID64); + dss_set_auid(&redo.node[DSS_REDO_MOVE_FT_NODE_LAST_INDEX].id, CM_INVALID_ID64); } - redo.node[DSS_REDO_RECYCLE_FT_NODE_RECYCLE_INDEX] = *recycle_node; + redo.node[DSS_REDO_MOVE_FT_NODE_SPECIFIC_INDEX] = *specific_node; - dss_put_log(session, vg_item, DSS_RT_RECYCLE_FILE_TABLE_NODE, &redo, sizeof(dss_redo_recycle_ft_node_t)); - DSS_LOG_DEBUG_OP("[FT][RECYCLE] Succeed to mv to recycle dir, name:%s, node:%s, now recycle dir count:%u.", - node->name, dss_display_metaid(node->id), recycle_node->items.count); - LOG_DEBUG_INF("[FT][RECYCLE] Now recycle dir first node:%s.", dss_display_metaid(recycle_node->items.first)); - LOG_DEBUG_INF("[FT][RECYCLE] Now recycle dir last node:%s.", dss_display_metaid(recycle_node->items.last)); + dss_put_log(session, vg_item, DSS_RT_MOVE_FILE_TABLE_NODE, &redo, sizeof(dss_redo_move_ft_node_t)); + DSS_LOG_DEBUG_OP("[FT] Succeed to mv to specific dir, name:%s, node:%s, now specific dir count:%u.", + node->name, dss_display_metaid(node->id), specific_node->items.count); + LOG_DEBUG_INF("[FT] Now specific dir first node:%s.", dss_display_metaid(specific_node->items.first)); + LOG_DEBUG_INF("[FT] Now specific dir last node:%s.", dss_display_metaid(specific_node->items.last)); } status_t dss_recycle_empty_file( @@ -4343,8 +4341,11 @@ static status_t dss_clean_delay_file_node( { if (node->size > 0) { // first remove node from old dir but not real delete, just mv to recycle + dss_au_root_t *dss_au_root = DSS_GET_AU_ROOT(vg_item->dss_ctrl); + ftid_t recycle_ftid = *(ftid_t *)(&dss_au_root->free_root); + gft_node_t *recycle_node = dss_get_ft_node_by_ftid(session, vg_item, recycle_ftid, CM_TRUE, CM_FALSE); dss_free_ft_node(session, vg_item, parent_node, node, CM_FALSE); - dss_mv_to_recycle_dir(session, vg_item, node); + dss_mv_to_specific_dir(session, vg_item, node, recycle_node); } else { status_t status = dss_recycle_empty_file(session, vg_item, parent_node, node); if (status != CM_SUCCESS) { diff --git a/src/common/dss_file.h b/src/common/dss_file.h index e0906198e62eae7460f8ae684375a24588fb788a..29247491aec8bf5d10a483b54242e6c88668dd5d 100644 --- a/src/common/dss_file.h +++ b/src/common/dss_file.h @@ -167,7 +167,8 @@ status_t dss_refresh_vginfo(dss_vg_info_item_t *vg_item); status_t dss_get_fs_block_info_by_offset( int64 offset, uint64 au_size, uint32 *block_count, uint32 *block_au_count, uint32 *au_offset); status_t dss_check_open_file_remote(dss_session_t *session, const char *vg_name, uint64 ftid, bool32 *is_open); -void dss_mv_to_recycle_dir(dss_session_t *session, dss_vg_info_item_t *vg_item, gft_node_t *node); +void dss_mv_to_specific_dir( + dss_session_t *session, dss_vg_info_item_t *vg_item, gft_node_t *node, gft_node_t *specific_node); status_t dss_recycle_empty_file( dss_session_t *session, dss_vg_info_item_t *vg_item, gft_node_t *parent_node, gft_node_t *node); status_t dss_check_file(dss_vg_info_item_t *vg_item); diff --git a/src/common/persist/dss_redo.c b/src/common/persist/dss_redo.c index 89f531c3bb003e52f1ddea5177d92a80f63d9cdd..b94e90ad18da0f80bbc65f792812545dbcea170d 100644 --- a/src/common/persist/dss_redo.c +++ b/src/common/persist/dss_redo.c @@ -1149,12 +1149,12 @@ static void print_redo_free_ft_node(dss_redo_entry_t *entry) (void)printf(" }\n"); } -status_t rp_redo_recycle_ft_node(dss_session_t *session, dss_vg_info_item_t *vg_item, dss_redo_entry_t *entry) +status_t rp_redo_move_ft_node(dss_session_t *session, dss_vg_info_item_t *vg_item, dss_redo_entry_t *entry) { CM_ASSERT(vg_item != NULL); CM_ASSERT(entry != NULL); - dss_redo_recycle_ft_node_t *data = (dss_redo_recycle_ft_node_t *)entry->data; + dss_redo_move_ft_node_t *data = (dss_redo_move_ft_node_t *)entry->data; bool32 check_version = CM_FALSE; if (vg_item->status == DSS_VG_STATUS_RECOVERY) { @@ -1171,7 +1171,7 @@ status_t rp_redo_recycle_ft_node(dss_session_t *session, dss_vg_info_item_t *vg_ gft_node_t *node; dss_ft_block_t *cur_block = NULL; - for (uint32 i = 0; i < DSS_REDO_RECYCLE_FT_NODE_NUM; i++) { + for (uint32 i = 0; i < DSS_REDO_MOVE_FT_NODE_NUM; i++) { if (dss_cmp_auid(data->node[i].id, CM_INVALID_ID64)) { continue; } @@ -1195,13 +1195,13 @@ status_t rp_redo_recycle_ft_node(dss_session_t *session, dss_vg_info_item_t *vg_ return CM_SUCCESS; } -status_t rb_redo_recycle_ft_node(dss_session_t *session, dss_vg_info_item_t *vg_item, dss_redo_entry_t *entry) +status_t rb_redo_move_ft_node(dss_session_t *session, dss_vg_info_item_t *vg_item, dss_redo_entry_t *entry) { CM_ASSERT(vg_item != NULL); CM_ASSERT(entry != NULL); status_t status; - dss_redo_recycle_ft_node_t *data = (dss_redo_recycle_ft_node_t *)entry->data; + dss_redo_move_ft_node_t *data = (dss_redo_move_ft_node_t *)entry->data; bool32 check_version = CM_FALSE; if (entry->size == 0) { @@ -1211,7 +1211,7 @@ status_t rb_redo_recycle_ft_node(dss_session_t *session, dss_vg_info_item_t *vg_ gft_node_t *node; dss_ft_block_t *cur_block = NULL; bool32 cmp; - for (uint32 i = 0; i < DSS_REDO_RECYCLE_FT_NODE_NUM; i++) { + for (uint32 i = 0; i < DSS_REDO_MOVE_FT_NODE_NUM; i++) { cmp = dss_cmp_auid(data->node[i].id, CM_INVALID_ID64); if (cmp) { continue; @@ -1230,11 +1230,11 @@ status_t rb_redo_recycle_ft_node(dss_session_t *session, dss_vg_info_item_t *vg_ return CM_SUCCESS; } -static void print_redo_recycle_ft_node(dss_redo_entry_t *entry) +static void print_redo_move_ft_node(dss_redo_entry_t *entry) { - dss_redo_recycle_ft_node_t *data = (dss_redo_recycle_ft_node_t *)entry->data; - (void)printf(" recycle_ft_node = {\n"); - for (uint32 i = 0; i < DSS_REDO_RECYCLE_FT_NODE_NUM; i++) { + dss_redo_move_ft_node_t *data = (dss_redo_move_ft_node_t *)entry->data; + (void)printf(" move_ft_node = {\n"); + for (uint32 i = 0; i < DSS_REDO_MOVE_FT_NODE_NUM; i++) { if (dss_cmp_auid(data->node[i].id, CM_INVALID_ID64)) { continue; } @@ -1875,7 +1875,7 @@ static dss_redo_handler_t g_dss_handlers[] = { // recycle gft_node to gft->free_list {DSS_RT_FREE_FILE_TABLE_NODE, rp_redo_free_ft_node, rb_redo_free_ft_node, print_redo_free_ft_node}, // recycle gft_node to dss_ctrl->core.au_root->free_root - {DSS_RT_RECYCLE_FILE_TABLE_NODE, rp_redo_recycle_ft_node, rb_redo_recycle_ft_node, print_redo_recycle_ft_node}, + {DSS_RT_MOVE_FILE_TABLE_NODE, rp_redo_move_ft_node, rb_redo_move_ft_node, print_redo_move_ft_node}, {DSS_RT_SET_FILE_SIZE, rp_redo_set_file_size, rb_redo_set_file_size, print_redo_set_file_size}, {DSS_RT_RENAME_FILE, rp_redo_rename_file, rb_redo_rename_file, print_redo_rename_file}, diff --git a/src/common/persist/dss_redo.h b/src/common/persist/dss_redo.h index 52f4a5469222a0e33f50a00e83de33d64e28df47..2aa83783a4248b08e0d2e67e05737c0f39ce9aba 100644 --- a/src/common/persist/dss_redo.h +++ b/src/common/persist/dss_redo.h @@ -56,7 +56,7 @@ typedef enum en_dss_redo_type { DSS_RT_FORMAT_AU_FILE_TABLE, DSS_RT_ALLOC_FILE_TABLE_NODE, DSS_RT_FREE_FILE_TABLE_NODE, - DSS_RT_RECYCLE_FILE_TABLE_NODE, + DSS_RT_MOVE_FILE_TABLE_NODE, DSS_RT_SET_FILE_SIZE, DSS_RT_RENAME_FILE, // fs_block @@ -103,15 +103,15 @@ typedef struct st_dss_redo_free_ft_node_t { gft_node_t node[DSS_REDO_FREE_FT_NODE_NUM]; } dss_redo_free_ft_node_t; -typedef enum st_dss_redo_recycle_ft_node_index { - DSS_REDO_RECYCLE_FT_NODE_SELF_INDEX = 0, - DSS_REDO_RECYCLE_FT_NODE_LAST_INDEX = 1, - DSS_REDO_RECYCLE_FT_NODE_RECYCLE_INDEX = 2, - DSS_REDO_RECYCLE_FT_NODE_NUM = 3 -} dss_redo_recycle_ft_node_index_e; -typedef struct st_dss_redo_recycle_ft_node_t { - gft_node_t node[DSS_REDO_RECYCLE_FT_NODE_NUM]; -} dss_redo_recycle_ft_node_t; +typedef enum st_dss_redo_move_ft_node_index { + DSS_REDO_MOVE_FT_NODE_SELF_INDEX = 0, + DSS_REDO_MOVE_FT_NODE_LAST_INDEX = 1, + DSS_REDO_MOVE_FT_NODE_SPECIFIC_INDEX = 2, + DSS_REDO_MOVE_FT_NODE_NUM = 3 +} dss_redo_move_ft_node_index_e; +typedef struct st_dss_redo_move_ft_node_t { + gft_node_t node[DSS_REDO_MOVE_FT_NODE_NUM]; +} dss_redo_move_ft_node_t; typedef struct st_dss_redo_format_ft_t { auid_t auid;