The way this deadlock all came about was reluctance to isolate that polling
code for the fact that the code base is large.

On Tue, Jul 28, 2015 at 8:24 PM, Kenneth Adam Miller <
kennethadammil...@gmail.com> wrote:

> That's ok, this is only for a simulation test. I'm not focused on
> congestion issues right now. I'm getting a measure of how much the
> implementation decisions have improved scalability in both space and speed
> across the entire software system.
>
> On Tue, Jul 28, 2015 at 8:12 PM, Justin Karneges <jus...@affinix.com>
> wrote:
>
>>  Sure thing. And yeah, if you're always polling forever for writability
>> before writing, then you effectively have a backpressure strategy.
>>
>> Note that if you begin polling for read and write at the same time, then
>> you open the door to potentially processing new data while you've still got
>> pending outbound data to write, and then you will face those three choices
>> I mentioned.
>>
>> On Tue, Jul 28, 2015, at 05:07 PM, Kenneth Adam Miller wrote:
>>
>> Thank you, by the way.
>>
>> On Tue, Jul 28, 2015 at 8:07 PM, Kenneth Adam Miller <
>> kennethadammil...@gmail.com> wrote:
>>
>> There's no need to take any of those options because in my case, because
>> the producer polls every time before sending.
>>
>> I think I realize with your first sentence what I missed when I wasn't
>> vocalizing my issue. I think I now know that it's not because the other
>> clients aren't concurrent that there is an issue, it's the lack of
>> isolating the location in code for polling into doing both read and write
>> polling in one call. If it were one call, then the send lockup could never
>> happen, but right now, it occurs in sequence, where if you return from
>> polling for read, you read, do work, and then poll before sending that back
>> out. In any case, I think I am highly confident I have the correct
>> implementation path now.
>>
>> On Tue, Jul 28, 2015 at 7:43 PM, Justin Karneges <jus...@affinix.com>
>> wrote:
>>
>>
>> You can poll for read and write at the same time, so there shouldn't be
>> any issue with both peers sending simultaneously and then failing to read.
>>
>> Note that if you can't write, then you need to think about how to manage
>> your outbound messages. The three basic choices you have are:
>> 1) Backpressure (while waiting to write, stop doing anything that causes
>> new messages to be produced)
>> 2) Drop messages
>> 3) Queue every message, indefinitely (caution to the wind!)
>>
>> The third option is almost never what you want. It sucks having to choose
>> between the first and second options but that's reality. Once you've
>> decided on your strategy then you'll know what code to write.
>>
>> On Tue, Jul 28, 2015, at 04:28 PM, Kenneth Adam Miller wrote:
>>
>> I can't use ZeroMQ for this, because I know if I could this wouldn't be a
>> problem. But since there are so many systems engineers on the channel and
>> fundamentally it's what ZMQ aims to solve, I think it's the appropriate
>> place.
>>
>> For a scalability benchmark meant to emulate our real world scenario, I
>> have a cycle created between a producer and a consumer, where the producer
>> spams a fifo object that the consumer is listening on. The consumer does
>> some validation work on the data that it was hit with and sends it back out
>> over a different fifo object that the producer is concurrently listening to
>> (rather it's a chain of four processes linked in this way).
>>
>>                  <-   process_echo <-
>> Producer                                      consumer
>>                 ->    process_echo ->
>>
>> This works fine from the perspective of the producer, because listening
>> and writing requires no coordination between threads. But the producer and
>> echoing processes were written singled threaded, and from the perspective
>> that it would poll only for input and not for when it writes.
>>
>> Well, as my testing went along I discovered that I had to make both the
>> producer and consumer poll on output so that no data could be lost when the
>> sender goes to send and the fifo isn't being read from fast enough.
>> (possibly that's wrong)
>>
>> But using poll on the sender has caused hangups on the system as a whole.
>> Poll returns for readers, I think, when someone has already written or is
>> writing. And for writers, when someone is blocking (whether polling or in
>> read) to read.
>>
>> But the problem that this solves brings up a different problem: if the
>> single threaded programs poll to write, then the cycle could deadlock where
>> every side is polling to write, before even one message makes it fully
>> round circle.
>>
>> My thought is, I could break it by making the consumer concurrent in
>> reading and writing, that way, lockup on send cannot happen, because there
>> will always be a reader to allow execution to continue in the echo tool and
>> consumer. But that's hard because the code base is large.
>>
>> I said all of that just to ask-does anybody have any alternative
>> suggestions regarding how to approach this exact problem?
>>
>> All fifo objects are in non-blocking mode.
>>    *_______________________________________________*
>> zeromq-dev mailing list
>> zeromq-dev@lists.zeromq.org
>> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>
>>
>>
>> _______________________________________________
>> zeromq-dev mailing list
>> zeromq-dev@lists.zeromq.org
>> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>
>>
>>    *_______________________________________________*
>> zeromq-dev mailing list
>> zeromq-dev@lists.zeromq.org
>> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>
>>
>>
>> _______________________________________________
>> zeromq-dev mailing list
>> zeromq-dev@lists.zeromq.org
>> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>
>>
>
_______________________________________________
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to