Nice, very accurate.

Am Montag, 24. Februar 2014 20:47:24 UTC+1 schrieb Guido van Rossum:
>
> Check out my rewording: http://codereview.appspot.com/68210044
>
>
> On Mon, Feb 24, 2014 at 11:15 AM, Christopher Probst <
> foxnet.d...@googlemail.com <javascript:>> wrote:
>
>> I think it would be helpful in the Flow-Control section, along with the 
>> info that generally UDP flow-control is supported but BSD systems are not 
>> fully supported.
>>
>> My english is not as good as it used to be, so feel free to modify the 
>> following snippet: 
>>
>>
>> 18.5.3.2.5. Flow control 
>> callbacks<http://docs.python.org/3.4/library/asyncio-protocol.html#flow-control-callbacks>
>>  
>>
>> These callbacks may be called on 
>> Protocol<http://docs.python.org/3.4/library/asyncio-protocol.html#asyncio.Protocol>,
>>  
>> DatagramProtocol and 
>> SubprocessProtocol<http://docs.python.org/3.4/library/asyncio-protocol.html#asyncio.SubprocessProtocol>
>>  instances:
>> BaseProtocol.pause_writing()<http://docs.python.org/3.4/library/asyncio-protocol.html#asyncio.BaseProtocol.pause_writing>
>>  
>>
>> Called when the transport’s buffer goes over the high-water mark.
>> BaseProtocol.resume_writing()<http://docs.python.org/3.4/library/asyncio-protocol.html#asyncio.BaseProtocol.resume_writing>
>>  
>>
>> Called when the transport’s buffer drains below the low-water mark.
>>
>>
>> Note: On BSD systems (OS X, FreeBSD, OpenBSD, NetBSD, etc.) the 
>> flow-control is not supported because send-failures caused by writing too 
>> many packets cannot be detected easily.
>>
>>
>>
>>
>>
>>
>> Am Montag, 24. Februar 2014 20:02:47 UTC+1 schrieb Guido van Rossum:
>>>
>>> Can you suggest a sentence or two and the exact point where they should 
>>> be inserted into the docs?
>>>
>>>
>>> On Mon, Feb 24, 2014 at 10:39 AM, Christopher Probst <
>>> foxnet.d...@googlemail.com> wrote:
>>>
>>>> Regarding the ENOBUFS issue:
>>>>
>>>> You are right, this info does not tell enough to use it for 
>>>> pause_writing. And some BSD version drop packets silently if the queue is 
>>>> full. But on Linux or Windows this technique is useful. Maybe a small 
>>>> annotation in the docs could help for other users experiencing the same 
>>>> issue with BSD systems.  
>>>>
>>>> Am Montag, 24. Februar 2014 19:22:46 UTC+1 schrieb Guido van Rossum:
>>>>>
>>>>> Hm, so it sounds like the ENOBUFS error is intended as an improvement: 
>>>>> it at least tells the caller that the packet was dropped immediately, 
>>>>> which 
>>>>> is a useful thing, even if the absence of that error does not constitute 
>>>>> a 
>>>>> guarantee. Unfortunately it doesn't look like we can use this directly to 
>>>>> call pause_writing(), because there's no reliable way to tell that things 
>>>>> are going to work again, except by trying.
>>>>>
>>>>> Regarding "reliable" UDP, I guess if you're really implementing TCP on 
>>>>> top of UDP, you're not going to beat the performance of TCP. You're still 
>>>>> going to need all the same AKCs etc. But don't let me stop you, I'm sure 
>>>>> you have a good reason to do this.
>>>>>
>>>>>
>>>>> On Mon, Feb 24, 2014 at 12:49 AM, Christopher Probst <
>>>>> foxnet.d...@googlemail.com> wrote:
>>>>>
>>>>>> This is from FreeBSD mailing lists, it definitely says that sendto 
>>>>>> does not block (select won't help, unfortunately it is like a file 
>>>>>> handle, 
>>>>>> it's always writable).
>>>>>> http://lists.freebsd.org/pipermail/freebsd-hackers/2004-
>>>>>> January/005369.html
>>>>>>
>>>>>> Well, I think it is safe to say that tulips Datagram control-flow 
>>>>>> will never really work on any BSD system. The sendto method simply never 
>>>>>> blocks.
>>>>>> It's also easy to explain the behavior you get: One mail says that 
>>>>>> FreeBSD might drop packets, instead of raising ENOBUFS, so you get 
>>>>>> dramatic 
>>>>>> packet loss instead of an error.
>>>>>>
>>>>>>
>>>>>> Am Montag, 24. Februar 2014 01:07:17 UTC+1 schrieb Guido van Rossum:
>>>>>>>
>>>>>>> "Reliable UDP"? Isn't that a contradiction?
>>>>>>>
>>>>>>> On Sunday, February 23, 2014, Christopher Probst <
>>>>>>> foxnet.d...@googlemail.com> wrote:
>>>>>>>
>>>>>>>> Thanks for your help so far, I really appreciate it.
>>>>>>>>
>>>>>>>> A manual backoff seems the best solution for this weird behavior 
>>>>>>>> for now, since reliable udp heavily depends on timing this is not such 
>>>>>>>> a 
>>>>>>>> bad thing anyway.
>>>>>>>>
>>>>>>>> Meanwhile I try to figure out the cause for this issue.
>>>>>>>>
>>>>>>>>
>>>>>>>> Am Montag, 24. Februar 2014 00:31:24 UTC+1 schrieb Guido van Rossum:
>>>>>>>>>
>>>>>>>>> I still can't repro it with your code. But that doesn't mean it's 
>>>>>>>>> not a real condition. It sounds like the kind of odd corner of 
>>>>>>>>> entirely 
>>>>>>>>> legitimate UDP behavior that is hard to provoke but which a robust 
>>>>>>>>> app 
>>>>>>>>> should handle.
>>>>>>>>>
>>>>>>>>> Note that the default behavior in Tulip appears to be to ignore 
>>>>>>>>> OSError coming out of sendto() -- the transport calls 
>>>>>>>>> protocol.error_received(), which by default does nothing. Since there 
>>>>>>>>> are 
>>>>>>>>> many other cases where a packet may silently be dropped on the floor, 
>>>>>>>>> this 
>>>>>>>>> behavior is technically correct -- the question is whether it is the 
>>>>>>>>> best 
>>>>>>>>> default behavior we can imagine.
>>>>>>>>>
>>>>>>>>> Unfortunately turning it into a pause_protocol() call in your 
>>>>>>>>> error_received() handler is a little tricky -- the transport 
>>>>>>>>> remembers 
>>>>>>>>> whether it has paused the protocol or not, but this state is not 
>>>>>>>>> public. So 
>>>>>>>>> you shouldn't call your own pause_writing(), since you'd never 
>>>>>>>>> receive a 
>>>>>>>>> resume_writing() call from the transport. Perhaps you can set a flag 
>>>>>>>>> internal to your protocol that just causes you to back off for a 
>>>>>>>>> brief 
>>>>>>>>> period of time? The optimal back-off time should be tuned 
>>>>>>>>> experimentally.
>>>>>>>>>
>>>>>>>>> --Guido
>>>>>>>>>
>>>>>>>>> On Sun, Feb 23, 2014 at 2:45 PM, Christopher Probst <
>>>>>>>>> foxnet.d...@googlemail.com> wrote:
>>>>>>>>>
>>>>>>>>> I made a simpler test, without using tulip, just using plain 
>>>>>>>>> sockets<http://stackoverflow.com/questions/21973661/os-x-udp-send-error-55-no-buffer-space-available/21973705?noredirect=1#comment33297277_21973705>
>>>>>>>>> .
>>>>>>>>>
>>>>>>>>> from socket import *
>>>>>>>>>
>>>>>>>>> udp = socket(AF_INET, SOCK_DGRAM)
>>>>>>>>> udp.setsockopt(SOL_SOCKET, SO_REUSEADDR, True)
>>>>>>>>>
>>>>>>>>> udp.bind(('0.0.0.0', 1337))
>>>>>>>>> udp.setblocking(False)
>>>>>>>>> udp.setsockopt(SOL_IP, IP_TTL, 4)
>>>>>>>>> udp.connect(('8.8.8.8
>>>>>>>>>
>>>>>>>>>  
>>>>>>>
>>>>>>> -- 
>>>>>>> --Guido van Rossum (on iPad)
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> -- 
>>>>> --Guido van Rossum (python.org/~guido) 
>>>>>
>>>>
>>>
>>>
>>> -- 
>>> --Guido van Rossum (python.org/~guido) 
>>>
>>
>
>
> -- 
> --Guido van Rossum (python.org/~guido) 
>

Reply via email to