@@ -219,6 +219,9 @@ struct ovsdb_cs {
struct uuid cid;
struct hmap server_rows;
+ /* Whether to send 'set_db_change_aware'. */
+ bool set_db_change_aware;
+
/* Clustered servers. */
uint64_t min_index; /* Minimum allowed index, to avoid regression. */
bool leader_only; /* If true, do not connect to Raft followers. */
@@ -331,6 +334,7 @@ ovsdb_cs_create(const char *db_name, int max_version,
cs->request_id = NULL;
cs->leader_only = true;
cs->shuffle_remotes = true;
+ cs->set_db_change_aware = true;
hmap_init(&cs->server_rows);
return cs;
@@ -461,7 +465,7 @@ ovsdb_cs_process_response(struct ovsdb_cs *cs, struct jsonrpc_msg *msg)
cs->server.monitor_version = cs->server.max_version;
ovsdb_cs_db_parse_monitor_reply(&cs->server, msg->result,
cs->server.monitor_version);
- if (ovsdb_cs_check_server_db(cs)) {
+ if (ovsdb_cs_check_server_db(cs) && cs->set_db_change_aware) {
ovsdb_cs_send_db_change_aware(cs);
}
} else {
@@ -1150,6 +1154,22 @@ ovsdb_cs_send_cond_change(struct ovsdb_cs *cs)
}
}
+/* Database change awareness. */
+
+/* By default, or if 'db_change_aware' is true, 'cs' will send
+ * 'set_db_change_aware' request to the server after receiving the _SERVER data
+ * (when the server supports it), which is useful for clients that intends to
+ * keep long connections to the server. Otherwise, 'cs' will not send the
+ * 'set_db_change_aware' request, which is more reasonable for short-lived
+ * connections to avoid unnecessary processing at the server side and possible
+ * error handling due to connections being closed by the clients before the
+ * responses are sent by the server. */
+void
+ovsdb_cs_set_db_change_aware(struct ovsdb_cs *cs, bool set_db_change_aware)
+{
+ cs->set_db_change_aware = set_db_change_aware;
+}
+
/* Clustered servers. */
/* By default, or if 'leader_only' is true, when 'cs' connects to a clustered
@@ -142,6 +142,9 @@ unsigned int ovsdb_cs_set_condition(struct ovsdb_cs *, const char *table,
const struct json *condition);
unsigned int ovsdb_cs_get_condition_seqno(const struct ovsdb_cs *);
+/* Database change awareness. */
+void ovsdb_cs_set_db_change_aware(struct ovsdb_cs *, bool set_db_change_aware);
+
/* Clustered servers. */
void ovsdb_cs_set_leader_only(struct ovsdb_cs *, bool leader_only);
void ovsdb_cs_set_shuffle_remotes(struct ovsdb_cs *, bool shuffle);
@@ -321,6 +321,14 @@ ovsdb_idl_set_shuffle_remotes(struct ovsdb_idl *idl, bool shuffle)
ovsdb_cs_set_shuffle_remotes(idl->cs, shuffle);
}
+/* Passes 'set_db_change_aware' to ovsdb_cs_set_db_change_aware(). See that
+ * function for documentation. */
+void
+ovsdb_idl_set_db_change_aware(struct ovsdb_idl *idl, bool set_db_change_aware)
+{
+ ovsdb_cs_set_db_change_aware(idl->cs, set_db_change_aware);
+}
+
/* Reset min_index to 0. This prevents a situation where the client
* thinks all databases have stale data, when they actually have all
* been destroyed and rebuilt from scratch.
@@ -66,6 +66,8 @@ struct ovsdb_idl *ovsdb_idl_create_unconnected(
const struct ovsdb_idl_class *, bool monitor_everything_by_default);
void ovsdb_idl_set_remote(struct ovsdb_idl *, const char *remote, bool retry);
void ovsdb_idl_set_shuffle_remotes(struct ovsdb_idl *, bool shuffle);
+void ovsdb_idl_set_db_change_aware(struct ovsdb_idl *,
+ bool set_db_change_aware);
void ovsdb_idl_reset_min_index(struct ovsdb_idl *);
void ovsdb_idl_destroy(struct ovsdb_idl *);