[PVFS2-CVS] commit by neill in pvfs2/test/io/trove: test-trove-cancel.c module.mk.in
CVS commit program
pvfs2-internal@beowulf-underground.org
Mon, 2 Feb 2004 17:50:26 -0500
Update of /projects/cvsroot/pvfs2/test/io/trove
In directory parlweb.parl.clemson.edu:/tmp/cvs-serv21560/test/io/trove
Modified Files:
module.mk.in
Added Files:
test-trove-cancel.c
Log Message:
- first cut at supporting threaded-aio trove cancellation
- we now better handle errors by reporting them if they occur in any of
the requests issued
- added a simple test-trove-cancel program as a sanity check
- misc cleanups
--- /dev/null Thu Apr 11 10:25:15 2002
+++ test-trove-cancel.c Mon Feb 2 17:50:26 2004
@@ -0,0 +1,333 @@
+/*
+ * (C) 2001 Clemson University and The University of Chicago
+ *
+ * See COPYING in top-level directory.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+#include <malloc.h>
+
+#include "gossip.h"
+#include "trove.h"
+
+#define ROOT_HANDLE_STRING "root_handle"
+
+int path_lookup(TROVE_coll_id coll_id,
+ TROVE_context_id trove_context,
+ char *path, TROVE_handle *out_handle_p);
+
+#define MB 1024*1024
+
+enum
+{
+ TEST_SIZE = 7*MB,
+ SSPACE_SIZE = 64,
+ FS_SIZE = 64,
+ PATH_SIZE = 256,
+ FS_COLL_ID = 9,
+ ADMIN_COLL_ID = 10
+};
+
+enum
+{
+ TROVE_TEST_DIR = 1,
+ TROVE_TEST_FILE = 2,
+ TROVE_TEST_BSTREAM = 3
+};
+
+char storage_space[SSPACE_SIZE] = "/tmp/trove-test-space";
+char file_system[FS_SIZE] = "fs-foo";
+char path_to_file[PATH_SIZE] = "/baz";
+TROVE_handle requested_file_handle = 4095;
+
+int main(int argc, char **argv)
+{
+ int ret = -1;
+ int count;
+ char *mybuffer, *verify_buffer;
+ int i;
+ char path_name[PATH_SIZE];
+ TROVE_op_id op_id, op_id2;
+ TROVE_coll_id coll_id;
+ TROVE_handle file_handle, parent_handle;
+ TROVE_ds_state state;
+ char *method_name, *file_name;
+ TROVE_keyval_s key, val;
+ TROVE_context_id trove_context = -1;
+
+ char *mem_offset_array[7] = {0};
+ TROVE_size mem_size_array[7] =
+ { 1*MB, 1*MB, 1*MB, 1*MB, 1*MB, 1*MB, 1*MB };
+ int mem_count = 7;
+ TROVE_offset stream_offset_array[5] = { 0, 1*MB, 4*MB, 2*MB, 6*MB};
+ TROVE_size stream_size_array[5] = { 1*MB, 1*MB, 2*MB, 2*MB, 1*MB };
+ int stream_count = 5;
+ TROVE_size output_size;
+ void *user_ptr_array[1] = { (char *) 13 };
+ int test_failed = 0;
+
+ TROVE_extent cur_extent;
+ TROVE_handle_extent_array extent_array;
+
+ gossip_enable_stderr();
+ gossip_set_debug_mask(1, GOSSIP_TROVE_DEBUG);
+
+ ret = trove_initialize(storage_space, 0, &method_name, 0);
+ if (ret < 0) {
+ fprintf(stderr, "initialize failed: run trove-mkfs first.\n");
+ return -1;
+ }
+
+ ret = trove_collection_lookup(file_system, &coll_id, NULL, &op_id);
+ if (ret < 0) {
+ fprintf(stderr, "collection lookup failed.\n");
+ return -1;
+ }
+
+ ret = trove_open_context(coll_id, &trove_context);
+ if (ret < 0)
+ {
+ fprintf(stderr, "trove_open_context failed\n");
+ return -1;
+ }
+
+ /* find the parent directory name */
+ strcpy(path_name, path_to_file);
+ for (i = strlen(path_name); i >= 0; i--)
+ {
+ if (path_name[i] != '/')
+ {
+ path_name[i] = '\0';
+ }
+ else
+ {
+ break;
+ }
+ }
+ file_name = path_to_file + strlen(path_name);
+ printf("path is %s\n", path_name);
+ printf("file is %s\n", file_name);
+
+ /* find the parent directory handle */
+ ret = path_lookup(coll_id, trove_context, path_name, &parent_handle);
+ if (ret < 0) {
+ return -1;
+ }
+
+ file_handle = 0;
+
+ cur_extent.first = cur_extent.last = requested_file_handle;
+ extent_array.extent_count = 1;
+ extent_array.extent_array = &cur_extent;
+ ret = trove_dspace_create(coll_id,
+ &extent_array,
+ &file_handle,
+ TROVE_TEST_FILE,
+ NULL,
+ 0 /* flags */,
+ NULL,
+ trove_context,
+ &op_id);
+ while (ret == 0) ret = trove_dspace_test(
+ coll_id, op_id, trove_context, &count, NULL, NULL, &state,
+ TROVE_DEFAULT_TEST_TIMEOUT);
+ if (ret < 0)
+ {
+ fprintf(stderr, "dspace create failed.\n");
+ return -1;
+ }
+
+ /* add new file name/handle pair to parent directory */
+ key.buffer = file_name;
+ key.buffer_sz = strlen(file_name) + 1;
+ val.buffer = &file_handle;
+ val.buffer_sz = sizeof(file_handle);
+ ret = trove_keyval_write(coll_id, parent_handle, &key, &val,
+ 0, NULL, NULL, trove_context, &op_id);
+ while (ret == 0) ret = trove_dspace_test(
+ coll_id, op_id, trove_context, &count, NULL, NULL, &state,
+ TROVE_DEFAULT_TEST_TIMEOUT);
+ if (ret < 0)
+ {
+ fprintf(stderr, "keyval write failed.\n");
+ return -1;
+ }
+
+ /* memory buffer to xfer */
+ mybuffer = (char *)malloc(TEST_SIZE);
+ if (!mybuffer)
+ {
+ fprintf(stderr, "mem.\n");
+ return(-1);
+ }
+ verify_buffer = (char *)malloc(TEST_SIZE);
+ if (!verify_buffer)
+ {
+ fprintf(stderr, "mem.\n");
+ return(-1);
+ }
+
+ mem_offset_array[0] = mybuffer;
+ mem_offset_array[4] = (mem_offset_array[0] + 1*MB);
+ mem_offset_array[2] = (mem_offset_array[4] + 1*MB);
+ mem_offset_array[3] = (mem_offset_array[2] + 1*MB);
+ mem_offset_array[1] = (mem_offset_array[3] + 1*MB);
+ mem_offset_array[6] = (mem_offset_array[1] + 1*MB);
+ mem_offset_array[5] = (mem_offset_array[6] + 1*MB);
+
+ memset(mem_offset_array[0], 0xFE, 1*MB);
+ memset(mem_offset_array[1], 0xFD, 1*MB);
+ memset(mem_offset_array[2], 0xFC, 1*MB);
+ memset(mem_offset_array[3], 0xFB, 1*MB);
+ memset(mem_offset_array[4], 0xFA, 1*MB);
+ memset(mem_offset_array[5], 0xEF, 1*MB);
+ memset(mem_offset_array[6], 0xED, 1*MB);
+
+ ret = trove_bstream_write_list(coll_id,
+ parent_handle,
+ mem_offset_array,
+ mem_size_array,
+ mem_count,
+ stream_offset_array,
+ stream_size_array,
+ stream_count,
+ &output_size,
+ 0, /* flags */
+ NULL, /* vtag */
+ user_ptr_array,
+ trove_context,
+ &op_id);
+
+ ret = trove_bstream_write_list(coll_id,
+ parent_handle,
+ mem_offset_array,
+ mem_size_array,
+ mem_count,
+ stream_offset_array,
+ stream_size_array,
+ stream_count,
+ &output_size,
+ 0, /* flags */
+ NULL, /* vtag */
+ user_ptr_array,
+ trove_context,
+ &op_id2);
+
+ fprintf(stderr, "*** Ok, calling trove_dspace_cancel now on op 2\n");
+ ret = trove_dspace_cancel(coll_id, op_id2, trove_context);
+ fprintf(stderr, "*** trove_dspace_cancel got ret code of %d\n", ret);
+
+ fprintf(stderr, "*** Ok, calling trove_dspace_cancel now on op 1\n");
+ ret = trove_dspace_cancel(coll_id, op_id, trove_context);
+ fprintf(stderr, "*** trove_dspace_cancel got ret code of %d\n", ret);
+
+ do
+ {
+ ret = trove_dspace_test(
+ coll_id, op_id, trove_context, &count, NULL, NULL, &state,
+ TROVE_DEFAULT_TEST_TIMEOUT);
+ } while (ret == 0);
+
+
+ if (ret < 0)
+ {
+ fprintf(stderr, "listio write failed\n");
+ return -1;
+ }
+
+ mem_offset_array[0] = verify_buffer;
+ mem_offset_array[4] = (mem_offset_array[0] + 1*MB);
+ mem_offset_array[2] = (mem_offset_array[4] + 1*MB);
+ mem_offset_array[3] = (mem_offset_array[2] + 1*MB);
+ mem_offset_array[1] = (mem_offset_array[3] + 1*MB);
+ mem_offset_array[6] = (mem_offset_array[1] + 1*MB);
+ mem_offset_array[5] = (mem_offset_array[6] + 1*MB);
+
+ memset(mem_offset_array[0], 0xDE, 1*MB);
+ memset(mem_offset_array[1], 0xDD, 1*MB);
+ memset(mem_offset_array[2], 0xDC, 1*MB);
+ memset(mem_offset_array[3], 0xDB, 1*MB);
+ memset(mem_offset_array[4], 0xDA, 1*MB);
+ memset(mem_offset_array[5], 0xCF, 1*MB);
+ memset(mem_offset_array[6], 0xCD, 1*MB);
+
+ /* should read this back out and verify here */
+ ret = trove_bstream_read_list(coll_id,
+ parent_handle,
+ mem_offset_array,
+ mem_size_array,
+ mem_count,
+ stream_offset_array,
+ stream_size_array,
+ stream_count,
+ &output_size,
+ 0, /* flags */
+ NULL, /* vtag */
+ user_ptr_array,
+ trove_context,
+ &op_id);
+ while (ret == 0) ret = trove_dspace_test(
+ coll_id, op_id, trove_context, &count, NULL, NULL, &state,
+ TROVE_DEFAULT_TEST_TIMEOUT);
+ if (ret < 0)
+ {
+ fprintf(stderr, "listio read failed\n");
+ return -1;
+ }
+
+ for(i = 0; i < TEST_SIZE; i++)
+ {
+ if (mybuffer[i] != verify_buffer[i])
+ {
+ fprintf(stderr,"data mismatch at index %d (%x != %x)\n",
+ i,mybuffer[i],verify_buffer[i]);
+ test_failed = 1;
+ break;
+ }
+ }
+
+ free(mybuffer);
+ free(verify_buffer);
+
+ fprintf(stderr,"This bstream listio test %s\n",
+ (test_failed ? "failed miserably" : "passed"));
+
+ trove_close_context(coll_id, trove_context);
+ trove_finalize();
+ return 0;
+}
+
+
+int path_lookup(TROVE_coll_id coll_id,
+ TROVE_context_id trove_context,
+ char *path, TROVE_handle *out_handle_p)
+{
+ int ret, count;
+ TROVE_ds_state state;
+ TROVE_keyval_s key, val;
+ TROVE_op_id op_id;
+ TROVE_handle handle;
+
+ char root_handle_string[] = ROOT_HANDLE_STRING;
+
+ key.buffer = root_handle_string;
+ key.buffer_sz = strlen(root_handle_string) + 1;
+ val.buffer = &handle;
+ val.buffer_sz = sizeof(handle);
+
+ ret = trove_collection_geteattr(coll_id, &key, &val,
+ 0, NULL, trove_context, &op_id);
+ while (ret == 0) ret = trove_dspace_test(
+ coll_id, op_id, trove_context, &count, NULL, NULL, &state,
+ TROVE_DEFAULT_TEST_TIMEOUT);
+ if (ret < 0) {
+ fprintf(stderr, "collection geteattr (for root handle) failed.\n");
+ return -1;
+ }
+
+ *out_handle_p = handle;
+ return 0;
+}
Index: module.mk.in
===================================================================
RCS file: /projects/cvsroot/pvfs2/test/io/trove/module.mk.in,v
diff -p -u -r1.12 -r1.13
--- module.mk.in 5 Sep 2003 16:55:24 -0000 1.12
+++ module.mk.in 2 Feb 2004 22:50:26 -0000 1.13
@@ -11,6 +11,7 @@ LOCALTESTSRC := \
$(DIR)/test-listio3.c \
$(DIR)/test-listio4.c \
$(DIR)/test-listio5.c \
+ $(DIR)/test-trove-cancel.c \
$(DIR)/trove-import.c \
$(DIR)/trove-export.c \
$(DIR)/trove-touch.c \