------
Eugen-Andrei Gavriloaie
Web: http://www.rtmpd.com

On May 13, 2013, at 9:02 PM, Adrian Chadd <[email protected]> wrote:

> Hi,
> 
> The reason I tend to suggest this is for portability and debugging
> reasons. (Before and even since libevent came into existence.)
> 
> If you do it right, you can stub / inline out all of the wrapper
> functions in userland and translate them to straight system or library
> calls.
> 
> Anyway. I'm all for making kqueue better. I just worry that adding
> little hacks here and there isn't the right way to do it. If you want
> to guarantee specific behaviours with kqueue, you should likely define
> how it should work in its entirety and see if it will cause
> architectural difficulties down the track.
And it caused some so far. We have workarounds for it, no problem.

> Until that is done, I think
> you have no excuse to get your code working as needed.
Yes. I agree. But when I look at the user space code without that feature, and 
when thinking how it would have been with that feature, it kinda makes me cry. 
A little more pain and I will make that patch myself. I'm just hoping that kq 
kernel side code will be handled by more capable hands before me. Ideally, by 
the creators.

> 
> Don't blame kqueue because what (iirc) is not defined behaviour isn't
> defined in a way that makes you happy :)
Nobody blamed kqueue. I'm just saying that it would be better for me (and I'm 
not the only one) who could use a liiiitle more help from it. It was born from 
needs, it evolved because of needs, why stop now? I dare to say it will become 
a standard on linux and other OSs very soon. It is the best fd reactor. Hands 
down!

Best regards,
Andrei

> 
> 
> 
> Adrian
> 
> On 13 May 2013 09:36, Eugen-Andrei Gavriloaie <[email protected]> wrote:
>> Hi Adrian,
>> 
>> All the tricks, work arounds, paradigms suggested/implemented by us, the kq 
>> users, are greatly simplified by simply adding that thing that Paul is 
>> suggesting. What you are saying here is to basically do not-so-natural 
>> things to overcome a real problem which can be very easy and non-intrusivly 
>> solved at lower levels. Seriously, if you truly believe that you can put the 
>> equal sign between the complexity of the user space code and the wanted 
>> patch in kqueue kernel side, than I simply shut up.
>> 
>> Besides, one of the important points in kq philosophy is simplifying things. 
>> I underline the "one of". It is not the goal, of course. Complex things are 
>> complex things no matter how hard you try to simplify them. But this is 
>> definitely (should) not falling into that category.
>> 
>> ------
>> Eugen-Andrei Gavriloaie
>> Web: http://www.rtmpd.com
>> 
>> On May 13, 2013, at 6:47 PM, Adrian Chadd <[email protected]> wrote:
>> 
>>> ... holy crap.
>>> 
>>> On 13 May 2013 08:37, Eugen-Andrei Gavriloaie <[email protected]> wrote:
>>>> Hi,
>>>> 
>>>> Well, Paul already asked this question like 3-4 times now. Even insisting 
>>>> on it. I will also ask it again:
>>>> If user code is responsible of tracking down the data associated with the 
>>>> signalled entity, what is the point of having user data?
>>>> Is rendered completely useless…
>>> 
>>> .. why does everything have to have a well defined purpose that is
>>> also suited for use in _all_ situations?
>> That is called perfection. I know we can't achieve it, but I like to walk in 
>> that direction at least.
>> 
>>> 
>>>> Not to mention, that your suggestion with FD index is a definite no-go. 
>>>> The FD values are re-used. Especially in MT environments. Imagine one 
>>>> kqueue call taking place in thread A and another one in thread B. Both 
>>>> threads waiting for events.
>>> 
>>> .. so don't do that. I mean, you're already having to write your code
>>> to _not_ touch FDs in other threads. I've done this before, it isn't
>>> that hard and it doesn't hurt performance.
>> Why not? This is how you achieve natural load balancing for multiple 
>> kevent() calls from multiple threads over the same kq fd. Otherwise, again, 
>> you have to write complex code to manually balance the threads. That brings 
>> locking again….
>> Why people always think that locking is cheap? Excessive locking hurts. A 
>> lot!
>> 
>>> 
>>>> When A does his magic, because of internal business rules, it decides to 
>>>> close FD number 123. It closes it and it connects somewhere else by 
>>>> opening a new one. Surprise, we MAY  get the value 123 again as a new 
>>>> socket, we put it on our index, etc. Now, thread B comes in and it has 
>>>> stale/old events for the old 123 FD. Somethings bad like EOF for the OLD 
>>>> version of FD number 123 (the one we just closed anyway). Guess what… 
>>>> thread B will deallocate the perfectly good thingy inside the index 
>>>> associated with 123.
>>> 
>>> So you just ensure that nothing at all calls a close(123); but calls
>>> fd_close(123) which will in turn close(123) and free all the state
>>> associated with it.
>> Once threads A and B returned from their kevent() calls, all bets are off. 
>> In between, you get the the behaviour I just described from threads A and B 
>> racing towards FD123 to either close it or create a new one. How is wrapping 
>> close() going to help? Is not like you have any control over what the 
>> socket() function is going to return. (That gave me another token idea btw… 
>> I will explain in another email, perhaps you care to comment)
>> Mathematically speaking, the fd-to-data association is not bijective.
>> 
>> 
>>> 
>>> You have fd_close() either grab a lock, or you ensure that only the
>>> owning thread can call fd_close(123) and if any other thread calls it,
>>> the behaviour is undefined.
>> As I said, that adds up to the user-space code complexity. Just don't forget 
>> that Paul's suggestion solves all this problems in a ridiculously simple 
>> manner. All our ideas of keeping track who is owning who and indexes are 
>> going to be put to rest. kq will notify us when the udata is out of scope 
>> from kq perspective. That is all we ask.
>> 
>>> 
>>>> And regarding the "thread happiness", that is not happiness at all IMHO…
>>> 
>>> Unless you're writing a high connection throughput web server, the
>>> overhead of grabbing a lock in userland during the fd shutdown process
>>> is trivial. Yes, I've written those. It doesn't hurt you that much.
>> That "that much" is subjective. And a streaming server is a few orders of 
>> magnitude more complex than a web server. Remember, a web server is bound to 
>> request/response paradigm. While a streaming server is a full duplex (not 
>> request/response based) animal for most of connections. I strongly believe 
>> that becomes a real problem. (I would love to be wrong on this one!)
>> 
>>> 
>>> I'm confused as to why this is still an issue. Sure, fix the kqueue
>>> semantics and do it in a way that doesn't break backwards
>>> compatibility.
>> Than, if someone has time and pleasure, it would be nice to have it. Is a 
>> neat solution. Is one thing saying, hey, we don't have time, do it yourself. 
>> And another thing in trying to offer "better" solutions by defending such an 
>> obvious caveat.
>> 
>>> But please don't claim that it's stopping you from
>>> getting real work done.
>> I didn't and I won't. I promise!
>> 
>>> I've written network apps with kqueue that
>>> scales to 8+ cores and (back in mid-2000's) gigabit + of small HTTP
>>> transactions.
>> Good for you. How is this relevant to or discussion of simplifying things? 
>> Of course is possible. But let's make things simpler and more efficient. It 
>> really pays off in the long run. Hell, this is how kq was born in the first 
>> place: getting rid of all garbage that one was supposed to do to achieve 
>> what kq does with a few lines of code. Let's make that even better than it 
>> currently is.
>> 
>>> This stuff isn't at all problematic.
>>> 
>>> 
>>> Adrian
>> 

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to