Friday July 29, 2011

[Time] NameMessage
[02:14] stelcheck has anyone worked with ZeroMQ to do a Push/Pull pipeline structure?
[02:17] stelcheck i am wondering if there is a way to set the socket on the pushing end to skip to the next server if one of the connection is broken instead of stacking it on the dead queue
[02:21] stelcheck in other words, I am looking to make the queue unique between multiple connections, instead of having one queue per connect, so that whatever is in the queue will be distributed to the existing connections
[02:36] stelcheck ah, nm
[02:37] stelcheck i was inverting client and server position
[02:37] stelcheck so the queuing was inverted as well
[03:04] stelcheck hmmm, ok, maybe another question then... how can you recover from a server crash in a rep/req request? I.E., if the server does not send a response to the client, the client stops sending its requests because it did not receive a response
[06:04] guido_g stelcheck: close the socket
[07:38] CIA-32 libzmq: 03Martin Sustrik 07vtcp * rd5f3628 10/ (8 files): Different connecters simplified ...
[08:22] wadimgrasza hi all, I have a question about the code examples in the zeromq guide: In examples/C/mdwrkapi.c:237: why is the socket recreated on the application level? Won't zeromq try to reestablish the connection by itself?
[08:33] fredix hi
[08:34] fredix is it possible to create a ZMQ_QUEUE with a ZMQ_PULL and a ZMQ_XREQ ?
[08:52] mikko hi
[08:52] mikko fredix: you mean a device?
[08:53] mikko wadimgrasza: can you link me to the file?
[08:55] pieterh wadimgrasza: hi, you still here?
[08:55] wadimgrasza pieterh: yes
[08:56] pieterh so to understand that pattern you have to have read the previous ones
[08:56] wadimgrasza mikko:
[08:56] pieterh this is basically the 'lazy pirate' pattern
[08:58] pieterh wadimgrasza: so, in general, yes, 0MQ will auto-reconnect for you
[08:59] wadimgrasza pieterh: I think I understand what the example is about, it's just that one thing that I don't get: why is the reconnecting performed on the application level?
[08:59] pieterh in this particular case, so that the app can send a new READY message
[08:59] fredix mikko: yes
[08:59] pieterh that is, the connection is stateful, and the app wants to be in control of that
[09:00] pieterh there are alternatives, which I developed later
[09:00] pieterh for example if the server doesn't recognize the worker, it can challenge it, and the worker then responds
[09:01] pieterh but basically, just reconnecting by itself isn't sufficient here
[09:02] pieterh wadimgrasza: does this make sense?
[09:04] wadimgrasza pieterh: ok, so you're saying that the worker is manually reconnecting because it doesn't want to send another READY message on the (possibly) same connection
[09:05] pieterh the worker is manually reconnecting because the MDP spec doesn't provide any way for the broker and worker to hand-shake a new connection otherwise
[09:06] pieterh manually reconnecting is the simplest way to ensure the two parties agree on state
[09:07] pieterh note that the mdp worker api is based on the ppworker api, which is explained a little earlier in the doc
[09:07] pieterh the text says, "The worker uses a reconnect strategy similar to the one we designed for the Lazy Pirate client."
[09:07] pieterh maybe I'll explain that more in the text
[09:08] pieterh it's kind of the same problem at the client side, except there it's also due to REQ sockets and their statefulness
[09:10] pieterh wadimgrasza: it helps to understand if you look at spworker and ppworker
[09:17] wadimgrasza pieterh: your explanation pretty much makes it clear, thanks! My question arose from wishing for a different behaviour, which basically means a different protocol. I didn't take into accout the limitations of this protocol.
[09:25] pieterh wadimgrasza: the protocol is not made in stone, of course: you could change it
[09:26] pieterh btw thanks for your pull request, I'm checking that now...
[09:30] pieterh wadimgrasza: can you provide me your email address, for the contributors list for the Guide?
[09:38] wadimgrasza pieterh: sure
[09:38] pieterh wadimgrasza: thanks, and nice work fixing those MDP brokers btw
[09:39] mikko fredix: i think you can
[09:39] mikko fredix: but notice that devices have been removed in 3
[09:40] pieterh mikko: indeed, but we can put zmq_device() back if we want it
[09:40] pieterh though no-one really seems to care, so it's been dropped
[09:42] mikko pieterh: i reimplemented devices in the php extension code
[09:42] pieterh right
[09:43] pieterh tbh I've never used devices in anything realistic
[09:43] pieterh I mean, the simple devices
[09:43] mikko there are uses for the simple devices as well
[09:43] mikko i've been using them in past for threaded programs
[09:43] pieterh the device pattern is of course very useful but it always seems to end up wrapped in a little more intelligence
[09:43] mikko for a single entry-point out
[09:43] pieterh for sure
[09:44] mikko very simple use-case but makes it easier when devices are bundled
[09:44] pieterh and if they're bundled in libzmq they're faster too
[09:44] pieterh that's the use case but I've not seen vocal demand for it
[09:45] mikko a company that i know uses them for similar use-case
[09:45] mikko they fork out worker processes
[09:45] mikko they are not very vocal in the community
[09:46] mikko what i am worried about at the moment is that what should be recommended to users?
[09:46] mikko 2.1 ?
[09:46] mikko 2.2?
[09:46] mikko 3.0?
[09:46] pieterh it depends on what they need
[09:46] mikko if people build on 2.x series, three will break a lot of things
[09:46] pieterh I'd personally use 2.1
[09:46] mikko and libzmq master is again incompatible with 3.x
[09:46] pieterh because it is stable
[09:46] mikko which means that similar thing is very close to happen with 4.x
[09:46] pieterh and I'd be careful about not using stuff I know will disappear
[09:46] pieterh e.g. durable sockets, devices, swap
[09:47] mikko but users wont know that
[09:47] pieterh replacing that over time, if I use that
[09:47] pieterh hmm
[09:47] mikko similar thing to this happened with imagemagick
[09:47] pieterh I've been removing these things from the guide
[09:47] mikko their api kept breaking and people got frustrated
[09:47] pieterh this probably deserves an explanation in the guide
[09:47] mikko so they made a new api called "magickwand" which is the stable api
[09:47] pieterh :)
[09:47] mikko and their "core api" is all bets off
[09:47] pieterh well, we have that with language bindings
[09:48] pieterh e.g. if you use CZMQ, it hides the core API
[09:48] mikko but the problem is that we are exposing the changes to bindings maintainers
[09:48] mikko it's not trouble-free upgrade
[09:48] pieterh indeed
[09:48] mikko and especially when all bindings are using the zmq api
[09:48] mikko probably main reason being when they were written
[09:49] mikko like for example the change from zmq_send to zmq_sendmsg is something i don't fully comprehend myself
[09:49] pieterh my feeling is that for some projects I want stability, for others I want new functionality
[09:49] mikko sure, but investing on 2.x series at the moment is a really bad investment
[09:49] mikko especially for new code
[09:50] pieterh well, I don't really think so
[09:50] mikko and investing on 3.x isn't any better as the new master branch is already incompatible
[09:50] pieterh in fact, 3.x and 4.x are purely experimental
[09:50] mikko but 3.0 was released as 'stable'
[09:50] pieterh nope
[09:50] pieterh it was unstable, alpha
[09:51] pieterh "Unstable release 3.0"
[09:51] mikko but the versioning doesn't indicate that, so for many people 3.0.0 is stable release
[09:51] mikko 3.0.0-alpha1 would be alpha for many people
[09:51] pieterh ?
[09:51] mikko at least that is what i am picking up
[09:52] pieterh ? the page is really explicit
[09:52] mikko or 3.0.0-rc1 for release candidate
[09:52] pieterh there is no tie between major/minor/patch numbering and stability
[09:52] pieterh none whatsoever, and there never was
[09:53] pieterh I wanted to make that, originally, was told "no way"
[09:53] pieterh version numbering are 100% orthogonal to stability of the package
[09:53] pieterh they indicate compatibility
[09:53] pieterh the patch level, to some extent, indicates maturity
[09:54] pieterh note that I don't particularly like this
[09:54] pieterh adding 'rc1' or 'alpha' is a good suggestion
[09:54] mikko i think the problem for a user is the disconnection between tar package name and stability level
[09:54] pieterh i agree
[09:54] mikko if i acquire zeromq-3.0.0.tar.gz from somewhere it doesn't carry the unstabledness with it
[09:55] pieterh ok, so how do you want to solve this?
[09:55] pieterh i'm more than happy to add suffixes
[09:55] pieterh but let's be consistent then
[09:55] mikko previously i've released several versions of same version
[09:55] pieterh I don't do that
[09:56] pieterh version number identifies the release uniquely
[09:56] pieterh what we can do is add a suffix
[09:56] mikko
[09:56] pieterh -unstable
[09:56] pieterh -stable
[09:56] mikko for example here
[09:56] pieterh -legacy
[09:56] pieterh -experimental
[09:57] pieterh -rc
[09:57] pieterh I used to use version numbers like 1.0a1, 1.0b2, to solve this
[09:58] pieterh apparently that was not standard and totally confusing
[10:00] pieterh anyhow, our development process does not match that of imagick
[10:00] pieterh we release code then patch it into maturity
[10:01] pieterh so e.g. we go from 2.1.7 to 2.1.8, not 2.2.0
[10:01] pieterh 2.2.0 would indicate a core change of some kind
[10:28] ianbarber genuine question: how are we signalling subscriber durability in 4?
[10:28] ianbarber is that just dropped along with manual IDs? or am i forgetting something obvious
[10:28] pieterh ianbarber: it is dropped
[10:28] pieterh this is actually the core of why explicit identities are such a pain to implement
[10:28] ianbarber yeah
[10:29] pieterh I've not looked at it, but my hypothesis is that subscriber durability can be better done using a device/broker
[10:30] pieterh this seems to be a problem that was solved in the wrong layer
[10:30] pieterh ianbarber: now that you're here what do you think of adding maturity indicators to packages?
[10:31] pieterh mikko points out that '3.0.0' is deceptive, looks stable
[10:31] ianbarber yeah, i agree on that one
[10:31] ianbarber i think the process we have for 2 is pretty good, as you've said people wont use it otherwise
[10:31] ianbarber but 3 is somewhat different
[10:32] pieterh well, 3 is going to go the same way as 2
[10:32] ianbarber because 2.x is always pretty much stable, the issues are usually minor if there are any
[10:32] ianbarber but 3 is a big change, and it is significantly less tested
[10:32] pieterh it took a while for 2.1 to become stable
[10:32] ianbarber i've spoken to a few people that are talking about moving their infrastructures to 3
[10:32] ianbarber which worries me somewhat, as they're not putting the time in i think is warranted
[10:32] pieterh sure
[10:32] pieterh this is ok
[10:33] ianbarber yeah true, but because 2.0.8 was so well distributed, a lot of people took a long time to move to 2.1
[10:33] ianbarber which all mostly worked out
[10:33] pieterh we eventually had to force people to move to 2.1 just to get it stable
[10:33] pieterh you know that the code base is in fact heavily heavily tested already
[10:33] ianbarber see, the thing is for me that 2.0 was broken in some pretty fundamental ways
[10:33] pieterh right, it was
[10:34] ianbarber 2.1+ does a job very well, there are some decisions that could be made differently, but i think 3 and so on are an expression of a refined, slightly different idea
[10:34] pieterh afaics 3.0 is attractive for those who need subscription forwarding
[10:34] pieterh 4.0 will be attractive for its new router socket
[10:34] ianbarber basically, my concern is that people will choose 3 instead of 2.1.8, when in fact they'd be better served with 2.1.8
[10:34] ianbarber agreed
[10:34] pieterh ok
[10:35] pieterh so we attach maturity tags to all packages
[10:35] pieterh if people use 3.0, we get error reports and it moves to stability
[10:35] pieterh this is all good
[10:35] pieterh but we have to be transparent about the risk
[10:35] ianbarber yep
[10:36] pieterh do we use -alpha / -beta / -rc / -stable etc.?
[10:36] pieterh note that releases are already numbered so no rc1/rc2 etc.
[10:37] ianbarber my inclination would be something very simple, alpha, beta and nothing for stable, and that should probably attach to branch
[10:37] ianbarber 2.1, 2.2-beta, 3.0-alpha
[10:37] ianbarber (this is just off the top of my head now though, so not the worlds most considered opinion)
[10:38] pieterh I'd prefer not changing the branches
[10:38] pieterh this is just a file name tag
[10:38] pieterh ok, -alpha, -beta, -rc
[10:39] pieterh ianbarber: random question, do you want to present 0MQ at Software Freedom Day in Amsterdam, on 12th September?
[10:39] pieterh s/12/14/
[10:39] pieterh I was going to do that (Amsterdam!) but will probably be in Texas
[10:41] ianbarber ah, well texas sounds fun too :) lemme check my calendar
[10:45] ianbarber hmm, that wednesday does not look good. i'll see if I can shuffle anything,
[10:51] pieterh mikko: ok... I've tagged all alpha / beta releases since 2.0.0
[10:51] pieterh also changed the main download page to make it more obvious
[10:53] mikko cool
[10:53] mikko thanks
[10:53] pieterh np, this is nicer
[10:53] pieterh I just added -alpha, -beta, or -rc to the package name
[10:54] pieterh and will continue to do this for future releases
[11:04] pieterh mikko: do you want to discuss the plan for 2.x->4.x migration?
[11:09] mikko pieterh: sure, should we start an email thread?
[11:09] mikko more async than irc
[11:09] pieterh mikko: how about a wiki page with discussion on the list?
[11:10] pieterh I think we need a documented plan
[11:11] pieterh i'll throw something together to kick off discussion
[11:11] mikko yes
[11:11] mikko makes sense
[11:11] mikko im on wireless with 4000ms latency so irc is not the most pleasant
[11:11] pieterh ok, I'll email the list when it's there, an hour or two
[11:11] pieterh :-)
[12:03] pieterh mikko: ok, it's there:
[12:17] Seta00 has anyone here successfully build zeromq with clang?
[12:18] Seta00 did*
[12:22] pieterh Seta00: did you check the list and google?
[12:23] Seta00 pieterh: heh, what I'm doing is rather unusual, I'm cross-compiling for 32bit on clang
[12:23] Seta00 but yeah, I've checked
[12:24] Seta00 it builds fine for the default architecture (x86_64)
[12:24] pieterh mikko is the genius in this department
[12:24] Seta00 I think it's a clang bug
[12:24] Seta00 ld: bad codegen, pointer diff in __ZN3zmq4lb_tD2Ev to global weak symbol __ZTVN3zmq15i_writer_eventsE for architecture i386
[12:25] pieterh ah, the infamous __ZN3zmq4lb_tD2Ev bug
[12:26] Seta00 hah
[12:34] cremes Seta00: there are 2 threads covering that error on stackoverflow; apparently the fix is to set "symbols hidden by default"
[12:34] cremes to yes in the build settings (for xcode)
[12:34] cremes but that must be passed down to clang somehow
[12:36] Seta00 really?
[12:36] Seta00 do you happen to have a link?
[12:36] cremes yeah, i can't easily find the equivalent cli switch
[12:36] cremes hold on...
[12:36] cremes
[12:36] cremes
[12:37] cremes that second one might be more on point since you are cross compiling
[12:37] Seta00 oh, I included zeromq in the search, that's why those didnt come up
[12:38] cremes my google-fu is apparently stronger than yours ;)
[12:38] Seta00 oh
[12:38] Seta00 it's like on GCC
[12:38] Seta00 -fvisibility=hidden
[12:41] Seta00 $ lipo -info src/.libs/libzmq.dylib
[12:41] Seta00 Non-fat file: src/.libs/libzmq.dylib is architecture: i386
[12:41] Seta00 cremes: many thanks ;)
[12:41] cremes you're welcome
[14:19] xyzzy So, still using the c# windows binding, I'm running into an error that crashes my server 'Assertion failed: fds.size () <= FD_SETSIZE (..\..\..\SRC\SELECT.CPP:70) I've searched on this, but, not found much in way of how not to incur the wrath of this error.
[14:19] xyzzy Any suggestions?
[15:40] sustrik xyzzy_: you have to redefine FD_SETSIZE
[15:47] xyzzy sustrik, is there an easy way for a newb to do that on windows?
[15:48] xyzzy As I understand what I'm reading, it means rebuilding the libzmq.dll from source, but, that's only as I understand it.
[15:48] xyzzy I'm prone to misunderstanding :P
[15:50] sustrik well, open the MSVC solution
[15:50] sustrik open properties dialog box
[15:50] sustrik find where custom build options are being set
[15:50] sustrik modify the value for FD_SETSIZE
[15:56] xyzzy Hm. I suspect this isn't as easy as it's being explained, but, I will see what happens after muddlign my way through a bit. :P
[16:00] xyzzy Well, okay, maybe it is... just have to hund down the build options bit.
[16:00] xyzzy Was suspecting there was gonna be a ton of issue getting it to load the project in VS2010. :P
[16:02] sustrik i guess it's somewhere near the bottom of the dialog box
[16:03] sustrik not 100% sure though
[16:08] xyzzy Well, that's the normal properties dialog for stuff, but, I'm not seeing anything that sounds like it relates to FD_SETSIZE. It looks like just the path to the file and such.
[16:14] sustrik well, i am not sure how exactly msvc2010 property dialog box looks like
[16:15] sustrik however, in the project file the value is set here:
[16:15] xyzzy Hmmm... In the source I have the problem code doesn't appear to be there... I wonder if I'm running into this issue cause I have an outdated libzmq.dll I shall try running my project with the self-compiled version from latest source and see if things blow up horrible.
[16:15] sustrik
[16:15] sustrik the error is actually a windows limitation
[16:15] sustrik you can't poll on more than FD_SETSIZE file descriptors
[16:16] sustrik which limits the number of connections you can handle in parallel
[16:19] xyzzy Yeah, i kinda gathered that, and albeit I didn't find the solution i expected. Recompiling from source instead of using the libzmq binary included with the c# runtime, appears to have fixed the issue. :)
[16:19] xyzzy So thanks. :)
[16:21] xyzzy The old dll must have been set extremely small.
[16:21] xyzzy I'm guessing the minimum 64.
[16:22] xyzzy Anyways, I know I already said it, but, thanks, this has been bugging me and I'm super anxious about even asking questions here.
[16:36] sustrik you are welcome :)
[16:42] ianbarber sustrik: zed was asking on twitter about durability on pub/sub in 4
[16:43] ianbarber i was about to say it's not there, but reading the code i'm not so sure
[16:43] ianbarber afaics, durability was basically down to the fact that a socket with an explicit identity was basically a reconnection
[16:44] ianbarber the identity just flagged how a detected disconnect shoudl effect messages
[16:44] ianbarber is that functionality still in there, or has it been removed?
[16:50] ianbarber i'm guessing it was in the session code that went from socket_base, so no
[16:52] ianbarber zedas: i am reasonably confident that durability isn't in 4.0, though I think sustrik would know for sure. Not sure you need it though, unless mongrel2 will remember the connection IDs on restart - there only issue is handler -> m2 as far as I can see
[16:54] ianbarber must admit i do like how much tidier the classes are in 4 :)
[17:28] sustrik ianbarber: without identities there's no way to identify specific client
[17:28] sustrik so, when the client connects, the server has no idea which messages were already received and which were not
[17:30] pieterh ianbarber: I think the conclusion was that the new ROUTER sockets can effectively replace identities for most patterns
[17:30] ianbarber oh yeah, ROUTER is fine
[17:30] ianbarber this was mainly for the PUB SUB durable case
[17:30] pieterh 4.0 router is magic stuff
[17:31] pieterh for durable pubsub, I'd consider something like the clone pattern
[17:31] ianbarber is there actually a plan for how it will work, or is it literally magic stuff
[17:31] pieterh ianbarber: well, there was very brief discussion, no written proposal, and 30 minutes later Martin announced that it was working :-)
[17:31] pieterh so, yes, magic
[17:32] ianbarber hehe
[17:33] ianbarber sustrik: so will any TCP interuption that causes reconnect always be treated as new connection
[17:33] ianbarber i was under the impression the identity was still sent, so that case should still work as before
[17:34] ianbarber but in a case of subscriber dying and generating a new identity it's side, it'll have missed some
[17:35] sustrik yes, it will be treated as a new connection
[17:35] sustrik however, keep in mind that TCP timeout is 2hrs
[17:35] sustrik if it exists at all
[17:36] sustrik so, tcp connection failure is almost always caused by application dying
[17:36] ianbarber fair point
[17:38] ianbarber the only concern I would have is wireless devices - lets say i have a subscriber over mobile network or similar, i would always have to explicitly add a sequence number and track receiving in case my connection dropped and was reestablished, as there is no way at application level of detecting that the tcp connection dropped and reconnected
[17:39] zedas pieterh: so the answer is "everyone should just use ROUTER and go back to tracking clients manually just like with sockets"?
[17:39] zedas part of the advantage of zeromq was that simple servers didn't have to do their own client tracking.
[17:39] pieterh zedas: ROUTER lets you build custom patterns
[17:39] zedas and, if that's the design direction, then zeromq needs to add a client disconnect/reconnect callback system.
[17:39] ianbarber zedas: you still don't. PUSH/PULL is your client comms, you just need to have a listening socket for incoming.
[17:39] pieterh yes, that's what ROUTER adds in 4.0
[17:40] pieterh you get what approaches TCP style sockets
[17:40] pieterh except all the 0MQ stuff as well
[17:40] zedas without callbacks indicating connect/disconnect you have to use crappy timeouts to keep your state storage clean.
[17:40] pieterh except message distribution
[17:41] zedas so, 4.0 will have ROUTER sockets plus connect/disconnect messages AND it'll continue to work without needing to run everything through zmq_poll (i.e. I can use my own epoll or kqueue)?
[17:41] ianbarber zedas: why would you need to track connects/disconnect at all?
[17:41] zedas ianbarber: if i have to keep track of client connections in a ROUTER, then I have to setup internal state, and if I don't know when the clients are gone or come back then I can't manage that state.
[17:42] pieterh zedas: indeed
[17:42] pieterh we do this now using heartbeating
[17:42] pieterh it's doable but somewhat extra work
[17:42] ianbarber zedas: i don't think you do though, for your use case, unless i've misunderstood it
[17:42] pieterh by exposing connection/disconnection events, that work disappears
[17:42] ianbarber you only need router on the application handler side
[17:43] zedas pieterh: same here, so i end up with this janky hashmap+handrolledGCusingtimeouts
[17:43] ianbarber ah, i see, but the dropping would not replicate the current replies
[17:44] zedas ianbarber: ok lemme break it down real quick: with a ROUTER, you get a message and you get some "client id" right? you use this ID to talk to the client.
[17:44] zedas ok, now i keep those in some hashmap.
[17:44] zedas next, zeromq gets rid of persistent IDs, so each client is making new ones.
[17:44] zedas finally, i get a client that connects and disconnects a ton of times.
[17:45] pieterh zedas: how much of the Guide have you read?
[17:45] zedas my hashmap now fills will useless client IDs until I get around to doing a heartbeat or a timeout.
[17:45] zedas if i've got disconnects, i can clean up immediately.
[17:45] zedas pieterh: i read it a while ago, and once again when i was trying to figure out how clientids changed.
[17:46] zedas remember i was telling you the description for IDs didn't make sense?
[17:46] ianbarber zedas: that sounds like you're trying to do what you currently do with PULL and PUB in one socket though - I'd keep that.
[17:46] ianbarber sustrik: Does ROUTER drop if it can't route, or block/fail?
[17:47] zedas ianbarber: uh, no it's a server that's talking to a client and needs the id to talk to it.
[17:47] zedas i mean, what are you guys doing? just entirely stateless and never storing client IDs for later operations?
[17:47] ianbarber zedas: what I would have: m2 PUSH to any handler, including a DSN. Handler creates REQ socket, stores in hash, sends reply to that directly. If the server has disappeared, handler can decide what to do.
[17:48] ianbarber M2 then just has a PUSH socket and a XREP for getting replies, otherwise exactly the same
[17:48] zedas well i'm not talking about mongrel2 here, i'm talking about other servers I've written with XREP
[17:48] ianbarber ah
[17:48] zedas every one ends up having to do a heartbeat/timeout/GC thing to keep the state clean.
[17:48] ianbarber again though, like if you're using a hash, just use multiple sockets
[17:49] ianbarber they're not massively expensive
[17:49] ianbarber and you can just clean up when they fail to send
[17:49] pieterh ianbarber: multiple sockets don't work that well
[17:49] pieterh but iirc sustrik made or will make this work like TCP in 4.0
[17:49] pieterh so you actually get a socket handle when a client connects
[17:50] zedas uh, wait, let's go back to your idea for mongrel2: are you saying that handlers would get a request, make a whole new REQ socket, send *that* address to mongrel2, and then do REQ/REP to do a reply?
[17:50] ianbarber nah
[17:50] ianbarber so, simple case
[17:50] zedas so, no matter how light you think zmq sockets are, they are *totally* not light.
[17:50] ianbarber 1 m2 - handler gets it's first message from m2, makes a socket, replies down that socket.
[17:50] ianbarber second message, replies down the same socket
[17:51] ianbarber if it gets a message from another m2, it makes a new socket, replies to that
[17:51] zedas i already have to make the stacks in my server close to 120k because it creates so much ram on the stack it's sick.
[17:51] ianbarber so the total number of sockets is total number of m2s talking to that handler
[17:51] ianbarber if one dies, it'll fail to send on that socket, and handler can wait or cleanup as appropriate
[17:52] zedas uh, haha, yeah that's not going to work and requires me to change how mongrel2 works internally to suit your latest idea
[17:53] ianbarber at the moment, most handlers have config for which m2 to connect to in their SUB right?
[17:53] ianbarber this would make it so you could add m2s transparently
[17:53] ianbarber but yeah, i wasn't expecting you to rewrite the core m2 transport setup based on an irc chat :)
[17:54] zedas but, listen to what you're saying. "Oh it's easy, you just send a socket address to the receiving side and then it makes a REQ/REP socket and uses that from then on."
[17:54] ianbarber actually, i'm completely lying about the adding transparently, as they'd still need to connect the PULL
[17:55] zedas ther's all sorts of problems with that. first, REQ/REP blows ass. they crash at the *slightest* little hickup in processing.
[17:55] ianbarber use XREQ then, it's no bones
[17:55] ianbarber I know it's a big change, but so's removing identites in ZMQ4
[17:55] ianbarber i mean, it's not like this is some incremental tweak
[17:56] zedas then, each handler just implicitly trusts an address it's given? no way. then it makes a socket and tries to connect to that addr, so now mongrel2 has to know all of the info needed for external connections to it?
[17:56] ianbarber it already does - the PUB DSN is in the config
[17:56] zedas and, now you're saying every *handler* has to use XREQ, i mean hell, why not just get rid of all the other sockets and say it's all ROUTER
[17:56] ianbarber sorry, SUB DSN
[17:56] ianbarber it would be same
[17:56] ianbarber router would work too, but you don't need the functionality, XREQ is simpler
[17:57] zedas no, it wouldn't because the huge difference is *zeromq* handles all the bullshit of SUB. you're basically saying i should reimplement that.
[17:57] zedas and why? because you don't want to make a callback telling me when a client disconnects. a totally reasonable feature in a server.
[17:57] pieterh zedas: what are you using pubsub for?
[17:58] zedas well at the time it was the only reliable way to send to all N servers.
[17:58] zedas and XREQ is too complicated for mere mortals to use.
[17:58] zedas hell, you guys can't even document it well, and you wrote it.
[17:58] zedas and REQ is too touchy, blows up or stalls at the slightest missed message or bad state
[17:59] sustrik re
[17:59] sustrik chatching up with the discussion...
[17:59] pieterh zedas: so you might want to check out the Clone pattern in the Guide
[17:59] zedas so that leaves, at the time, PUSH/PULL or PUB/SUB, and SUB had subscriptions so I could target a specific server with an id but send to all.
[17:59] pieterh it's a complete reliable pubsub solution
[17:59] pieterh with implementation in C and possibly other languages
[17:59] pieterh distributed key-value cache
[17:59] zedas does it involve handlers using XREQ/XREP?
[18:00] ianbarber pieterh: the downside of clone for M2 is that it makes implementing handlers way more config, as M2 is inverted from normal, lots of of PUBs to few SUBS type of thing
[18:00] sustrik ad ROUTER socket in 4.0: it reports connections/disconnections
[18:00] ianbarber sustrik: excellent
[18:00] zedas sustrik: thank you. if you got that then this entire conversation is pointless.
[18:00] sustrik and the send blocks if hwm is reached
[18:00] pieterh I already said this ages ago
[18:01] sustrik yup, it's already implemented in the trunk
[18:01] pieterh yes
[18:01] zedas pieterh: no you said maybe and then tried to get me to redesign my stuff to work around not having it.
[18:01] pieterh (07:42:40 PM) pieterh: by exposing connection/disconnection events, that work disappears
[18:01] pieterh sorry, I wasn't clear
[18:02] pieterh 4.0 has a new super ROUTER socket that explicitly provides connect/disconnect events
[18:02] pieterh and also, possibly (sustrik?) will provide independent sockets for each peer
[18:02] pieterh allowing output polling on each connection independently
[18:03] ianbarber sustrik: on a disconnect, if you send to a specific socket with a ROUTER will it drop the message or block?
[18:03] ianbarber specific node i mean
[18:03] zedas then that'll work, as long as *handler authors don't have to implement ROUTER too*
[18:03] zedas seriously, you guys live and breath this stuff so it makes sense to you, but everyone else is very confused by ROUTER
[18:03] sustrik inbarber: it will report an error if the specified peer doesn't exist
[18:03] ianbarber sustrik: cool
[18:03] sustrik if the hwm is reached, it'll block
[18:04] zedas it's become this zeromq swissarmy knife that you use to solve all problems, so now it's overloaded with everything
[18:04] pieterh zedas: yes, understood... if you have any ideas for making it simpler, always welcome
[18:04] pieterh I'd personally like 1 socket per connection
[18:04] pieterh it's much simpler for this work
[18:04] pieterh and matches TCP more closely
[18:05] ianbarber i would imagine it will have to be a ROUTER in the handler
[18:05] ianbarber but yeah, the router is a bit conceptually simpler than it used to be, so maybe that wont be a problem? i guess that'll depend on the docs
[18:05] sustrik yes, it's a swiss army knife, allows you to build any pattern you can think of
[18:06] pieterh sustrik: moving to accept->socket would be good IMO
[18:06] zedas pieterh: re: clone pattern, yes i read this, and it's flawed. You have clients using a REQ socket, so they block indefinitely and if the server dies mid-request they hang.
[18:06] pieterh zedas: the clients use DEALER, not REQ
[18:06] sustrik pieterh: what you get is a connection event with connection ID
[18:06] sustrik kind of like socket
[18:07] pieterh sustrik: we discussed this, there's no way to do accurate output polling
[18:07] zedas pieterh: huh? in this?
[18:07] zedas also, DEALER? that's a new one too.
[18:07] zedas when did that show up?
[18:07] pieterh zedas: lemme take a look... DEALER's been around for a year,
[18:08] pieterh it's new only if you don't follow the zeromq-dev list :-)
[18:08] ianbarber picture looks to be out of date
[18:08] pieterh it has seriously been discussed like on 10 threads
[18:08] ianbarber zedas: DEALER = XREQ
[18:08] sustrik router and dealer were just aliases for xrep/xreq
[18:09] zedas pieterh: there's no DEALER in the clone pattern diagrams and a quick glance through later code doesn't mention it.
[18:09] zedas ianbarber: ah, so it got a name change.
[18:09] pieterh zedas: it's how the clone class (client API) is implemented
[18:09] pieterh the diagrams are inaccurate and/or over-simplified
[18:10] pieterh the clone pattern took 5 iterations to develop
[18:10] pieterh sorry, six
[18:10] pieterh "self->snapshot = zsocket_new (ctx, ZMQ_DEALER);"
[18:11] zedas pieterh: ok so what you're saying is, the diagrams are misleading, so then I'd have to read version 6 of the client to see you're using DEALER, which is an alias for XREQ, which brings me back to my original problem: XREQ/XREP are too complicated for most people new to zeromq.
[18:11] pieterh well, this is chapter 5 of the Guide
[18:11] sustrik clone = reliable pub/sub ?
[18:11] pieterh yes
[18:11] zedas i mean really guys, if i'm keeping track of client connections all the time in zeromq then it's basically a socket fd, just design it like that.
[18:11] pieterh full distributed key/value cache
[18:11] pieterh zedas: yes
[18:11] pieterh sustrik: I have to go but zedas is right
[18:12] pieterh the proper API for ROUTER is independent sockets per connection
[18:12] pieterh addition of an accept() api call
[18:12] pieterh proper POSIX compatible semantics for new/dead connections
[18:13] zedas pieterh: i totally agree with that, and I also have to go to work. :-)
[18:13] sustrik that's what TCP does
[18:13] pieterh those semantics exist and are known
[18:13] pieterh exactly
[18:13] sustrik why bother with 0mq then
[18:13] pieterh OMG sustrik
[18:13] pieterh seriously?
[18:13] ianbarber again?
[18:13] sustrik the goal imo is to provice reusable patterns
[18:13] ianbarber :)
[18:13] pieterh do I have to spell that list of 0MQ features out AGAIN?
[18:13] pieterh it's the 3rd time, dude
[18:13] ianbarber right, i'm gonna go as well :)
[18:13] pieterh get with the program here
[18:13] pieterh :)
[18:14] sustrik see you
[18:18] pieterh sustrik: did you seriously forget that long list of things 0MQ does for you, which TCP doesn't, or are you trolling me?
[18:19] pieterh "Dumb" as in, portable, with 30 language bindings, doing framing,
[18:19] pieterh multipart, async i/o, multiple transports via one API, high-water
[18:19] pieterh marks, zero copy, etc.
[18:20] sustrik once you move to TCP like behaviour some of those features will dissintegrate
[18:20] sustrik for example, no PGM
[18:21] pieterh this is purely an API design issue
[18:21] sustrik HWMs become just a duplicate of SO_SNDBUF
[18:21] pieterh you are basically inventing an API that POSIX already provides
[18:21] pieterh that is bad for several reasons
[18:22] sustrik i guess the only reason for 0mq existence with this model is TCP message delimitation
[18:22] sustrik which could be done in much simpler way
[18:25] pieterh ok, to be really clear, because I'
[18:25] pieterh I'm reimplementing large chunks of the TCP layer in VTX
[18:25] pieterh and I know the pain...
[18:25] pieterh 1. message framing
[18:25] pieterh 2. asynchronous message dispatch
[18:25] pieterh 3. connection to other transports via one API
[18:25] pieterh 4. performance
[18:26] pieterh 5. portability
[18:26] sustrik 1. yes
[18:26] pieterh 6. error handling
[18:26] pieterh 7. signal handling
[18:26] pieterh 7. multipart message handling
[18:26] sustrik 2. BSD sockets have that
[18:26] pieterh did I already say 7? sorry, 8
[18:26] sustrik 3. BSD sockets have that
[18:26] pieterh nope, they do not
[18:26] pieterh sorry, they do not
[18:26] sustrik 4. BSD sockets have better peformance
[18:26] pieterh except for small amounts
[18:26] pieterh come on
[18:26] sustrik 5. BSD sockets have that
[18:26] sustrik 6. BSD sockets have that
[18:26] pieterh I've spent the last 20 years writing TCP servers
[18:26] sustrik 7 yes
[18:27] pieterh please don't trivialize this away
[18:27] pieterh and please address my actual question instead of trolling
[18:27] sustrik what's the question?
[18:27] pieterh you are inventing a new API for socket presence / disconnection
[18:27] pieterh it's not POSIX
[18:27] pieterh that is bad for two or three reasons
[18:28] pieterh your API is equivalent to one socket per peer
[18:28] pieterh except worse
[18:28] pieterh and more complex
[18:28] pieterh and not standard
[18:28] sustrik exactly
[18:28] pieterh and confusing
[18:28] pieterh well
[18:28] pieterh why then dismiss the whole problem scope
[18:28] pieterh instead of just fixing the API?
[18:28] sustrik that's why i've been reluctant to add the thing to 0mq for so ling
[18:28] sustrik long
[18:28] pieterh shrug
[18:29] pieterh I don't see why you make stuff that's really valuable and then screw up the API
[18:29] pieterh either don't make it at all, or discuss with users and get the API right up front
[18:30] sustrik i would rather drop it
[18:30] pieterh fixing it a year later when everyone's invested in the old clunky API is... not efficient
[18:30] sustrik but the reason i added it
[18:30] pieterh drop it, drop 80% of use cases
[18:30] pieterh your call
[18:30] sustrik was that designing new patterns inside 0mq is costlu
[18:30] pieterh you want users, or you dont
[18:30] sustrik costly
[18:30] pieterh mass is mass
[18:30] pieterh you either make software that's relevant and that gives you mass
[18:30] pieterh or you don't
[18:30] pieterh but if you aim for mass, do it right please
[18:31] pieterh I'm really not satisfied with the quality of the upfront design process
[18:31] pieterh it's almost totally absent
[18:31] pieterh and that is visible
[18:31] pieterh very visible
[18:32] sustrik once again, in this model the only value add of 0mq is message delimitation and multi-part messages
[18:32] pieterh and high performance async io
[18:32] sustrik if that's what you want i can code such library in 2 days
[18:32] sustrik the performance is actually lower than BSD socket performance
[18:33] pieterh raw BSD sockets don't do anything
[18:33] sustrik ?
[18:33] sustrik they do exactly what you are asking for, no?
[18:33] pieterh they only work rapidly in single threaded apps
[18:33] sustrik ah, you meaninproc
[18:33] sustrik right?
[18:33] pieterh look, this is the wrong time and model for such discussions
[18:34] sustrik ok
[18:34] pieterh it is *hugely* frustrating to try to explain to you, of all people, the value 0MQ adds
[18:34] sustrik the value is handing multiple connections in transparent manner
[18:34] pieterh there is such a gap between my experience writing multithreaded applications, in anger
[18:35] pieterh I've been doing this since 1991 or so
[18:35] sustrik once you have to handle connections on one-by-one basis, the value-add mostly disappers
[18:35] pieterh multithreaded communications servers
[18:35] sustrik inproc, right?
[18:35] pieterh now, when you tell me to "just use BSD sockets", you are being either massively naive, randomly insulting, or successfully trollish
[18:35] pieterh I cannot figure out which it is
[18:35] sustrik nope, i really don't have an idea
[18:36] sustrik there are few nice details there
[18:36] sustrik like specifying address as a string
[18:36] pieterh I'll explain in an email
[18:36] pieterh tomorrow
[18:36] sustrik ok
[19:58] CIA-32 pyzmq: 03MinRK 07gh-pages * rac82456 10/ (106 files in 11 dirs): update to 2.1.8 -
[20:17] CIA-32 pyzmq: 03MinRK 07master * r8c12877 10/ README.rst : updated README for 2.1.8 -
[20:17] CIA-32 pyzmq: 03MinRK 07master * r795c55f 10/ README.rst : mention homebrew in README -
[20:17] CIA-32 pyzmq: 03MinRK 07master * r42b6035 10/ (3 files): add change notes to docs -
[20:17] CIA-32 pyzmq: 03MinRK 07master * r4b322d5 10/ (5 files in 4 dirs): sphinx cleanup ...
[20:17] CIA-32 pyzmq: 03MinRK 07v2.1.8 * r18777a2 10/ zmq/core/version.pyx : release 2.1.8 -
[20:23] fredix hi
[20:30] mikko hi
[21:16] fredix hi
[21:17] fredix why will you remove device ?
[22:03] evgeny_boger Hi! I'm expierencing a kind of weird problem with zeromq. Would someone please try to help me?
[22:06] evgeny_boger asyncsrv example with XREP/XREQ sockets just doesn't work on my ubuntu machine. Client just do not recieve any messages. I've tried both precompiled zeromq packages and source code ones. Both zmq 2.1 and 3.0. Both C and python samples. Both unix sockets ans tcp.
[22:06] evgeny_boger And it 100% reproducable. And it works well on my Debian server out of the box. Any ideas?
[22:09] cremes evgeny_boger: any error messages?
[22:09] evgeny_boger No, not at all
[22:09] cremes so what does it do? hang?
[22:10] evgeny_boger XREQ side do not recieve any messages
[22:10] evgeny_boger it could send the messages and this messages are properly recieved by XREP side
[22:11] evgeny_boger So, for asyncserv example I just don't get the lines like "Client worker-6 received: request #7". Everything else is ok
[22:11] cremes do any of the other examples work or is this the only one that fails for you?
[22:12] evgeny_boger I didn't check all of them. But for instance hwserver/hwclient work well. As well as 'weather' example
[22:14] cremes evgeny_boger: it's weird that it works on one box but not another...
[22:14] cremes things to check... read the code to see what ports the example is using and then
[22:14] cremes use netstat -an to verify that some other process hasn't already grabbed the port
[22:14] cremes also, make sure you are using the *exact* same tarball on both boxes... don't install 0mq using
[22:15] cremes the package manager because it may be out of date
[22:15] cremes good luck
[22:15] evgeny_boger thanks!
[22:16] evgeny_boger the problem is definetely not related to ports since the same behaviour is for unix sockets. And it doesn't work for all the versions I've tried. That's weird. I don't even know how to send a bug report because I can't reproduce it on another box
[23:06] traviscline pieterh: I'm the author of gevent-zeromq a compat lib for gevent - a coroutine library for python -- the examples that use zmq.Poller need modification to fit in an environment utilizing my library -- once I have a collection I'll probably submit a pull req. -- re: example dir Python-gevent or the like? don't see another example dir for a similar alternate implementation route
[23:07] mikko traviscline: python-gevent sounds good
[23:07] traviscline or would the likelihood of inclusion be too low?
[23:07] traviscline rgr
[23:07] mikko traviscline: i think if you submit fairly complete examples for the things they should be included
[23:08] mikko there is no reason not to
[23:31] traviscline pieterh: little start here but i'll ping when i flesh out more