From 5fcbffbf7a879c916684d71c7d201adf2cb89adb Mon Sep 17 00:00:00 2001 From: yuqing Date: Sun, 24 Aug 2014 22:19:19 +0800 Subject: [PATCH] fdfs_monitor support delete empty group --- HISTORY | 1 + client/fdfs_monitor.c | 20 +++++++-- client/tracker_client.c | 57 ++++++++++++++++++++++++++ client/tracker_client.h | 10 +++++ tracker/tracker_mem.c | 86 +++++++++++++++++++++++++++++++++++++++ tracker/tracker_mem.h | 1 + tracker/tracker_proto.h | 2 + tracker/tracker_service.c | 27 ++++++++++++ 8 files changed, 200 insertions(+), 4 deletions(-) diff --git a/HISTORY b/HISTORY index 7373a01..e2f5cdb 100644 --- a/HISTORY +++ b/HISTORY @@ -6,6 +6,7 @@ Version 5.04 2014-08-24 online / active and the storage status is wait_sync or syncing, the tracker adjust storage status to newer, and the storage rejoin to the tracker server + * fdfs_monitor support delete empty group Version 5.03 2014-08-10 * network send and recv retry when error EINTR happen diff --git a/client/fdfs_monitor.c b/client/fdfs_monitor.c index 1a0bf0f..5afbe0e 100644 --- a/client/fdfs_monitor.c +++ b/client/fdfs_monitor.c @@ -175,15 +175,26 @@ int main(int argc, char *argv[]) } else if (strcmp(op_type, "delete") == 0) { - char *storage_id; if (arg_index >= argc) { - usage(argv); - return 1; + if ((result=tracker_delete_group(&g_tracker_group, \ + group_name)) == 0) + { + printf("delete group: %s success\n", \ + group_name); } + else + { + printf("delete group: %s fail, " \ + "error no: %d, error info: %s\n", \ + group_name, result, STRERROR(result)); + } + } + else + { + char *storage_id; storage_id = argv[arg_index++]; - if ((result=tracker_delete_storage(&g_tracker_group, \ group_name, storage_id)) == 0) { @@ -197,6 +208,7 @@ int main(int argc, char *argv[]) group_name, storage_id, \ result, STRERROR(result)); } + } } else if (strcmp(op_type, "set_trunk_server") == 0) { diff --git a/client/tracker_client.c b/client/tracker_client.c index 6c1b296..b344d6d 100644 --- a/client/tracker_client.c +++ b/client/tracker_client.c @@ -1218,6 +1218,63 @@ int tracker_delete_storage(TrackerServerGroup *pTrackerGroup, \ return result == ENOENT ? 0 : result; } +int tracker_delete_group(TrackerServerGroup *pTrackerGroup, \ + const char *group_name) +{ + ConnectionInfo *conn; + TrackerHeader *pHeader; + ConnectionInfo tracker_server; + ConnectionInfo *pServer; + ConnectionInfo *pEnd; + char out_buff[sizeof(TrackerHeader) + FDFS_GROUP_NAME_MAX_LEN]; + char in_buff[1]; + char *pInBuff; + int64_t in_bytes; + int result; + + memset(out_buff, 0, sizeof(out_buff)); + pHeader = (TrackerHeader *)out_buff; + snprintf(out_buff + sizeof(TrackerHeader), sizeof(out_buff) - \ + sizeof(TrackerHeader), "%s", group_name); + + long2buff(FDFS_GROUP_NAME_MAX_LEN, pHeader->pkg_len); + pHeader->cmd = TRACKER_PROTO_CMD_SERVER_DELETE_GROUP; + + result = 0; + pEnd = pTrackerGroup->servers + pTrackerGroup->server_count; + for (pServer=pTrackerGroup->servers; pServersock, out_buff, \ + sizeof(TrackerHeader) + FDFS_GROUP_NAME_MAX_LEN, + g_fdfs_network_timeout)) != 0) + { + logError("file: "__FILE__", line: %d, " \ + "send data to tracker server %s:%d fail, " \ + "errno: %d, error info: %s", __LINE__, \ + tracker_server.ip_addr, tracker_server.port, \ + result, STRERROR(result)); + break; + } + + pInBuff = in_buff; + result = fdfs_recv_response(conn, &pInBuff, 0, &in_bytes); + tracker_disconnect_server_ex(conn, result != 0 && result != ENOENT); + if (result != 0) + { + break; + } + } + + return result; +} + int tracker_set_trunk_server(TrackerServerGroup *pTrackerGroup, \ const char *group_name, const char *storage_id, \ char *new_trunk_server_id) diff --git a/client/tracker_client.h b/client/tracker_client.h index fb11a10..f6a993c 100644 --- a/client/tracker_client.h +++ b/client/tracker_client.h @@ -291,6 +291,16 @@ int tracker_delete_storage(TrackerServerGroup *pTrackerGroup, \ const char *group_name, const char *storage_id); +/** +* delete a group from cluster +* params: +* pTrackerGroup: the tracker group +* group_name: the group name to delete +* return: 0 success, !=0 fail, return the error code +**/ +int tracker_delete_group(TrackerServerGroup *pTrackerGroup, \ + const char *group_name); + /** * set trunk server of the specified group * params: diff --git a/tracker/tracker_mem.c b/tracker/tracker_mem.c index dbbe1ea..05716d8 100644 --- a/tracker/tracker_mem.c +++ b/tracker/tracker_mem.c @@ -3373,6 +3373,87 @@ static void tracker_mem_clear_storage_fields(FDFSStorageDetail *pStorageServer) memset(&(pStorageServer->stat), 0, sizeof(FDFSStorageStat)); } +static int tracker_mem_remove_group(FDFSGroupInfo **groups, FDFSGroupInfo *pGroup) +{ + FDFSGroupInfo **ppGroup; + FDFSGroupInfo **ppEnd; + FDFSGroupInfo **pp; + + ppEnd = groups + g_groups.count; + for (ppGroup=groups; ppGroupcount != 0) + { + return EBUSY; + } + + pthread_mutex_lock(&mem_thread_lock); + if (pGroup->count != 0) + { + result = EBUSY; + } + else + { + result = tracker_mem_remove_group(g_groups.groups, pGroup); + if (result == 0) + { + result = tracker_mem_remove_group(g_groups.sorted_groups, pGroup); + } + } + if (result == 0) + { + if (g_groups.pStoreGroup == pGroup) + { + g_groups.pStoreGroup = NULL; + } + g_groups.count--; + } + pthread_mutex_unlock(&mem_thread_lock); + + if (result != 0) + { + return result; + } + + logDebug("file: "__FILE__", line: %d, " \ + "delete empty group: %s", \ + __LINE__, group_name); + sleep(1); + free(pGroup); + + return tracker_save_groups(); +} + int tracker_mem_delete_storage(FDFSGroupInfo *pGroup, const char *id) { FDFSStorageDetail *pStorageServer; @@ -3408,6 +3489,11 @@ int tracker_mem_delete_storage(FDFSGroupInfo *pGroup, const char *id) } } + logDebug("file: "__FILE__", line: %d, " \ + "delete storage server: %s:%d, group: %s", \ + __LINE__, pStorageServer->ip_addr, + pStorageServer->storage_port, pGroup->group_name); + tracker_mem_clear_storage_fields(pStorageServer); pStorageServer->status = FDFS_STORAGE_STATUS_DELETED; diff --git a/tracker/tracker_mem.h b/tracker/tracker_mem.h index 5b47916..61073bf 100644 --- a/tracker/tracker_mem.h +++ b/tracker/tracker_mem.h @@ -68,6 +68,7 @@ FDFSStorageDetail *tracker_mem_get_storage_by_ip(FDFSGroupInfo *pGroup, \ const FDFSStorageDetail *tracker_mem_set_trunk_server( \ FDFSGroupInfo *pGroup, const char *pStroageId, int *result); +int tracker_mem_delete_group(const char *group_name); int tracker_mem_delete_storage(FDFSGroupInfo *pGroup, const char *id); int tracker_mem_storage_ip_changed(FDFSGroupInfo *pGroup, \ diff --git a/tracker/tracker_proto.h b/tracker/tracker_proto.h index 596c3f9..cf293b7 100644 --- a/tracker/tracker_proto.h +++ b/tracker/tracker_proto.h @@ -56,6 +56,8 @@ #define TRACKER_PROTO_CMD_SERVICE_QUERY_FETCH_ALL 105 #define TRACKER_PROTO_CMD_SERVICE_QUERY_STORE_WITHOUT_GROUP_ALL 106 #define TRACKER_PROTO_CMD_SERVICE_QUERY_STORE_WITH_GROUP_ALL 107 +#define TRACKER_PROTO_CMD_SERVER_DELETE_GROUP 108 + #define TRACKER_PROTO_CMD_RESP 100 #define FDFS_PROTO_CMD_ACTIVE_TEST 111 //active test, tracker and storage both support since V1.28 diff --git a/tracker/tracker_service.c b/tracker/tracker_service.c index 02f5032..3dfc584 100644 --- a/tracker/tracker_service.c +++ b/tracker/tracker_service.c @@ -1395,6 +1395,30 @@ static int tracker_deal_storage_join(struct fast_task_info *pTask) return 0; } +static int tracker_deal_server_delete_group(struct fast_task_info *pTask) +{ + char group_name[FDFS_GROUP_NAME_MAX_LEN + 1]; + int nPkgLen; + + nPkgLen = pTask->length - sizeof(TrackerHeader); + pTask->length = sizeof(TrackerHeader); + if (nPkgLen != FDFS_GROUP_NAME_MAX_LEN) + { + logError("file: "__FILE__", line: %d, " \ + "cmd=%d, client ip: %s, package size " \ + PKG_LEN_PRINTF_FORMAT" is not correct, " \ + "expect length: %d", __LINE__, \ + TRACKER_PROTO_CMD_SERVER_DELETE_GROUP, \ + pTask->client_ip, nPkgLen, FDFS_GROUP_NAME_MAX_LEN); + return EINVAL; + } + + memcpy(group_name, pTask->data + sizeof(TrackerHeader), \ + FDFS_GROUP_NAME_MAX_LEN); + group_name[FDFS_GROUP_NAME_MAX_LEN] = '\0'; + return tracker_mem_delete_group(group_name); +} + static int tracker_deal_server_delete_storage(struct fast_task_info *pTask) { char group_name[FDFS_GROUP_NAME_MAX_LEN + 1]; @@ -3649,6 +3673,9 @@ int tracker_deal_task(struct fast_task_info *pTask) case TRACKER_PROTO_CMD_STORAGE_SYNC_DEST_QUERY: result = tracker_deal_storage_sync_dest_query(pTask); break; + case TRACKER_PROTO_CMD_SERVER_DELETE_GROUP: + result = tracker_deal_server_delete_group(pTask); + break; case TRACKER_PROTO_CMD_SERVER_DELETE_STORAGE: result = tracker_deal_server_delete_storage(pTask); break;