Wednesday September 1, 2010

[Time] NameMessage
[00:05] ModusPwnens can anyone tell me about the size method for zeromq?
[06:01] CIA-20 zeromq2: 03Martin Sustrik 07master * r47c064f 10/ (src/fq.cpp src/lb.cpp): hangup when closing socket with no pipes attached -- fixed -
[06:01] CIA-20 zeromq2: 03Martin Sustrik 07master * raaa0761 10/ src/pair.cpp : pipe being attached to the PAIR socket during its termination process is immediately asked to terminate itself -
[06:01] CIA-20 zeromq2: 03Martin Sustrik 07master * rdb73c76 10/ src/pub.cpp : assert when pipe attaches to PUB socket in process of termination -- fixed -
[06:01] CIA-20 zeromq2: 03Martin Sustrik 07master * rce0972d 10/ (src/ctx.cpp src/ctx.hpp src/object.cpp src/object.hpp): context creates an inproc endpoint ('inproc://log') to distribute 0MQ's log messages -
[07:02] guido_g howdy
[07:05] guido_g cool, logging...
[07:09] guido_g does the core itself use the logging?
[07:20] guido_g hmmm
[07:20] guido_g doesn't seem so
[07:27] sustrik only the core can use the logging
[07:27] sustrik however, atm it's not logging anything
[07:27] sustrik logs are to be added gradually
[07:31] guido_g well... better then nothing :)
[08:50] Mikael_H_Kjaer Sustrik: I don't have a small example that triggers the bug I've posted about on the mailing list.
[08:51] sustrik hi mikael
[08:51] sustrik that's a problem
[08:51] sustrik from inspecting the backtrace it looks like it's not a 0mq problem
[08:51] Mikael_H_Kjaer I know. I have been trying to boil it down
[08:51] sustrik maybe a memory overwrite?
[08:52] sustrik some random code overwriting the socket?
[08:52] Mikael_H_Kjaer Maybe. Currently I am not hitting the issue anymore
[08:52] Mikael_H_Kjaer But I shouldn't have any wild pointers or memory accesses in my code. I am currently using smart pointers for everything and my cycle checker seems to think I am okay too.
[08:54] Mikael_H_Kjaer I haven't valgrinded my code in a few weeks but I will soon try it with zmq added in.
[08:54] sustrik ok. good
[08:55] sustrik btw, maybe try to compile with debug into so that backtrace is more informative
[08:56] Mikael_H_Kjaer I do :) what additional information do you want
[08:58] sustrik hm
[08:59] sustrik can you possibly add a printf statement to socket's destructor
[08:59] sustrik so that we know whether the socket was destructed or overwritten?
[08:59] sustrik printing out this pointer would be good so that we can correlate it with the backtrace
[09:00] Mikael_H_Kjaer Not a problem
[09:00] Mikael_H_Kjaer I will get back with more. Any other printf's you want?
[09:01] sustrik not yet
[09:02] sustrik let's first see whrther the socket is destructed
[09:12] Mikael_H_Kjaer sustrik: I can't get the error to show up any more. I believe my fix of waiting for all sends to finish before attempting a shutdown of zmq has resolved it.
[09:12] sustrik hm
[09:13] sustrik ok, so let's leave it for now
[09:13] sustrik if you ever see it again, we'll continue
[09:16] Mikael_H_Kjaer Agreed, I was thinking the same.
[09:51] mcxx I'm building a system that will use architecture similar to this one:
[09:52] mcxx however, in this setup, the broker is the single point of failure
[09:52] mcxx can the architecture be altered somehowe? e.g. can the clients connect to multiple brokers so that when one goes down, they switch to a working one?
[09:54] sustrik yes, you can load balance via multiple brokers
[09:55] sustrik just start 2 brokers
[09:55] sustrik and connect all components to both of them
[09:55] sustrik you also have to set HWM on clients
[09:55] sustrik so that messages are not queued for the unavailable broker indefinitely
[09:57] mcxx what's HWM? Google doesn't show reasonable results
[09:57] mcxx oh, I see noe
[09:57] mcxx now
[10:39] mcxx when I set HWM on the client and one of the brokers goes down, will the clients' sockets find out the broker is no longer available and automatically use others?
[10:39] guido_g huh? what broker?
[10:40] guido_g you mean the pipes of the underlying connections?
[10:40] mcxx guido_g: it's a follow up to my previous question
[10:40] mcxx in this arch
[10:40] guido_g as far as i know, full pipes (hwm reached) are skipped
[10:41] guido_g i see
[10:41] guido_g still, full pipes are skipped
[10:42] guido_g more should be found on describption of the socket types
[10:43] mcxx re-reading that helps :)
[10:46] guido_g :)
[11:32] CIA-20 zeromq2: 03Martin Sustrik 07master * r6a0c323 10/ (builds/msvc/libzmq/libzmq.vcproj src/ctx.cpp): MSVC build fixed -
[11:39] pieterh I've posted a blog that hopefully clears up the naming confusion for once and for all...
[11:39] pieterh
[11:39] pieterh anyone from Denmark here?
[11:43] guido_g :)
[12:04] pieterh sustrik: random question about 2.1
[12:05] sustrik yes?
[12:07] pieterh how solid is it?
[12:07] pieterh should I start to be using it for the examples in the guide?
[12:08] sustrik it haven't been tested extensively
[12:08] sustrik but the API is the same
[12:08] sustrik so, for the guide, it's irrelevant which one you use
[12:08] pieterh there's the 'insert random sleep here' which i'd like to remove
[12:08] sustrik ah, yes, that can go with 2.1
[12:09] pieterh i'll start to test it then
[12:09] pieterh it'd be fun to release a 2.1.0 unstable IMO
[12:09] sustrik btw, there's a test suite in the package now
[12:09] pieterh especially if you have stuff like sys:// in there...
[12:09] sustrik so if you write a test
[12:09] sustrik jsut put it in there
[12:10] sustrik well, the infrastructure is there, but no notifications are passed atm
[12:10] pieterh :-) i saw some emails on that but missed the original discussion
[12:10] pieterh great idea to have a test suite!
[12:10] sustrik it's in tests subdir
[12:10] sustrik just put your file there
[12:10] sustrik add it to
[12:10] sustrik and make check will run it
[12:10] pieterh ack
[12:11] guido_g ah, while talking about tests
[12:12] guido_g i plan to write the basic tests for the missing socket types over the weekend
[12:12] sustrik missing socket types?
[12:12] sustrik ah, those not yet in test suite
[12:12] guido_g afaik only req/rep and pair are tested atm
[12:12] sustrik nice
[12:13] pieterh ZMQ_∅
[12:13] guido_g if there are any corner cases that should be tested, please leave me a note
[12:13] pieterh the secret socket typ
[12:13] pieterh *type
[12:13] pieterh if you can't spell it, you can't use it...
[12:13] guido_g pieterh seems to be in a funny mood today
[12:13] guido_g :)
[12:13] sustrik you really got the letter or have you made it up?
[12:14] pieterh that's a real letter
[12:14] pieterh i couldn't invent something _that_ ... unique
[12:14] guido_g justifies the number of beers you had
[12:14] pieterh that's why the guide made that strange reference to annoying the Danes
[12:15] guido_g ahhh
[12:15] pieterh next we're going to get email from the mathematicians accusing us of soiling Bourbaki's name
[12:16] pieterh guido_g: what language are you using for the tests?
[12:16] guido_g c++
[12:17] guido_g but they can be in any language the core understands
[12:17] pieterh there's one example that would work for push/pull and pair
[12:17] guido_g for these sockets we have tests already
[12:17] pieterh the mtrelay
[12:17] pieterh you just said only req/rep and pair...?
[12:18] guido_g oh sorry
[12:18] guido_g parsed the pub/sub wrong
[12:18] guido_g push/pull
[12:18] pieterh agh, I realized that example in fact doesn't use push/pull finally, i switched to using pair
[12:19] guido_g and i thought they do have good beer in .sk
[12:19] pieterh it's ok, not real beer like we make in Belgium
[12:19] guido_g ah
[12:20] pieterh kind of halfway between real beer (belgian) and fake beer (anglo)
[12:20] pieterh just kidding
[12:20] pieterh it's the home of beer, of course
[12:20] pieterh ZeroMQ is a big hit in Japan it seems
[12:21] pieterh まだ結構α版なんで、問題とかあったら教えて下さい RT !heavenshell: おお。perl の ZeroMQ のサンプルは動い
[12:21] guido_g ahh... sure
[12:21] sustrik there are some japanese guys working on the perl binding afaiu
[12:21] pieterh I think they're complaining about the spelling... :-/
[12:21] pieterh my Japanese isn't so good anymore
[12:22] sustrik btw "where 0mq goes, google cannot follow" is a nice slogan
[12:22] sustrik wrt distributed vs. centralised services
[12:22] sustrik privacy etc.
[12:22] sustrik のMQ would be read NoMQ :)
[12:25] pieterh Hehe, "can't follow this"...
[12:27] pieterh we need to prepare an ultrasecret joke for next April 1st
[12:27] pieterh where we rename 0MQ to のMQ
[12:27] pieterh get lots of people to blog and twitter about it
[12:27] pieterh confuse the heck out of everyone...
[12:31] pieterh sustrik: could you send me a .zip of the zeromq2 master (clean checkout)?
[12:31] pieterh i'm on a slow 2G connection and have failed 4 times to do a git pull
[12:31] pieterh maybe email will work better
[12:39] pieterh sustrik: recv'd! thanks... git seems to have a problem working across slow links
[12:39] pieterh too much chatter or something... they aren't using 0MQ....
[13:10] pieterh sustrik: what's your view of when 2.1.0 would be releasable?
[13:10] pieterh would it help if I stress tested it with some real applications?
[13:10] pieterh btw, it all build and passed the test suite fine, of course
[13:11] pieterh *built
[13:11] mikko you can run tests in language bindings as well
[13:11] guido_g not a real suprise, the tests are really basic
[13:11] mikko they probably contain fair amount of tests
[13:12] pieterh gudio_g: i'd like to try breakage tests...
[13:13] guido_g nevertheless do we need good test coverage in the core
[13:13] pieterh yes, we can't refer up the stack
[13:13] pieterh core can't test using language bindings, this is up to the binding author/community
[13:13] guido_g pieterh: what does that mean?
[13:14] guido_g breakage tests
[13:14] pieterh well, stuff like send message, close, check that it's delivered or not according to socket policy
[13:14] pieterh exceed HWM, check messages are delayed/discarded
[13:14] pieterh send invalid stuff, check 0MQ does not die
[13:14] pieterh do bad operations, invalid socket mixes, illegal sequences
[13:15] pieterh all the stuff normal apps do all the time... :-)
[13:15] guido_g ahh ok
[13:15] guido_g normal tests :)
[13:15] pieterh normal regression is of course also very useful
[13:15] pieterh "it still works"
[13:15] pieterh but "i can't break it" is also valuable
[13:16] guido_g that you get with every build and make check
[13:16] guido_g the regression test
[13:16] pieterh yes
[13:16] guido_g ok, would be nice to have a list of tests to do
[13:16] pieterh it's sometimes possible to collect test cases for issues
[13:16] guido_g i'll go over it as time permits and write the test programs
[13:17] pieterh oh, sorry, i'm not trying to propose work... :-/
[13:17] guido_g it has to be done
[13:17] pieterh i'm more than happy to help though it would be in C not C++
[13:17] pieterh well, let's start by collecting specs?
[13:17] pieterh sorry s/start/continue/
[13:18] guido_g yes
[13:18] pieterh perhaps this can help language binding authors make coherent test sets too
[13:18] guido_g to make it leight and easy to start with, a simple collection of ideas what to test would be ok i think
[13:18] pieterh i.e. standardized test set spec
[13:18] pieterh yes
[13:19] pieterh it would give users a tool for validating bindings
[13:19] pieterh "has test suite"
[13:20] pieterh actually it should then be written both in C++ and C
[13:20] pieterh i volunteer to make the C test suite then
[13:22] guido_g :)
[13:22] guido_g i'd like to stick with c++ for now
[13:22] guido_g it's hard enough to relearn it
[13:23] pieterh sure, so we will double up the test suite, that also gives people examples to compare?
[13:23] pieterh sustrik: do you have any problem with a C test suite in parallel to the C++ one?
[13:23] pieterh if it's a stupid idea, i'm happy to retract it... :-)
[13:26] guido_g hehe
[13:26] guido_g see you later
[13:29] CIA-20 zeromq2: 03Martin Sustrik 07master * r651c1ad 10/ (src/ctx.cpp src/socket_base.cpp): sys transport introdced; inproc://log moved to sys://log -
[13:29] CIA-20 zeromq2: 03Martin Sustrik 07master * r0fe7d3c 10/ (builds/msvc/libzmq/libzmq.vcproj src/ctx.cpp): conflicts resolved -
[14:02] guido_g re
[14:03] sustrik pieterh: C test suite is OK
[14:03] sustrik but afaik the files have to have .cpp extension
[14:03] sustrik so that autotools know it should link c++ runtime with it
[14:04] sustrik (needed by 0mq library, in case of static linking)
[14:04] pieterh yes, indeed
[14:04] pieterh great
[14:04] guido_g why is the logging now a special transport?
[14:04] pieterh will have to use a naming convention to avoid conflicts, NP
[14:05] sustrik guido_g: two reasons
[14:05] sustrik 1. it's a different beast, communicating with 0mq internals rather than communicating with a socket in a different thread
[14:05] sustrik 2. full backward compatibility
[14:06] guido_g ok
[14:06] pieterh sustrik: i see one problem with making it a separate transport
[14:06] guido_g how will users attach to this type of transport?
[14:07] sustrik guido_g: connect
[14:07] guido_g just a SUB w/ sys://log?
[14:07] sustrik pieterh: what problem?
[14:07] sustrik guido_g: yes
[14:07] pieterh take the syslog service as an analogy
[14:07] guido_g great! thanks
[14:07] pieterh it's a bus, any component can participate
[14:08] pieterh ok, that's not quite accurate but I mean you might want to allow arbitrary components to inject traffic into this
[14:08] sustrik i don't :)
[14:08] pieterh and have it picked up by log clients without them needing to be changed
[14:08] guido_g :)
[14:08] sustrik what i mean is how would you scale that kind of thing?
[14:08] sustrik right now it's easy
[14:09] pieterh it's inproc or ipc, what's the scaling issue?
[14:09] sustrik it's constrained to the process
[14:09] sustrik the business logic
[14:09] pieterh attach device to sub, export as pub... np
[14:09] sustrik what you want with a business logic is a distributed logging service
[14:09] guido_g ack
[14:09] guido_g the way with a forwarder is ok
[14:10] pieterh i can play devil's advocate here
[14:10] sustrik pieterh: i have no idea how you would implement it
[14:10] pieterh it looks like you are claiming a semantic difference in order to solve a naming clash
[14:10] pieterh it's unclear what the value is of a new transport
[14:10] pieterh no clear problem you're solving wrt to using inproc:
[14:10] sustrik you mean between sys & inproc or between 0mq logging and application logging?
[14:10] pieterh or ipc:
[14:12] pieterh sustrik: ... sorry, I don't follow this thread
[14:12] sustrik pieterh> it looks like you are claiming a semantic difference in order to solve a naming clash
[14:12] pieterh ah, yes
[14:12] pieterh between sys: and inproc or ipc
[14:13] pieterh is sys: like inproc or like ipc?
[14:13] sustrik it's different from both
[14:13] sustrik it has no peer actually
[14:13] pieterh yes, but can you connect to it from another process?
[14:13] pieterh is it an in or ex-process endpoint?
[14:14] sustrik it's process-scoped
[14:14] pieterh so it's like inproc
[14:14] sustrik sure, same scope
[14:14] sustrik different semantics
[14:15] pieterh now if i am being evil and minimalist i'll ask what the value is in defining a totally new protocol instead of a protected namespace within inproc
[14:15] pieterh given that every new construct is something expensive to document, understand...
[14:15] sustrik same question: why not make ipc a separate namespace within tcp?
[14:15] pieterh but the semantics fit perfectly to an inproc SUB socket from the users' POV
[14:16] sustrik no: there's no peer socket
[14:16] pieterh that's an implementation detail
[14:16] pieterh that's behind the wall, and not relevant to users
[14:16] pieterh it looks like there is a peer socket
[14:16] sustrik ok, let me explain the internal mechanism of sys
[14:16] pieterh ah, hang on
[14:16] pieterh i'm at the API level
[14:17] pieterh internal mechanisms should not be relevant
[14:17] guido_g this is what sys: says imho, don't expect the usual, this comming from the kernel
[14:17] pieterh but why?
[14:17] pieterh why the surprise?
[14:17] guido_g i can't see any, sorry
[14:17] pieterh why is the kernel a 'special' component with its own transport that looks exactly like inproc: but has a different name?
[14:17] pieterh it's surprising
[14:18] sustrik it's administration/business logic distinction
[14:18] sustrik inproc carries business logic
[14:18] sustrik sys carries admin data
[14:18] pieterh not necessarily
[14:18] sustrik necessarily
[14:18] pieterh as soon as i make a framework over 0MQ
[14:18] pieterh then inproc carries admin data
[14:18] guido_g for an application using the core
[14:18] guido_g not the ømq core itself
[14:18] pieterh ok... perhaps it would help if there was some significant semantic difference between admin data and business data
[14:19] pieterh such as priority
[14:19] guido_g i see sys: as the core namespace
[14:19] pieterh or blocking/ error handling
[14:19] pieterh guido_g: as a namespace this is a lousy solution IMO
[14:19] pieterh namespaces should be orthogonal to transports
[14:19] guido_g pieterh: why?
[14:19] pieterh well, this makes it impossible to run a separate logger to inspect a running process
[14:20] pieterh every single application needs a special thread that exports the sys: data over ipc: or tcp:
[14:20] sustrik the main problem i have with the whole log thing is that people are now going to use it for their business logic and thus break the patterns
[14:20] sustrik if so, i'll rather remove it completely
[14:20] pieterh sustrik: no, you can prevent that easily
[14:20] sustrik ?
[14:20] guido_g sustrik: hold it, we need it!
[14:20] pieterh you can prevent that trivially
[14:20] pieterh use a protected name space
[14:20] guido_g like sys: ? :)
[14:21] pieterh recall in amqp how exchanges beginning with amq. were protected
[14:21] pieterh transports are not namespaces... :-(
[14:21] guido_g sure
[14:21] sustrik what i mean is people are now going to ask me to report disconnections via sys
[14:21] pieterh inproc://zmq/log and ipc://zmq/log would be perfect
[14:21] pieterh allows me to start separate logger
[14:21] sustrik so that they can handle each connection separately
[14:21] pieterh perhaps
[14:22] sustrik to prevent that, the admin part should be as much separated from the business part as possible
[14:22] pieterh that's a use case but it's possibly not the right solution
[14:22] pieterh hmm
[14:22] sustrik different API would be ideal
[14:22] guido_g but the application developer doe *not* know what makes sys: work technically, so the obvious similarity to inproc might be wrong
[14:22] sustrik but that's too much work
[14:22] pieterh sustrik: do you see the value in allowing this namespace to work over both ipc and inproc?
[14:22] sustrik no
[14:23] sustrik it's just adminstration stuff
[14:23] pieterh i don't think logging should be mixed with out of band control of sockets
[14:23] pieterh that's a different issue
[14:23] sustrik right
[14:23] sustrik but it's an obvious trap
[14:24] pieterh avoidable trap
[14:24] sustrik i think someone have already suggested something like that
[14:24] pieterh yes
[14:24] sustrik i can avoid it by saying "NO"
[14:24] sustrik as i am core maintainer atm
[14:24] pieterh indeed
[14:24] pieterh but that's not going away, your veto
[14:24] sustrik no mixing of business logic and administration
[14:25] pieterh anyone can fork 0MQ and add whatever they like
[14:25] pieterh but it won't be the official version
[14:25] sustrik sure, that's ok
[14:25] pieterh unless and until you vote it in
[14:25] pieterh no exceptions to this, period.
[14:25] guido_g are we still at the logging thing or do i have to move myself to a safe place?
[14:26] sustrik good, so unless i hear a good argument for mixing business logic and maitenence/debugging stuff, i would keep it apart
[14:26] sustrik it's logging still :)
[14:26] pieterh sustrik: i'd like, really love, to be able to do logging from a separate process
[14:26] pieterh otherwise every application becomes N x more complex
[14:26] sustrik write an app that does that
[14:26] sustrik np
[14:26] sustrik 5 lines of code
[14:27] pieterh you said it was in process
[14:27] pieterh did I misunderstand you?
[14:27] sustrik you can create a device that would read from sys and republish on tcp
[14:27] sustrik you can even use forwarder
[14:28] sustrik when you do that you are effectively converting 0mq admin data into business logic data
[14:28] sustrik which is ok
[14:28] sustrik but at 0mq level i need them separated
[14:28] sustrik to avoid contamination
[14:28] guido_g if anyone can access the *internal* data flow w/o authorization it would be a nightmare
[14:29] sustrik you mean the logs?
[14:29] guido_g yes
[14:29] sustrik :(
[14:29] sustrik no authorisation as for now
[14:29] sustrik otoh
[14:29] sustrik it's in-process only
[14:29] sustrik so nobody from outside can read from sys
[14:29] guido_g given the "one forwarder per program" model, the program decides on what to publish and where etc.
[14:30] guido_g sustrik: sure, but as far as i understood, pieterh wanted access from an external process w/o a forwarder inbetween
[14:30] sustrik yes, that was the original discussion
[14:31] sustrik actually it would be almost impossible from implementation point of view
[14:31] sustrik that's black magic going on in the background :)
[14:31] guido_g details! :)
[14:31] sustrik well, sys is technically different from all the other sockets
[14:31] sustrik maybe pgm excluded
[14:32] sustrik becasue it's a real bus
[14:32] sustrik ie. multiple writers
[14:32] sustrik multiple readers
[14:32] sustrik no device in the middle
[14:32] guido_g as i said "<guido_g> but the application developer doe *not* know what makes sys: work technically, so the obvious similarity to inproc might be wrong"
[14:32] guido_g therefore the sys: transport makes sense in my eyes
[14:33] sustrik yes, that was my argument as well
[14:33] guido_g good
[14:33] guido_g because i really like the logging
[14:33] sustrik it's good but can be dangerous if misused
[14:34] guido_g ømq is notoriously weak on giving information on what's going on
[14:34] sustrik :|
[14:34] guido_g that's a thing nearly every library has
[14:34] sustrik right
[14:34] sustrik that's because it's much more async that probably any other library around
[14:35] sustrik zillions of moving parts
[14:35] sustrik even without proper synchronisation
[14:35] guido_g and for real distributed applications there is rule 0: log everything, all the time
[14:35] sustrik right
[14:35] sustrik so, this should solve it
[14:35] sustrik hopefully
[14:35] guido_g it's at least a clean interface
[14:36] pieterh sustrik: makes sense but it's a shame that we'd need a dedicated thread in every app to export log data
[14:36] pieterh still, this can be extended over time
[14:36] pieterh minimalism demands I shut up now :-)
[14:36] pieterh though a new question comes to mind...
[14:36] pieterh if a bus transport is useful for 0MQ internally
[14:37] pieterh surely it is also useful for applications as well
[14:37] pieterh :-)
[14:37] sustrik it doesn't scale
[14:37] sustrik it can work on level on 1 process
[14:37] sustrik even on LAN
[14:37] sustrik once you try to stretch it further it breaks
[14:38] sustrik the number of transfers grows quadratically with increasding number of components
[14:38] sustrik pieterh: ad dedicated thread
[14:38] pieterh sustrik: as an inproc bus, I meant
[14:38] sustrik yes, that's why it's a bus
[14:38] pieterh bus://
[14:38] sustrik to avoid speacial thread
[14:39] sustrik yes, can be
[14:39] sustrik but i like that sys is explicit abour "don't pass your business logic through this"
[14:39] pieterh for some reason 'magic system stuff you use here' seems not ideal
[14:40] pieterh it's like the core gets to use magic stuff the apps don't get
[14:40] sustrik yes
[14:40] guido_g that's why it's the core
[14:40] sustrik because core doesn't have to scale
[14:40] sustrik applications do
[14:41] pieterh imo you will get people demanding access to this transport for their essential internal signalling
[14:41] pieterh but i have no proof, just baseless speculation
[14:42] sustrik i expect it will be so
[14:42] sustrik thus i want it be named something really scary
[14:42] guido_g but the line is drawn "sorry, no access for you here"
[14:42] pieterh e.g. "how do I do a clean shutdown"... answer: signal every thread
[14:42] guido_g as with system calls into the kernel
[14:42] pieterh bah. that was the idea with PAIR as well
[14:42] sustrik that's baked into 0mq as well
[14:42] sustrik ETERM
[14:42] pieterh but it turns out we really need PAIR for some use cases
[14:43] sustrik ok, the use case for pair:
[14:43] pieterh yeah, i know, it's a bad example
[14:43] sustrik you have an application that does accounting and HR
[14:43] sustrik you want to split it into two applications
[14:43] sustrik one does accounting
[14:43] sustrik other does HR
[14:43] sustrik they have a PAIR socket between them
[14:44] sustrik because each of the peer is singleton
[14:44] sustrik and doesn't scale
[14:44] pieterh my use case for PAIR is just interthread signalling
[14:44] sustrik hm
[14:44] sustrik what use case?
[14:44] pieterh i explained it in the guide, end of chapter 2
[14:45] pieterh thread a wants to signal to thread b that it's done
[14:45] pieterh no scaling required
[14:45] sustrik let me see
[14:45] pieterh no reconnection required
[14:45] pieterh PAIR gives the best semantics afaics
[14:48] sustrik this one: "Thread Coordination" ?
[14:51] sustrik well, there's no business logic in the example
[14:52] sustrik so it's hard to say what's the right socket types to use
[14:52] sustrik it the three components are by definition singletons, then PAIR is appropriate
[14:52] sustrik it say step2 can be parallelised the pipeline would be better
[14:53] sustrik the problem i have with pair is that it solves a problem (the accounting vs. HR problem)
[14:53] sustrik but it doesn't scale
[14:54] sustrik by throwing more boxes on your accounting/HR application you won't get more power
[14:54] sustrik even thought you paired the two by a PAIR socket
[15:29] guido_g sustrik: latest master shows poll problem again
[15:30] guido_g test code is at
[15:31] guido_g output of zmqcpp when sender was executed:
[16:11] ModusPwnens hello
[16:18] ModusPwnens i have a question about the zmq_msg_size function
[16:26] cremes ModusPwnens: go ahead and ask
[16:26] cremes if someone knows the answer, they'll respond
[16:26] ModusPwnens ok
[16:26] ModusPwnens so as i have said before, I am using google protocl buffers to encode messages and send them
[16:27] ModusPwnens and on the clientsize, I do message.size(), where message is the size of the object encoded by google protocol buffers
[16:27] ModusPwnens however, on the server side
[16:27] ModusPwnens I use the zmq_msg_size function
[16:27] ModusPwnens but no matter how large the message actually is, zmq_msg_size always gives 36 bytes
[16:28] ModusPwnens I am wondering not only why that is, but how to get the actual size of the payload of the message
[16:28] cremes ok
[16:28] cremes it sounds to me like your client is not allocating the message correctly
[16:29] cremes do you have a code snippet showing how you are allocating the zmq_msg_t and assigning your protocol buffer to it?
[16:29] ModusPwnens rc = zmq_msg_init_data(&msg, cstr, message.size(), NULL, NULL);
[16:29] ModusPwnens something like that?>
[16:30] cremes hold on a sec...
[16:30] ModusPwnens k
[16:32] cremes the variable 'cstr' points to the data; are you sure its size is the same as message.size() ?
[16:32] Steve-o shouldn't it be message.ByteSize() in Google protobufs?
[16:34] ModusPwnens hmm, that's a good point. I wasn't aware that function existed..
[16:34] ModusPwnens but in any case, that doesn't seem like it would solve my problem.
[16:35] cremes does the server *always* receive packets of length 36 exactly? if so, the client must be producing messages of that length
[16:35] cremes focus on the client side for now... something is likely wrong there
[16:35] cremes on the server, are the bytes received garbage? try printing the data the client sends and comparing it to the data the server receives
[16:36] ModusPwnens It seems so, but when i print the value of message.size() in the client, it prints outs omething much larger
[16:36] ModusPwnens and the bytes received are not garbage
[16:36] ModusPwnens i have verified the message coming through is valid
[16:37] cremes why not try: rc = zmq_msg_init_data(&msg, cstr, strlen(cstr), NULL, NULL);
[16:37] cremes i don't understand the relationship between cstr and message.size()
[16:38] ModusPwnens Hmm, i changed that for a reason...
[16:38] ModusPwnens I think it's because the zmq syntax doesn't want a string there or something
[16:38] ModusPwnens so I had to convert a string into a c-style string
[16:38] ModusPwnens and thats what cstr is
[16:39] cremes ah ha... that is your problem
[16:39] ModusPwnens it is?
[16:39] cremes c style strings are terminated by a NUL \0
[16:39] ModusPwnens Yeah. Does that interfere with zeromq somehow?
[16:39] cremes hmmm, wait, i got ahead of myself there...
[16:40] cremes i'm going to think out loud
[16:40] ModusPwnens ok
[16:40] cremes so a c style string is really just a char* or a pointer to a byte buffer
[16:40] ModusPwnens correct
[16:40] ModusPwnens oh right
[16:40] cremes you need to pass a byte buffer pointing to the beginning of your encoded message
[16:40] ModusPwnens sorry you're thinking out loud >_<
[16:41] cremes is the cstr pointing to that?
[16:41] ModusPwnens yeah
[16:41] ModusPwnens and then i strcpy the message into cstr
[16:41] cremes e.g. cstr = (char*) message.encode().get_pointer()
[16:41] ModusPwnens beforehand
[16:41] ModusPwnens yeah something like that
[16:41] cremes any embedded NULs will terminate the string copy
[16:42] cremes so you may only be copying 36 bytes even though your byte buffer is larger
[16:42] cremes use memcpy instead
[16:42] cremes does that sound reasonable?
[16:42] ModusPwnens but..wouldn't that reflect on the serverside as far as displaying the message?
[16:42] ModusPwnens i.e. it wouldn't display the whole thing?
[16:43] ModusPwnens furthermore
[16:43] ModusPwnens embedded nuls will terminate the string copy
[16:43] ModusPwnens but doesnt' that only apply to the encoded message that is being copied?
[16:43] cremes ModusPwnens: you are going to have to show more code, i think
[16:44] ModusPwnens ok i will just copy the entire function into a pastebin
[16:44] cremes there are lots of folks successfully slinging around large strings and large byte buffers so there is likely an issue in your code
[16:44] cremes cool
[16:44] ModusPwnens That is definitely a possibility
[16:44] cremes you are using 2.0.8 release, yes? or the 2.1 master branch?
[16:44] ModusPwnens 2.0.7
[16:45] CIA-20 zeromq2: 03Martin Sustrik 07master * r99ddfa7 10/ (builds/msvc/platform.hpp maint: will become 2.0.9 -
[16:45] CIA-20 zeromq2: 03Martin Sustrik 07master * r47aaf10 10/ :
[16:45] CIA-20 zeromq2: Merge branch 'maint'
[16:45] CIA-20 zeromq2: * maint:
[16:45] CIA-20 zeromq2: maint: will become 2.0.9
[16:45] CIA-20 zeromq2: Conflicts:
[16:45] CIA-20 zeromq2: builds/msvc/platform.hpp
[16:45] CIA-20 zeromq2: -
[16:45] CIA-20 zeromq2: 03Mikael Helbo Kjær 07master * r59315eb 10/ src/select.cpp :
[16:45] CIA-20 zeromq2: Erasure of retired fd's in select.cpp causes an assertion in MSVC 2008 STL
[16:45] CIA-20 zeromq2: I was hitting an issue with an SCL enabled STL library in connection with the
[16:45] CIA-20 zeromq2: way select_t::loop was erasing retired fd's. The problem as identified by the
[16:45] CIA-20 zeromq2: SCL assertion was that by the time the iterator given to the erase method was
[16:45] CIA-20 zeromq2: called it was considered invalid by the library. I am not sure this isn't just
[16:45] CIA-20 zeromq2: a "quirk" of the MSVC STL library as the other code looks valid to me as well. -
[16:45] CIA-20 zeromq2: 03Martin Sustrik 07master * ra81a373 10/ src/select.cpp :
[16:45] CIA-20 zeromq2: Merge branch 'maint'
[16:45] cremes 2.0.7 should be okay too; i don't recall any data truncation bugs for any sockets
[16:46] ModusPwnens
[16:46] ModusPwnens if i am doing anything stupid in general
[16:46] ModusPwnens please let me know
[16:46] ModusPwnens I am actually only a stupid so im not as experienced as most people here probably are..
[16:47] ModusPwnens wow
[16:47] ModusPwnens i meant student
[16:47] cremes line 36 confuses me...
[16:47] ModusPwnens oh yeah ignore that
[16:47] cremes is that supposed to be commented out?
[16:48] cremes because it is overwriting the size of the msg on the prior line
[16:48] ModusPwnens I think so. We put that in for debugging purposes.
[16:48] cremes with 36 bytes which matches up with how many you are receiving on the server side
[16:49] cremes well, that's a bug
[16:49] cremes remove that and test again
[16:49] ModusPwnens *sigh* i hate asking stupid questions
[16:51] cremes don't worry about it; you'll be repaying the favor here in a few short weeks
[16:51] ModusPwnens ahhhhh gosh darn it
[16:51] ModusPwnens that was it
[16:51] ModusPwnens I'm sorry for wasting your time.
[16:51] ModusPwnens thanks for your help tho
[16:51] cremes btw, line 34 looks to me like a bug waiting to happen
[16:51] cremes i would use memcpy
[16:52] ModusPwnens because of the nul string thing?
[16:52] cremes right
[16:53] cremes memcpy(cstr, message.c_str(), message.size())
[16:53] ModusPwnens Ok, i will change it.
[16:53] cremes or use strncpy
[16:53] cremes but memcpy is likely quicker since it isn't looking for NULs
[16:53] cremes ModusPwnens: and all this from a Ruby guy who hasn't used C in anger for many years... :)
[16:54] ModusPwnens heh, well it looks like you still got it then.
[16:54] ModusPwnens oh, and i have another question this time
[16:54] ModusPwnens for the send and receive topology
[16:55] ModusPwnens is there a flag you can set or something that prevents the send and receive messages from blocking?
[16:55] cremes yes
[16:56] cremes check out ZMQ_NOBLOCK;
[16:56] cremes btw, when using PUB sockets, it's a good idea to put your topic in a separate message part
[16:57] ModusPwnens what do you mean?
[16:57] cremes the example code you pastied showed that you are sending the AddressBook as the first message part, so subscribers will match on it
[16:57] cremes i'll pastie some pseudo-code showing what i mean
[16:57] ModusPwnens ok.
[16:58] ModusPwnens and as far as the no blocking, we want to use it so we can constantly send messages and then receive a message every once in a while, or vice-versa. But would it be better to just use multiple sockets and a publish-subscribe topology instead?
[16:58] jond cremes: if it's std::string why not use the copy method std::string::copy?
[16:59] mikko do you actually need a copy there?
[16:59] ModusPwnens well i need to store the message I am sending in that string, so I would need to copy it in, right?
[17:01] cremes ModusPwnens: unlikely legal C, but you should get the idea
[17:01] cremes jond: i don't know; i'm not a C++ guy but memcpy is pretty easy to figure out for me
[17:02] cremes mikko: you probably need the copy unless you can guarantee the buffer won't go away until the message is *actually* sent
[17:02] ModusPwnens Hmm, that makes sense.
[17:02] Steve-o Does it really need to be a string? I used buf.SerializeToArray() and buf.ParseFromArray().
[17:03] cremes ModusPwnens: by sending a topic, your SUB sockets can use it to filter out unwanted messages
[17:04] ModusPwnens Yes that makes sense. I can see the usefulness of that.
[17:04] ModusPwnens And steve-o, you make a good point
[17:04] jond cremes: ok, there is a method on string, so you could do message.copy(cstr,message.size()), but the code id as you say mainly c
[17:04] mikko ModusPwnens: is that C++ or C ?
[17:05] cremes jond: i'm a ruby guy so take my C suggestions with a grain of salt ;)
[17:05] ModusPwnens well, I am using visual studio C++, but I am actually using the C bindings
[17:05] mikko cremes: yeah, true
[17:05] mikko on the earlier
[17:05] ModusPwnens mostly because I was having trouble with the C++ ones
[17:06] ModusPwnens and steve-o, that would probably be a better/more efficient way of doing this, right?
[17:06] ModusPwnens then I wouldn't have to do all the c-string manipulation
[17:07] Steve-o it should be the best as of v2.1, but I think Google has changed their api a few times since
[17:07] Steve-o my example of using protobufs here,
[17:09] Steve-o noting ByteSize() is only valid after you have actually filled in values for protobufs, it has caught me a few times
[17:09] ModusPwnens you mean after you have encoded a message?
[17:10] Steve-o I needed the message size before serializing
[17:11] ModusPwnens hmm
[17:11] ModusPwnens for the serializetoarray method
[17:12] ModusPwnens you would need to get the size of the data you are serializing before you can serialize it..?
[17:13] Steve-o For my code I need to reserve space in a socket buffer for the serialized form, so I need the size. Obviously usage case varies for everyone.
[17:14] ModusPwnens You mean the size is always known beforehand? What if you don't know the size before, can you still use that?
[17:15] Steve-o probably if you know the protobuf object is always going to be smaller than your buffer
[17:15] ModusPwnens Hmm. okay.
[17:15] Steve-o it's a bit safer to check the size before hand, much like vasprintf()
[17:19] ModusPwnens Yeah that makes sense.
[17:19] ModusPwnens Ok, thanks for your help guys!
[17:20] ModusPwnens I will probably be back again in a few days with something else..hopefully something less stupid.
[17:55] pieterh folks: if anyone wants to review, feedback would be welcome
[17:55] pieterh this is meant to be the welcome site for new 0MQ users
[17:56] pieterh next I'll remove a lot of the fluff from the front page and menus
[18:00] pieterh my idea is to make the site an index of all projects
[18:01] pieterh kind of ranked by activity somehow
[18:05] pieterh no-one minds? :-)
[18:12] Steve-o inproc is still a new word
[18:13] guido_g the onhover bold is a little overdone
[18:16] guido_g on the page linked from 04READ should show the canonical doku first (the guide & the manual)
[18:16] jond steve-o: agree about inproc, not widely used AFAIK
[19:44] mcxx I'm trying to build pyzmq, but I get this error:
[19:45] mcxx I got freshly cloned zeromq2 and pyzmq repos from github