See ovsdb-server.1.in changes for details. Signed-off-by: Andy Zhou <az...@ovn.org> --- NEWS | 4 ++++ ovsdb/ovsdb-server.1.in | 6 ++++++ ovsdb/ovsdb-server.c | 55 +++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 54 insertions(+), 11 deletions(-)
diff --git a/NEWS b/NEWS index 6d71df7..a56131f 100644 --- a/NEWS +++ b/NEWS @@ -36,6 +36,10 @@ Post-v2.5.0 for 2.7+. - SELinux: * Introduced SELinux policy package. + - ovsdb-server: + * Support multi-threading. '--max-num-threads' command line + option are added to specify the max thread to use. Either passing + in '0' or omit the option disables multi-threading v2.5.0 - xx xxx xxxx --------------------- diff --git a/ovsdb/ovsdb-server.1.in b/ovsdb/ovsdb-server.1.in index 6c85729..0a06e52 100644 --- a/ovsdb/ovsdb-server.1.in +++ b/ovsdb/ovsdb-server.1.in @@ -16,6 +16,7 @@ ovsdb\-server \- Open vSwitch database server [\fIdatabase\fR]\&... [\fB\-\-remote=\fIremote\fR]\&... [\fB\-\-run=\fIcommand\fR] +[\fB\-\-max-num-threads=\fInumber\fR] .so lib/daemon-syn.man .so lib/service-syn.man .so lib/vlog-syn.man @@ -91,6 +92,11 @@ run a single command, e.g.: .B "ovsdb\-server \-\-remote=punix:socket \-\-run='ovsdb\-client dump unix:socket Open_vSwitch'" .IP This option is not supported on Windows platform. +. +.IP "\fB\-\-max-num-threads=\fInumber\fR" +Ordinarily \fBovsdb\-server\fR runs without spawning additional threads. Use this option +to increase \fBovsdb\-server\fR throughput on a multi-core server by spwaning up to \fInumber\fR +of additional threads to handle incoming client connections. .SS "Daemon Options" .ds DD \ \fBovsdb\-server\fR detaches only after it starts listening on all \ diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c index 8dd79c4..414106a 100644 --- a/ovsdb/ovsdb-server.c +++ b/ovsdb/ovsdb-server.c @@ -87,6 +87,7 @@ struct server_config { struct shash *all_dbs; FILE *config_tmpfile; struct ovsdb_jsonrpc_server *jsonrpc; + size_t n_max_threads; }; static unixctl_cb_func ovsdb_server_add_remote; static unixctl_cb_func ovsdb_server_remove_remote; @@ -101,7 +102,7 @@ static void close_db(struct db *db); static void parse_options(int *argc, char **argvp[], struct sset *remotes, char **unixctl_pathp, - char **run_command); + char **run_command, size_t *n_max_threads); OVS_NO_RETURN static void usage(void); static char *reconfigure_remotes(struct ovsdb_jsonrpc_server *, @@ -115,10 +116,11 @@ static void update_remote_status(const struct ovsdb_jsonrpc_server *jsonrpc, struct shash *all_dbs); static void save_config__(FILE *config_file, const struct sset *remotes, - const struct sset *db_filenames); + const struct sset *db_filenames, + size_t n_max_threads); static void save_config(struct server_config *); static void load_config(FILE *config_file, struct sset *remotes, - struct sset *db_filenames); + struct sset *db_filenames, size_t *n_max_threads); static void main_loop(struct ovsdb_jsonrpc_server *jsonrpc, struct shash *all_dbs, @@ -214,6 +216,7 @@ main(int argc, char *argv[]) struct server_config server_config; struct shash all_dbs; struct shash_node *node, *next; + size_t n_max_threads; char *error; int i; @@ -223,7 +226,8 @@ main(int argc, char *argv[]) fatal_ignore_sigpipe(); process_init(); - parse_options(&argc, &argv, &remotes, &unixctl_path, &run_command); + parse_options(&argc, &argv, &remotes, &unixctl_path, &run_command, + &n_max_threads); daemon_become_new_user(false); /* Create and initialize 'config_tmpfile' as a temporary file to hold @@ -249,14 +253,15 @@ main(int argc, char *argv[]) server_config.remotes = &remotes; server_config.config_tmpfile = config_tmpfile; + server_config.n_max_threads = n_max_threads; - save_config__(config_tmpfile, &remotes, &db_filenames); + save_config__(config_tmpfile, &remotes, &db_filenames, n_max_threads); daemonize_start(false); /* Load the saved config. */ - load_config(config_tmpfile, &remotes, &db_filenames); - jsonrpc = ovsdb_jsonrpc_server_create(0); + load_config(config_tmpfile, &remotes, &db_filenames, &n_max_threads); + jsonrpc = ovsdb_jsonrpc_server_create(n_max_threads); shash_init(&all_dbs); server_config.all_dbs = &all_dbs; @@ -1270,7 +1275,8 @@ ovsdb_server_list_databases(struct unixctl_conn *conn, int argc OVS_UNUSED, static void parse_options(int *argcp, char **argvp[], - struct sset *remotes, char **unixctl_pathp, char **run_command) + struct sset *remotes, char **unixctl_pathp, char **run_command, + size_t *n_max_threads) { enum { OPT_REMOTE = UCHAR_MAX + 1, @@ -1278,12 +1284,14 @@ parse_options(int *argcp, char **argvp[], OPT_RUN, OPT_BOOTSTRAP_CA_CERT, OPT_PEER_CA_CERT, + OPT_THREAD, VLOG_OPTION_ENUMS, DAEMON_OPTION_ENUMS }; static const struct option long_options[] = { {"remote", required_argument, NULL, OPT_REMOTE}, {"unixctl", required_argument, NULL, OPT_UNIXCTL}, + {"max-num-threads", required_argument, NULL, OPT_THREAD}, #ifndef _WIN32 {"run", required_argument, NULL, OPT_RUN}, #endif @@ -1301,6 +1309,7 @@ parse_options(int *argcp, char **argvp[], char *short_options = ovs_cmdl_long_options_to_short_options(long_options); int argc = *argcp; char **argv = *argvp; + *n_max_threads = 0; sset_init(remotes); for (;;) { @@ -1324,6 +1333,10 @@ parse_options(int *argcp, char **argvp[], *run_command = optarg; break; + case OPT_THREAD: + *n_max_threads = atoi(optarg); + break; + case 'h': usage(); @@ -1385,6 +1398,7 @@ usage(void) printf("\nOther options:\n" " --run COMMAND run COMMAND as subprocess then exit\n" " --unixctl=SOCKET override default control socket name\n" + " --max-num-threads=NUM spawn up to 'NUM' threads\n" " -h, --help display this help message\n" " -V, --version display version information\n"); exit(EXIT_SUCCESS); @@ -1407,7 +1421,7 @@ sset_to_json(const struct sset *sset) * 'remotes' and 'db_filenames'. */ static void save_config__(FILE *config_file, const struct sset *remotes, - const struct sset *db_filenames) + const struct sset *db_filenames, size_t n_max_threads) { struct json *obj; char *s; @@ -1420,6 +1434,10 @@ save_config__(FILE *config_file, const struct sset *remotes, obj = json_object_create(); json_object_put(obj, "remotes", sset_to_json(remotes)); json_object_put(obj, "db_filenames", sset_to_json(db_filenames)); + if (n_max_threads) { + json_object_put(obj, "n_max_threads", + json_integer_create(n_max_threads)); + } s = json_to_string(obj, 0); json_destroy(obj); @@ -1445,7 +1463,8 @@ save_config(struct server_config *config) sset_add(&db_filenames, db->filename); } - save_config__(config->config_tmpfile, config->remotes, &db_filenames); + save_config__(config->config_tmpfile, config->remotes, &db_filenames, + config->n_max_threads); sset_destroy(&db_filenames); } @@ -1464,10 +1483,22 @@ sset_from_json(struct sset *sset, const struct json *array) } } +static void +n_max_threads_from_json(size_t *n_max_threads, const struct json * json) +{ + if (json && json->type == JSON_INTEGER) { + *n_max_threads = json->u.integer; + } else { + *n_max_threads = 0; + } +} + + /* Clears and replaces 'remotes' and 'dbnames' by a configuration read from * 'config_file', which must have been previously written by save_config(). */ static void -load_config(FILE *config_file, struct sset *remotes, struct sset *db_filenames) +load_config(FILE *config_file, struct sset *remotes, struct sset *db_filenames, + size_t *n_max_threads) { struct json *json; @@ -1483,5 +1514,7 @@ load_config(FILE *config_file, struct sset *remotes, struct sset *db_filenames) sset_from_json(remotes, shash_find_data(json_object(json), "remotes")); sset_from_json(db_filenames, shash_find_data(json_object(json), "db_filenames")); + n_max_threads_from_json(n_max_threads, shash_find_data(json_object(json), + "n_max_threads")); json_destroy(json); } -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev