[Pvfs2-cvs] commit by slang in pvfs2/src/server: batch-remove.sm pvfs2-server-req.c

CVS commit program cvs at parl.clemson.edu
Wed Feb 20 22:23:53 EST 2008


Update of /projects/cvsroot/pvfs2/src/server
In directory parlweb1:/tmp/cvs-serv27574/src/server

Added Files:
      Tag: small-file-branch
	batch-remove.sm pvfs2-server-req.c 
Log Message:
couple more.


--- /dev/null	2004-06-24 14:04:38.000000000 -0400
+++ batch-remove.sm	2008-02-20 22:23:53.000000000 -0500
@@ -0,0 +1,218 @@
+/* 
+ * (C) 2001 Clemson University and The University of Chicago 
+ *
+ * See COPYING in top-level directory.
+ */
+
+#include <string.h>
+#include <assert.h>
+
+#include "server-config.h"
+#include "pvfs2-server.h"
+#include "pvfs2-attr.h"
+#include "gossip.h"
+#include "pvfs2-internal.h"
+
+enum
+{
+    REMOVE_NEXT = 1
+};
+
+%%
+
+machine pvfs2_batch_remove_sm
+{
+    state setup_prelude
+    {
+        run setup_prelude;
+        default => prelude;
+    }
+
+    state prelude
+    {
+        jump pvfs2_prelude_work_sm;
+        success => setup_remove;
+        default => release;
+    }
+
+    state setup_remove
+    {
+        run setup_remove;
+        success => remove;
+        default => remove_complete;
+    }
+
+    state remove
+    {
+        jump pvfs2_remove_work_sm;
+        default => remove_complete;
+    }
+
+    state remove_complete
+    {
+        run remove_complete;
+        default => release;
+    }
+
+    state release
+    {
+        run release;
+        default => remove_next;
+    }
+
+    state remove_next
+    {
+        run remove_next;
+        REMOVE_NEXT => setup_prelude;
+        default => response;
+    }
+
+    state response
+    {
+        jump pvfs2_final_response_sm;
+        default => cleanup;
+    }
+
+    state cleanup
+    {
+        run cleanup;
+        default => terminate;
+    }
+}
+
+%%
+
+static PINT_sm_action setup_prelude(
+    struct PINT_smcb *smcb, job_status_s *js_p)
+{
+    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+    assert(s_op);
+
+    /* get the object to remove, the access and scheduling policies */
+    s_op->target_fs_id = s_op->req->u.batch_remove.fs_id;
+    s_op->target_handle =
+        s_op->req->u.batch_remove.handles[s_op->u.batch_remove.handle_index];
+
+    s_op->access_type = PINT_server_req_get_access_type(s_op->req);
+    s_op->sched_policy = PINT_server_req_get_sched_policy(s_op->req);
+
+    return SM_ACTION_COMPLETE;
+}
+
+static PINT_sm_action setup_remove(
+    struct PINT_smcb *smcb, job_status_s *js_p)
+{
+    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+    struct PINT_server_op *remove_op;
+    int ret;
+
+    remove_op = malloc(sizeof(*remove_op));
+    if(!remove_op)
+    {
+        js_p->error_code = -PVFS_ENOMEM;
+        return SM_ACTION_COMPLETE;
+    }
+    memset(remove_op, 0, sizeof(*remove_op));
+
+    remove_op->u.remove.fs_id = s_op->target_fs_id;
+    remove_op->u.remove.handle = s_op->target_handle;
+
+    ret = PINT_sm_push_frame(smcb, 0, remove_op);
+    if(ret < 0)
+    {
+        js_p->error_code = ret;
+    }
+    return SM_ACTION_COMPLETE;
+}
+
+static PINT_sm_action remove_complete(
+    struct PINT_smcb *smcb, job_status_s *js_p)
+{
+    struct PINT_server_op *remove_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+    struct PINT_server_op *s_op;
+    int error_code;
+
+    s_op = PINT_sm_pop_frame(smcb, &error_code);
+
+    free(remove_op);
+
+    if(error_code != 0)
+    {
+        s_op->u.batch_remove.error_code = error_code;
+        return SM_ACTION_COMPLETE;
+    }
+
+    return SM_ACTION_COMPLETE;
+}
+
+static PINT_sm_action release(
+    struct PINT_smcb *smcb, job_status_s *js_p)
+{
+    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+    job_id_t tmp_id;
+    int ret;
+
+    /* we need to release the scheduled remove request on the target
+     * handle.  The schedule call occurred in the prelude_work sm */
+
+    if(!s_op->scheduled_id)
+    {
+        return SM_ACTION_COMPLETE;
+    }
+
+    ret = job_req_sched_release(s_op->scheduled_id, smcb, 0, js_p, &tmp_id,
+                                server_job_context);
+    s_op->scheduled_id = 0;
+    return ret;
+}
+
+static PINT_sm_action remove_next(
+    struct PINT_smcb *smcb, job_status_s *js_p)
+{
+    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+
+    if(s_op->u.batch_remove.error_code != 0)
+    {
+        js_p->error_code = s_op->u.batch_remove.error_code;
+        return SM_ACTION_COMPLETE;
+    }
+
+    if(js_p->error_code != 0)
+    {
+        return SM_ACTION_COMPLETE;
+    }
+
+    s_op->u.batch_remove.handle_index++;
+    if(s_op->u.batch_remove.handle_index < s_op->req->u.batch_remove.handle_count)
+    {
+        js_p->error_code = REMOVE_NEXT;
+    }
+
+    return SM_ACTION_COMPLETE;
+}
+
+
+static int cleanup(
+        struct PINT_smcb *smcb, job_status_s *js_p)
+{
+    return(server_state_machine_complete(smcb));
+}
+
+struct PINT_server_req_params pvfs2_batch_remove_params =
+{
+    .string_name = "batch_remove",
+    .perm = PINT_SERVER_CHECK_NONE,
+    .access_type = PINT_server_req_modify,
+    .state_machine = &pvfs2_batch_remove_sm
+};
+
+
+/*
+ * Local variables:
+ *  mode: c
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ *
+ * vim: ft=c ts=8 sts=4 sw=4 expandtab
+ */

--- /dev/null	2004-06-24 14:04:38.000000000 -0400
+++ pvfs2-server-req.c	2008-02-20 22:23:53.000000000 -0500
@@ -0,0 +1,171 @@
+/*
+ * (C) 2001 Clemson University and The University of Chicago
+ *
+ * See COPYING in top-level directory.
+ */
+
+#include "pvfs2-server.h"
+#include "assert.h"
+
+/* server operation state machines */
+extern struct PINT_server_req_params pvfs2_get_config_params;
+extern struct PINT_server_req_params pvfs2_get_attr_params;
+extern struct PINT_server_req_params pvfs2_list_attr_params;
+extern struct PINT_server_req_params pvfs2_set_attr_params;
+extern struct PINT_server_req_params pvfs2_create_params;
+extern struct PINT_server_req_params pvfs2_crdirent_params;
+extern struct PINT_server_req_params pvfs2_mkdir_params;
+extern struct PINT_server_req_params pvfs2_readdir_params;
+extern struct PINT_server_req_params pvfs2_lookup_params;
+extern struct PINT_server_req_params pvfs2_io_params;
+extern struct PINT_server_req_params pvfs2_small_io_params;
+extern struct PINT_server_req_params pvfs2_remove_params;
+extern struct PINT_server_req_params pvfs2_mgmt_remove_object_params;
+extern struct PINT_server_req_params pvfs2_mgmt_remove_dirent_params;
+extern struct PINT_server_req_params pvfs2_mgmt_get_dirdata_handle_params;
+extern struct PINT_server_req_params pvfs2_rmdirent_params;
+extern struct PINT_server_req_params pvfs2_chdirent_params;
+extern struct PINT_server_req_params pvfs2_flush_params;
+extern struct PINT_server_req_params pvfs2_truncate_params;
+extern struct PINT_server_req_params pvfs2_setparam_params;
+extern struct PINT_server_req_params pvfs2_noop_params;
+extern struct PINT_server_req_params pvfs2_unexpected_params;
+extern struct PINT_server_req_params pvfs2_statfs_params;
+extern struct PINT_server_req_params pvfs2_perf_update_params;
+extern struct PINT_server_req_params pvfs2_job_timer_params;
+extern struct PINT_server_req_params pvfs2_proto_error_params;
+extern struct PINT_server_req_params pvfs2_perf_mon_params;
+extern struct PINT_server_req_params pvfs2_event_mon_params;
+extern struct PINT_server_req_params pvfs2_iterate_handles_params;
+extern struct PINT_server_req_params pvfs2_get_eattr_params;
+extern struct PINT_server_req_params pvfs2_get_eattr_list_params;
+extern struct PINT_server_req_params pvfs2_set_eattr_params;
+extern struct PINT_server_req_params pvfs2_set_eattr_list_params;
+extern struct PINT_server_req_params pvfs2_del_eattr_params;
+extern struct PINT_server_req_params pvfs2_list_eattr_params;
+extern struct PINT_server_req_params pvfs2_batch_create_params;
+extern struct PINT_server_req_params pvfs2_batch_remove_params;
+extern struct PINT_server_req_params pvfs2_stuffed_create_params;
+extern struct PINT_server_req_params pvfs2_precreate_pool_refiller_params;
+
+/* table of incoming request types and associated parameters */
+struct PINT_server_req_entry PINT_server_req_table[] =
+{
+    /* 0 */ {PVFS_SERV_INVALID, NULL},
+    /* 1 */ {PVFS_SERV_CREATE, &pvfs2_create_params},
+    /* 2 */ {PVFS_SERV_REMOVE, &pvfs2_remove_params},
+    /* 3 */ {PVFS_SERV_IO, &pvfs2_io_params},
+    /* 4 */ {PVFS_SERV_GETATTR, &pvfs2_get_attr_params},
+    /* 5 */ {PVFS_SERV_SETATTR, &pvfs2_set_attr_params},
+    /* 6 */ {PVFS_SERV_LOOKUP_PATH, &pvfs2_lookup_params},
+    /* 7 */ {PVFS_SERV_CRDIRENT, &pvfs2_crdirent_params},
+    /* 8 */ {PVFS_SERV_RMDIRENT, &pvfs2_rmdirent_params},
+    /* 9 */ {PVFS_SERV_CHDIRENT, &pvfs2_chdirent_params},
+    /* 10 */ {PVFS_SERV_TRUNCATE, &pvfs2_truncate_params},
+    /* 11 */ {PVFS_SERV_MKDIR, &pvfs2_mkdir_params},
+    /* 12 */ {PVFS_SERV_READDIR, &pvfs2_readdir_params},
+    /* 13 */ {PVFS_SERV_GETCONFIG, &pvfs2_get_config_params},
+    /* 14 */ {PVFS_SERV_WRITE_COMPLETION, NULL},
+    /* 15 */ {PVFS_SERV_FLUSH, &pvfs2_flush_params},
+    /* 16 */ {PVFS_SERV_MGMT_SETPARAM, &pvfs2_setparam_params},
+    /* 17 */ {PVFS_SERV_MGMT_NOOP, &pvfs2_noop_params},
+    /* 18 */ {PVFS_SERV_STATFS, &pvfs2_statfs_params},
+    /* 19 */ {PVFS_SERV_PERF_UPDATE, &pvfs2_perf_update_params},
+    /* 20 */ {PVFS_SERV_MGMT_PERF_MON, &pvfs2_perf_mon_params},
+    /* 21 */ {PVFS_SERV_MGMT_ITERATE_HANDLES, &pvfs2_iterate_handles_params},
+    /* 22 */ {PVFS_SERV_MGMT_DSPACE_INFO_LIST, NULL},
+    /* 23 */ {PVFS_SERV_MGMT_EVENT_MON, &pvfs2_event_mon_params},
+    /* 24 */ {PVFS_SERV_MGMT_REMOVE_OBJECT, &pvfs2_mgmt_remove_object_params},
+    /* 25 */ {PVFS_SERV_MGMT_REMOVE_DIRENT, &pvfs2_mgmt_remove_dirent_params},
+    /* 26 */ {PVFS_SERV_MGMT_GET_DIRDATA_HANDLE, &pvfs2_mgmt_get_dirdata_handle_params},
+    /* 27 */ {PVFS_SERV_JOB_TIMER, &pvfs2_job_timer_params},
+    /* 28 */ {PVFS_SERV_PROTO_ERROR, &pvfs2_proto_error_params},
+    /* 29 */ {PVFS_SERV_GETEATTR, &pvfs2_get_eattr_params},
+    /* 30 */ {PVFS_SERV_SETEATTR, &pvfs2_set_eattr_params},
+    /* 31 */ {PVFS_SERV_DELEATTR, &pvfs2_del_eattr_params},
+    /* 32 */ {PVFS_SERV_LISTEATTR, &pvfs2_list_eattr_params},
+    /* 33 */ {PVFS_SERV_SMALL_IO, &pvfs2_small_io_params},
+    /* 34 */ {PVFS_SERV_LISTATTR, &pvfs2_list_attr_params},
+    /* 35 */ {PVFS_SERV_BATCH_CREATE, &pvfs2_batch_create_params},
+    /* 36 */ {PVFS_SERV_BATCH_REMOVE, &pvfs2_batch_remove_params},
+    /* 37 */ {PVFS_SERV_PRECREATE_POOL_REFILLER, &pvfs2_precreate_pool_refiller_params},
+};
+
+#define CHECK_OP(_op_) assert(_op_ == PINT_server_req_table[_op_].op_type)
+
+inline int PINT_server_req_readonly(struct PVFS_server_req *req)
+{
+    return 1;
+}
+
+inline int PINT_server_req_modify(struct PVFS_server_req *req)
+{
+    return 0;
+}
+
+enum PINT_server_req_permissions
+PINT_server_req_get_perms(struct PVFS_server_req *req)
+{
+    CHECK_OP(req->op);
+    return PINT_server_req_table[req->op].params->perm;
+}
+
+enum PINT_server_req_access_type
+PINT_server_req_get_access_type(struct PVFS_server_req *req)
+{
+    CHECK_OP(req->op);
+
+    if(!PINT_server_req_table[req->op].params->access_type)
+    {
+        return PINT_SERVER_REQ_READONLY;
+    }
+    return PINT_server_req_table[req->op].params->access_type(req);
+}
+
+enum PINT_server_sched_policy
+PINT_server_req_get_sched_policy(struct PVFS_server_req *req)
+{
+    CHECK_OP(req->op);
+    return PINT_server_req_table[req->op].params->sched_policy;
+}
+
+int PINT_server_req_get_object_ref(
+    struct PVFS_server_req *req, PVFS_fs_id *fs_id, PVFS_handle *handle)
+{
+    CHECK_OP(req->op);
+
+    if(!PINT_server_req_table[req->op].params->get_object_ref)
+    {
+        *fs_id = 0;
+        *handle = 0;
+        return 0;
+    }
+    else
+    {
+        return PINT_server_req_table[req->op].params->get_object_ref(
+            req, fs_id, handle);
+    }
+}
+
+/*
+ * PINT_map_server_op_to_string()
+ *
+ * provides a string representation of the server operation number
+ *
+ * returns a pointer to a static string (DONT FREE IT) on success,
+ * null on failure
+ */
+const char* PINT_map_server_op_to_string(enum PVFS_server_op op)
+{
+    CHECK_OP(op);
+    return PINT_server_req_table[op].params->string_name;
+}
+
+/*
+ * Local variables:
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ * End:
+ *
+ * vim: ts=8 sts=4 sw=4 expandtab
+ */



More information about the Pvfs2-cvs mailing list