bool
ovsdb_jsonrpc_server_add_db(struct ovsdb_jsonrpc_server *svr, struct ovsdb *db)
{
+ /* The OVSDB protocol doesn't have a way to notify a client that a
+ * database has been added. If some client tried to use the database
+ * that we're adding and failed, then forcing it to reconnect seems like
+ * a reasonable way to make it try again.
+ *
+ * If this is too big of a hammer in practice, we could be more selective,
+ * e.g. disconnect only connections that actually tried to use a database
+ * with 'db''s name. */
+ ovsdb_jsonrpc_server_reconnect(svr);
+
return ovsdb_server_add_db(&svr->up, db);
}
+/* Removes 'db' from the set of databases served out by 'svr'. Returns
+ * true if successful, false if there is no database associated with 'db'. */
+bool
+ovsdb_jsonrpc_server_remove_db(struct ovsdb_jsonrpc_server *svr,
+ struct ovsdb *db)
+{
+ /* There might be pointers to 'db' from 'svr', such as monitors or
+ * outstanding transactions. Disconnect all JSON-RPC connections to avoid
+ * accesses to freed memory.
+ *
+ * If this is too big of a hammer in practice, we could be more selective,
+ * e.g. disconnect only connections that actually reference 'db'. */
+ ovsdb_jsonrpc_server_reconnect(svr);
+
+ return ovsdb_server_remove_db(&svr->up, db);
+}
+
void
ovsdb_jsonrpc_server_destroy(struct ovsdb_jsonrpc_server *svr)
{
error = jsonrpc_pstream_open(name, &listener, options->dscp);
if (error && error != EAFNOSUPPORT) {
- VLOG_ERR_RL(&rl, "%s: listen failed: %s", name, strerror(error));
+ VLOG_ERR_RL(&rl, "%s: listen failed: %s", name, ovs_strerror(error));
return NULL;
}
} else if (error != EAGAIN) {
VLOG_WARN_RL(&rl, "%s: accept failed: %s",
pstream_get_name(remote->listener),
- strerror(error));
+ ovs_strerror(error));
}
}
monitor_length = ovsdb_jsonrpc_monitor_json_length_all(s);
if (backlog > s->reply_backlog + monitor_length * 2) {
- VLOG_INFO("%s: %zu bytes backlogged but a complete replica "
- "would only take %zu bytes, disconnecting",
+ VLOG_INFO("%s: %"PRIuSIZE" bytes backlogged but a complete replica "
+ "would only take %"PRIuSIZE" bytes, disconnecting",
jsonrpc_session_get_name(s->js),
backlog - s->reply_backlog, monitor_length);
jsonrpc_session_force_reconnect(s->js);
error = pstream_set_dscp(remote->listener, options->dscp);
if (error) {
VLOG_ERR("%s: set_dscp failed %s",
- pstream_get_name(remote->listener), strerror(error));
+ pstream_get_name(remote->listener), ovs_strerror(error));
} else {
remote->dscp = options->dscp;
}
struct reconnect_stats rstats;
struct ds locks_held, locks_waiting, locks_lost;
+ status->bound_port = (remote->listener
+ ? pstream_get_bound_port(remote->listener)
+ : htons(0));
+
if (list_is_empty(&remote->sessions)) {
return false;
}