Commit 2297826b authored by Krzysztof Karas's avatar Krzysztof Karas Committed by Tomasz Zawadzki
Browse files

lib/event: skip RPC server initialization



We should allow users to skip server initialization when passing
an empty address. This will help in cases, where RPC communication
is not required by the application.

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


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
parent 2d65fd75
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -163,6 +163,7 @@ if [ $SPDK_RUN_FUNCTIONAL_TEST -eq 1 ]; then

	run_test "env" $rootdir/test/env/env.sh
	run_test "rpc" $rootdir/test/rpc/rpc.sh
	run_test "skip_rpc" $rootdir/test/rpc/skip_rpc.sh
	run_test "rpc_client" $rootdir/test/rpc_client/rpc_client.sh
	run_test "json_config" $rootdir/test/json_config/json_config.sh
	run_test "json_config_extra_key" $rootdir/test/json_config/json_config_extra_key.sh
+32 −15
Original line number Diff line number Diff line
@@ -141,6 +141,8 @@ static const struct option g_cmdline_options[] = {
	{"lcores",			required_argument,	NULL, LCORES_OPT_IDX},
#define NO_HUGE_OPT_IDX	272
	{"no-huge",			no_argument,		NULL, NO_HUGE_OPT_IDX},
#define NO_RPC_SERVER_OPT_IDX	273
	{"no-rpc-server",		no_argument,		NULL, NO_RPC_SERVER_OPT_IDX},
};

static void
@@ -297,7 +299,9 @@ app_start_application(int rc, void *arg1)
		return;
	}

	if (g_spdk_app.rpc_addr) {
		spdk_rpc_server_resume(g_spdk_app.rpc_addr);
	}

	g_start_fn(g_start_arg);
}
@@ -326,7 +330,7 @@ app_subsystem_init_done(int rc, void *arg1)
}

static void
app_start_rpc(int rc, void *arg1)
app_do_spdk_subsystem_init(int rc, void *arg1)
{
	struct spdk_rpc_opts opts;

@@ -335,6 +339,7 @@ app_start_rpc(int rc, void *arg1)
		return;
	}

	if (g_spdk_app.rpc_addr) {
		opts.size = SPDK_SIZEOF(&opts, log_level);
		opts.log_file = g_spdk_app.rpc_log_file;
		opts.log_level = g_spdk_app.rpc_log_level;
@@ -344,11 +349,14 @@ app_start_rpc(int rc, void *arg1)
			spdk_app_stop(rc);
			return;
		}

	if (!g_delay_subsystem_init) {
		if (g_delay_subsystem_init) {
			return;
		}
		spdk_rpc_server_pause(g_spdk_app.rpc_addr);
		spdk_subsystem_init(app_subsystem_init_done, NULL);
	} else {
		SPDK_NOTICELOG("RPC server not started\n");
	}
	spdk_subsystem_init(app_subsystem_init_done, NULL);
}

static int
@@ -537,10 +545,10 @@ bootstrap_fn(void *arg1)
		/* Load SPDK_RPC_STARTUP RPCs from config file */
		assert(spdk_rpc_get_state() == SPDK_RPC_STARTUP);
		spdk_subsystem_load_config(g_spdk_app.json_data, g_spdk_app.json_data_size,
					   app_start_rpc, NULL,
					   app_do_spdk_subsystem_init, NULL,
					   !g_spdk_app.json_config_ignore_errors);
	} else {
		app_start_rpc(0, NULL);
		app_do_spdk_subsystem_init(0, NULL);
	}
}

@@ -739,6 +747,11 @@ spdk_app_start(struct spdk_app_opts *opts_user, spdk_msg_fn start_fn,
		return 1;
	}

	if (!opts->rpc_addr && opts->delay_subsystem_init) {
		SPDK_ERRLOG("Cannot use '--wait-for-rpc' if no RPC server is going to be started.\n");
		return 1;
	}

	if (!(opts->lcore_map || opts->reactor_mask)) {
		/* Set default CPU mask */
		opts->reactor_mask = SPDK_APP_DPDK_DEFAULT_CORE_MASK;
@@ -996,6 +1009,7 @@ usage(void (*app_usage)(void))
	printf("\nConfiguration options:\n");
	printf(" -c, --config, --json  <config>     JSON config file\n");
	printf(" -r, --rpc-socket <path>   RPC listen address (default %s)\n", SPDK_DEFAULT_RPC_ADDR);
	printf("     --no-rpc-server       skip RPC server initialization. This option ignores '--rpc-socket' value.\n");
	printf("     --wait-for-rpc        wait for RPCs to initialize subsystems\n");
	printf("     --rpcs-allowed	   comma-separated list of permitted RPCS\n");
	printf("     --json-ignore-init-errors    don't exit on invalid config entry\n");
@@ -1184,6 +1198,9 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts,
		case RPC_SOCKET_OPT_IDX:
			opts->rpc_addr = optarg;
			break;
		case NO_RPC_SERVER_OPT_IDX:
			opts->rpc_addr = NULL;
			break;
		case MEM_SIZE_OPT_IDX: {
			uint64_t mem_size_mb;
			bool mem_size_has_prefix;

test/rpc/skip_rpc.sh

0 → 100755
+64 −0
Original line number Diff line number Diff line
#!/usr/bin/env bash
#
#  SPDX-License-Identifier: BSD-3-Clause
#  Copyright (C) 2024 Intel Corporation
#  All rights reserved.
#
testdir=$(readlink -f $(dirname $0))
rootdir=$(readlink -f $testdir/../..)
source $rootdir/test/common/autotest_common.sh

CONFIG_PATH="$rootdir/test/rpc/config.json"
LOG_PATH="$rootdir/test/rpc/log.txt"

test_skip_rpc() {
	$SPDK_BIN_DIR/spdk_tgt --no-rpc-server -m 0x1 &
	local spdk_pid=$!

	trap 'killprocess $spdk_pid; exit 1' SIGINT SIGTERM EXIT
	sleep 5

	NOT rpc_cmd spdk_get_version &> /dev/null
	trap - SIGINT SIGTERM EXIT
	killprocess $spdk_pid
}

gen_json_config() {
	$SPDK_BIN_DIR/spdk_tgt -m 0x1 &
	local spdk_pid=$!

	trap 'killprocess $spdk_pid; exit 1' SIGINT SIGTERM EXIT
	waitforlisten $spdk_pid

	# Use an RPC that results in an output to the terminal
	rpc_cmd nvmf_get_transports --trtype tcp || rpc_cmd nvmf_create_transport -t tcp

	rpc_cmd save_config > $CONFIG_PATH
	cat $CONFIG_PATH

	trap - SIGINT SIGTERM EXIT
	killprocess $spdk_pid
}

test_skip_rpc_with_json() {
	gen_json_config

	$SPDK_BIN_DIR/spdk_tgt --no-rpc-server -m 0x1 --json $CONFIG_PATH &> $LOG_PATH &
	local spdk_pid=$!
	sleep 5

	killprocess $spdk_pid
	grep -q "TCP Transport Init" $LOG_PATH
	rm $LOG_PATH
}

test_skip_rpc_with_delay() {
	# Skipping RPC init and adding a delay are exclusive
	NOT $SPDK_BIN_DIR/spdk_tgt --no-rpc-server -m 0x1 --wait-for-rpc
}

run_test "skip_rpc" test_skip_rpc
run_test "skip_rpc_with_json" test_skip_rpc_with_json
run_test "skip_rpc_with_delay" test_skip_rpc_with_delay

rm $CONFIG_PATH