[ovs-dev] [PATCH v1] Monitor Database table to manage lifecycle of IDL client.
Ben Pfaff
blp at ovn.org
Thu Dec 27 17:22:56 UTC 2018
On Tue, Dec 18, 2018 at 12:18:06AM +0000, Ted Elhourani wrote:
> The Python IDL implementation supports ovsdb cluster connections.
> This patch is a follow up to commit 31e434fc98, it adds the option of
> connecting to the leader in the Raft-based cluster. It mimics the
> exisiting C IDL support for clusters introduced in commit 1b1d2e6daa.
>
> The server schema is first requested, then a monitor of the Database table
> in the _Server Database. __check_server_db is called to verify the
> eligibility of the server. Unlike the C IDL, if an attempt to obtain a
> monitor of the Server database fails this implementation does not proceed
> to monitor and transact with the database. The reason is connections to
> standalone databases should not be permitted when the intention is to
> connect to a valid cluster node. The change_seqno is not incremented in the
> case of Database table updates.
>
> The run method of Session (jsonrpc) is modified such that the session is
> closed when a stream connection fails, if more than one remote exists.
> Otherwise the session will re-attempt to establish a stream to the same
> cluster node. Method pick_remote must be called before opening a stream
> in __connect (in Session), otherwise a force_reconnect causes the Session
> to re-attempt a connection to the same server. pick_remote is no longer
> necessary in method run of Session.
>
> Signed-off-by: Ted Elhourani <ted.elhourani at nutanix.com>
I'm pretty sure that this breaks backward compatibility with any
ovsdb-server not new enough to support the _Server table. The commit
message above conflates that with whether the database is clustered. I
think your intention is to reject non-clustered databases, but it
doesn't do that; instead, it rejects database servers too old to have a
_Server table and accepts standalone databases served up by new-enough
servers. It's one thing to avoid connecting to standalone databases
when a cluster is expected, but this goes beyond that to drop support
for all older database servers. I don't think that's reasonable behavior.
I noticed that the following looks wrong. EAGAIN indicates that the
connection is not complete yet. It should not be treated as a
connection failure (unless a timeout has occurred) even if there is more
than one remote:
> @@ -516,9 +516,9 @@ class Session(object):
> self.reconnect.connected(ovs.timeval.msec())
> self.rpc = Connection(self.stream)
> self.stream = None
> - elif error != errno.EAGAIN:
> + elif (error != errno.EAGAIN or
> + self.get_num_of_remotes() > 1):
> self.reconnect.connect_failed(ovs.timeval.msec(), error)
> - self.pick_remote()
> self.stream.close()
> self.stream = None
Thanks,
Ben.
More information about the dev
mailing list