root/branches/orange-next/test/correctness/pts/test-path-lookup.c @ 8994

Revision 8994, 17.4 KB (checked in by dcypher, 23 months ago)

replaced %llu->%s for (PVFS|TROVE)_handle

Line 
1/*
2 * (C) 2001 Clemson University and The University of Chicago
3 *
4 * See COPYING in top-level directory.
5 */
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <time.h>
10#include "mpi.h"
11#include "pts.h"
12#include "pvfs-helper.h"
13#include "pvfs2-util.h"
14#include "test-path-lookup.h"
15#include "pvfs2-req-proto.h"
16#include "pvfs2-internal.h"
17#include <pvfs2-handle-to-str.h>
18
19#define GENERATE_FILENAME(fname, max_len, f, i, r, slash) \
20do {                                                      \
21snprintf(fname, max_len, (slash ? "/%s%dr%d" : "%s%dr%d"),\
22          f, i, r);                                       \
23} while (0);
24
25#define RELATIVE_SYMLINK_NAME "rl"
26#define ABSOLUTE_SYMLINK_NAME "al"
27
28static int build_nested_path(
29    int levels, char *format, int rank, int test_symlinks)
30{
31    int ret = -1, i = 0, stored_error = 0;
32    char cur_filename[64] = {0}, tmp_buf[PVFS_NAME_MAX] = {0};
33    PVFS_fs_id cur_fs_id = 0;
34    PVFS_sys_attr attr;
35    PVFS_credentials credentials;
36    PVFS_sysresp_lookup lookup_resp;
37    PVFS_sysresp_mkdir mkdir_resp;
38    PVFS_sysresp_symlink symlink_resp;
39    char PATH_LOOKUP_BASE_DIR[64] = {0};
40    PVFS_object_ref root_refn = {0,0}, parent_refn = {0,0}, base_refn = {0,0};
41    PVFS_object_ref *newdir_refns = NULL;
42    PVFS_object_ref *lookup_refns = NULL;
43    PVFS_object_ref *rsymlink_refns = NULL;
44    PVFS_object_ref *asymlink_refns = NULL;
45    char **absolute_paths = NULL;
46
47    PVFS_util_gen_credentials(&credentials);
48
49    if (levels && format)
50    {
51        snprintf(PATH_LOOKUP_BASE_DIR, 64, "d%sr%d",
52                 format, rank);
53
54        cur_fs_id = pvfs_helper.fs_id;
55
56        /* look up the root handle */
57        ret = PVFS_sys_lookup(
58            cur_fs_id, "/", &credentials, &lookup_resp,
59            PVFS2_LOOKUP_LINK_NO_FOLLOW);
60        if (ret < 0)
61        {
62            fprintf(stderr," *** lookup failed on root directory\n");
63            return ret;
64        }
65
66        root_refn = lookup_resp.ref;
67        fprintf(stderr,"Got Root Handle %s on fs %d\n",
68                PVFS_handle_to_str(root_refn.handle), root_refn.fs_id);
69
70        attr.mask = PVFS_ATTR_SYS_ALL_SETABLE;
71        attr.owner = credentials.uid;
72        attr.group = credentials.gid;
73        attr.perms = 1877;
74        attr.atime = attr.ctime = attr.mtime = time(NULL);
75
76        /* make the top-level base directory */
77        fprintf(stderr," Creating base directory %s under %s, %d\n",
78                PATH_LOOKUP_BASE_DIR, PVFS_handle_to_str(root_refn.handle),
79                root_refn.fs_id);
80        ret = PVFS_sys_mkdir(PATH_LOOKUP_BASE_DIR, root_refn,
81                             attr, &credentials, &mkdir_resp);
82        if (ret < 0)
83        {
84            fprintf(stderr," PVFS_sys_mkdir failed to create "
85                    "base directory %s\n", PATH_LOOKUP_BASE_DIR);
86            goto cleanup;
87        }
88        base_refn = mkdir_resp.ref;
89
90        newdir_refns = (PVFS_object_ref *)malloc(
91            (levels * sizeof(PVFS_object_ref)));
92        lookup_refns = (PVFS_object_ref *)malloc(
93            (levels * sizeof(PVFS_object_ref)));
94        absolute_paths = (char **)malloc(
95            (levels * PVFS_NAME_MAX * sizeof(char)));
96        if (!newdir_refns || !lookup_refns | !absolute_paths)
97        {
98            fprintf(stderr," failed to allocate reference arrays\n");
99            goto cleanup;
100        }
101
102        for(i = 0; i < levels; i++)
103        {
104            parent_refn = mkdir_resp.ref;
105
106            GENERATE_FILENAME(cur_filename, 64, format, i, rank, 0);
107            fprintf(stderr,"  Creating directory %s under %s, %d\n",
108                    cur_filename, PVFS_handle_to_str(parent_refn.handle),
109                    parent_refn.fs_id);
110
111            ret = PVFS_sys_mkdir(cur_filename, parent_refn, attr,
112                                 &credentials, &mkdir_resp);
113            if (ret < 0)
114            {
115                fprintf(stderr," PVFS_sys_mkdir failed to create "
116                        "the directory %s\n", cur_filename);
117                goto cleanup;
118            }
119            fprintf(stderr, "Got handle %s\n",
120                    PVFS_handle_to_str(mkdir_resp.ref.handle));
121
122            /* grab refn of newly created directory */
123            newdir_refns[i] = mkdir_resp.ref;
124        }
125
126        /* generate the absolute path names */
127        snprintf(tmp_buf, PVFS_NAME_MAX, "/%s", PATH_LOOKUP_BASE_DIR);
128        for(i = 0; i < levels; i++)
129        {
130            GENERATE_FILENAME(cur_filename, 64, format, i, rank, 1);
131            strncat(tmp_buf, cur_filename, PVFS_NAME_MAX);
132            absolute_paths[i] = strdup(tmp_buf);
133            if (strlen(absolute_paths[i]) > PVFS_NAME_MAX)
134            {
135                fprintf(stderr," Generated pathname is too long to "
136                        "be a valid PVFS2 path name\n");
137                fprintf(stderr,"%s", absolute_paths[i]);
138                goto cleanup;
139            }
140        }
141
142        /* for each directory just created, do a lookup on them */
143        parent_refn = base_refn;
144        for(i = 0; i < levels; i++)
145        {
146            GENERATE_FILENAME(cur_filename, 64, format, i, rank, 0);
147            fprintf(stderr,"Looking up path %d [RELATIVE] \t\t... ", i);
148#if 0
149            fprintf(stderr,
150                    " - Looking up relative path %s under %s, %d\n",
151                    cur_filename, PVFS_handle_to_str(parent_refn.handle),
152                    parent_refn.fs_id);
153#endif
154            /* first do a relative lookup */
155            ret = PVFS_sys_ref_lookup(
156                parent_refn.fs_id, cur_filename,
157                parent_refn, &credentials,
158                &lookup_resp, PVFS2_LOOKUP_LINK_NO_FOLLOW);
159            if (ret < 0)
160            {
161                fprintf(stderr,"\nPVFS_sys_ref_lookup failed\n");
162                goto cleanup;
163            }
164            else
165            {
166                fprintf(stderr,"OK\n");
167            }
168
169            /* grab refn of looked up directory */
170            lookup_refns[i] = lookup_resp.ref;
171
172            /* then do an absolute path lookup */
173            fprintf(stderr,"Looking up path %d [ABSOLUTE] \t\t... ", i);
174#if 0
175            fprintf(stderr," - Looking up absolute path:\n%s\n",
176                    absolute_paths[i]);
177#endif
178            ret = PVFS_sys_lookup(cur_fs_id, absolute_paths[i],
179                                  &credentials, &lookup_resp,
180                                  PVFS2_LOOKUP_LINK_NO_FOLLOW);
181            if (ret < 0)
182            {
183                fprintf(stderr,"\nPVFS_sys_lookup failed\n");
184                goto cleanup;
185            }
186            else
187            {
188                fprintf(stderr,"OK\n");
189            }
190
191            /*
192              assert that the ref lookup and the absolute
193              lookup yielded the same result
194            */
195            if ((lookup_refns[i].fs_id !=
196                 lookup_resp.ref.fs_id) ||
197                (lookup_refns[i].handle !=
198                 lookup_resp.ref.handle))
199            {
200                fprintf(stderr,"! PVFS_sys_ref_lookup and "
201                        "PVFS_sys_lookup returned different results\n"
202                        "\twhen they SHOULD BE THE SAME (%s != %s)!\n",
203                        PVFS_handle_to_str(lookup_refns[i].handle),
204                        PVFS_handle_to_str(lookup_resp.ref.handle));
205                goto cleanup;
206            }
207            parent_refn = lookup_resp.ref;
208        }
209        ret = 0;
210    }
211
212    if (!test_symlinks)
213    {
214        goto cleanup;
215    }
216
217    /*
218      generate both relative and absolute symlinks for
219      most of the nested directories created
220    */
221    rsymlink_refns = (PVFS_object_ref *)malloc(
222        (levels * sizeof(PVFS_object_ref)));
223    asymlink_refns = (PVFS_object_ref *)malloc(
224        (levels * sizeof(PVFS_object_ref)));
225    for(i = 0; i < levels; i++)
226    {
227        parent_refn = ((i == 0) ? base_refn : lookup_refns[i - 1]);
228        GENERATE_FILENAME(cur_filename, 64, format, i, rank, 0);
229        fprintf(stderr, "Generating relative symlink %s "
230                "in %s,%d to point at %s\n", RELATIVE_SYMLINK_NAME,
231                PVFS_handle_to_str(parent_refn.handle),
232                parent_refn.fs_id, cur_filename);
233        ret = PVFS_sys_symlink(
234            RELATIVE_SYMLINK_NAME, parent_refn, cur_filename,
235            attr, &credentials, &symlink_resp);
236        if (ret < 0)
237        {
238            PVFS_perror("Failed to create symlink ", ret);
239            goto symlink_cleanup;
240        }
241        fprintf(stderr, "Got handle %s\n", PVFS_handle_to_str(symlink_resp.ref.handle));
242
243        /* stash the newly created relative symlink references created */
244        rsymlink_refns[i] = symlink_resp.ref;
245
246        fprintf(stderr, "Generating absolute symlink %s "
247                "in %s,%d to point at %s\n", ABSOLUTE_SYMLINK_NAME,
248                PVFS_handle_to_str(parent_refn.handle),
249                parent_refn.fs_id, absolute_paths[i]);
250        ret = PVFS_sys_symlink(
251            ABSOLUTE_SYMLINK_NAME, parent_refn, absolute_paths[i],
252            attr, &credentials, &symlink_resp);
253        if (ret < 0)
254        {
255            PVFS_perror("Failed to create symlink ", ret);
256            goto symlink_cleanup;
257        }
258        fprintf(stderr, "Got handle %s\n", PVFS_handle_to_str(symlink_resp.ref.handle));
259
260        /* stash the newly created absolute symlink references created */
261        asymlink_refns[i] = symlink_resp.ref;
262    }
263
264    for(i = 0; i < levels; i++)
265    {
266        /*
267          do absolute path lookups with simple symlink substitutions
268          that should resolve to known targets at this point
269        */
270        if (i > 0)
271        {
272            snprintf(tmp_buf, PVFS_NAME_MAX, "%s/%s",
273                     absolute_paths[i - 1], RELATIVE_SYMLINK_NAME);
274            /*
275              a lookup on tmp_buf should resolve exactly
276              to rsymlink_refns[i] if not followed, and
277              lookup_refns[i] if followed.  make sure!
278            */
279            fprintf(stderr,"Looking up rsymlink %d [UNFOLLOWED] "
280                    "\t\t... ", i);
281            ret = PVFS_sys_lookup(cur_fs_id, tmp_buf,
282                                  &credentials, &lookup_resp,
283                                  PVFS2_LOOKUP_LINK_NO_FOLLOW);
284            if (ret < 0)
285            {
286                fprintf(stderr,"\nPVFS_sys_lookup failed\n");
287                goto symlink_cleanup;
288            }
289
290            if ((lookup_resp.ref.handle !=
291                 rsymlink_refns[i].handle) ||
292                (lookup_resp.ref.fs_id !=
293                 rsymlink_refns[i].fs_id))
294            {
295                fprintf(stderr,"\nSymlink %s resolved to %s "
296                        "but should have resolved to %s\n", tmp_buf,
297                        PVFS_handle_to_str(lookup_resp.ref.handle),
298                        PVFS_handle_to_str(rsymlink_refns[i].handle));
299                goto symlink_cleanup;
300            }
301            else
302            {
303                fprintf(stderr,"OK\n");
304            }
305
306            fprintf(stderr,"Looking up rsymlink %d [  FOLLOWED] "
307                    "\t\t... ", i);
308            ret = PVFS_sys_lookup(cur_fs_id, tmp_buf,
309                                  &credentials, &lookup_resp,
310                                  PVFS2_LOOKUP_LINK_FOLLOW);
311            if (ret < 0)
312            {
313                fprintf(stderr,"\nPVFS_sys_lookup failed\n");
314                goto symlink_cleanup;
315            }
316
317            if ((lookup_resp.ref.handle !=
318                 lookup_refns[i].handle) ||
319                (lookup_resp.ref.fs_id !=
320                 lookup_refns[i].fs_id))
321            {
322                fprintf(stderr,"\nSymlink %s resolved to %s "
323                        "but should have resolved to %s\n", tmp_buf,
324                        PVFS_handle_to_str(lookup_resp.ref.handle),
325                        PVFS_handle_to_str(lookup_refns[i].handle));
326                goto symlink_cleanup;
327            }
328            else
329            {
330                fprintf(stderr,"OK\n");
331            }
332
333            snprintf(tmp_buf, PVFS_NAME_MAX, "%s/%s",
334                     absolute_paths[i - 1], ABSOLUTE_SYMLINK_NAME);
335            /*
336              a lookup on tmp_buf should resolve exactly
337              to asymlink_refns[i] if not followed, and
338              lookup_refns[i] if followed.  make sure!
339            */
340            fprintf(stderr,"Looking up asymlink %d [UNFOLLOWED] "
341                    "\t\t... ", i);
342            ret = PVFS_sys_lookup(cur_fs_id, tmp_buf,
343                                  &credentials, &lookup_resp,
344                                  PVFS2_LOOKUP_LINK_NO_FOLLOW);
345            if (ret < 0)
346            {
347                fprintf(stderr,"\nPVFS_sys_lookup failed\n");
348                goto symlink_cleanup;
349            }
350
351            if ((lookup_resp.ref.handle !=
352                 asymlink_refns[i].handle) ||
353                (lookup_resp.ref.fs_id !=
354                 asymlink_refns[i].fs_id))
355            {
356                fprintf(stderr,"\nSymlink %s resolved to %s "
357                        "but should have resolved to %s\n", tmp_buf,
358                        PVFS_handle_to_str(lookup_resp.ref.handle),
359                        PVFS_handle_to_str(asymlink_refns[i].handle));
360                goto symlink_cleanup;
361            }
362            else
363            {
364                fprintf(stderr,"OK\n");
365            }
366
367            fprintf(stderr,"Looking up asymlink %d [  FOLLOWED] "
368                    "\t\t... ", i);
369            ret = PVFS_sys_lookup(cur_fs_id, tmp_buf,
370                                  &credentials, &lookup_resp,
371                                  PVFS2_LOOKUP_LINK_FOLLOW);
372            if (ret < 0)
373            {
374                fprintf(stderr,"\nPVFS_sys_lookup failed\n");
375                goto symlink_cleanup;
376            }
377
378            if ((lookup_resp.ref.handle !=
379                 lookup_refns[i].handle) ||
380                (lookup_resp.ref.fs_id !=
381                 lookup_refns[i].fs_id))
382            {
383                fprintf(stderr,"\nSymlink %s resolved to %s "
384                        "but should have resolved to %s\n", tmp_buf,
385                        PVFS_handle_to_str(lookup_resp.ref.handle),
386                        PVFS_handle_to_str(lookup_refns[i].handle));
387                goto symlink_cleanup;
388            }
389            else
390            {
391                fprintf(stderr,"OK\n");
392            }
393        }
394    }
395
396  symlink_cleanup:
397    if (rsymlink_refns)
398    {
399        free(rsymlink_refns);
400    }
401    if (asymlink_refns)
402    {
403        free(asymlink_refns);
404    }
405
406  cleanup:
407    stored_error = ret;
408
409    if (absolute_paths)
410    {
411        for(i = (levels - 1); i > -1; i--)
412        {
413            parent_refn = ((i == 0) ? base_refn : lookup_refns[i - 1]);
414            if (parent_refn.handle == PVFS_HANDLE_NULL)
415            {
416                fprintf(stderr, "Error performing clean up. "
417                        "Sorry, we're busted ... aborting\n");
418                break;
419            }
420            GENERATE_FILENAME(cur_filename, 64, format, i, rank, 0);
421            fprintf(stderr,"Removing path %s under %s,%d \t\t... ",
422                    cur_filename, PVFS_handle_to_str(parent_refn.handle),
423                    parent_refn.fs_id);
424            ret = PVFS_sys_remove(cur_filename, parent_refn, &credentials);
425            fprintf(stderr, "%s\n", ((ret < 0) ? "FAILED" : "DONE"));
426            if (ret)
427            {
428                PVFS_perror("\nPath removal status: ", ret);
429            }
430
431            if (test_symlinks)
432            {
433                fprintf(stderr,"Removing rlink %s under %s,%d \t\t... ",
434                        RELATIVE_SYMLINK_NAME, PVFS_handle_to_str(parent_refn.handle),
435                        parent_refn.fs_id);
436                ret = PVFS_sys_remove(RELATIVE_SYMLINK_NAME,
437                                      parent_refn, &credentials);
438                fprintf(stderr, "%s\n", ((ret < 0) ? "FAILED" : "DONE"));
439                if (ret)
440                {
441                    PVFS_perror("\nPath removal status: ", ret);
442                }
443
444                fprintf(stderr,"Removing alink %s under %s,%d \t\t... ",
445                        ABSOLUTE_SYMLINK_NAME, PVFS_handle_to_str(parent_refn.handle),
446                        parent_refn.fs_id);
447                ret = PVFS_sys_remove(ABSOLUTE_SYMLINK_NAME,
448                                      parent_refn, &credentials);
449                fprintf(stderr, "%s\n", ((ret < 0) ? "FAILED" : "DONE"));
450                if (ret)
451                {
452                    PVFS_perror("\nPath removal status: ", ret);
453                }
454            }
455        }
456        free(absolute_paths);
457    }
458    ret = PVFS_sys_remove(PATH_LOOKUP_BASE_DIR, root_refn, &credentials);
459    if (ret)
460    {
461        PVFS_perror("Top-level Path removal error ", ret);
462    }
463    if (newdir_refns)
464    {
465        free(newdir_refns);
466    }
467    if (lookup_refns)
468    {
469        free(lookup_refns);
470    }
471    return stored_error;
472}
473
474int test_path_lookup(MPI_Comm *comm __unused, int rank, char *buf __unused, void *params __unused)
475{
476    int ret = -1;
477    char *format_prefix1 = "pt-0";
478    char *format_prefix2 = "st0";
479
480    if (!pvfs_helper.initialized && initialize_sysint())
481    {
482        fprintf(stderr, "initialize_sysint failed\n");
483        return ret;
484    }
485
486    ret = build_nested_path(5, format_prefix1, rank, 0);
487    if (ret)
488    {
489        fprintf(stderr,"(1) Failed to build nested path\n");
490        goto error_exit;
491    }
492
493    ret = build_nested_path(13, format_prefix2, rank, 1);
494    if (ret)
495    {
496        fprintf(stderr,"(2) Failed to build nested path\n");
497        goto error_exit;
498    }
499
500  error_exit:
501    return ret;
502}
503
504/*
505 * Local variables:
506 *  c-indent-level: 4
507 *  c-basic-offset: 4
508 * End:
509 *
510 * vim: ts=8 sts=4 sw=4 expandtab
511 */
Note: See TracBrowser for help on using the browser.