Whamcloud - gitweb
LU-10070 test: llapi_layout_test enhancements
[fs/lustre-release.git] / lustre / tests / llapi_layout_test.c
index 3352fa5..f875f91 100644 (file)
@@ -70,12 +70,14 @@ do {                                                                        \
 
 static char *lustre_dir;
 static char *poolname;
+static bool run_list_provided;
 static int num_osts = -1;
 
 void usage(char *prog)
 {
        printf("Usage: %s [-d lustre_dir] [-p pool_name] [-o num_osts] "
-              "[-s $n,$m,..]\n", prog);
+              "[-s $n,$m,... (skip tests)] [-t $n,$m,... (run tests)]\n",
+              prog);
        exit(0);
 }
 
@@ -1362,8 +1364,10 @@ void test30(void)
        ASSERTF(rc == 0, "errno %d", errno);
 
        /* set non-contiguous extent will fail */
-       rc = llapi_layout_comp_extent_set(layout, end[0] * 2, end[1]);
-       ASSERTF(rc == -1 && errno == EINVAL, "rc %d, errno %d", rc, errno);
+       rc = llapi_layout_comp_extent_set(layout, start[1] * 2, end[1]);
+       ASSERTF(rc == 0, "errno %d", errno);
+       rc = llapi_layout_sanity(layout, false, false);
+       ASSERTF(rc == 12 /*LSE_NOT_ADJACENT_PREV*/, "rc %d", rc);
 
        rc = llapi_layout_comp_extent_set(layout, start[1], end[1]);
        ASSERTF(rc == 0, "errno %d", errno);
@@ -1622,6 +1626,118 @@ void test33(void)
        free(lmdbuf);
 }
 
+#define T34FILE                "f34"
+#define T34_DESC       "create simple valid & invalid self extending layouts"
+void test34(void)
+{
+       int rc, fd;
+       uint64_t start[4], end[4];
+       struct llapi_layout *layout;
+       char path[PATH_MAX];
+
+       start[0] = 0;
+       end[0] = 10 * 1024 * 1024; /* 10m */
+       start[1] = end[0];
+       end[1] = 1024 * 1024 * 1024; /* 1G */
+       start[2] = end[1];
+       end[2] = 10ull * 1024 * 1024 * 1024; /* 10G */
+       start[3] = end[2];
+       end[3] = LUSTRE_EOF;
+
+       if (num_osts < 2)
+               return;
+
+       snprintf(path, sizeof(path), "%s/%s", lustre_dir, T34FILE);
+
+       rc = unlink(path);
+       ASSERTF(rc >= 0 || errno == ENOENT, "errno = %d", errno);
+
+       layout = llapi_layout_alloc();
+       ASSERTF(layout != NULL, "errno %d", errno);
+
+       rc = llapi_layout_stripe_count_set(layout, 1);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       /* add component without adjusting previous component's extent
+        * end will fail.
+        */
+       rc = llapi_layout_comp_add(layout);
+       ASSERTF(rc == -1 && errno == EINVAL, "rc %d, errno %d", rc, errno);
+
+       rc = llapi_layout_comp_extent_set(layout, start[0], end[0]);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       rc = llapi_layout_comp_add(layout);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       rc = llapi_layout_comp_extent_set(layout, start[1], end[1]);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       rc = llapi_layout_comp_flags_set(layout, LCME_FL_EXTENSION);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       /* Invalid size, too small - < 64 MiB */
+       rc = llapi_layout_extension_size_set(layout, 32 << 20);
+       ASSERTF(rc == -1, "errno %d", errno);
+
+       /* too large - > 4 TiB */
+       rc = llapi_layout_extension_size_set(layout, 5ull << 40);
+       ASSERTF(rc == -1, "errno %d", errno);
+
+       /* Valid size, 64 MiB */
+       rc = llapi_layout_extension_size_set(layout, 64 << 20);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       rc = llapi_layout_comp_add(layout);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       rc = llapi_layout_comp_extent_set(layout, start[2], end[2]);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       /* Set extension space flag on adjacent components:
+        * This is invalid, but can't be checked until we try to create the
+        * file. */
+       rc = llapi_layout_comp_flags_set(layout, LCME_FL_EXTENSION);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       fd = llapi_layout_file_create(path, 0, 0660, layout);
+       ASSERTF(fd = -1, "path = %s, fd = %d, errno = %d", path, fd, errno);
+
+       /* Delete incorrect component */
+       rc = llapi_layout_comp_del(layout);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       rc = llapi_layout_comp_add(layout);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       /* Convert this comp to zero-length so it can be followed by extension
+        * space */
+       rc = llapi_layout_comp_extent_set(layout, start[2], start[2]);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       rc = llapi_layout_comp_add(layout);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       rc = llapi_layout_comp_extent_set(layout, start[2], end[3]);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       rc = llapi_layout_comp_flags_set(layout, LCME_FL_EXTENSION);
+       ASSERTF(rc == 0, "errno %d", errno);
+
+       /* create composite file */
+       fd = llapi_layout_file_create(path, 0, 0660, layout);
+       ASSERTF(fd >= 0, "path = %s, fd = %d, errno = %d", path, fd, errno);
+
+       llapi_layout_free(layout);
+
+       /* traverse & verify all components */
+       layout = llapi_layout_get_by_path(path, 0);
+       ASSERTF(layout != NULL, "errno = %d", errno);
+
+       rc = llapi_layout_sanity(layout, false, false);
+       ASSERTF(rc == 0, "errno %d", errno);
+}
+
 #define TEST_DESC_LEN  80
 struct test_tbl_entry {
        void (*tte_fn)(void);
@@ -1664,6 +1780,7 @@ static struct test_tbl_entry test_tbl[] = {
        { .tte_fn = &test31, .tte_desc = T31_DESC, .tte_skip = false },
        { .tte_fn = &test32, .tte_desc = T32_DESC, .tte_skip = false },
        { .tte_fn = &test33, .tte_desc = T33_DESC, .tte_skip = false },
+       { .tte_fn = &test34, .tte_desc = T34_DESC, .tte_skip = false },
 };
 
 #define NUM_TESTS      (sizeof(test_tbl) / sizeof(struct test_tbl_entry))
@@ -1687,7 +1804,8 @@ int test(void (*test_fn)(), const char *test_desc, bool test_skip, int test_num)
        char status_buf[128];
 
        if (test_skip) {
-               print_test_desc(test_num, test_desc, "skip");
+               if (!run_list_provided)
+                       print_test_desc(test_num, test_desc, "skip");
                return 0;
        }
 
@@ -1742,11 +1860,34 @@ static void set_tests_skipped(char *str_tests)
        }
 }
 
+static void set_tests_to_run(char *str_tests)
+{
+       char *ptr = str_tests;
+       int tstno;
+       int i = 0;
+
+       if (ptr == NULL || strlen(ptr) == 0)
+               return;
+
+       for (i = 0; i < NUM_TESTS ; i++)
+               test_tbl[i].tte_skip = true;
+
+       while (*ptr != '\0') {
+               tstno = strtoul(ptr, &ptr, 0);
+               if (tstno >= 0 && tstno < NUM_TESTS)
+                       test_tbl[tstno].tte_skip = false;
+               if (*ptr == ',')
+                       ptr++;
+               else
+                       break;
+       }
+}
+
 static void process_args(int argc, char *argv[])
 {
        int c;
 
-       while ((c = getopt(argc, argv, "d:p:o:s:")) != -1) {
+       while ((c = getopt(argc, argv, "d:p:o:s:t:")) != -1) {
                switch (c) {
                case 'd':
                        lustre_dir = optarg;
@@ -1760,6 +1901,10 @@ static void process_args(int argc, char *argv[])
                case 's':
                        set_tests_skipped(optarg);
                        break;
+               case 't':
+                       run_list_provided = true;
+                       set_tests_to_run(optarg);
+                       break;
                case '?':
                        fprintf(stderr, "Unknown option '%c'\n", optopt);
                        usage(argv[0]);