Commit 9e3241a1 authored by Krzysztof Karas's avatar Krzysztof Karas Committed by Tomasz Zawadzki
Browse files

init: add pausing and resuming RPC server polling



Add APIs to pause and resume polling on specified server address.
This will be useful in following patches, where one RPC server is
launched for user interaction (e.g. via rpc.py script) and other
will start to configure subsystems from JSON config.

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


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
parent 09895428
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -105,6 +105,20 @@ typedef void (*spdk_subsystem_fini_fn)(void *ctx);
 */
void spdk_subsystem_fini(spdk_subsystem_fini_fn cb_fn, void *cb_arg);

/**
 * Pause polling RPC server with given address.
 *
 * \param listen_addr Address, on which RPC server listens for connections.
 */
void spdk_rpc_server_pause(const char *listen_addr);

/**
 * Resume polling RPC server with given address.
 *
 * \param listen_addr Address, on which RPC server listens for connections.
 */
void spdk_rpc_server_resume(const char *listen_addr);

#ifdef __cplusplus
}
#endif
+31 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ static struct spdk_poller *g_rpc_poller = NULL;
struct init_rpc_server {
	struct spdk_rpc_server *server;
	char listen_addr[sizeof(((struct sockaddr_un *)0)->sun_path)];
	bool active;
	STAILQ_ENTRY(init_rpc_server) link;
};

@@ -30,8 +31,10 @@ rpc_subsystem_poll_servers(void *arg)
	struct init_rpc_server *init_server;

	STAILQ_FOREACH(init_server, &g_init_rpc_servers, link) {
		if (init_server->active) {
			spdk_rpc_server_accept(init_server->server);
		}
	}

	return SPDK_POLLER_BUSY;
}
@@ -169,6 +172,7 @@ spdk_rpc_initialize(const char *listen_addr, const struct spdk_rpc_opts *opts)
	}

	rpc_set_spdk_log_opts(opts);
	init_server->active = true;

	STAILQ_INSERT_TAIL(&g_init_rpc_servers, init_server, link);
	if (g_rpc_poller == NULL) {
@@ -208,3 +212,29 @@ spdk_rpc_finish(void)
		spdk_rpc_server_finish(init_server->listen_addr);
	}
}

static void
set_server_active_flag(const char *listen_addr, bool is_active)
{
	struct init_rpc_server *init_server;

	init_server = get_server_by_addr(listen_addr);
	if (!init_server) {
		SPDK_ERRLOG("No server listening on provided address: %s\n", listen_addr);
		return;
	}

	init_server->active = is_active;
}

void
spdk_rpc_server_pause(const char *listen_addr)
{
	set_server_active_flag(listen_addr, false);
}

void
spdk_rpc_server_resume(const char *listen_addr)
{
	set_server_active_flag(listen_addr, true);
}
+2 −0
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@
	spdk_rpc_initialize;
	spdk_rpc_finish;
	spdk_rpc_server_finish;
	spdk_rpc_server_pause;
	spdk_rpc_server_resume;

	local: *;
};
+2 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ DEFINE_STUB(spdk_rpc_initialize, int, (const char *listen_addr,
DEFINE_STUB_V(spdk_rpc_set_allowlist, (const char **rpc_allowlist));
DEFINE_STUB_V(spdk_rpc_finish, (void));
DEFINE_STUB_V(spdk_rpc_server_finish, (const char *listen_addr));
DEFINE_STUB_V(spdk_rpc_server_pause, (const char *listen_addr));
DEFINE_STUB_V(spdk_rpc_server_resume, (const char *listen_addr));
DEFINE_STUB_V(spdk_subsystem_init_from_json_config, (const char *json_config_file,
		const char *rpc_addr,
		spdk_subsystem_init_fn cb_fn, void *cb_arg, bool stop_on_error));
+57 −0
Original line number Diff line number Diff line
@@ -63,6 +63,20 @@ server_exists(const char *addr)
	return false;
}

static bool
server_paused(const char *addr)
{
	struct init_rpc_server *server;

	STAILQ_FOREACH(server, &g_init_rpc_servers, link) {
		if (strcmp(addr, server->listen_addr) == 0 && !server->active) {
			return true;
		}
	}

	return false;
}

static void
initialize_servers(void)
{
@@ -73,10 +87,12 @@ initialize_servers(void)
	rc = spdk_rpc_initialize(g_test_addr1, NULL);
	CU_ASSERT(rc == 0);
	CU_ASSERT(server_exists(g_test_addr1));
	CU_ASSERT(server_paused(g_test_addr1) == false);

	rc = spdk_rpc_initialize(g_test_addr2, NULL);
	CU_ASSERT(rc == 0);
	CU_ASSERT(server_exists(g_test_addr2));
	CU_ASSERT(server_paused(g_test_addr2) == false);
}

static void
@@ -159,6 +175,45 @@ test_rpc_set_spdk_log_default_opts(void)
	spdk_rpc_finish();
}

static void
test_pause_resume_servers(void)
{
	initialize_servers();

	spdk_rpc_server_pause(g_test_addr1);
	CU_ASSERT(server_exists(g_test_addr1));
	CU_ASSERT(server_paused(g_test_addr1));

	spdk_rpc_server_pause(g_test_addr2);
	CU_ASSERT(server_exists(g_test_addr2));
	CU_ASSERT(server_paused(g_test_addr2));

	spdk_rpc_server_resume(g_test_addr2);
	CU_ASSERT(!server_paused(g_test_addr2));

	spdk_rpc_server_resume(g_test_addr1);
	CU_ASSERT(!server_paused(g_test_addr1));

	spdk_rpc_finish();
}

static void
test_remove_paused_servers(void)
{
	initialize_servers();

	spdk_rpc_server_pause(g_test_addr1);
	spdk_rpc_server_pause(g_test_addr2);

	spdk_rpc_server_finish(g_test_addr2);
	CU_ASSERT(!server_exists(g_test_addr2));

	CU_ASSERT(server_exists(g_test_addr1));
	CU_ASSERT(server_paused(g_test_addr1));

	spdk_rpc_server_finish(g_test_addr1);
}

int
main(int argc, char **argv)
{
@@ -177,6 +232,8 @@ main(int argc, char **argv)
	CU_ADD_TEST(suite, test_run_multiple_servers_stop_singles);
	CU_ADD_TEST(suite, test_rpc_set_spdk_log_opts);
	CU_ADD_TEST(suite, test_rpc_set_spdk_log_default_opts);
	CU_ADD_TEST(suite, test_pause_resume_servers);
	CU_ADD_TEST(suite, test_remove_paused_servers);

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