/* * 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; }
/* * 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; }
/* * rpmemd_req_close -- handle close request */ static int rpmemd_req_close(struct rpmemd_obc *obc, void *arg) { RPMEMD_ASSERT(arg != NULL); struct rpmemd *rpmemd = (struct rpmemd *)arg; rpmemd->closing = 1; int ret; int status = 0; if (!rpmemd->pool) { RPMEMD_LOG(ERR, "pool not opened"); status = RPMEM_ERR_FATAL; return rpmemd_obc_close_resp(rpmemd->obc, status); } rpmemd_db_pool_close(rpmemd->db, rpmemd->pool); ret = rpmemd_fip_process_stop(rpmemd->fip); if (ret) { RPMEMD_LOG(ERR, "!stopping fip process failed"); status = errno; } ret = rpmemd_obc_close_resp(rpmemd->obc, status); if (!ret) rpmemd_fip_wait_close(rpmemd->fip, -1); rpmemd_fip_close(rpmemd->fip); rpmemd_fip_fini(rpmemd->fip); return ret; }
/* * 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; }
/* * 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; }
/* * 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; }
/* * 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; }