Esempio n. 1
0
/*
 * test_open -- test rpmemd_db_pool_open()
 */
static int
test_open(const char *root_dir, const char *pool_desc)
{
	struct rpmem_pool_attr attr1, attr2;
	struct rpmemd_db_pool *prp;
	struct rpmemd_db *db;
	int ret;

	memset(&attr1, 0, sizeof(attr1));
	attr1.major = 1;

	db = rpmemd_db_init(root_dir, POOL_MODE);
	if (db == NULL) {
		FAILED_FUNC("rpmemd_db_init");
	}
	prp = rpmemd_db_pool_create(db, pool_desc, 0, &attr1);
	if (prp == NULL) {
		FAILED_FUNC("rpmemd_db_pool_create");
	}
	rpmemd_db_pool_close(db, prp);
	prp = rpmemd_db_pool_open(db, pool_desc, 0, &attr2);
	if (prp == NULL) {
		FAILED_FUNC("rpmemd_db_pool_open");
	}
	rpmemd_db_pool_close(db, prp);
	ret = rpmemd_db_pool_remove(db, pool_desc);
	if (ret) {
		FAILED_FUNC("rpmemd_db_pool_remove");
	}
	rpmemd_db_fini(db);

	compare_attr(&attr1, &attr2);

	return 0;
}
Esempio n. 2
0
/*
 * rpmemd_close_pool -- close pool and remove it if required
 */
static int
rpmemd_close_pool(struct rpmemd *rpmemd, int remove)
{
	int ret = 0;

	RPMEMD_LOG(NOTICE, "closing pool");
	rpmemd_db_pool_close(rpmemd->db, rpmemd->pool);
	RPMEMD_LOG(INFO, "pool closed");

	if (remove) {
		RPMEMD_LOG(NOTICE, "removing '%s'", rpmemd->pool_desc);
		ret = rpmemd_db_pool_remove(rpmemd->db,
				rpmemd->pool_desc, 0, 0);
		if (ret) {
			RPMEMD_LOG(ERR, "!removing pool '%s' failed",
					rpmemd->pool_desc);
		} else {
			RPMEMD_LOG(INFO, "removed '%s'", rpmemd->pool_desc);
		}
	}

	free(rpmemd->pool_desc);

	return ret;
}
Esempio n. 3
0
/*
 * test_create -- test rpmemd_db_pool_create()
 */
static int
test_create(const char *root_dir, const char *pool_desc)
{
	struct rpmem_pool_attr attr;
	struct rpmemd_db_pool *prp;
	struct rpmemd_db *db;
	int ret;

	db = rpmemd_db_init(root_dir, POOL_MODE);
	if (db == NULL) {
		FAILED_FUNC("rpmemd_db_init");
	}
	prp = rpmemd_db_pool_create(db, pool_desc, 0, &attr);
	if (prp == NULL) {
		FAILED_FUNC("rpmemd_db_pool_create");
	}
	rpmemd_db_pool_close(db, prp);
	ret = rpmemd_db_pool_remove(db, pool_desc);
	if (ret) {
		FAILED_FUNC("rpmemd_db_pool_remove");
	}
	rpmemd_db_fini(db);
	return 0;
}
Esempio n. 4
0
int
main(int argc, char *argv[])
{
    util_init();

    int send_status = 1;
    int ret = 1;

    struct rpmemd *rpmemd = calloc(1, sizeof(*rpmemd));
    if (!rpmemd) {
        RPMEMD_LOG(ERR, "!calloc");
        goto err_rpmemd;
    }

    rpmemd->obc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO);
    if (!rpmemd->obc) {
        RPMEMD_LOG(ERR, "out-of-band connection intitialization");
        goto err_obc;
    }

    if (rpmemd_log_init(DAEMON_NAME, NULL, 0)) {
        RPMEMD_LOG(ERR, "logging subsystem initialization failed");
        goto err_log_init;
    }

    if (rpmemd_config_read(&rpmemd->config, argc, argv) != 0) {
        RPMEMD_LOG(ERR, "reading configuration failed");
        goto err_config;
    }

    rpmemd_log_close();
    rpmemd_log_level = rpmemd->config.log_level;
    if (rpmemd_log_init(DAEMON_NAME, rpmemd->config.log_file,
                        rpmemd->config.use_syslog)) {
        RPMEMD_LOG(ERR, "logging subsystem initialization"
                   " failed (%s, %d)", rpmemd->config.log_file,
                   rpmemd->config.use_syslog);
        goto err_log_init_config;
    }

    RPMEMD_LOG(INFO, "%s version %s", DAEMON_NAME, SRCVERSION);
    rpmemd->persist = pmem_persist;
    rpmemd->persist_method = rpmemd_get_pm(&rpmemd->config);
    rpmemd->nthreads = rpmemd_get_nthreads();
    if (!rpmemd->nthreads) {
        RPMEMD_LOG(ERR, "invalid number of threads -- '%lu'",
                   rpmemd->nthreads);
        goto err_nthreads;
    }

    rpmemd->db = rpmemd_db_init(rpmemd->config.poolset_dir, 0666);
    if (!rpmemd->db) {
        RPMEMD_LOG(ERR, "!pool set db initialization");
        goto err_db_init;
    }

    if (rpmemd->config.rm_poolset) {
        RPMEMD_LOG(INFO, "removing '%s'",
                   rpmemd->config.rm_poolset);
        if (rpmemd_db_pool_remove(rpmemd->db,
                                  rpmemd->config.rm_poolset,
                                  rpmemd->config.force)) {
            RPMEMD_LOG(ERR, "removing '%s' failed",
                       rpmemd->config.rm_poolset);
        } else {
            RPMEMD_LOG(NOTICE, "removed '%s'",
                       rpmemd->config.rm_poolset);
            ret = 0;
        }
        send_status = 0;
        goto out_rm;
    }

    ret = rpmemd_obc_status(rpmemd->obc, 0);
    if (ret) {
        RPMEMD_LOG(ERR, "writing status failed");
        goto err_status;
    }

    rpmemd_print_info(rpmemd);

    while (!ret) {
        ret = rpmemd_obc_process(rpmemd->obc, &rpmemd_req, rpmemd);
        if (ret) {
            RPMEMD_LOG(ERR, "out-of-band connection"
                       " process failed");
            goto err;
        }

        if (rpmemd->closing)
            break;
    }

    rpmemd_db_fini(rpmemd->db);
    rpmemd_config_free(&rpmemd->config);
    rpmemd_log_close();
    rpmemd_obc_fini(rpmemd->obc);
    free(rpmemd);

    return 0;
err:
    rpmemd_req_cleanup(rpmemd);
err_status:
out_rm:
    rpmemd_db_fini(rpmemd->db);
err_db_init:
err_nthreads:
err_log_init_config:
    rpmemd_config_free(&rpmemd->config);
err_config:
    rpmemd_log_close();
err_log_init:
    if (send_status) {
        if (rpmemd_obc_status(rpmemd->obc, (uint32_t)errno))
            RPMEMD_LOG(ERR, "writing status failed");
    }
    rpmemd_obc_fini(rpmemd->obc);
err_obc:
    free(rpmemd);
err_rpmemd:
    return ret;
}
Esempio n. 5
0
/*
 * rpmemd_req_create -- handle create request
 */
static int
rpmemd_req_create(struct rpmemd_obc *obc, void *arg,
                  const struct rpmem_req_attr *req,
                  const struct rpmem_pool_attr *pool_attr)
{
    RPMEMD_ASSERT(arg != NULL);
    RPMEMD_LOG(NOTICE, "create request:");
    rpmemd_print_req_attr(req);
    RPMEMD_LOG(NOTICE, "pool attributes:");
    rpmemd_print_pool_attr(pool_attr);

    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));

    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_create(rpmemd->db,
                                         req->pool_desc,
                                         0, (struct rpmem_pool_attr *)pool_attr);
    if (!rpmemd->pool) {
        ret = -1;
        status = rpmemd_db_get_status(errno);
        goto err_pool_create;
    }

    rpmemd->created = 1;

    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, "create request response: (status = %u)", status);
    if (!status)
        rpmemd_print_resp_attr(&resp);
    ret = rpmemd_obc_create_resp(rpmemd->obc, status, &resp);
    if (ret)
        goto err_create_resp;

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

    return 0;
err_fip_start:
err_create_resp:
    err_send = 0;
    rpmemd_fip_fini(rpmemd->fip);
err_fip_init:
err_pool_check:
    rpmemd_db_pool_close(rpmemd->db, rpmemd->pool);
    rpmemd_db_pool_remove(rpmemd->db, req->pool_desc, 0);
err_pool_create:
    free(rpmemd->pool_desc);
err_strdup:
err_pool_opened:
    if (err_send)
        ret = rpmemd_obc_create_resp(rpmemd->obc, status, &resp);
    rpmemd->closing = 1;
    return ret;
}
Esempio n. 6
0
/*
 * rpmemd_common_fip_init -- initialize fabric provider
 */
static int
rpmemd_common_fip_init(struct rpmemd *rpmemd, const struct rpmem_req_attr *req,
	struct rpmem_resp_attr *resp, int *status)
{
	void *addr = (void *)((uintptr_t)rpmemd->pool->pool_addr +
			POOL_HDR_SIZE);
	struct rpmemd_fip_attr fip_attr = {
		.addr		= addr,
		.size		= req->pool_size,
		.nlanes		= req->nlanes,
		.nthreads	= rpmemd->nthreads,
		.provider	= req->provider,
		.persist_method = rpmemd->persist_method,
		.persist	= rpmemd->persist,
	};

	const char *node = rpmemd_get_ssh_addr();
	enum rpmem_err err;

	rpmemd->fip = rpmemd_fip_init(node, NULL, &fip_attr, resp, &err);
	if (!rpmemd->fip) {
		*status = (int)err;
		goto err_fip_init;
	}

	return 0;
err_fip_init:
	return -1;
}

/*
 * rpmemd_req_create -- handle create request
 */
static int
rpmemd_req_create(struct rpmemd_obc *obc, void *arg,
	const struct rpmem_req_attr *req,
	const struct rpmem_pool_attr *pool_attr)
{
	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));

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

	rpmemd->pool = rpmemd_db_pool_create(rpmemd->db,
			req->pool_desc,
			0, (struct rpmem_pool_attr *)pool_attr);

	if (!rpmemd->pool) {
		status = rpmemd_db_get_status(errno);
		goto err_pool_create;
	}

	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_create_resp(rpmemd->obc, status, &resp);
	if (ret) {
		err_send = 0;
		goto err_create_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_create_resp:
	rpmemd_fip_fini(rpmemd->fip);
err_fip_init:
err_pool_check:
	rpmemd_db_pool_close(rpmemd->db, rpmemd->pool);
	rpmemd_db_pool_remove(rpmemd->db, req->pool_desc);
err_pool_create:
err_pool_opened:
	if (err_send)
		ret = rpmemd_obc_create_resp(rpmemd->obc, status, &resp);
	rpmemd->closing = 1;
	return ret;
}