Пример #1
0
/*
 * req_cb_open -- callback for open request operation
 *
 * This function behaves according to arguments specified via
 * struct req_cb_arg.
 */
static int
req_cb_open(struct rpmemd_obc *obc, void *arg,
	const struct rpmem_req_attr *req)
{
	UT_ASSERTne(arg, NULL);
	UT_ASSERTne(req, NULL);

	req_cb_check_req(req);

	struct req_cb_arg *args = arg;

	args->types |= (1 << RPMEM_MSG_TYPE_OPEN);

	int ret = args->ret;

	if (args->resp) {
		struct rpmem_resp_attr resp = {
			.port = PORT,
			.rkey = RKEY,
			.raddr = RADDR,
			.persist_method = PERSIST_METHOD,
			.nlanes = NLANES_RESP,
		};

		struct rpmem_pool_attr pool_attr = POOL_ATTR_INIT;

		ret = rpmemd_obc_open_resp(obc, args->status,
				&resp, &pool_attr);
	}

	if (args->force_ret)
		ret = args->ret;

	return ret;
}
Пример #2
0
/*
 * req_open -- process open request
 */
static int
req_open(struct rpmemd_obc *obc, void *arg,
	const struct rpmem_req_attr *req)
{
	struct rpmem_req_attr ex_req = REQ_ATTR_INIT;
	UT_ASSERTne(arg, NULL);
	UT_ASSERTeq(ex_req.provider, req->provider);
	UT_ASSERTeq(ex_req.pool_size, req->pool_size);
	UT_ASSERTeq(ex_req.nlanes, req->nlanes);
	UT_ASSERTeq(strcmp(ex_req.pool_desc, req->pool_desc), 0);

	struct req_arg *args = arg;

	return rpmemd_obc_open_resp(obc, 0,
			&args->resp, &args->pool_attr);
}
Пример #3
0
/*
 * rpmemd_req_open -- handle open request
 */
static int
rpmemd_req_open(struct rpmemd_obc *obc, void *arg,
                const struct rpmem_req_attr *req)
{
    RPMEMD_ASSERT(arg != NULL);
    RPMEMD_LOG(NOTICE, "open request:");
    rpmemd_print_req_attr(req);
    struct rpmemd *rpmemd = (struct rpmemd *)arg;

    int ret;
    int status = 0;
    int err_send = 1;
    struct rpmem_resp_attr resp;
    memset(&resp, 0, sizeof(resp));

    struct rpmem_pool_attr pool_attr;
    memset(&pool_attr, 0, sizeof(pool_attr));

    if (rpmemd->pool) {
        RPMEMD_LOG(ERR, "pool already opened");
        ret = -1;
        status = RPMEM_ERR_FATAL;
        goto err_pool_opened;
    }

    rpmemd->pool_desc = strdup(req->pool_desc);
    if (!rpmemd->pool_desc) {
        RPMEMD_LOG(ERR, "!allocating pool descriptor");
        ret = -1;
        status = RPMEM_ERR_FATAL;
        goto err_strdup;
    }

    rpmemd->pool = rpmemd_db_pool_open(rpmemd->db,
                                       req->pool_desc, 0, &pool_attr);
    if (!rpmemd->pool) {
        ret = -1;
        status = rpmemd_db_get_status(errno);
        goto err_pool_open;
    }

    RPMEMD_LOG(NOTICE, "pool attributes:");
    rpmemd_print_pool_attr(&pool_attr);

    ret = rpmemd_check_pool(rpmemd, req, &status);
    if (ret)
        goto err_pool_check;

    ret = rpmemd_common_fip_init(rpmemd, req, &resp, &status);
    if (ret)
        goto err_fip_init;

    RPMEMD_LOG(NOTICE, "open request response: (status = %u)", status);
    if (!status)
        rpmemd_print_resp_attr(&resp);

    ret = rpmemd_obc_open_resp(rpmemd->obc, status, &resp, &pool_attr);
    if (ret)
        goto err_open_resp;

    ret = rpmemd_fip_start_thread(rpmemd);
    if (ret)
        goto err_fip_start;

    return 0;
err_fip_start:
err_open_resp:
    err_send = 0;
    rpmemd_fip_fini(rpmemd->fip);
err_fip_init:
err_pool_check:
    rpmemd_db_pool_close(rpmemd->db, rpmemd->pool);
err_pool_open:
    free(rpmemd->pool_desc);
err_strdup:
err_pool_opened:
    if (err_send)
        ret = rpmemd_obc_open_resp(rpmemd->obc, status,
                                   &resp, &pool_attr);
    rpmemd->closing = 1;
    return ret;
}
Пример #4
0
/*
 * rpmemd_req_open -- handle open request
 */
static int
rpmemd_req_open(struct rpmemd_obc *obc, void *arg,
	const struct rpmem_req_attr *req)
{
	RPMEMD_ASSERT(arg != NULL);

	struct rpmemd *rpmemd = (struct rpmemd *)arg;

	int ret;
	int status = 0;
	int err_send = 1;
	struct rpmem_resp_attr resp;
	memset(&resp, 0, sizeof(resp));

	struct rpmem_pool_attr pool_attr;
	memset(&pool_attr, 0, sizeof(pool_attr));

	if (rpmemd->pool) {
		RPMEMD_LOG(ERR, "pool already opened");
		status = RPMEM_ERR_FATAL;
		goto err_pool_opened;
	}

	rpmemd->pool = rpmemd_db_pool_open(rpmemd->db,
			req->pool_desc, 0, &pool_attr);
	if (!rpmemd->pool) {
		status = rpmemd_db_get_status(errno);
		goto err_pool_open;
	}

	ret = rpmemd_check_pool(rpmemd, req, &status);
	if (ret)
		goto err_pool_check;

	ret = rpmemd_common_fip_init(rpmemd, req, &resp, &status);
	if (ret)
		goto err_fip_init;

	ret = rpmemd_obc_open_resp(rpmemd->obc, status, &resp, &pool_attr);
	if (ret) {
		err_send = 0;
		goto err_open_resp;
	}

	ret = rpmemd_fip_accept(rpmemd->fip);
	if (ret) {
		status = RPMEM_ERR_FATAL_CONN;
		goto err_accept;
	}

	ret = rpmemd_fip_process_start(rpmemd->fip);
	if (ret) {
		status = RPMEM_ERR_FATAL_CONN;
		goto err_process_start;
	}

	return 0;
err_process_start:
	rpmemd_fip_close(rpmemd->fip);
err_accept:
	err_send = 0;
err_open_resp:
	rpmemd_fip_fini(rpmemd->fip);
err_fip_init:
err_pool_check:
	rpmemd_db_pool_close(rpmemd->db, rpmemd->pool);
err_pool_open:
err_pool_opened:
	if (err_send)
		ret = rpmemd_obc_open_resp(rpmemd->obc, status,
				&resp, &pool_attr);
	rpmemd->closing = 1;
	return ret;
}