2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 01:51:26 +00:00
ovs/ovsdb/monitor.h
Han Zhou 9167cb52fa ovsdb-monitor: Support monitor_cond_since.
Support the new monitor method monitor_cond_since so that a client
can request monitoring start from a specific point instead of always
from beginning. This will reduce the cost at scenarios when server
is restarted/failed-over but client still has all existing data. In
these scenarios only new changes (and in most cases no change) needed
to be transfered to client. When ovsdb-server restarted, history
transactions are read from disk file; when ovsdb-server failed over,
history transactions exists already in the memory of the new server.

There are situations that the requested transaction may not be found.
For example, a transaction that is too old and has been discarded
from the maintained history list in memory, or the transactions on
disk has been compacted during ovsdb compaction. In those situations
the server fall backs to transfer all data start from begining.

For more details of the protocol change, see
Documentation/ref/ovsdb-server.7.rst.

This change includes both server side and ovsdb-client side changes
with the new protocol. IDLs using this capability will be added in
future patches.

Now the feature takes effect only for cluster mode of ovsdb-server,
because cluster mode is the only mode that supports unique transcation
uuid today. For other modes, the monitor_cond_since always fall back
to transfer all data with found = false. Support for those modes can
be added in the future.

Signed-off-by: Han Zhou <hzhou8@ebay.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
2019-02-28 10:26:18 -08:00

125 lines
4.7 KiB
C

/*
* Copyright (c) 2015, 2017 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OVSDB_MONITOR_H
#define OVSDB_MONITOR_H
struct ovsdb;
struct ovsdb_column;
struct ovsdb_monitor;
struct ovsdb_jsonrpc_monitor;
struct ovsdb_monitor_session_condition;
struct ovsdb_condition;
struct ovsdb_txn;
struct simap;
enum ovsdb_monitor_selection {
OJMS_NONE = 0, /* None for this iteration */
OJMS_INITIAL = 1 << 0, /* All rows when monitor is created. */
OJMS_INSERT = 1 << 1, /* New rows. */
OJMS_DELETE = 1 << 2, /* Deleted rows. */
OJMS_MODIFY = 1 << 3 /* Modified rows. */
};
enum ovsdb_monitor_version {
OVSDB_MONITOR_V1, /* RFC 7047 "monitor" method. */
OVSDB_MONITOR_V2, /* Extension to RFC 7047, see ovsdb-server
man page for details. */
OVSDB_MONITOR_V3, /* Extension to V2, see ovsdb-server man
page for details. */
/* Last entry. */
OVSDB_MONITOR_VERSION_MAX
};
struct ovsdb_monitor *ovsdb_monitor_create(struct ovsdb *,
struct ovsdb_jsonrpc_monitor *);
void ovsdb_monitors_remove(struct ovsdb *);
void ovsdb_monitors_commit(struct ovsdb *, const struct ovsdb_txn *);
void ovsdb_monitor_prereplace_db(struct ovsdb *);
struct ovsdb_monitor *ovsdb_monitor_add(struct ovsdb_monitor *);
void ovsdb_monitor_add_jsonrpc_monitor(struct ovsdb_monitor *,
struct ovsdb_jsonrpc_monitor *);
struct ovsdb_monitor_change_set;
void ovsdb_monitor_remove_jsonrpc_monitor(struct ovsdb_monitor *,
struct ovsdb_jsonrpc_monitor *,
struct ovsdb_monitor_change_set *);
void ovsdb_monitor_add_table(struct ovsdb_monitor *,
const struct ovsdb_table *);
const char * ovsdb_monitor_add_column(struct ovsdb_monitor *,
const struct ovsdb_table *,
const struct ovsdb_column *,
enum ovsdb_monitor_selection,
bool monitored);
bool
ovsdb_monitor_table_exists(struct ovsdb_monitor *,
const struct ovsdb_table *);
struct json *ovsdb_monitor_get_update(struct ovsdb_monitor *,
bool initial,
bool cond_updated,
struct ovsdb_monitor_session_condition *,
enum ovsdb_monitor_version,
struct ovsdb_monitor_change_set **p_mcs);
const struct uuid *ovsdb_monitor_get_last_txnid(struct ovsdb_monitor *);
void ovsdb_monitor_table_add_select(struct ovsdb_monitor *,
const struct ovsdb_table *,
enum ovsdb_monitor_selection);
bool ovsdb_monitor_needs_flush(struct ovsdb_monitor *,
struct ovsdb_monitor_change_set *);
void ovsdb_monitor_get_initial(struct ovsdb_monitor *,
struct ovsdb_monitor_change_set **);
void ovsdb_monitor_get_changes_after(const struct uuid *txn_uuid,
struct ovsdb_monitor *, struct ovsdb_monitor_change_set **);
void ovsdb_monitor_get_memory_usage(struct simap *);
struct ovsdb_monitor_session_condition *
ovsdb_monitor_session_condition_create(void);
void
ovsdb_monitor_session_condition_destroy(
struct ovsdb_monitor_session_condition *);
struct ovsdb_error *
ovsdb_monitor_table_condition_create(
struct ovsdb_monitor_session_condition *,
const struct ovsdb_table *,
const struct json *json_cnd);
void
ovsdb_monitor_condition_bind(struct ovsdb_monitor *,
struct ovsdb_monitor_session_condition *);
struct ovsdb_error *
ovsdb_monitor_table_condition_update(
struct ovsdb_monitor *,
struct ovsdb_monitor_session_condition *,
const struct ovsdb_table *,
const struct json *cond_json);
#endif