At times is it convient to read from all clients at the same time. In
particular when searching for what system_id a port or bridge (datapath)
belongs to.

Signed-off-by: Jason Kölker <[email protected]>
---
 ryu/services/protocols/ovsdb/client.py  |  9 ++++++++-
 ryu/services/protocols/ovsdb/manager.py | 30 ++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/ryu/services/protocols/ovsdb/client.py 
b/ryu/services/protocols/ovsdb/client.py
index 1780638..7c20eb2 100644
--- a/ryu/services/protocols/ovsdb/client.py
+++ b/ryu/services/protocols/ovsdb/client.py
@@ -373,8 +373,15 @@ class RemoteOvsdb(app_manager.RyuApp):
     def modify_request_handler(self, ev):
         self._txn_q.append(ev)
 
-    def read_request_handler(self, ev):
+    def read_request_handler(self, ev, bulk=False):
         result = ev.func(self._idl.tables)
+
+        # NOTE(jkoelker) If this was a bulk request, the parent OVSDB app is
+        #                responsible for the reply
+
+        if bulk:
+            return (self.system_id, result)
+
         rep = event.EventReadReply(self.system_id, result)
         self.reply_to_request(ev, rep)
 
diff --git a/ryu/services/protocols/ovsdb/manager.py 
b/ryu/services/protocols/ovsdb/manager.py
index 0c63197..a2b8a7e 100644
--- a/ryu/services/protocols/ovsdb/manager.py
+++ b/ryu/services/protocols/ovsdb/manager.py
@@ -88,6 +88,26 @@ class OVSDB(app_manager.RyuApp):
             t = hub.spawn(self._start_remote, sock, client_address)
             self.threads.append(t)
 
+    def _bulk_read_handler(self, ev):
+        results = []
+
+        def done(gt, *args, **kwargs):
+            if gt in self.threads:
+                self.threads.remove(gt)
+
+            results.append(gt.wait())
+
+        threads = []
+        for c in self._clients.values():
+            gt = hub.spawn(c.read_request_handler, ev, bulk=True)
+            threads.append(gt)
+            self.threads.append(gt)
+            gt.link(done)
+
+        hub.joinall(threads)
+        rep = event.EventReadReply(None, results)
+        self.reply_to_request(ev, rep)
+
     def _proxy_event(self, ev):
         system_id = ev.system_id
         client_name = client.RemoteOvsdb.instance_name(system_id)
@@ -174,6 +194,16 @@ class OVSDB(app_manager.RyuApp):
     @handler.set_ev_cls(event.EventReadRequest)
     def read_request_handler(self, ev):
         system_id = ev.system_id
+
+        if system_id is None:
+            def done(gt, *args, **kwargs):
+                if gt in self.threads:
+                    self.threads.remove(gt)
+
+            thread = hub.spawn(self._bulk_read_handler, ev)
+            self.threads.append(thread)
+            return thread.link(done)
+
         client_name = client.RemoteOvsdb.instance_name(system_id)
         remote = self._clients.get(client_name)
 
-- 
2.7.3


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785351&iu=/4140
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to