From: Patrick Farrell Date: Thu, 5 Dec 2024 04:30:12 +0000 (-0500) Subject: LU-17814 utils: implement real pfind X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;p=fs%2Flustre-release.git LU-17814 utils: implement real pfind This patch does the last step of integrating the actual find code with pfind. This doesn't mean we're done - it doesn't have error propagation and is not enabled by default - but we are close. The next patch will finalize and enable testing. Test-Parameters: trivial Signed-off-by: Patrick Farrell Change-Id: I34020357037bdcf400ffe7f3b4dc14ea5e5a23c7 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/57295 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Marc Vef Reviewed-by: Oleg Drokin --- diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index f1b30bf..e24f1f6 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -1952,10 +1952,10 @@ out_close: return rc; } -static int llapi_semantic_traverse(char *path, int size, int parent, - semantic_func_t sem_init, - semantic_func_t sem_fini, void *data, - struct dirent64 *de) +int llapi_semantic_traverse(char *path, int size, int parent, + semantic_func_t sem_init, + semantic_func_t sem_fini, void *data, + struct dirent64 *de) { struct find_param *param = (struct find_param *)data; struct dirent64 *dent; @@ -2049,7 +2049,7 @@ static int llapi_semantic_traverse(char *path, int size, int parent, } while ((dent = readdir64(dir)) != NULL) { - int rc; + int rc = 0; if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, "..")) continue; @@ -2086,8 +2086,14 @@ static int llapi_semantic_traverse(char *path, int size, int parent, break; case DT_DIR: /* recursion down into a new subdirectory here */ - rc = llapi_semantic_traverse(path, size, d, sem_init, - sem_fini, data, dent); + if (param->fp_thread_count) { + rc = work_unit_create_and_add(path, param, + dent); + } else { + rc = llapi_semantic_traverse(path, size, d, + sem_init, sem_fini, + data, dent); + } if (rc != 0 && ret == 0) ret = rc; if (rc < 0 && rc != -EALREADY && diff --git a/lustre/utils/liblustreapi_pfind.c b/lustre/utils/liblustreapi_pfind.c index 96489f3..a620112 100644 --- a/lustre/utils/liblustreapi_pfind.c +++ b/lustre/utils/liblustreapi_pfind.c @@ -24,7 +24,6 @@ static void *find_worker(void *arg) struct find_work_queue *queue = (struct find_work_queue *) arg; struct find_work_unit *unit; - /* TODO: Implement actual work processing */ while (!queue->fwq_shutdown) { /* Get work unit from queue */ pthread_mutex_lock(&queue->fwq_lock); @@ -46,9 +45,11 @@ static void *find_worker(void *arg) queue->fwq_tail = NULL; pthread_mutex_unlock(&queue->fwq_lock); - /* TODO: processing goes here */ - sleep(0.1); + // TODO: Error propagation, interesting... + llapi_semantic_traverse(unit->fwu_path, 2 * PATH_MAX, -1, + cb_find_init, cb_common_fini, + unit->fwu_param, NULL); work_unit_free(unit); __sync_fetch_and_sub(&queue->fwq_active_units, 1); } @@ -269,8 +270,8 @@ error: return NULL; } -static int work_unit_create_and_add(const char *path, struct find_param *param, - struct dirent64 *dent) +int work_unit_create_and_add(const char *path, struct find_param *param, + struct dirent64 *dent) { struct find_work_queue *queue = param->fp_queue; struct find_work_unit *unit; diff --git a/lustre/utils/lustreapi_internal.h b/lustre/utils/lustreapi_internal.h index 87eb8e0..e81d7f6 100644 --- a/lustre/utils/lustreapi_internal.h +++ b/lustre/utils/lustreapi_internal.h @@ -225,4 +225,10 @@ int cb_common_fini(char *path, int p, int *dp, void *data, int common_param_init(struct find_param *param, char *path); void find_param_fini(struct find_param *param); int parallel_find(char *path, struct find_param *param); +int work_unit_create_and_add(const char *path, struct find_param *param, + struct dirent64 *dent); +int llapi_semantic_traverse(char *path, int size, int parent, + semantic_func_t sem_init, + semantic_func_t sem_fini, void *data, + struct dirent64 *de); #endif /* _LUSTREAPI_INTERNAL_H_ */