On Sat, Sep 09, 2023 at 04:18:36AM +0200, Ilya Maximets wrote:
> 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 las-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: 46d44cf3be0d ("python: idl: Add monitor_cond_since support.")
> Signed-off-by: Ilya Maximets <[email protected]>
Acked-by: Simon Horman <[email protected]>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev