Beispiel #1
0
/*
 * server_msg_args -- process a message according to specified arguments
 */
static void
server_msg_args(struct rpmemd_obc *rpdc, enum conn_wait_close conn,
	struct req_cb_arg *args)
{
	int ret;
	unsigned long long types = args->types;
	args->types = 0;


	ret = rpmemd_obc_process(rpdc, &REQ_CB, args);
	UT_ASSERTeq(ret, args->ret);
	UT_ASSERTeq(args->types, types);

	if (conn == CONN_WAIT_CLOSE) {
		ret = rpmemd_obc_process(rpdc, &REQ_CB, args);
		UT_ASSERTeq(ret, 1);
	}

	rpmemd_obc_fini(rpdc);
}
Beispiel #2
0
/*
 * server_econnreset -- test case for closing connection when operation on
 * server is in progress - server side
 */
int
server_econnreset(const struct test_case *tc, int argc, char *argv[])
{
	struct rpmemd_obc *rpdc;
	int ret;

	rpdc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO);
	UT_ASSERTne(rpdc, NULL);

	ret = rpmemd_obc_status(rpdc, 0);
	UT_ASSERTeq(ret, 0);

	ret = rpmemd_obc_process(rpdc, &REQ_CB, NULL);
	UT_ASSERTne(ret, 0);

	rpmemd_obc_fini(rpdc);

	return 0;
}
Beispiel #3
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;
}
Beispiel #4
0
/*
 * server_msg_resp -- process a message of specified type, response to client
 * with specific status value and return status of sending response function
 */
int
server_msg_resp(const struct test_case *tc, int argc, char *argv[])
{
	if (argc < 2)
		UT_FATAL("usage: %s msg_type status", tc->name);

	int type = atoi(argv[0]);
	int status = atoi(argv[1]);

	int ret;
	struct rpmemd_obc *rpdc;

	rpdc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO);
	UT_ASSERTne(rpdc, NULL);

	ret = rpmemd_obc_status(rpdc, 0);
	UT_ASSERTeq(ret, 0);

	struct req_cb_arg args = {
		.ret = 0,
		.force_ret = 0,
		.resp = 1,
		.types = (1 << type),
		.status = status,
	};

	server_msg_args(rpdc, CONN_WAIT_CLOSE, &args);

	return 2;
}

/*
 * server_msg_noresp -- process a message of specified type, do not response to
 * client and return specific value from process callback
 */
int
server_msg_noresp(const struct test_case *tc, int argc, char *argv[])
{
	if (argc < 1)
		UT_FATAL("usage: %s msg_type", tc->name);

	int type = atoi(argv[0]);
	int ret;
	struct rpmemd_obc *rpdc;

	rpdc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO);
	UT_ASSERTne(rpdc, NULL);

	ret = rpmemd_obc_status(rpdc, 0);
	UT_ASSERTeq(ret, 0);

	struct req_cb_arg args = {
		.ret = -1,
		.force_ret = 1,
		.resp = 0,
		.types = (1 << type),
		.status = 0,
	};

	server_msg_args(rpdc, CONN_CLOSE, &args);

	return 1;
}

/*
 * server_bad_msg -- process a message and expect
 * error returned from rpmemd_obc_process function
 */
int
server_bad_msg(const struct test_case *tc, int argc, char *argv[])
{
	int ret;
	struct rpmemd_obc *rpdc;

	rpdc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO);
	UT_ASSERTne(rpdc, NULL);

	ret = rpmemd_obc_status(rpdc, 0);
	UT_ASSERTeq(ret, 0);

	ret = rpmemd_obc_process(rpdc, &REQ_CB, NULL);
	UT_ASSERTne(ret, 0);

	rpmemd_obc_fini(rpdc);

	return 0;
}
Beispiel #5
0
/*
 * server -- run server and process clients requests
 */
int
server(const struct test_case *tc, int argc, char *argv[])
{
	int ret;

	struct req_arg arg = {
		.resp = RESP_ATTR_INIT,
		.pool_attr = POOL_ATTR_INIT,
		.closing = 0,
	};

	struct rpmemd_obc *obc;

	obc = rpmemd_obc_init(0, 1);
	UT_ASSERTne(obc, NULL);

	ret = rpmemd_obc_status(obc, 0);
	UT_ASSERTeq(ret, 0);


	while (1) {
		ret = rpmemd_obc_process(obc, &REQ, &arg);
		if (arg.closing) {
			break;
		} else {
			UT_ASSERTeq(ret, 0);
		}
	}

	ret = rpmemd_obc_process(obc, &REQ, &arg);
	UT_ASSERTeq(ret, 1);

	rpmemd_obc_fini(obc);

	return 0;
}

/*
 * test_cases -- available test cases
 */
static struct test_case test_cases[] = {
	TEST_CASE(server),
	TEST_CASE(client_create),
	TEST_CASE(client_open),
};

#define NTESTS	(sizeof(test_cases) / sizeof(test_cases[0]))

int
main(int argc, char *argv[])
{
	START(argc, argv, "rpmem_obc");
	common_init("rpmem_fip",
		"RPMEM_LOG_LEVEL",
		"RPMEM_LOG_FILE", 0, 0);
	rpmemd_log_init("rpmemd", getenv("RPMEMD_LOG_FILE"), 0);
	rpmemd_log_level = rpmemd_log_level_from_str(
			getenv("RPMEMD_LOG_LEVEL"));

	TEST_CASE_PROCESS(argc, argv, test_cases, NTESTS);

	common_fini();
	rpmemd_log_close();
	DONE(NULL);
}
Beispiel #6
0
int
main(int argc, char *argv[])
{
	int ret;
	util_init();

	struct rpmemd_config config;
	rpmemd_log_init(DAEMON_NAME, NULL, 0);
	if (rpmemd_config_read(&config, argc, argv) != 0) {
		ret = 1;
		goto err_config;
	}

	rpmemd_log_level = config.log_level;
	rpmemd_log_init(DAEMON_NAME, config.log_file, config.use_syslog);

	RPMEMD_LOG(INFO, "%s version %s", DAEMON_NAME, SRCVERSION);

	struct rpmemd_obc *obc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO);
	if (!obc) {
		RPMEMD_LOG(ERR, "out-of-band connection intitialization");
		ret = 1;
		goto err_obc;
	}

	struct rpmemd *rpmemd = calloc(1, sizeof(*rpmemd));
	if (!rpmemd) {
		RPMEMD_LOG(ERR, "!calloc");
		ret = rpmemd_obc_status(obc, (uint32_t)errno);
		if (ret)
			RPMEMD_LOG(ERR, "writing status failed");
		goto err_rpmemd;
	}

	rpmemd->persist = pmem_persist;
	rpmemd->persist_method = rpmemd_get_pm(&config);
	rpmemd->nthreads = rpmemd_get_nthreads();
	if (!rpmemd->nthreads) {
		RPMEMD_LOG(ERR, "invalid number of threads -- '%lu'",
				rpmemd->nthreads);
		ret = rpmemd_obc_status(obc, (uint32_t)errno);
		if (ret)
			RPMEMD_LOG(ERR, "writing status failed");
		goto err_nthreads;
	}

	rpmemd->db = rpmemd_db_init(config.poolset_dir, 0666);
	if (!rpmemd->db) {
		RPMEMD_LOG(ERR, "!pool set db initialization");
		ret = rpmemd_obc_status(obc, (uint32_t)errno);
		if (ret)
			RPMEMD_LOG(ERR, "writing status failed");
		goto err_db_init;
	}

	rpmemd->obc = obc;

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

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

		if (rpmemd->closing)
			break;
	}

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

	return 0;
err:
err_status:
err_db_init:
err_nthreads:
	free(rpmemd);
err_rpmemd:
	rpmemd_obc_fini(obc);
err_obc:
	rpmemd_log_close();
	rpmemd_config_free(&config);
err_config:
	return ret;
}