ovs-xapi-sync: Rerun processing when a db update arrives during a commit.
authorBen Pfaff <blp@nicira.com>
Thu, 8 Mar 2012 18:49:47 +0000 (10:49 -0800)
committerBen Pfaff <blp@nicira.com>
Thu, 8 Mar 2012 19:42:25 +0000 (11:42 -0800)
The logic in ovs-xapi-sync didn't handle the case where ovsdb-server sends
a database update before it replies to a transaction that ovs-xapi-sync
sent, like this:

ovs-xapi-sync              ovsdb-server
-------------              ------------

                      .
                      .
                      .
transaction request  --->
                     <---  database contents update
                     <---  transaction reply
                      .
                      .
                      .

The update was not lost but ovs-xapi-sync would not process it until the
database changed again.

Bug #10082.
Reported-by: Krishna Miriyala <krishna@nicira.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync

index 7132726ab9c055ca9134db74a2e0e0e4ade6fdd8..0ffccc2da9619d20ee0b29831b071c2a233902c0 100755 (executable)
@@ -272,8 +272,10 @@ def main():
     bridges = {}                # Map from bridge name to xs_network_uuids
     iface_ids = {}              # Map from xs-vif-uuid to iface-id
     vm_ids = {}                 # Map from xs-vm-uuid to vm-id
+    seqno = idl.change_seqno    # Sequence number when we last processed the db
     while True:
-        if not force_run and not idl.run():
+        idl.run()
+        if not force_run and seqno == idl.change_seqno:
             poller = ovs.poller.Poller()
             idl.wait(poller)
             poller.block()
@@ -285,6 +287,7 @@ def main():
             iface_ids = {}
             vm_ids = {}
             force_run = False
+        seqno = idl.change_seqno
 
         txn = ovs.db.idl.Transaction(idl)