Finally :)

I managed to integrate the proactor in my program loop by using
pn_proactor_get carefully correlated with pn_proactor_done.

The main mistake I did, was that I used to call pn_proactor_done after
getting a flow event and just before calling send.

Many thanks for advise and for patience.
Adrian

On Thu, Jun 18, 2020, 7:50 AM Adrian Florea <florea....@gmail.com> wrote:

> OK, so it must be pn_proactor_wait() or can I achieve similar behavior
> with pn_proactor_get()  ? I assume not.
>
> It would be nice if pn_proactor_wait would have a timed_wait option.
>
>
>
> On Thu, Jun 18, 2020, 7:44 AM Ted Ross <tr...@redhat.com> wrote:
>
>> If you look at the examples supplied with Proton, you will see simple
>> applications that behave as you desire.  Sends are immediate.
>>
>> Changing your idle timeout is only altering the timing of the bad behavior
>> of your app.  You need to find a way to incorporate pn_proactor_wait into
>> your logic.
>>
>> On Thu, Jun 18, 2020 at 1:07 AM Adrian Florea <florea....@gmail.com>
>> wrote:
>>
>> > So, based on this email chain and looking at what the idle timeout is
>> > intended for, I think that is true ... proton is "woke up" by these
>> > heartbeats, like you said. Playing with transport timeout values, just
>> > increased their frequency.
>> >
>> > I will look at other possibilities to obtain an "immediate send" effect.
>> >
>> >
>> > On Wed, Jun 17, 2020, 3:26 PM Adrian Florea <florea....@gmail.com>
>> wrote:
>> >
>> > > Some news.
>> > >
>> > > After setting up the transport (SSL and all), I added a call to
>> > > pn_transport_set_idle_timeout, with 20000ms.
>> > >
>> > > This provides great improvement, as now I can see my messages going
>> out
>> > > every few seconds, definitely sooner than 20s.
>> > >
>> > > As a side note, I tried to set the timeout to a subsecond value,
>> doesn't
>> > > work.
>> > > Said it must be min 10000. Setting it to 10000 is causing a subsequent
>> > > error with the connection timeout. The connection timeout becomes 5000
>> > ...
>> > > so I ended up setting transport timeout to 20000 to achieve a
>> cinnection
>> > > timeout of 10000.
>> > >
>> > > As I said, this provides great improvement but it would be nice if the
>> > > send can be "flushed" immediately.
>> > >
>> > > Adrian
>> > >
>> > > On Wed, Jun 17, 2020, 2:40 PM Ted Ross <tr...@redhat.com> wrote:
>> > >
>> > >> Proactor is a single-threaded, event-driven API for messaging.  It
>> owns
>> > >> the
>> > >> main execution loop and uses the pn_proactor_wait() execution to do
>> > >> background work like sending your message out the connection.
>> > >>
>> > >> I don't know what your application looks like, but I assume that you
>> > have
>> > >> your own main loop and you don't ever give proactor a chance to run.
>> > Your
>> > >> message is probably being sent when a heartbeat frame arrives from
>> > >> whatever
>> > >> you're connected to.  This is the PN_TRANSPORT event you are seeing.
>> > >>
>> > >> -Ted
>> > >>
>> > >> On Wed, Jun 17, 2020 at 3:00 PM Adrian Florea <florea....@gmail.com>
>> > >> wrote:
>> > >>
>> > >> > Yeah... forget my last mention. Looking at what pn_proactor_done
>> does,
>> > >> it
>> > >> > doesn't make sense to call it when the batch of events is null.
>> > >> >
>> > >> > On Wed, Jun 17, 2020, 1:50 PM Adrian Florea <florea....@gmail.com>
>> > >> wrote:
>> > >> >
>> > >> > > Yes.
>> > >> > > I don't call it when the pn_proactor_get() returns null.
>> > >> > >
>> > >> > > I should probably call it in this case as well..
>> > >> > >
>> > >> > >
>> > >> > > On Wed, Jun 17, 2020, 1:30 PM Ted Ross <tr...@redhat.com> wrote:
>> > >> > >
>> > >> > >> On Wed, Jun 17, 2020 at 2:19 PM Adrian Florea <
>> > florea....@gmail.com>
>> > >> > >> wrote:
>> > >> > >>
>> > >> > >> > Hi, thanks.
>> > >> > >> > I am using the proactor.
>> > >> > >> > I need a way to clearly send a message out.
>> > >> > >> > My program has a loop and everytime it loops, I tried this:
>> > >> > >> >
>> > >> > >> > - call pn_proactor_wait  --> this ends up blocking my loop,
>> which
>> > >> is
>> > >> > not
>> > >> > >> > good.
>> > >> > >> >
>> > >> > >> > - call pn_proactor_get -- this does not block and returns no
>> > event
>> > >> > for a
>> > >> > >> > long while, when suddenly it gets a PN_TRANSPORT event and
>> all my
>> > >> > >> messages
>> > >> > >> > are really sent out.
>> > >> > >> >
>> > >> > >>
>> > >> > >> Are you calling pn_proactor_done() after processing the batch of
>> > >> events
>> > >> > >> from pn_proactor_get()?
>> > >> > >>
>> > >> > >>
>> > >> > >> >
>> > >> > >> > Adrian
>> > >> > >> >
>> > >> > >> > On Wed, Jun 17, 2020, 12:36 PM Ted Ross <tr...@redhat.com>
>> > wrote:
>> > >> > >> >
>> > >> > >> > > Hi Adrian,
>> > >> > >> > >
>> > >> > >> > > What is your program doing after it calls pn_message_send?
>> > That
>> > >> > >> function
>> > >> > >> > > queues the message for delivery but the delivery isn't
>> actually
>> > >> > >> > transferred
>> > >> > >> > > until the application yields the control back to the Proton
>> > >> reactor
>> > >> > >> (via
>> > >> > >> > > pn_proactor_wait).  If the application is doing other
>> > processing
>> > >> or
>> > >> > >> > waiting
>> > >> > >> > > on a condition or mutex, the delivery won't go out the door
>> > >> > >> immediately.
>> > >> > >> > >
>> > >> > >> > > -Ted
>> > >> > >> > >
>> > >> > >> > > On Wed, Jun 17, 2020 at 1:11 PM Adrian Florea <
>> > >> florea....@gmail.com
>> > >> > >
>> > >> > >> > > wrote:
>> > >> > >> > >
>> > >> > >> > > > Hi,
>> > >> > >> > > >
>> > >> > >> > > > Any idea is welcome on this one.
>> > >> > >> > > >
>> > >> > >> > > > I am trying to send messages (via a sender link) at
>> various
>> > >> > moments
>> > >> > >> in
>> > >> > >> > > the
>> > >> > >> > > > life of a program. I am using pn_message_send.
>> > >> > >> > > >
>> > >> > >> > > > I have set the outgoing window size to 1, on the session.
>> > >> > >> > > >
>> > >> > >> > > > The current behavior is:
>> > >> > >> > > >
>> > >> > >> > > > 1. pn_message_send completes OK
>> > >> > >> > > > 2. nothing is actually sent
>> > >> > >> > > > 3. after a while (I guess this is where I miss something)
>> I
>> > see
>> > >> > that
>> > >> > >> > the
>> > >> > >> > > > proactor gets an event of type PN_TRANSPORT and I can see
>> all
>> > >> > >> messages
>> > >> > >> > > > being really sent.
>> > >> > >> > > >
>> > >> > >> > > > Is there a way to achieve a "send immediate" behavior ?
>> > >> > >> > > >
>> > >> > >> > > > When a message send is invoked, I need it to really go
>> out.
>> > >> > >> > > >
>> > >> > >> > > > many thanks for pointing me in the right direction,
>> > >> > >> > > >
>> > >> > >> > > > Adrian
>> > >> > >> > > >
>> > >> > >> > >
>> > >> > >> >
>> > >> > >>
>> > >> > >
>> > >> >
>> > >>
>> > >
>> >
>>
>

Reply via email to