Skip to content
Permalink
1139b72d5e
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
243 lines (202 sloc) 6.08 KB
/*
* (C) 2003 Clemson University and The University of Chicago
*
* See COPYING in top-level directory.
*/
/** \file
* \ingroup mgmtint
*
* PVFS2 management interface routines for removing specific objects.
* These are used primarily for file system repair purposes (to remove
* orphaned objects), although they can also be used to create specific
* inconsistency cases for testing of failure tolerance.
*/
#include <string.h>
#include <assert.h>
#include "client-state-machine.h"
#include "pvfs2-debug.h"
#include "job.h"
#include "gossip.h"
#include "str-utils.h"
#include "pint-cached-config.h"
#include "PINT-reqproto-encode.h"
#include "pvfs2-internal.h"
extern job_context_id pint_client_sm_context;
static int mgmt_remove_object_comp_fn(
void *v_p, struct PVFS_server_resp *resp_p, int i);
%%
machine pvfs2_client_mgmt_remove_object_sm
{
state init
{
run mgmt_remove_init;
default => remove_object_setup_msgpair;
}
state remove_object_setup_msgpair
{
run mgmt_remove_object_setup_msgpair;
success => remove_object_xfer_msgpair;
default => cleanup;
}
state remove_object_xfer_msgpair
{
jump pvfs2_msgpairarray_sm;
default => cleanup;
}
state cleanup
{
run mgmt_remove_cleanup;
default => terminate;
}
}
%%
/** Initiate removal of a specific file system object.
*/
PVFS_error PVFS_imgmt_remove_object(
PVFS_object_ref object_ref,
PVFS_credentials *credentials,
PVFS_sys_op_id *op_id,
PVFS_hint hints,
void *user_ptr)
{
PVFS_error ret = -PVFS_EINVAL;
PINT_smcb *smcb = NULL;
PINT_client_sm *sm_p = NULL;
gossip_debug(GOSSIP_CLIENT_DEBUG,
"PVFS_imgmt_remove_object entered\n");
if ((object_ref.handle == PVFS_HANDLE_NULL) ||
(object_ref.fs_id == PVFS_FS_ID_NULL))
{
return ret;
}
PINT_smcb_alloc(&smcb, PVFS_MGMT_REMOVE_OBJECT,
sizeof(struct PINT_client_sm),
client_op_state_get_machine,
client_state_machine_terminate,
pint_client_sm_context);
if (smcb == NULL)
{
return -PVFS_ENOMEM;
}
sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
PINT_init_msgarray_params(sm_p, object_ref.fs_id);
PINT_init_sysint_credentials(sm_p->cred_p, credentials);
sm_p->object_ref = object_ref;
PVFS_hint_copy(hints, &sm_p->hints);
gossip_debug(
GOSSIP_CLIENT_DEBUG, "Trying to remove handle %llu,%d\n",
llu(object_ref.handle), object_ref.fs_id);
gossip_debug(GOSSIP_CLIENT_DEBUG, "PVFS_imgmt_remove_object calling "
"PINT_client_state_machine_post()\n");
return PINT_client_state_machine_post(
smcb, op_id, user_ptr);
}
/** Remove a specific file system object.
*/
PVFS_error PVFS_mgmt_remove_object(
PVFS_object_ref object_ref,
PVFS_credentials *credentials,
PVFS_hint hints)
{
PVFS_error ret = -PVFS_EINVAL, error = 0;
PVFS_sys_op_id op_id;
gossip_debug(GOSSIP_CLIENT_DEBUG,
"PVFS_mgmt_remove_object entered\n");
ret = PVFS_imgmt_remove_object(object_ref, credentials, &op_id, NULL, hints);
if (ret)
{
PVFS_perror_gossip("PVFS_imgmt_remove_object call", ret);
error = ret;
}
else
{
ret = PVFS_mgmt_wait(op_id, "remove_object", &error);
if (ret)
{
PVFS_perror_gossip("PVFS_mgmt_wait call", ret);
error = ret;
}
}
PINT_mgmt_release(op_id);
return error;
}
/****************************************************************/
static PINT_sm_action mgmt_remove_init(
struct PINT_smcb *smcb, job_status_s *js_p)
{
gossip_debug(GOSSIP_CLIENT_DEBUG, "mgmt_remove_init called\n");
assert(js_p->error_code == 0);
return SM_ACTION_COMPLETE;
}
static PINT_sm_action mgmt_remove_object_setup_msgpair(
struct PINT_smcb *smcb, job_status_s *js_p)
{
struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
int ret = -PVFS_EINVAL;
PINT_sm_msgpair_state *msg_p = NULL;
js_p->error_code = 0;
PINT_msgpair_init(&sm_p->msgarray_op);
msg_p = &sm_p->msgarray_op.msgpair;
PINT_SERVREQ_MGMT_REMOVE_OBJECT_FILL(
msg_p->req,
*sm_p->cred_p,
sm_p->object_ref.fs_id,
sm_p->object_ref.handle,
sm_p->hints);
gossip_debug(GOSSIP_REMOVE_DEBUG, "- doing MGMT_REMOVE_OBJECT on "
"%llu,%d\n", llu(sm_p->object_ref.handle),
sm_p->object_ref.fs_id);
msg_p->fs_id = sm_p->object_ref.fs_id;
msg_p->handle = sm_p->object_ref.handle;
msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY;
msg_p->comp_fn = mgmt_remove_object_comp_fn;
ret = PINT_cached_config_map_to_server(
&msg_p->svr_addr, msg_p->handle, msg_p->fs_id);
if (ret)
{
gossip_err("Failed to map server address\n");
js_p->error_code = ret;
}
PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op);
return SM_ACTION_COMPLETE;
}
static int mgmt_remove_object_comp_fn(
void *v_p, struct PVFS_server_resp *resp_p, int index)
{
PINT_smcb *smcb = v_p;
#ifdef WIN32
PINT_client_sm *sm_p =
PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM);
#else
PINT_client_sm *sm_p __attribute__((unused)) =
PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM);
#endif
assert(resp_p->op == PVFS_SERV_MGMT_REMOVE_OBJECT);
if (resp_p->status == 0)
{
gossip_debug(
GOSSIP_CLIENT_DEBUG,
" mgmt_remove_object_comp_fn: object %llu,%d removed\n",
llu(sm_p->object_ref.handle),
sm_p->object_ref.fs_id);
}
return resp_p->status;
}
static PINT_sm_action mgmt_remove_cleanup(
struct PINT_smcb *smcb, job_status_s *js_p)
{
struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
gossip_debug(GOSSIP_CLIENT_DEBUG, "mgmt_remove_cleanup called\n");
sm_p->error_code = js_p->error_code;
PINT_SET_OP_COMPLETE;
return SM_ACTION_TERMINATE;
}
/*
* Local variables:
* mode: c
* c-indent-level: 4
* c-basic-offset: 4
* End:
*
* vim: ft=c ts=8 sts=4 sw=4 expandtab
*/