[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