Hello

According to this mail

http://sourceforge.net/p/ryu/mailman/message/34347766/

ryu can't get all flow entries if query time is longer than
DEFAULT_TIMEOUT(1s).

In this patch, I add few line to check new messages.

keep waiting if new message came (length of msgs changed)

I tried to add 40k flows and dump all flows by using REST API, and it works
fine.

-- 
Yi Tseng (a.k.a Takeshi)
Taiwan National Chiao Tung University
Department of Computer Science
W2CNLab
From d6c85467975a56a064dfa7f6c14afe013c7390e2 Mon Sep 17 00:00:00 2001
From: Takeshi <[email protected]>
Date: Wed, 5 Aug 2015 23:45:00 +0800
Subject: [PATCH] use idle timeout in ofctl to avoid incomplete querying

---
 ryu/lib/ofctl_v1_0.py | 8 ++++++++
 ryu/lib/ofctl_v1_2.py | 8 ++++++++
 ryu/lib/ofctl_v1_3.py | 8 ++++++++
 3 files changed, 24 insertions(+)

diff --git a/ryu/lib/ofctl_v1_0.py b/ryu/lib/ofctl_v1_0.py
index 04b9b7d..939207b 100644
--- a/ryu/lib/ofctl_v1_0.py
+++ b/ryu/lib/ofctl_v1_0.py
@@ -274,10 +274,18 @@ def send_stats_request(dp, stats, waiters, msgs):
     dp.set_xid(stats)
     waiters_per_dp = waiters.setdefault(dp.id, {})
     lock = hub.Event()
+    previous_msg_len = len(msgs)
     waiters_per_dp[stats.xid] = (lock, msgs)
     dp.send_msg(stats)
 
     lock.wait(timeout=DEFAULT_TIMEOUT)
+    current_msg_len = len(msgs)
+
+    while current_msg_len > previous_msg_len:
+        previous_msg_len = current_msg_len
+        lock.wait(timeout=DEFAULT_TIMEOUT)
+        current_msg_len = len(msgs)
+
     if not lock.is_set():
         del waiters_per_dp[stats.xid]
 
diff --git a/ryu/lib/ofctl_v1_2.py b/ryu/lib/ofctl_v1_2.py
index 37f8792..038bb49 100644
--- a/ryu/lib/ofctl_v1_2.py
+++ b/ryu/lib/ofctl_v1_2.py
@@ -382,10 +382,18 @@ def send_stats_request(dp, stats, waiters, msgs):
     dp.set_xid(stats)
     waiters_per_dp = waiters.setdefault(dp.id, {})
     lock = hub.Event()
+    previous_msg_len = len(msgs)
     waiters_per_dp[stats.xid] = (lock, msgs)
     dp.send_msg(stats)
 
     lock.wait(timeout=DEFAULT_TIMEOUT)
+    current_msg_len = len(msgs)
+
+    while current_msg_len > previous_msg_len:
+        previous_msg_len = current_msg_len
+        lock.wait(timeout=DEFAULT_TIMEOUT)
+        current_msg_len = len(msgs)
+
     if not lock.is_set():
         del waiters_per_dp[stats.xid]
 
diff --git a/ryu/lib/ofctl_v1_3.py b/ryu/lib/ofctl_v1_3.py
index 8490206..5b709f3 100644
--- a/ryu/lib/ofctl_v1_3.py
+++ b/ryu/lib/ofctl_v1_3.py
@@ -404,10 +404,18 @@ def send_stats_request(dp, stats, waiters, msgs):
     dp.set_xid(stats)
     waiters_per_dp = waiters.setdefault(dp.id, {})
     lock = hub.Event()
+    previous_msg_len = len(msgs)
     waiters_per_dp[stats.xid] = (lock, msgs)
     dp.send_msg(stats)
 
     lock.wait(timeout=DEFAULT_TIMEOUT)
+    current_msg_len = len(msgs)
+
+    while current_msg_len > previous_msg_len:
+        previous_msg_len = current_msg_len
+        lock.wait(timeout=DEFAULT_TIMEOUT)
+        current_msg_len = len(msgs)
+
     if not lock.is_set():
         del waiters_per_dp[stats.xid]
 
-- 
2.3.2 (Apple Git-55)

------------------------------------------------------------------------------
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to