Commit 010f6f3f authored by Krzysztof Karas's avatar Krzysztof Karas Committed by Tomasz Zawadzki
Browse files

lib/rpc: add APIs to manage server objects



Following patches will aim to move managing instances of RPC servers
from lib/rpc (currently a single global instance) to lib/init
(we'll have a list of server instances there) and lib/rpc will be
responsible for creating/closing given RPC server objects.
For that to be possible we first need a set of functions
taking/returning server objects in lib/rpc.

Change-Id: I167572aeddf5f62bbf8ce7c0ae187071728315c5
Signed-off-by: default avatarKrzysztof Karas <krzysztof.karas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/21318


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
parent d8e2f663
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -48,6 +48,29 @@ void spdk_rpc_accept(void);
 */
void spdk_rpc_close(void);

/**
 * Start listening for RPC connections on given address.
 *
 * \param listen_addr Listening address.
 *
 * \return new RPC server or NULL on failure.
 */
struct spdk_rpc_server *spdk_rpc_server_listen(const char *listen_addr);

/**
 * Poll the RPC server.
 *
 * \param server RPC server, which will be polled for connections.
 */
void spdk_rpc_server_accept(struct spdk_rpc_server *server);

/**
 * Stop a server from listening and free it.
 *
 * \param server RPC server, which will be stopped and be freed.
 */
void spdk_rpc_server_close(struct spdk_rpc_server *server);

/**
 * Function signature for RPC request handlers.
 *
+38 −0
Original line number Diff line number Diff line
@@ -220,12 +220,40 @@ spdk_rpc_listen(const char *listen_addr)
	return rc;
}

struct spdk_rpc_server *
spdk_rpc_server_listen(const char *listen_addr)
{
	struct spdk_rpc_server *server;
	int rc;

	server = calloc(1, sizeof(struct spdk_rpc_server));
	if (!server) {
		SPDK_ERRLOG("Could not allocate new RPC server\n");
		return NULL;
	}

	rc = _spdk_rpc_listen(listen_addr, server);
	if (rc) {
		free(server);
		return NULL;
	}

	return server;
}

void
spdk_rpc_accept(void)
{
	spdk_jsonrpc_server_poll(g_rpc_server.jsonrpc_server);
}

void
spdk_rpc_server_accept(struct spdk_rpc_server *server)
{
	assert(server != NULL);
	spdk_jsonrpc_server_poll(server->jsonrpc_server);
}

void
spdk_rpc_register_method(const char *method, spdk_rpc_method_handler func, uint32_t state_mask)
{
@@ -377,6 +405,16 @@ spdk_rpc_close(void)
	}
}

void
spdk_rpc_server_close(struct spdk_rpc_server *server)
{
	assert(server != NULL);

	_spdk_rpc_close(server);

	free(server);
}

struct rpc_get_methods {
	bool current;
	bool include_aliases;
+3 −0
Original line number Diff line number Diff line
@@ -6,6 +6,9 @@
	spdk_rpc_listen;
	spdk_rpc_accept;
	spdk_rpc_close;
	spdk_rpc_server_listen;
	spdk_rpc_server_accept;
	spdk_rpc_server_close;
	spdk_rpc_register_method;
	spdk_rpc_register_alias_deprecated;
	spdk_rpc_is_method_allowed;
+29 −0
Original line number Diff line number Diff line
@@ -242,6 +242,34 @@ test_spdk_rpc_listen_close(void)
	MOCK_CLEAR(flock);
}

static void
test_rpc_run_multiple_servers(void)
{
	const char listen_addr1[128] = "/var/tmp/spdk-rpc-ut.sock1";
	const char listen_addr2[128] = "/var/tmp/spdk-rpc-ut.sock2";
	const char listen_addr3[128] = "/var/tmp/spdk-rpc-ut.sock3";
	struct spdk_rpc_server *rpc_server1, *rpc_server2, *rpc_server3;

	MOCK_SET(open, 1);
	MOCK_SET(close, 0);
	MOCK_SET(flock, 0);

	rpc_server1 = spdk_rpc_server_listen(listen_addr1);
	CU_ASSERT(rpc_server1 != NULL);
	rpc_server2 = spdk_rpc_server_listen(listen_addr2);
	CU_ASSERT(rpc_server2 != NULL);
	rpc_server3 = spdk_rpc_server_listen(listen_addr3);
	CU_ASSERT(rpc_server3 != NULL);

	spdk_rpc_server_close(rpc_server1);
	spdk_rpc_server_close(rpc_server2);
	spdk_rpc_server_close(rpc_server3);

	MOCK_CLEAR(open);
	MOCK_CLEAR(close);
	MOCK_CLEAR(flock);
}

int
main(int argc, char **argv)
{
@@ -257,6 +285,7 @@ main(int argc, char **argv)
	CU_ADD_TEST(suite, test_rpc_get_methods);
	CU_ADD_TEST(suite, test_rpc_spdk_get_version);
	CU_ADD_TEST(suite, test_spdk_rpc_listen_close);
	CU_ADD_TEST(suite, test_rpc_run_multiple_servers);

	num_failures = spdk_ut_run_tests(argc, argv, NULL);
	CU_cleanup_registry();