Tuesday October 4, 2011

[Time] NameMessage
[07:34] CIA-79 libzmq: 03Steven McCoy 07master * rcc5d316 10/ src/pgm_socket.cpp : Re-add PGM rate limiting ...
[07:41] CIA-79 libzmq: 03Steven McCoy 07master * rf5f1a8b 10/ (3 files in 2 dirs): New upstream OpenPGM maintenance release 5.1.118. ...
[08:28] mikko good morning
[08:30] sustrik morning
[09:02] mikko sustrik: did you see the bug i opened last night?
[09:04] sustrik yes
[09:05] sustrik haven't inspected it in detail yet though
[09:18] mikko sustrik: it seems odd that i can send 102064 messages with hwm 1
[09:18] mikko especially when noone reads
[09:18] sustrik yes
[09:19] sustrik some are in TCP buffers though
[09:33] mikko sustrik: might be majority
[09:34] mikko this might be why i added the devices to pzq earlier
[09:34] mikko it allows better hwm management (over inproc)
[09:35] mikko previously i remember that two messages or so were pushed to pipe
[09:35] mikko now i see ~5k or so
[09:35] mikko not sure if those just go to buffers
[09:35] mikko if this is expected behaviour then i need to rething the logic
[09:56] sustrik mikko: what you can do is to use the acks for flow control
[09:57] sustrik ie. don't send more messages if there are more then N messages on the fly
[09:59] mikko yes, that's what i am thinking
[09:59] mikko that is very prone to slow acks though
[10:01] sustrik what's the problem with that?
[10:01] sustrik that's what is wanted, no?
[10:01] sustrik ie. if acks are slow the message flow is slow as well
[10:01] mikko that is not per peer limitation
[10:01] sustrik i see
[10:02] sustrik then you'll need a ROUTER socket instead of dealer
[10:02] mikko yes
[10:02] mikko need to change the flow a bit i guess
[10:06] mikko i guess with router i need to maintain more state
[10:06] mikko that is the downside
[12:01] beobal hi, i'm having a small problem getting to grips with zmq_poll - specifically I'm using the java bindings
[12:01] beobal Poller.poll always seems to return immediately, regardless of any timeout value
[12:02] beobal I understand the reasoning behind
[12:02] beobal but a timeout of -1 isnt working for me either
[12:02] beobal am i right to think that Poller.poll(-1) should block until event(s) occur?
[12:14] mikko beobal: yes
[12:23] beobal ok, i think its a threading problem
[12:24] beobal I'm calling poll from 1 thread thats in a loop, but the sockets are created by a different thread
[12:24] beobal they share a context and the polling thread owns the poller, but it didn't create the sockets. could that be the cause?
[12:24] mikko you should access sockets only from one thread
[12:25] mikko you need to do full memory barrier before using socket from another thread
[12:25] mikko (mutex or so)
[12:25] beobal i only call socket.recv from the poller thread, the other thread is just responsible for creating the socket
[12:25] guido_g whcih is *not* the intended way to use ømq sockets
[12:26] guido_g why do you create sockets in a diferent thread?
[12:27] beobal I was doing that because the main thread is busy in the poll loop. would the right way to do it be to add another socket to the poller and use that to signal to the poller thread that a new socket needs creating?
[12:28] guido_g for example
[12:29] mikko that seems like very odd design
[12:29] mikko without knowing more about it
[12:30] guido_g having a control socket is not odd per se
[12:30] guido_g or did i get your comment wrong?
[12:31] beobal i'm thinking that i'll will have potentially 1000s of sockets, and don't want to spawn a thread to manage each one (calling recv). the idea was that 1 thread owns the poller and sits in a loop polling it. then new sockets are created as clients connect, and get registered with the poller
[12:32] beobal it seems to work as I expected, except for the timeout behaviour of the poller
[12:32] beobal but i can see why that is now
[12:33] mikko hmm
[12:33] mikko you have one socket per client?
[12:33] beobal yes
[12:33] mikko why is that?
[12:34] beobal the sockets of SUB type, and each client is subscribing to a unique channel
[12:34] beobal i could do that with a single socket i guess, and use filtering
[12:35] mikko do the clients subscribe to just one channel?
[12:35] beobal yes
[12:35] guido_g ok, now it is odd
[12:35] beobal lol
[12:35] mikko beobal: why do you use pub/sub in that case?
[12:35] mikko why not ROUTER socket and just route the messages to correct clients?
[12:35] beobal sorry, they're actually PULL
[12:35] mikko that way you could use one socket
[12:36] mikko you could have let's say a pool of worker threads that get fed through inproc socket
[12:36] mikko and one router socket facing the clients
[12:37] mikko client --- tcp --> ROUTER --- inproc / load balance --> worker threads
[12:38] guido_g if it has to be threads, might also be processes (even on other machines)
[12:38] beobal guido_g: its actually scala actors, so backed by a thread pool, but yes I see your point
[12:38] mikko yes, i would use threads if local
[12:39] guido_g scala? asctor? hear, hear! :)
[12:39] mikko beobal: there are several benefits to this design
[12:39] mikko beobal: one of which is a lot less configuration on clients
[12:39] mikko they need to know about single or a few endpoints
[12:39] mikko rather than each one their own
[12:40] beobal cool, thanks - i'll go and read up on ROUTER sockets then
[12:40] beobal thanks for the help
[12:41] mikko no problem
[12:41] guido_g you also might want to have a look at the guide, at least for ideas on what is possible
[12:42] beobal cheers guido_g, will do (again) :)
[12:42] calvin is there a particular reason why creating sockets on one thread and then calling recv on another (although the socket would never be calling recv on multiple threads, just one for the duration of the application) is bad?
[12:42] calvin i understand it's not the intended use case, but i've done it in the past with a lot of luck and am curious what the implications are in case i'm looking at a ticking time bomb
[12:45] mikko calvin: there is no issue here as long as you guarantee a full memory barrier before using on another thread
[12:46] calvin what do you mean by a full memory barrier? I know what a memory barrier means atomically
[12:46] mikko
[12:46] calvin basically 3 sockets are created on thread A, then socket 1 is used on thread B, socket 2 is used on thread C and socket 3 is used on thread D
[12:46] calvin ok i'll give that a read
[12:47] mikko calvin: if you use mutex or a semaphore before accessing the socket you should be fine
[12:48] mikko calvin: as far as i understand (which isnt much) there might be issues with out of order execution there
[12:48] mikko very short race condition
[12:49] calvin oh interesting
[19:48] larsks Hello all. I'm working with the 0MQ python bindings, and I can
[19:48] larsks (whoops)
[19:48] larsks can't get send_multipart() to operate with zmq.NONBLOCK.
[19:48] larsks (For a PUSH socket, in the case that the corresponding PULL socket is not available/not listening)
[19:49] larsks Should this work?
[20:01] cremes larsks: you need to put your code up on or some other paste service so people can look at it
[20:01] larsks
[20:02] larsks It's trivial, which is why I didn't link it initially.
[20:02] cremes and where is the receiver?
[20:02] cremes oh, i see your comment in there
[20:02] larsks I want it to fail (instead of blocking) when the receiver is not available.
[20:02] cremes that's not how 0mq works
[20:02] cremes have you read the guide yet?
[20:03] larsks Indeed.
[20:03] cremes indeed you read it, or indeed you did not? :)
[20:04] larsks I have read through the guide. I would like a failure mode other than blocking for this particular situation. I don't thinkt he PUB/SUB model is appropriate here, and I don't need the request/reply model, either.
[20:04] larsks I'm looking for a one-way message delivery, which is why I'm looking at PUSH/POLL sockets.
[20:04] larsks It works great, other than the blocking behavior.
[20:04] cremes well, the issue is that you are conflating two activities with one socket
[20:04] cremes the push socket cannot tell you that there are 0 pull sockets listening
[20:05] cremes that information is not exposed in the 2.1.x or 3.x apis
[20:05] cremes to make sure someone is listening, your consumers need to heartbeat with another pair of sockets
[20:05] larsks Huh. I figured that internally it would know it had been unable to establish a tcp connection. Perhaps I am misunderstanding the purpsoe of the NONBLOCK flag.
[20:05] cremes probably
[20:06] larsks So if I want to be able to send a message to a receiver *that may not be listening*, what's the correct model?
[20:06] larsks This is "informative" data; it's okay to drop it and it doesn't need to be synchronously delivered.
[20:07] cremes pub/sub is appropriate here
[20:08] cremes think of a PUB socket as a radio broadcaster
[20:08] larsks I thought that PUB wouldn't send without an a priori subscription.
[20:08] cremes if no one is listening, the packets are dropped
[20:08] cremes look at the man page for zmq_socket where all sockets are described
[20:08] larsks More importantly, I though that PUB sockets had to bind() and SUB sockets had to connect() , which is the opposite of what I need.
[20:09] cremes you can see that PUB will drop packets when HWM is exceeded, so just set HWM to 1
[20:09] cremes no, that isn't true
[20:09] minrk all sockets can both bind and connect
[20:09] cremes where are you getting this?
[20:09] larsks All the examples I've seen show a subscriber connecting to a publisher (via connect()).
[20:09] larsks I'll take a closer look.
[20:10] cremes sure, but those are just examples
[20:10] minrk zeromq is entirely agnostic about connection direction - you should be able to toggle bind/connect in every example with ~ no change
[20:11] larsks I had tried this earlier but ran into problems and just figured I was misusing things. I'll give it another try.
[20:12] larsks Thanks for your thoughts.
[20:14] larsks ...nope, I'm still seeing blocking behavior with PUB sockets, too. I've updated to create a PUB socket, and it still blocks in `send_multipart` if the SUB socket isn't available. As soon as the listener comes up, the message is delivered and send_multipart() unblocks.
[20:14] cremes larsks: set HWM to 1
[20:14] cremes before the bind/connect call
[20:16] minrk connect is blocking, not send
[20:17] minrk add a print in between to verify
[20:17] larsks The connect() call completes successfully. It's blocking in send_multipart, although perhaps under the hood the connection operating is delayed untilt he data is first sent. I'm trying with HWM=1 right now.
[20:17] larsks I have added a print to verify. COntrol flow is definately blocking in send_multipart.
[20:17] minrk ok
[20:18] larsks I have added a print to verify. COntrol flow is definately blocking in send_multipart.
[20:18] larsks (sorry)
[20:19] larsks Setting HWM=1 (s.setsockopt(zmq.HWM, 1)) doesn't appear to affect the behavior, either.
[20:19] larsks I'm going to punt for now and spend some more quality time with the documentation this evening.
[20:19] larsks Thanks again for the suggestions.
[20:23] minrk actually, print statements indicate that it's actually close() that's blocking, not send
[20:23] guido_g your program is blocking after the send
[20:23] guido_g right
[20:23] minrk send completes just fine
[20:23] minrk but close is waiting to flush messages
[20:23] minrk see LINGER sockopt
[20:23] larsks Ah, interesting. I'll try that.
[20:24] guido_g add: s.setsockopt(zmq.LINGER, 0) before the connect and see
[20:24] larsks Hey, look, it works. minrk, thanks for that pointer.
[20:24] minrk print-statement debugging to the rescue!
[20:25] larsks ...although I note that with LINGER == 0, it doesn't actually deliver the messages when the listener is available. It looks like LINGER=1 works, though.
[20:26] mikko good evening
[20:26] minrk In your code, close is called immediately after send_multipart
[20:26] larsks Yeah, it's a timing issue.
[20:26] minrk (it is called automatically on gc)
[20:27] mikko minrk: you remember the issue from other evening?
[20:27] minrk mikko: which?
[20:27] mikko minrk: lost messages on close
[20:27] mikko it was actually a bug
[20:28] mikko on better news, new build hardware is installed
[20:28] minrk excellent!
[20:28] mikko and i should be getting access soon
[20:28] mikko then just need to install vms and we are set to go
[20:29] mikko i think i have some time off next week
[20:29] mikko and been thinking about this snapshot portal
[20:29] mikko where build artifacts could be downloaded easily
[20:30] minrk that would be greatly appreciated (especially by Windows folks, I imagine)
[20:30] mikko do you have automated packaging mechanism in pyzmq?
[20:30] mikko because i guess thats fairly easy to add to listings
[20:30] minrk I don't, I do it all by hand
[20:39] minrk shouldn't be hard, I imagine. The main thing is it should use libzmq built with MSC 1500 (VS 2008), to match Python.
[22:28] adymitruk hi everyone
[22:29] adymitruk anyone here successfully used zeromq in .NET?
[22:50] adymitruk I'm having issues finding the dlls for C#
[22:57] adymitruk anybody here? Do I have to build zeroMQ myself or are there dlls that I can DL somewhere?
[23:04] adymitruk anyone alive in here?
[23:08] mikko adymitruk: a lot of people are on EU timezone
[23:08] mikko s
[23:08] adymitruk I figured :)
[23:09] adymitruk do I need to build from source?
[23:09] mikko
[23:09] adymitruk or can I find an DLL set to download
[23:09] adymitruk sweet
[23:09] mikko you probably want 2.1.10 with clrzmq
[23:09] mikko also, there are NuGet packages available
[23:09] mikko
[23:10] adymitruk no nuget for me
[23:10] adymitruk but you wouldn't use 3.0?
[23:10] mikko it's still in beta
[23:11] mikko unless you need specific features from it, then no
[23:11] adymitruk ok.. I'll do the 2.1 then
[23:12] adymitruk how come there is no link to those on the download page?
[23:12] adymitruk seem's only the source
[23:12] mikko we don't currently do official windows binaries
[23:13] mikko hopefully there is going to be windows snapshot builds for 32/64 soon
[23:16] adymitruk ok.. in that archive i found msvcp100.dll
[23:16] adymitruk is that all I need?
[23:17] adymitruk I found libzmq.dll
[23:17] adymitruk that must be it :)
[23:52] CIA-79 pyzmq: 03MinRK 07master * r7e099c8 10/ (4 files): fix missing ENOTSOCK const ...
[23:52] CIA-79 pyzmq: 03MinRK 07master * rb5d816c 10/ zmq/utils/zmq_compat.h : fix FD_T (again) on x64 Windows -