Ok Iwase

I'm willing to give it a try at ZMQ. I will read the documentation you
gave me and then come back at a later time to tell you how it went.

Once again, thank you for your support.

Carlos

On 21 December 2017 at 01:35, Iwase Yusuke <iwase.yusu...@gmail.com> wrote:
> Hi Carlos,
>
> Hmmm... It seems that your problem is whether Pyro4 can work on (or
> cooperate
> with) GreanThreads.
> I don't know much about Pyro4, if Pyro4 (client side at least) can work on
> GreanThreads, you can call Pyro4's APIs on your Ryu application, I guess.
>
> Ryu is designed for using non-blocking with eventlet and it is difficult to
> draw their thread back to Native Threads, so if you need to communicate to
> native threads, you need to some mechanism to realize it.
>
> Anyway, the mixing of Native Threads and GreanThreads should be avoided, you
> need to separate process (Ryu and Pyro4 client) first.
>
>   working on                working on
>  non-blocking mode         blocking mode
> <=============>       <===========================>
> Ryu    RyuApp          Pyro4 Client   Pyro4 Server
>  | event |                   |         |
>  |------>| some mechanism(*) |         |
>  |       |------------------>| Request |
>  |       |                   |-------->|
>  |       |                   | Reply   |
>  |       | some mechanism(*) |<--------|
>  |       |<------------------|         |
>
> For (*) in the above, if you prefer to use Queue, how about using Push/Pull
> pattern of ZeroMQ?
> The following describes the way to create a Queue like object with ZeroMQ.
> http://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/pushpull.html
> Please note that, on Ryu, you need to use Eventlet's ZeroMQ instead of
> "pyzmq",
> but the usage seems to be almost the same.
> http://eventlet.net/doc/modules/zmq.html
>
> Thanks,
> Iwase
>
>
>
> On 2017年12月21日 09:48, Carlos Ferreira wrote:
>>
>> Thank you Iwase.
>>
>> I was actually thinking in using queues to synchronise information
>> between Ryu's threads and native threads, since I'm also using Pyro4
>> to communicate with another service.
>> But my doubt here is, how can I suspend a Ryu thread and make it wait
>> for a message to arrive at a queue?
>> I have never used ZeroMQ and I wanted to use a simple mechanism, like
>> the native Python queue.Queue, for example.
>>
>> Carlos
>>
>>
>> On 20 December 2017 at 23:45, Iwase Yusuke <iwase.yusu...@gmail.com>
>> wrote:
>>>
>>> Hi Carlos,
>>>
>>> Please let me confirm your issue first.
>>> Your question is how to suspend the current thread waiting for some works
>>> finished (REST request? or other thread?), right?
>>> To suspend your threads using ryu.lib.hub.spawn, you can use
>>> "eventlet.event"
>>> which is similar to a Queue or threading.Lock.
>>> http://eventlet.net/doc/modules/event.html
>>>
>>> For example:
>>>
>>>   Ryu    xxx_handler  thread        worker
>>>    | Event |           |              |
>>>    |------>|           |              |
>>>    |       | hub.spawn |              |
>>>    |       |---------->|              |
>>>    |       |           | request some |
>>>    |       |           |------------->|
>>>    |       |           | response     |
>>>    |       | FlowMod   |<-------------|
>>>    |       | request   |              |
>>>    |<------------------|              |
>>>    |       |           |              |
>>>
>>>
>>> On this situation, your problem is mixing the Native Threads and the
>>> GreenThreads?
>>> As far as I know, the Native Threads behave (normally) as IO blocking
>>> threads
>>> and Ryu's threads (using ryu.lib.hub.spawn) behave as non-blocking
>>> threads.
>>> Generally, it is not recommended to mix blocking and non-blocking in the
>>> same
>>> process, if these need to cooperate, I guess some APIs like socket (TCP,
>>> REST or
>>> so), file, messaging queue(http://eventlet.net/doc/zeromq.html) is better
>>> way to
>>> communicate between blocking and non-blocking.
>>>
>>> Does someone know more better way?
>>>
>>>
>>> Thanks,
>>> Iwase
>>>
>>>
>>>
>>> On 2017年12月20日 07:52, Carlos Ferreira wrote:
>>>>
>>>>
>>>> Iwase, can you help me here, please?
>>>>
>>>> Thank you!
>>>>
>>>> Carlos Ferreira
>>>>
>>>> On 18 December 2017 at 11:16, Carlos Ferreira <carlosmf...@gmail.com>
>>>> wrote:
>>>>>
>>>>>
>>>>> Hmm, suspending all Ryu activities that is precisely what I was trying
>>>>> to
>>>>> avoid.
>>>>>
>>>>> Ok I have another idea. Instead of having the coroutine waiting for
>>>>> some work to be processed, what if I have a Python thread creating a
>>>>> new coroutine using ryu.lib.hub.spawn, which will then active the
>>>>> necessary flows when a decision is ready to be implemented?
>>>>>
>>>>> I had issues in the past, when mixing Threads and the greenlet
>>>>> coroutines, having problems when sharing information between them.
>>>>>
>>>>> Thank you Iwase, for your help!
>>>>>
>>>>>
>>>>> On 18 December 2017 at 05:39, Iwase Yusuke <iwase.yusu...@gmail.com>
>>>>> wrote:
>>>>>>
>>>>>>
>>>>>> Hi Carlos,
>>>>>>
>>>>>> Well, as far as I know, Ryu does not provides the features for
>>>>>> suspending
>>>>>> the
>>>>>> specific activities (e.g., threads) of Ryu, so I guess you can only
>>>>>> suspend
>>>>>> all activities at the same time.
>>>>>>
>>>>>> Just an idea, the following suspends all Ryu activities when calling
>>>>>> sleep()
>>>>>> and prevents other threads getting executed.
>>>>>> The following uses the "non-patched" time module to suspend
>>>>>> greanthread.
>>>>>> If you need some locks, please use threading.Lock instead of
>>>>>> time.sleep().
>>>>>>
>>>>>>
>>>>>> $ git diff
>>>>>> diff --git a/ryu/app/simple_switch_13.py b/ryu/app/simple_switch_13.py
>>>>>> index 06a5d0e..316ee37 100644
>>>>>> --- a/ryu/app/simple_switch_13.py
>>>>>> +++ b/ryu/app/simple_switch_13.py
>>>>>> @@ -22,6 +22,9 @@ from ryu.lib.packet import packet
>>>>>>    from ryu.lib.packet import ethernet
>>>>>>    from ryu.lib.packet import ether_types
>>>>>>
>>>>>> +from eventlet import patcher
>>>>>> +orig_time = patcher.original('time')
>>>>>> +
>>>>>>
>>>>>>    class SimpleSwitch13(app_manager.RyuApp):
>>>>>>        OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
>>>>>> @@ -29,6 +32,7 @@ class SimpleSwitch13(app_manager.RyuApp):
>>>>>>        def __init__(self, *args, **kwargs):
>>>>>>            super(SimpleSwitch13, self).__init__(*args, **kwargs)
>>>>>>            self.mac_to_port = {}
>>>>>> +        self.is_something_done = False
>>>>>>
>>>>>>        @set_ev_cls(ofp_event.EventOFPSwitchFeatures,
>>>>>> CONFIG_DISPATCHER)
>>>>>>        def switch_features_handler(self, ev):
>>>>>> @@ -63,8 +67,19 @@ class SimpleSwitch13(app_manager.RyuApp):
>>>>>>                                        match=match, instructions=inst)
>>>>>>            datapath.send_msg(mod)
>>>>>>
>>>>>> +    def _do_something_with_global_blocking(self):
>>>>>> +        if self.is_something_done:
>>>>>> +            return
>>>>>> +
>>>>>> +        self.logger.info('waiting for done of something...')
>>>>>> +        orig_time.sleep(10)
>>>>>> +        self.is_something_done = True
>>>>>> +        self.logger.info('done.')
>>>>>> +
>>>>>>        @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
>>>>>>        def _packet_in_handler(self, ev):
>>>>>> +        self._do_something_with_global_blocking()
>>>>>> +
>>>>>>            # If you hit this you might want to increase
>>>>>>            # the "miss_send_length" of your switch
>>>>>>            if ev.msg.msg_len < ev.msg.total_len:
>>>>>>
>>>>>>
>>>>>> With the above modification, simple_switch_13.py blocks all Ryu
>>>>>> activities
>>>>>> while
>>>>>> 10 seconds, and Packet-In event will not be handled until done.
>>>>>>
>>>>>> $ ryu-manager ryu/app/simple_switch_13.py
>>>>>> loading app ryu/app/simple_switch_13.py
>>>>>> loading app ryu.controller.ofp_handler
>>>>>> instantiating app ryu/app/simple_switch_13.py of SimpleSwitch13
>>>>>> instantiating app ryu.controller.ofp_handler of OFPHandler
>>>>>> waiting for done of something...
>>>>>> done.
>>>>>> packet in 1 c2:09:7b:d2:6c:a2 ff:ff:ff:ff:ff:ff 1
>>>>>> packet in 1 c2:09:7b:d2:6c:a2 ff:ff:ff:ff:ff:ff 1
>>>>>> packet in 1 c2:09:7b:d2:6c:a2 ff:ff:ff:ff:ff:ff 1
>>>>>> packet in 1 c2:09:7b:d2:6c:a2 ff:ff:ff:ff:ff:ff 1
>>>>>> packet in 1 c2:09:7b:d2:6c:a2 ff:ff:ff:ff:ff:ff 1
>>>>>> packet in 1 c2:09:7b:d2:6c:a2 ff:ff:ff:ff:ff:ff 1
>>>>>> packet in 1 c2:09:7b:d2:6c:a2 ff:ff:ff:ff:ff:ff 1
>>>>>> packet in 1 c2:09:7b:d2:6c:a2 ff:ff:ff:ff:ff:ff 1
>>>>>> packet in 1 c2:09:7b:d2:6c:a2 ff:ff:ff:ff:ff:ff 1
>>>>>> packet in 1 82:3d:bb:d5:d6:ba c2:09:7b:d2:6c:a2 2
>>>>>> packet in 1 c2:09:7b:d2:6c:a2 82:3d:bb:d5:d6:ba 1
>>>>>> packet in 1 c2:09:7b:d2:6c:a2 82:3d:bb:d5:d6:ba 1
>>>>>> ...(snip)...
>>>>>>
>>>>>> mininet> h1 ping h2
>>>>>> PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
>>>>>>   From 10.0.0.1 icmp_seq=1 Destination Host Unreachable  # not handled
>>>>>> as
>>>>>> sleeping
>>>>>>   From 10.0.0.1 icmp_seq=2 Destination Host Unreachable
>>>>>>   From 10.0.0.1 icmp_seq=3 Destination Host Unreachable
>>>>>>   From 10.0.0.1 icmp_seq=4 Destination Host Unreachable
>>>>>>   From 10.0.0.1 icmp_seq=5 Destination Host Unreachable
>>>>>>   From 10.0.0.1 icmp_seq=6 Destination Host Unreachable
>>>>>>   From 10.0.0.1 icmp_seq=7 Destination Host Unreachable
>>>>>>   From 10.0.0.1 icmp_seq=8 Destination Host Unreachable
>>>>>>   From 10.0.0.1 icmp_seq=9 Destination Host Unreachable
>>>>>> 64 bytes from 10.0.0.2: icmp_seq=10 ttl=64 time=2005 ms
>>>>>> 64 bytes from 10.0.0.2: icmp_seq=11 ttl=64 time=996 ms
>>>>>> 64 bytes from 10.0.0.2: icmp_seq=12 ttl=64 time=0.170 ms
>>>>>> 64 bytes from 10.0.0.2: icmp_seq=13 ttl=64 time=0.055 ms
>>>>>> 64 bytes from 10.0.0.2: icmp_seq=14 ttl=64 time=0.059 ms
>>>>>> 64 bytes from 10.0.0.2: icmp_seq=15 ttl=64 time=0.066 ms
>>>>>> ^C
>>>>>> --- 10.0.0.2 ping statistics ---
>>>>>> 15 packets transmitted, 6 received, +9 errors, 60% packet loss, time
>>>>>> 14054ms
>>>>>> rtt min/avg/max/mdev = 0.055/500.491/2005.751/765.266 ms, pipe 3
>>>>>>
>>>>>>
>>>>>> Please note that this approach will suspend "all" activities of Ryu,
>>>>>> if
>>>>>> a
>>>>>> lot of
>>>>>> Packet-In events curred while blocking, these event will invoked
>>>>>> immediately.
>>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>> Iwase
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 2017年12月15日 06:03, Carlos Ferreira wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> I work with real switches (Zodiac FX).
>>>>>>>
>>>>>>> Depending on the Events, wether is Packet_In or other Events, I want
>>>>>>> to take different kinds of actions.
>>>>>>> Some of these actions, require contacting a different system
>>>>>>> component, outside of the Ryu scope.
>>>>>>> What I want, is to have a way to suspend the greenlet execution and
>>>>>>> continue with the following Events processing, while the outside
>>>>>>> system does its thing. Once the outside system returns with the
>>>>>>> required data, the greenlet will resume the processing.
>>>>>>>
>>>>>>> Carlos
>>>>>>>
>>>>>>>
>>>>>>> On 14 December 2017 at 20:37,  <marcosab...@inf.ufg.br> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> When you subscribe an event (with @override) while switch is connect
>>>>>>>> you
>>>>>>>> receive this event. You can ignore these events implementing a logic
>>>>>>>> according your application. But when you ignore an event, for
>>>>>>>> exemple
>>>>>>>> Packet_IN, you loss the packets that enter in switch.
>>>>>>>>
>>>>>>>> Can you explain more your problem? You work with real switch or OVS?
>>>>>>>>
>>>>>>>> Citando Carlos Ferreira <carlosmf...@gmail.com>:
>>>>>>>>
>>>>>>>>> Hello to all!
>>>>>>>>>
>>>>>>>>> Is it possible to suspend a Ryu Coroutine event? For example,
>>>>>>>>> suspend
>>>>>>>>> the execution of the Packet_IN handler, while waiting for an event,
>>>>>>>>> signal or condition?
>>>>>>>>>
>>>>>>>>> I need to know how can I do this, because I need to execute some
>>>>>>>>> algorithms, which may take some time and depend upon resources
>>>>>>>>> outside
>>>>>>>>> of the application. I wanted for the coroutine to wait until it
>>>>>>>>> gets
>>>>>>>>> a
>>>>>>>>> result, but I didn't want to stall the entire event pipeline.
>>>>>>>>>
>>>>>>>>> Thank you!
>>>>>>>>> Carlos Ferreira
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ------------------------------------------------------------------------------
>>>>>>>>> Check out the vibrant tech community on one of the world's most
>>>>>>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>>>>>> _______________________________________________
>>>>>>>>> Ryu-devel mailing list
>>>>>>>>> Ryu-devel@lists.sourceforge.net
>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/ryu-devel
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> ------------------------------------------------------------------------------
>>>>>>>> Check out the vibrant tech community on one of the world's most
>>>>>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>>>>> _______________________________________________
>>>>>>>> Ryu-devel mailing list
>>>>>>>> Ryu-devel@lists.sourceforge.net
>>>>>>>> https://lists.sourceforge.net/lists/listinfo/ryu-devel
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> ------------------------------------------------------------------------------
>>>>>>> Check out the vibrant tech community on one of the world's most
>>>>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>>>> _______________________________________________
>>>>>>> Ryu-devel mailing list
>>>>>>> Ryu-devel@lists.sourceforge.net
>>>>>>> https://lists.sourceforge.net/lists/listinfo/ryu-devel
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>> ------------------------------------------------------------------------------
>>>> Check out the vibrant tech community on one of the world's most
>>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>> _______________________________________________
>>>> Ryu-devel mailing list
>>>> Ryu-devel@lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/ryu-devel
>>>>
>>>
>

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Ryu-devel mailing list
Ryu-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to