#include "command-line.h"
#include "daemon.h"
#include "dirs.h"
-#include "dummy.h"
#include "dynamic-string.h"
#include "fatal-signal.h"
#include "file.h"
#include "jsonrpc-server.h"
#include "list.h"
#include "memory.h"
+#include "monitor.h"
#include "ovsdb.h"
#include "ovsdb-data.h"
#include "ovsdb-types.h"
#include "trigger.h"
#include "util.h"
#include "unixctl.h"
-#include "vlog.h"
+#include "perf-counter.h"
+#include "openvswitch/vlog.h"
VLOG_DEFINE_THIS_MODULE(ovsdb_server);
static unixctl_cb_func ovsdb_server_exit;
static unixctl_cb_func ovsdb_server_compact;
static unixctl_cb_func ovsdb_server_reconnect;
+static unixctl_cb_func ovsdb_server_perf_counters_clear;
+static unixctl_cb_func ovsdb_server_perf_counters_show;
+static unixctl_cb_func ovsdb_server_disable_monitor2;
struct server_config {
struct sset *remotes;
static void parse_options(int *argc, char **argvp[],
struct sset *remotes, char **unixctl_pathp,
char **run_command);
-static void usage(void) NO_RETURN;
+OVS_NO_RETURN static void usage(void);
static char *reconfigure_remotes(struct ovsdb_jsonrpc_server *,
const struct shash *all_dbs,
simap_init(&usage);
ovsdb_jsonrpc_server_get_memory_usage(jsonrpc, &usage);
+ ovsdb_monitor_get_memory_usage(&usage);
SHASH_FOR_EACH(node, all_dbs) {
struct db *db = node->data;
ovsdb_get_memory_usage(db->db, &usage);
char *error;
int i;
- proctitle_init(argc, argv);
+ ovs_cmdl_proctitle_init(argc, argv);
set_program_name(argv[0]);
service_start(&argc, &argv);
fatal_ignore_sigpipe();
process_init();
parse_options(&argc, &argv, &remotes, &unixctl_path, &run_command);
+ daemon_become_new_user(false);
/* Create and initialize 'config_tmpfile' as a temporary file to hold
* ovsdb-server's most basic configuration, and then save our initial
save_config__(config_tmpfile, &remotes, &db_filenames);
- daemonize_start();
+ daemonize_start(false);
/* Load the saved config. */
load_config(config_tmpfile, &remotes, &db_filenames);
shash_init(&all_dbs);
server_config.all_dbs = &all_dbs;
server_config.jsonrpc = jsonrpc;
+
+ perf_counters_init();
+
SSET_FOR_EACH (db_filename, &db_filenames) {
error = open_db(&server_config, db_filename);
if (error) {
ovsdb_server_remove_database, &server_config);
unixctl_command_register("ovsdb-server/list-dbs", "", 0, 0,
ovsdb_server_list_databases, &all_dbs);
+ unixctl_command_register("ovsdb-server/perf-counters-show", "", 0, 0,
+ ovsdb_server_perf_counters_show, NULL);
+ unixctl_command_register("ovsdb-server/perf-counters-clear", "", 0, 0,
+ ovsdb_server_perf_counters_clear, NULL);
+
+ /* Simulate the behavior of OVS release prior to version 2.5 that
+ * does not support the monitor2 method. */
+ unixctl_command_register("ovsdb-server/disable-monitor2", "", 0, 0,
+ ovsdb_server_disable_monitor2, jsonrpc);
main_loop(jsonrpc, &all_dbs, unixctl, &remotes, run_process, &exiting);
close_db(db);
shash_delete(&all_dbs, node);
}
+ shash_destroy(&all_dbs);
sset_destroy(&remotes);
sset_destroy(&db_filenames);
unixctl_server_destroy(unixctl);
run_command, process_status_msg(status));
}
}
-
+ perf_counters_destroy();
service_stop();
return 0;
}
return NULL;
}
-static char * WARN_UNUSED_RESULT
+static char * OVS_WARN_UNUSED_RESULT
parse_db_column__(const struct shash *all_dbs,
const char *name_, char *name,
const struct db **dbp,
/* Returns NULL if successful, otherwise a malloc()'d string describing the
* error. */
-static char * WARN_UNUSED_RESULT
+static char * OVS_WARN_UNUSED_RESULT
parse_db_column(const struct shash *all_dbs,
const char *name_,
const struct db **dbp,
/* Returns NULL if successful, otherwise a malloc()'d string describing the
* error. */
-static char * WARN_UNUSED_RESULT
+static char * OVS_WARN_UNUSED_RESULT
parse_db_string_column(const struct shash *all_dbs,
const char *name,
const struct db **dbp,
unixctl_command_reply(conn, NULL);
}
+static void
+ovsdb_server_perf_counters_show(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[] OVS_UNUSED,
+ void *arg_ OVS_UNUSED)
+{
+ char *s = perf_counters_to_string();
+
+ unixctl_command_reply(conn, s);
+ free(s);
+}
+
+static void
+ovsdb_server_perf_counters_clear(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[] OVS_UNUSED,
+ void *arg_ OVS_UNUSED)
+{
+ perf_counters_clear();
+ unixctl_command_reply(conn, NULL);
+}
+
+/* "ovsdb-server/disable-monitor2": makes ovsdb-server drop all of its
+ * JSON-RPC connections and reconnect. New sessions will not recognize
+ * the 'monitor2' method. */
+static void
+ovsdb_server_disable_monitor2(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[] OVS_UNUSED, void *jsonrpc_)
+{
+ struct ovsdb_jsonrpc_server *jsonrpc = jsonrpc_;
+
+ ovsdb_jsonrpc_disable_monitor2();
+ ovsdb_jsonrpc_server_reconnect(jsonrpc);
+ unixctl_command_reply(conn, NULL);
+}
+
static void
ovsdb_server_compact(struct unixctl_conn *conn, int argc,
const char *argv[], void *dbs_)
OPT_UNIXCTL,
OPT_RUN,
OPT_BOOTSTRAP_CA_CERT,
- OPT_ENABLE_DUMMY,
+ OPT_PEER_CA_CERT,
VLOG_OPTION_ENUMS,
DAEMON_OPTION_ENUMS
};
DAEMON_LONG_OPTIONS,
VLOG_LONG_OPTIONS,
{"bootstrap-ca-cert", required_argument, NULL, OPT_BOOTSTRAP_CA_CERT},
+ {"peer-ca-cert", required_argument, NULL, OPT_PEER_CA_CERT},
{"private-key", required_argument, NULL, 'p'},
{"certificate", required_argument, NULL, 'c'},
{"ca-cert", required_argument, NULL, 'C'},
- {"enable-dummy", optional_argument, NULL, OPT_ENABLE_DUMMY},
{NULL, 0, NULL, 0},
};
- char *short_options = long_options_to_short_options(long_options);
+ char *short_options = ovs_cmdl_long_options_to_short_options(long_options);
int argc = *argcp;
char **argv = *argvp;
bootstrap_ca_cert = true;
break;
- case OPT_ENABLE_DUMMY:
- dummy_enable(optarg && !strcmp(optarg, "override"));
+ case OPT_PEER_CA_CERT:
+ stream_ssl_set_peer_ca_cert_file(optarg);
break;
case '?':