mirror of
https://github.com/openvswitch/ovs
synced 2025-09-02 07:15:17 +00:00
python: idl: Fix last-id update from a monitor reply.
While sending a reply to the monitor_cond_since request, server
includes the last transaction ID. And it sends new IDs with each
subsequent update. Current implementation doesn't use the one
supplied with a monitor reply, and only takes into account IDs
provided with monitor updates. That may cause various issues:
1. Performance: During initialization, the last-id is set to zero.
If re-connection will happen after receiving a monitor reply,
but before any monitor update, the client will send a new
monitor request with an all-zero last-id and will re-download
the whole database again.
2. Data inconsistency: Assuming one of the clients sends a
transaction, but our python client disconnects before receiving
a monitor update for this transaction. The last-id will point
to a database state before this transaction. On re-connection,
this last-id will be sent and the monitor reply will contain
a diff with a new data from that transaction. But if another
disconnection happens right after that, on second re-connection
our python client will send another monitor_cond_since with
exactly the same last-id. That will cause receiving the same
set of updates again. And since it's an update2 message with
a diff of the data, the client will remove previously applied
result of the transaction. At this point it will have a
different database view with the server potentially leading
to all sorts of data inconsistency problems.
Fix that by always updating the last-id from the latest monitor
reply.
Fixes: 46d44cf3be
("python: idl: Add monitor_cond_since support.")
Acked-by: Simon Horman <horms@ovn.org>
Acked-by: Han Zhou <hzhou@ovn.org>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
@@ -494,6 +494,7 @@ class Idl(object):
|
||||
if not msg.result[0]:
|
||||
self.__clear()
|
||||
self.__parse_update(msg.result[2], OVSDB_UPDATE3)
|
||||
self.last_id = msg.result[1]
|
||||
elif self.state == self.IDL_S_DATA_MONITOR_COND_REQUESTED:
|
||||
self.__clear()
|
||||
self.__parse_update(msg.result, OVSDB_UPDATE2)
|
||||
|
Reference in New Issue
Block a user