Пример #1
0
int client_state_machine_terminate(
        struct PINT_smcb *smcb, job_status_s *js_p)
{
    int ret;
    PINT_client_sm *sm_p;

    sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);

    gossip_debug(GOSSIP_CLIENT_DEBUG,
                 "client_state_machine_terminate smcb %p\n",smcb);

    if (!((PINT_smcb_op(smcb) == PVFS_SYS_IO) &&
            (PINT_smcb_cancelled(smcb)) &&
            (cancelled_io_jobs_are_pending(smcb))) &&
        !PINT_smcb_immediate_completion(smcb))
    {
        gossip_debug(GOSSIP_CLIENT_DEBUG,
                 "client_state_machine_terminate smcb %p completing\n",smcb);

        PINT_EVENT_END(PINT_client_sys_event_id, pint_client_pid, NULL, sm_p->event_id, 0);
        PVFS_hint_free(sm_p->hints);
        sm_p->hints = NULL;

        gossip_debug(GOSSIP_CLIENT_DEBUG, 
                "add smcb %p to completion list\n", smcb);
        ret = add_sm_to_completion_list(smcb);
        assert(ret == 0);
    }
    else
    {
        gossip_debug(GOSSIP_CLIENT_DEBUG,
                 "client_state_machine_terminate smcb %p waiting for cancelled jobs\n",smcb);
    }
    return SM_ACTION_TERMINATE;
}
Пример #2
0
int pvfsDestory()
{
  PVFS_sys_finalize();
  PVFS_hint_free(hints);
}
Пример #3
0
/** lebf_initialize()
 *
 * initializes the encoder module, calculates max sizes of each request type 
 * in advance
 *
 * no return value
 */
static void lebf_initialize(void)
{
    struct PVFS_server_req req = {0};
    struct PVFS_server_resp resp = {0};
    enum PVFS_server_op op_type;
    int reqsize, respsize;
    int noreq;
    PINT_dist tmp_dist;
    PINT_Request tmp_req;
    char *tmp_name = strdup("foo");
    const int init_big_size = 1024 * 1024;
    int i;

    gossip_debug(GOSSIP_ENDECODE_DEBUG,"lebf_initialize\n");

    max_size_array = malloc(PVFS_SERV_NUM_OPS * sizeof(*max_size_array));
    if (max_size_array == NULL)
        return;

    /*
     * Some messages have extra structures, and even indeterminate sizes
     * which are hand-calculated here.  Also some fields must be initialized
     * for encoding to work properly.
     */
    memset(&tmp_dist, 0, sizeof(tmp_dist));
    tmp_dist.dist_name = strdup(PVFS_DIST_BASIC_NAME);
    if (PINT_dist_lookup(&tmp_dist)) {
	gossip_err("%s: dist %s does not exist?!?\n",
	  __func__, tmp_dist.dist_name);
	exit(1);
    }
    memset(&tmp_req, 0, sizeof(tmp_req));

    initializing_sizes = 1;

    /** set number of hints in request to the max */
    for(i = 0; i < PVFS_HINT_MAX; ++i)
    {
        char name[PVFS_HINT_MAX_NAME_LENGTH] = {0};
        char val[PVFS_HINT_MAX_LENGTH] = {0};
        PVFS_hint_add(&req.hints, name, PVFS_HINT_MAX_LENGTH, val);
    }

    for (op_type=0; op_type<PVFS_SERV_NUM_OPS; op_type++) {
        memset(&req.u, 0, sizeof(req.u));
	req.op = resp.op = op_type;
	reqsize = 0;
	respsize = 0;
	noreq = 0;
	switch (op_type) {
	    case PVFS_SERV_INVALID:
	    case PVFS_SERV_PERF_UPDATE:
	    case PVFS_SERV_PRECREATE_POOL_REFILLER:
	    case PVFS_SERV_JOB_TIMER:
		/** never used, skip initialization */
		continue;
	    case PVFS_SERV_GETCONFIG:
		resp.u.getconfig.fs_config_buf = tmp_name;
		respsize = extra_size_PVFS_servresp_getconfig;
		break;
	    case PVFS_SERV_LOOKUP_PATH:
		req.u.lookup_path.path = "";
		resp.u.lookup_path.handle_count = 0;
		resp.u.lookup_path.attr_count = 0;
		reqsize = extra_size_PVFS_servreq_lookup_path;
		respsize = extra_size_PVFS_servresp_lookup_path;
		break;
	    case PVFS_SERV_BATCH_CREATE:
		/** can request a range of handles */
		req.u.batch_create.handle_extent_array.extent_count = 0;
		req.u.batch_create.object_count = 0;
		resp.u.batch_create.handle_count = 0;
		reqsize = extra_size_PVFS_servreq_batch_create;
		respsize = extra_size_PVFS_servresp_batch_create;
		break;
	    case PVFS_SERV_CREATE:
		/** can request a range of handles */
		reqsize = extra_size_PVFS_servreq_create;
                respsize = extra_size_PVFS_servresp_create;
                break;
            case PVFS_SERV_MIRROR:
                 req.u.mirror.dist = &tmp_dist;
                 req.u.mirror.dst_count = 0;
                 reqsize = extra_size_PVFS_servreq_mirror;
                 respsize = extra_size_PVFS_servresp_mirror;
                 break;
            case PVFS_SERV_IMM_COPIES:
                 break;
	    case PVFS_SERV_REMOVE:
		/** nothing special, let normal encoding work */
		break;
	    case PVFS_SERV_BATCH_REMOVE:
		req.u.batch_remove.handles = NULL;
		req.u.batch_remove.handle_count = 0;
		reqsize = extra_size_PVFS_servreq_batch_remove;
		break;
	    case PVFS_SERV_MGMT_REMOVE_OBJECT:
		/** nothing special, let normal encoding work */
		break;
	    case PVFS_SERV_MGMT_REMOVE_DIRENT:
		req.u.mgmt_remove_dirent.entry = tmp_name;
		reqsize = extra_size_PVFS_servreq_mgmt_remove_dirent;
		break;
	    case PVFS_SERV_TREE_REMOVE:
		req.u.tree_remove.handle_array = NULL;
		req.u.tree_remove.num_data_files = 0;
		reqsize = extra_size_PVFS_servreq_tree_remove;
		break;
	    case PVFS_SERV_IO:
		req.u.io.io_dist = &tmp_dist;
		req.u.io.file_req = &tmp_req;
		reqsize = extra_size_PVFS_servreq_io;
		break;
            case PVFS_SERV_SMALL_IO:
                req.u.small_io.dist = &tmp_dist;
                req.u.small_io.file_req = &tmp_req;
                reqsize = extra_size_PVFS_servreq_small_io;
                respsize = extra_size_PVFS_servresp_small_io;
                break;
	    case PVFS_SERV_GETATTR:
		resp.u.getattr.attr.mask = 0;
		respsize = extra_size_PVFS_servresp_getattr;
		break;
	    case PVFS_SERV_UNSTUFF:
		resp.u.unstuff.attr.mask = 0;
		respsize = extra_size_PVFS_servresp_unstuff;
		break;
	    case PVFS_SERV_SETATTR:
		req.u.setattr.attr.mask = 0;
		reqsize = extra_size_PVFS_servreq_setattr;
		break;
	    case PVFS_SERV_CRDIRENT:
		req.u.crdirent.name = tmp_name;
		reqsize = extra_size_PVFS_servreq_crdirent;
		break;
	    case PVFS_SERV_RMDIRENT:
		req.u.rmdirent.entry = tmp_name;
		reqsize = extra_size_PVFS_servreq_rmdirent;
		break;
	    case PVFS_SERV_CHDIRENT:
		req.u.chdirent.entry = tmp_name;
		reqsize = extra_size_PVFS_servreq_chdirent;
		break;
	    case PVFS_SERV_TRUNCATE:
		/** nothing special */
		break;
	    case PVFS_SERV_MKDIR:
		req.u.mkdir.handle_extent_array.extent_count = 0;
		req.u.mkdir.attr.mask = 0;
		reqsize = extra_size_PVFS_servreq_mkdir;
		break;
	    case PVFS_SERV_READDIR:
		resp.u.readdir.directory_version = 0;
		resp.u.readdir.dirent_count = 0;
		respsize = extra_size_PVFS_servresp_readdir;
		break;
	    case PVFS_SERV_FLUSH:
		/** nothing special */
		break;
	    case PVFS_SERV_MGMT_SETPARAM:
		/** nothing special */
		break;
	    case PVFS_SERV_MGMT_NOOP:
		/** nothing special */
		break;
	    case PVFS_SERV_STATFS:
		/** nothing special */
		break;
	    case PVFS_SERV_MGMT_GET_DIRDATA_HANDLE:
		/** nothing special */
		break;
	    case PVFS_SERV_WRITE_COMPLETION:
		/** only a response, but nothing special there */
		noreq = 1;
		break;
	    case PVFS_SERV_MGMT_PERF_MON:
		resp.u.mgmt_perf_mon.perf_array_count = 0;
		respsize = extra_size_PVFS_servresp_mgmt_perf_mon;
		break;
	    case PVFS_SERV_MGMT_ITERATE_HANDLES:
		resp.u.mgmt_iterate_handles.handle_count = 0;
		respsize = extra_size_PVFS_servresp_mgmt_iterate_handles;
		break;
	    case PVFS_SERV_MGMT_DSPACE_INFO_LIST:
		req.u.mgmt_dspace_info_list.handle_count = 0;
		resp.u.mgmt_dspace_info_list.dspace_info_count = 0;
		reqsize = extra_size_PVFS_servreq_mgmt_dspace_info_list;
		respsize = extra_size_PVFS_servresp_mgmt_dspace_info_list;
		break;
	    case PVFS_SERV_MGMT_EVENT_MON:
		resp.u.mgmt_event_mon.event_count = 0;
		respsize = extra_size_PVFS_servresp_mgmt_event_mon;
		break;
	    case PVFS_SERV_PROTO_ERROR:
		/** nothing special */
		break;
	    case PVFS_SERV_GETEATTR:
                req.u.geteattr.nkey = 0;
                resp.u.geteattr.nkey = 0;
		reqsize = extra_size_PVFS_servreq_geteattr;
		respsize = extra_size_PVFS_servresp_geteattr;
		break;
	    case PVFS_SERV_SETEATTR:
                req.u.seteattr.nkey = 0;
		reqsize = extra_size_PVFS_servreq_seteattr;
		break;
	    case PVFS_SERV_DELEATTR:
                req.u.deleattr.key.buffer_sz = 0;
		reqsize = extra_size_PVFS_servreq_deleattr;
		break;
	    case PVFS_SERV_LISTEATTR:
		resp.u.listeattr.nkey = 0;
		req.u.listeattr.nkey = 0;
                reqsize = extra_size_PVFS_servreq_listeattr;
		respsize = extra_size_PVFS_servresp_listeattr;
                break;
            case PVFS_SERV_LISTATTR:
                resp.u.listattr.nhandles = 0;
                req.u.listattr.nhandles = 0;
                reqsize = extra_size_PVFS_servreq_listattr;
                respsize = extra_size_PVFS_servresp_listattr;
                break;
	    case PVFS_SERV_TREE_GET_FILE_SIZE:
		req.u.tree_get_file_size.handle_array = NULL;
		req.u.tree_get_file_size.num_data_files = 0;
		resp.u.tree_get_file_size.size = NULL;
		resp.u.tree_get_file_size.error = NULL;
		resp.u.tree_get_file_size.handle_count = 0;
                resp.u.tree_get_file_size.caller_handle_index = 0;
		reqsize = extra_size_PVFS_servreq_tree_get_file_size;
		respsize = extra_size_PVFS_servresp_tree_get_file_size;
		break;
            case PVFS_SERV_MGMT_GET_UID:
                resp.u.mgmt_get_uid.uid_info_array_count = 0;
                respsize = extra_size_PVFS_servresp_mgmt_get_uid;
                break;
            case PVFS_SERV_NUM_OPS:  /** sentinel, should not hit */
                assert(0);
                break;
	}
	/** since these take the max size when mallocing in the encode,
	 * give them a huge number, then later fix it. */
	max_size_array[op_type].req = 
                                 max_size_array[op_type].resp = init_big_size;

	if (noreq)
	    reqsize = 0;
	else
	    reqsize += check_req_size(&req);

	respsize += check_resp_size(&resp);

	if (reqsize > init_big_size)
	    gossip_err("%s: op %d reqsize %d exceeded prealloced %d\n",
	      __func__, op_type, reqsize, init_big_size);
	if (respsize > init_big_size)
	    gossip_err("%s: op %d respsize %d exceeded prealloced %d\n",
	      __func__, op_type, respsize, init_big_size);
	max_size_array[op_type].req = reqsize;
	max_size_array[op_type].resp = respsize;
    }

    /** clean up stuff just used for initialization */
    PVFS_hint_free(req.hints);
    free(tmp_dist.dist_name);
    free(tmp_name);
    initializing_sizes = 0;
}
Пример #4
0
/*
 * example environment variable
 * PVFS2_HINTS =
 *'pvfs.hint.request_id:10+pvfs.hint.client_id:30'
 */
int PVFS_hint_import_env(PVFS_hint *out_hint)
{
    char * env;
    char * env_copy;
    char * save_ptr = NULL;
    char * aktvar;
    char name[PVFS_HINT_MAX_NAME_LENGTH];
    int len;
    const struct PINT_hint_info *info;
    PINT_hint *hint = NULL;
    int ret;

    if( out_hint == NULL )
    {
        return 1;
    }
    env = getenv("PVFS2_HINTS");
    if( env == NULL )
    {
        return 0;
    }
    len = strlen(env);
    env_copy = (char *) malloc(sizeof(char) * (len+1));
    strncpy(env_copy, env, len+1);

    /* parse hints and do not overwrite already specified hints !*/
#ifdef WIN32
    aktvar = strtok(env_copy, "+");  /* thread-safe */
#else
    aktvar = strtok_r(env_copy, "+", & save_ptr);
#endif
    while( aktvar != NULL )
    {
        char * rest;

#ifdef WIN32
        rest = strchr(aktvar, ':');
#else
        rest = index(aktvar, ':');        
#endif
        if (rest == NULL)
        {
            gossip_err("Environment variable PVFS2_HINTS is "
                       "malformed starting with: %s\n",
                       aktvar);
            free(env_copy);
            return 0;
        }

        *rest = 0;

        sprintf(name, "pvfs2.hint.%s", aktvar);
        info = PINT_hint_get_info_by_name(name);
        if(info)
        {
            /* a bit of a hack..if we know the type and its
             * an int, we convert from a string
             */
            if(info->encode == encode_func_uint32_t)
            {
                uint32_t val;
                sscanf(rest+1, "%u", &val);
                ret = PVFS_hint_add(&hint, info->name, sizeof(val), &val);
            }
            else if(info->encode == encode_func_uint64_t)
            {
                uint32_t val;
                sscanf(rest+1, "%u", &val);
                ret = PVFS_hint_add(&hint, info->name, sizeof(val), &val);
            }
            else if(info->encode == encode_func_string)
            {
                /* just pass the string along as the hint value */
                ret = PVFS_hint_add(&hint, info->name, strlen(rest+1), rest+1);
            }
            else
            {
                /* Can't specify a complex hint in the PVFS2_HINTS environment
                 * variable.
                 */
                ret = -PVFS_EINVAL;
            }
        }
        else
        {
            /* Hint not recognized, so we store it with its name */
            ret = PVFS_hint_add(&hint, name, strlen(rest+1), rest+1);
        }

        if(ret < 0)
        {
            /* hint parsing failed */
            PVFS_hint_free(hint);
            free(env_copy);
            return ret;
        }
#ifdef WIN32
        aktvar = strtok(NULL, "+");
#else
        aktvar = strtok_r(NULL, "+", & save_ptr);
#endif
    }

    free(env_copy);
    return 0;
}