Whamcloud - gitweb
LU-17814 utils: implement real pfind 95/57295/14 master
authorPatrick Farrell <pfarrell@whamcloud.com>
Thu, 5 Dec 2024 04:30:12 +0000 (23:30 -0500)
committerOleg Drokin <green@whamcloud.com>
Thu, 12 Jun 2025 06:38:42 +0000 (06:38 +0000)
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 <pfarrell@whamcloud.com>
Change-Id: I34020357037bdcf400ffe7f3b4dc14ea5e5a23c7
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/57295
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Marc Vef <mvef@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/utils/liblustreapi.c
lustre/utils/liblustreapi_pfind.c
lustre/utils/lustreapi_internal.h

index f1b30bf..e24f1f6 100644 (file)
@@ -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 &&
index 96489f3..a620112 100644 (file)
@@ -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;
index 87eb8e0..e81d7f6 100644 (file)
@@ -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_ */