Hi Viktor,

Each transport has queue list and each queue in that list stands for one
destination (nexthop).

Please consider below scenario, transport2 has more queued entries than
transport1, but transport 2 will be selected while transport 1 never. The
if statement doesn't satisfy the comments.


Transport1 ==> queue1 -> queue2 -> queue3
 (1 pending)      (1 todo)     (1 todo)    (1 todo)

Transport2 ==> queue1 -> queue2 -> queue3
 (1 pending)      (1 todo)     ( 1 todo)    (2 todo)

Regards,
King

2015-05-11 11:28 GMT+08:00 Viktor Dukhovni <postfix-us...@dukhovni.org>:

> On Mon, May 11, 2015 at 09:19:43AM +0800, King Cao wrote:
>
> > > > Suppose transport->pending is 1, so the value of need is 2
> (pending+1),
> > >
> > > Which means that we're in the process of making an asynchronous
> > > connection to the transport to request a delivery.
> > >
> > > > queue->window is 5 by default (initial destination concurrency).
> Suppose
> > > > there is one todo entry and one busy entry, so min(queue->window -
> > > > queue->busy_refcount, queue->todo_refcount) is 1, which cause the
> > > > invalidation of if statement. So even there is one todo entry, but
> this
> > > > queue is still not satisfied.
> > >
> > > That's correct, the todo entry will be allocated to the pending
> > > connection when it completes.
> > >
> > > > PS: QMGR_TRANSPORT_MAX_PEND has changed from 1 to 2 before, not sure
> if
> > > > it's side-effect of this change.
> > >
> > > To allow for more than one pending connection at a time, which
> > > improves queue manager throughput under extreme message rates
> > > (thousands per second, when benchmarking with RAM-disk queues).
> > >
> > > The code is correct.
> >
> > The weird thing is that if queue->todo_refcount = 2, the queue will be
> > satisfied but if queue->todo_refcount = 1, the queue is not satisfied. So
> > when we have one pending delivery agent connection, if one queue have two
> > todo tasks, the related transport will be selected, but if one queue just
> > have one todo tasks, the related transport won't be selected.
>
> I repeat.  The code is correct as it stands.  More messages queued
> to be delivered yield more opportunities to schedule a delivery.
>
> Nothing weird here at all.  In particular, with a delivery agent
> connection pending, the single "todo" entry is going to be used by
> *that* delivery agent when the connection completes, so no additional
> agents are scheduled until that happens or more entries become
> available.
>
> Otherwise, under light load we'd wake up two delivery agents for
> every entry, only to find that the second delivery agent has nothing
> to do.
>
> I'm going to stop the discussion here.  You'll need to figure out
> why the code is correct without additional input.
>
> --
>         Viktor.
>

Reply via email to