That’s a very good point.
Currently if timeout > 0, it will wait up to timeout for the sender thread
to complete. After that it will do a force close but not block.

Maybe we should make it to be:
If timeout > 0, wait up to timeout for the sender thread to complete.
After that, make a force close but still try to join the sender thread.
If timeout = 0, it is non-blocking.

Jiangjie (Becket) Qin

On 3/20/15, 9:16 AM, "Jun Rao" <j...@confluent.io> wrote:

>Got it. Just to clarify, does close(timeout) always wait for the sender
>thread to complete?
>
>Thanks,
>
>Jun
>
>On Fri, Mar 20, 2015 at 7:41 AM, Jiangjie Qin <j...@linkedin.com.invalid>
>wrote:
>
>> I think the we agreed that we are going to log an error and block. By
>> doing this we can make sure the error log to be checked by user in all
>> cases.
>> If we silently replace close() to close(0) in sender thread, in some
>>cases
>> such as send error during a normal close(), user might not notice
>> something went wrong.
>>
>> On 3/19/15, 10:34 PM, "Joel Koshy" <jjkosh...@gmail.com> wrote:
>>
>> >close can probably just getCurrentThread and check if == senderThread.
>> >I'm actually not sure from this thread if there was clear agreement on
>> >whether it should change close(timeout)/close() to close(0) or if it
>> >should
>> >log an error and block up to the timeout.
>> >
>> >On Thursday, March 19, 2015, Jun Rao <j...@confluent.io> wrote:
>> >
>> >> So in (1), if a close() or close(timeout) is called from a callback,
>>we
>> >> will just turn that into a close(0)? Implementation wise, how do we
>>know
>> >> whether a close() call is made from the sender thread or not?
>> >>
>> >> Thanks,
>> >>
>> >> Jun
>> >>
>> >> On Wed, Mar 18, 2015 at 2:13 PM, Jiangjie Qin
>> >><j...@linkedin.com.invalid>
>> >> wrote:
>> >>
>> >> > It looks we have another option and are now deciding between the
>> >> following
>> >> > two interfaces:
>> >> >
>> >> > 1. Close() + close(timeout)
>> >> >   - timeout could be either positive or zero.
>> >> >   - only close(0) can be called from sender thread
>> >> >
>> >> > 2. Close() + abort() + close(timeout)
>> >> >   - timeout can either be positive or zero
>> >> >   - only abort() can be called from sender thread
>> >> >
>> >> >   - abort() is equivalent to close(0) in 1) but does not join
>>sender
>> >> > thread and does not close metrics.
>> >> >   - Another thread has to call close() or close(timeout) in order
>>to
>> >>make
>> >> > sure the resources in producer are gone.
>> >> >
>> >> > The tow approach provides the same function we need, the
>>difference is
>> >> > approach 2) follows convention of close() and abort(). On the other
>> >>hand,
>> >> > approach 1) saves one interface compared with approach 2) but does
>>not
>> >> > follow the convention.
>> >> >
>> >> > When the two approaches come to user code, it is probably something
>> >>like
>> >> > this:
>> >> >
>> >> > Try {
>> >> >   While(!finished)
>> >> >     Producer.send(record, callback)
>> >> > } catch (Exception e) {
>> >> >   Producer.close(5)
>> >> > }
>> >> >
>> >> > Class CallbackImpl implements Callback {
>> >> >   onCompletion(RecordMetadata metadata Exception e) {
>> >> >     If (e != null)
>> >> >       Abort() / close()
>> >> >   }
>> >> > }
>> >> >
>> >> > Because the two approach leads to almost the same user code,
>>assuming
>> >> > users are always calling producer.close() as a clean up step,
>> >>personally
>> >> I
>> >> > prefer approach 2) as it follows convention.
>> >> >
>> >> > Any thoughts?
>> >> >
>> >> > Jiangjie (Becket) Qin
>> >> >
>> >> >
>> >> > On 3/17/15, 10:25 AM, "Jiangjie Qin" <j...@linkedin.com
>> >><javascript:;>>
>> >> wrote:
>> >> >
>> >> > >Hi Jun,
>> >> > >
>> >> > >Yes, as Guozhang said, the main reason we set a flag is because
>> >>close(0)
>> >> > >is expected to be called by sender thread itself.
>> >> > >If we want to maintain the semantic meaning of close(), one
>> >>alternative
>> >> is
>> >> > >to have an abort() method does the same thing as close(0) except
>> >> cleanup.
>> >> > >And in close(timeout), after timeout we call abort() and join the
>> >>sender
>> >> > >thread. This was one of the previous proposal. We merged abort to
>> >> close(0)
>> >> > >because they are almost doing the same thing. But from what you
>> >> mentioned,
>> >> > >it might make sense to have two separate methods.
>> >> > >
>> >> > >Thanks.
>> >> > >
>> >> > >Jiangjie (Becket) Qin
>> >> > >
>> >> > >On 3/16/15, 10:31 PM, "Guozhang Wang" <wangg...@gmail.com
>> >> <javascript:;>> wrote:
>> >> > >
>> >> > >>Yeah in this sense the sender thread will not exist immediately
>>in
>> >>the
>> >> > >>close(0) call, but will only terminate after the current response
>> >>batch
>> >> > >>has
>> >> > >>been processed, as will the producer instance itself.
>> >> > >>
>> >> > >>There is a reason for this though: for a clean shutdown the
>>caller
>> >> thread
>> >> > >>has to wait for the sender thread to join before closing the
>> >>producer
>> >> > >>instance, but this cannot be achieve if close(0) is called by the
>> >> sender
>> >> > >>thread itself (for example in KAFKA-1659, there is a proposal
>>from
>> >> Andrew
>> >> > >>Stein on using thread.interrupt and thread.stop, but if it is
>> >>called by
>> >> > >>the
>> >> > >>ioThread itself the stop call will fail). Hence we came up with
>>the
>> >> flag
>> >> > >>approach to let the sender thread to close as soon as it is at
>>the
>> >> > >>barrier
>> >> > >>of the run loop.
>> >> > >>
>> >> > >>Guozhang
>> >> > >>
>> >> > >>On Mon, Mar 16, 2015 at 9:41 PM, Jun Rao <j...@confluent.io
>> >> <javascript:;>> wrote:
>> >> > >>
>> >> > >>> Hmm, does that mean that after close(0), the sender thread is
>>not
>> >> > >>>necessary
>> >> > >>> gone? Normally, after closing an entity, we expect all internal
>> >> threads
>> >> > >>> associated with the entity are shut down completely.
>> >> > >>>
>> >> > >>> Thanks,
>> >> > >>>
>> >> > >>> Jun
>> >> > >>>
>> >> > >>> On Mon, Mar 16, 2015 at 3:18 PM, Jiangjie Qin
>> >> > >>><j...@linkedin.com.invalid>
>> >> > >>> wrote:
>> >> > >>>
>> >> > >>> > Hi Jun,
>> >> > >>> >
>> >> > >>> > Close(0) will set two flags in sender. Running=false and a
>>newly
>> >> > >>>added
>> >> > >>> > forceClose=true. It will also set accumulator.closed=true so
>>no
>> >> > >>>further
>> >> > >>> > producer.send() will succeed.
>> >> > >>> > The sender thread will finish executing all the callbacks in
>> >> current
>> >> > >>> batch
>> >> > >>> > of responses, then it will see the forceClose flag. It will
>>just
>> >> fail
>> >> > >>>all
>> >> > >>> > the incomplete batches in the producer and exit.
>> >> > >>> > So close(0) is a non-blocking call and sender thread will not
>> >>try
>> >> to
>> >> > >>>join
>> >> > >>> > itself in close(0).
>> >> > >>> >
>> >> > >>> > Thanks.
>> >> > >>> >
>> >> > >>> > Jiangjie (Becket) Qin
>> >> > >>> >
>> >> > >>> > On 3/16/15, 2:50 PM, "Jun Rao" <j...@confluent.io
>> <javascript:;>>
>> >> wrote:
>> >> > >>> >
>> >> > >>> > >How does close(0) work if it's called from the sender
>>thread?
>> >>If
>> >> > >>> close(0)
>> >> > >>> > >needs to wait for the sender thread to join, wouldn't this
>> >>cause a
>> >> > >>> > >deadlock?
>> >> > >>> > >
>> >> > >>> > >Thanks,
>> >> > >>> > >
>> >> > >>> > >Jun
>> >> > >>> > >
>> >> > >>> > >On Mon, Mar 16, 2015 at 2:26 PM, Jiangjie Qin
>> >> > >>><j...@linkedin.com.invalid
>> >> > >>> >
>> >> > >>> > >wrote:
>> >> > >>> > >
>> >> > >>> > >> Thanks Guozhang. It wouldn’t be as thoroughly considered
>> >>without
>> >> > >>> > >> discussing with you :)
>> >> > >>> > >>
>> >> > >>> > >> Jiangjie (Becket) Qin
>> >> > >>> > >>
>> >> > >>> > >> On 3/16/15, 1:07 PM, "Guozhang Wang" <wangg...@gmail.com
>> >> <javascript:;>> wrote:
>> >> > >>> > >>
>> >> > >>> > >> >Thanks Jiangjie,
>> >> > >>> > >> >
>> >> > >>> > >> >After talking to you offline on this, I have been
>>convinced
>> >>and
>> >> > >>> > >>changed my
>> >> > >>> > >> >preference to blocking. The immediate shutdown approach
>>does
>> >> have
>> >> > >>> some
>> >> > >>> > >> >unsafeness in some cases.
>> >> > >>> > >> >
>> >> > >>> > >> >Guozhang
>> >> > >>> > >> >
>> >> > >>> > >> >On Mon, Mar 16, 2015 at 11:50 AM, Jiangjie Qin
>> >> > >>> > >><j...@linkedin.com.invalid
>> >> > >>> > >> >
>> >> > >>> > >> >wrote:
>> >> > >>> > >> >
>> >> > >>> > >> >> It looks that the problem we want to solve and the
>> >>purpose we
>> >> > >>>want
>> >> > >>> to
>> >> > >>> > >> >> achieve is:
>> >> > >>> > >> >> If user uses close() in callback, we want to let user
>>be
>> >> aware
>> >> > >>>that
>> >> > >>> > >>they
>> >> > >>> > >> >> should use close(0) instead of close() in the callback.
>> >> > >>> > >> >>
>> >> > >>> > >> >> We have agreed that we will have an error log to inform
>> >>user
>> >> > >>>about
>> >> > >>> > >>this
>> >> > >>> > >> >> mis-usage. The options differ in the way how we can
>>force
>> >> user
>> >> > >>>to
>> >> > >>> > >>take a
>> >> > >>> > >> >> look at that error log.
>> >> > >>> > >> >> There are two scenarios:
>> >> > >>> > >> >> 1. User does not expect the program to exit.
>> >> > >>> > >> >> 2. User expect the program to exit.
>> >> > >>> > >> >>
>> >> > >>> > >> >> For scenario 1), blocking will probably delay the
>> >>discovery
>> >> of
>> >> > >>>the
>> >> > >>> > >> >> problem. Calling close(0) exposes the problem quicker.
>>In
>> >> this
>> >> > >>> > >>scenario
>> >> > >>> > >> >> producer just encounter a send failure when running
>> >>normally.
>> >> > >>> > >> >> For scenario 2), blocking will expose the problem
>>quick.
>> >> > >>>Calling
>> >> > >>> > >> >>close(-1)
>> >> > >>> > >> >> might hide the problem. This scenario might include: a)
>> >>Unit
>> >> > >>>test
>> >> > >>> > >>for a
>> >> > >>> > >> >> send failure. b) Message sending during a close() call
>> >>from a
>> >> > >>>user
>> >> > >>> > >> >>thread.
>> >> > >>> > >> >>
>> >> > >>> > >> >> So as a summary table:
>> >> > >>> > >> >>
>> >> > >>> > >> >>                   Scenario 1)
>> >>  Scenario
>> >> > >>>2)
>> >> > >>> > >> >>
>> >> > >>> > >> >> Blocking      Delay problem discovery
>>Guaranteed
>> >> > >>>problem
>> >> > >>> > >> >>discovery
>> >> > >>> > >> >>
>> >> > >>> > >> >> Close(-1)     Immediate problem discovery     Problem
>> >>might
>> >> be
>> >> > >>> hidden
>> >> > >>> > >> >>
>> >> > >>> > >> >>
>> >> > >>> > >> >> Personally I prefer blocking because it seems providing
>> >>more
>> >> > >>> > >>guarantees
>> >> > >>> > >> >> and safer.
>> >> > >>> > >> >>
>> >> > >>> > >> >> Thanks.
>> >> > >>> > >> >>
>> >> > >>> > >> >> Jiangjie (Becket) Qin
>> >> > >>> > >> >>
>> >> > >>> > >> >>
>> >> > >>> > >> >> On 3/16/15, 10:11 AM, "Guozhang Wang"
>><wangg...@gmail.com
>> >> <javascript:;>>
>> >> > >>>wrote:
>> >> > >>> > >> >>
>> >> > >>> > >> >> >HI Jiangjie,
>> >> > >>> > >> >> >
>> >> > >>> > >> >> >As far as I understand calling close() in the
>>ioThread is
>> >> not
>> >> > >>> > >>common,
>> >> > >>> > >> >>as
>> >> > >>> > >> >> >it
>> >> > >>> > >> >> >may only trigger when we saw some non-retriable error.
>> >>Hence
>> >> > >>>when
>> >> > >>> > >>user
>> >> > >>> > >> >>run
>> >> > >>> > >> >> >their program it is unlikely that close() will be
>> >>triggered
>> >> > >>>and
>> >> > >>> > >>problem
>> >> > >>> > >> >> >will be detected. So it seems to me that from the
>>error
>> >> > >>>detection
>> >> > >>> > >> >>aspect
>> >> > >>> > >> >> >these two options seems to be the same as people will
>> >> usually
>> >> > >>> > >>detect it
>> >> > >>> > >> >> >from the producer metrics all dropping to 0.
>> >> > >>> > >> >> >
>> >> > >>> > >> >> >Guozhang
>> >> > >>> > >> >> >
>> >> > >>> > >> >> >On Mon, Mar 16, 2015 at 9:52 AM, Jiangjie Qin
>> >> > >>> > >> >><j...@linkedin.com.invalid>
>> >> > >>> > >> >> >wrote:
>> >> > >>> > >> >> >
>> >> > >>> > >> >> >> It seems there are two options we can choose from
>>when
>> >> > >>>close()
>> >> > >>> is
>> >> > >>> > >> >>called
>> >> > >>> > >> >> >> from sender thread (callback):
>> >> > >>> > >> >> >> 1. Log an error and close the producer using
>>close(-1)
>> >> > >>> > >> >> >> 2. Log an error and block.
>> >> > >>> > >> >> >> (Throwing an exception will not work because we
>>catch
>> >>all
>> >> > >>>the
>> >> > >>> > >> >>exception
>> >> > >>> > >> >> >> thrown from user callback. It will just lead to an
>> >>error
>> >> > >>>log.)
>> >> > >>> > >> >> >>
>> >> > >>> > >> >> >> My concern for the first option is that the producer
>> >>will
>> >> be
>> >> > >>> > >>closed
>> >> > >>> > >> >>even
>> >> > >>> > >> >> >> if we logged and error. I am wondering if some user
>> >>would
>> >> > >>>not
>> >> > >>> even
>> >> > >>> > >> >>take
>> >> > >>> > >> >> >>a
>> >> > >>> > >> >> >> look at the log if producer is closed normally.
>>Because
>> >> from
>> >> > >>>the
>> >> > >>> > >> >> >>programs
>> >> > >>> > >> >> >> behavior, everything looks good. If that is the
>>case,
>> >>the
>> >> > >>>error
>> >> > >>> > >> >>message
>> >> > >>> > >> >> >>we
>> >> > >>> > >> >> >> logged probably will just be ignored until some day
>> >>when
>> >> > >>>people
>> >> > >>> > >>check
>> >> > >>> > >> >> >>the
>> >> > >>> > >> >> >> log and see it.
>> >> > >>> > >> >> >>
>> >> > >>> > >> >> >> As for the second option, because producer does not
>> >>close
>> >> > >>>but
>> >> > >>> > >>blocks.
>> >> > >>> > >> >> >>User
>> >> > >>> > >> >> >> will notice this the first time they run the
>>program.
>> >>They
>> >> > >>> > >>probably
>> >> > >>> > >> >>will
>> >> > >>> > >> >> >> look at the log to see why producer could not be
>>closed
>> >> and
>> >> > >>>they
>> >> > >>> > >>will
>> >> > >>> > >> >> >>see
>> >> > >>> > >> >> >> the error log we put there. So they will get
>>informed
>> >> about
>> >> > >>>this
>> >> > >>> > >> >> >>mis-usage
>> >> > >>> > >> >> >> of close() in sender thread the first time they run
>>the
>> >> code
>> >> > >>> > >>instead
>> >> > >>> > >> >>of
>> >> > >>> > >> >> >> some time later.
>> >> > >>> > >> >> >>
>> >> > >>> > >> >> >> Personally I prefer the second one because it is
>>more
>> >> > >>>obvious
>> >> > >>> that
>> >> > >>> > >> >> >> something was wrong.
>> >> > >>> > >> >> >>
>> >> > >>> > >> >> >> Jiangjie (Becket) Qin
>> >> > >>> > >> >> >>
>> >> > >>> > >> >> >> On 3/15/15, 4:27 PM, "Guozhang Wang"
>> >><wangg...@gmail.com
>> >> <javascript:;>>
>> >> > >>> wrote:
>> >> > >>> > >> >> >>
>> >> > >>> > >> >> >> >Yeah I agree we should not silently change the
>> >>behavior
>> >> of
>> >> > >>>the
>> >> > >>> > >> >>function
>> >> > >>> > >> >> >> >with the given parameters; and I would prefer
>> >> > >>> > >> >> >>error-logging-and-shutdown
>> >> > >>> > >> >> >> >over blocking when close(>0) is used, since as Neha
>> >> > >>>suggested
>> >> > >>> > >> >>blocking
>> >> > >>> > >> >> >> >would also not proceed with sending any data, bu
>>will
>> >> just
>> >> > >>>let
>> >> > >>> > >> >>users to
>> >> > >>> > >> >> >> >realize the issue later than sooner.
>> >> > >>> > >> >> >> >
>> >> > >>> > >> >> >> >On Sun, Mar 15, 2015 at 3:25 PM, Neha Narkhede
>> >> > >>> > >><n...@confluent.io <javascript:;>>
>> >> > >>> > >> >> >>wrote:
>> >> > >>> > >> >> >> >
>> >> > >>> > >> >> >> >> >
>> >> > >>> > >> >> >> >> > And I also agree it is better if we can make
>> >>producer
>> >> > >>>block
>> >> > >>> > >>when
>> >> > >>> > >> >> >> >> > close() is called from sender thread so user
>>will
>> >> > >>>notice
>> >> > >>> > >> >>something
>> >> > >>> > >> >> >> >>went
>> >> > >>> > >> >> >> >> > wrong.
>> >> > >>> > >> >> >> >>
>> >> > >>> > >> >> >> >>
>> >> > >>> > >> >> >> >> This isn't a great experience either. Why can't
>>we
>> >>just
>> >> > >>>throw
>> >> > >>> > >>an
>> >> > >>> > >> >> >> >>exception
>> >> > >>> > >> >> >> >> for a behavior we know is incorrect and we'd like
>> >>the
>> >> > >>>user to
>> >> > >>> > >> >>know.
>> >> > >>> > >> >> >> >> Blocking as a means of doing that seems wrong and
>> >> > >>>annoying.
>> >> > >>> > >> >> >> >>
>> >> > >>> > >> >> >> >> On Sun, Mar 15, 2015 at 11:56 AM, Jay Kreps
>> >> > >>> > >><jay.kr...@gmail.com <javascript:;>>
>> >> > >>> > >> >> >> wrote:
>> >> > >>> > >> >> >> >>
>> >> > >>> > >> >> >> >> > Cool.
>> >> > >>> > >> >> >> >> >
>> >> > >>> > >> >> >> >> > I think blocking is good or alternately
>>throwing
>> >>an
>> >> > >>> exception
>> >> > >>> > >> >> >>directly
>> >> > >>> > >> >> >> >> from
>> >> > >>> > >> >> >> >> > close(). Basically I would just worry about
>>subtly
>> >> > >>>doing
>> >> > >>> > >> >>something
>> >> > >>> > >> >> >> >> slightly
>> >> > >>> > >> >> >> >> > different from what the user asked for as it
>>will
>> >>be
>> >> > >>>hard
>> >> > >>> to
>> >> > >>> > >> >>notice
>> >> > >>> > >> >> >> >>that
>> >> > >>> > >> >> >> >> > behavior difference.
>> >> > >>> > >> >> >> >> >
>> >> > >>> > >> >> >> >> > -Jay
>> >> > >>> > >> >> >> >> >
>> >> > >>> > >> >> >> >> > On Sat, Mar 14, 2015 at 5:48 PM, Jiangjie Qin
>> >> > >>> > >> >> >> >><j...@linkedin.com.invalid
>> >> > >>> > >> >> >> >> >
>> >> > >>> > >> >> >> >> > wrote:
>> >> > >>> > >> >> >> >> >
>> >> > >>> > >> >> >> >> > > Hi Jay,
>> >> > >>> > >> >> >> >> > >
>> >> > >>> > >> >> >> >> > > I have modified the KIP as you suggested. I
>> >>thinks
>> >> as
>> >> > >>> long
>> >> > >>> > >>as
>> >> > >>> > >> >>we
>> >> > >>> > >> >> >> >>have
>> >> > >>> > >> >> >> >> > > consistent define for timeout across Kafka
>> >> interface,
>> >> > >>> there
>> >> > >>> > >> >>would
>> >> > >>> > >> >> >> >>be no
>> >> > >>> > >> >> >> >> > > problem. And I also agree it is better if we
>>can
>> >> make
>> >> > >>> > >>producer
>> >> > >>> > >> >> >>block
>> >> > >>> > >> >> >> >> when
>> >> > >>> > >> >> >> >> > > close() is called from sender thread so user
>> >>will
>> >> > >>>notice
>> >> > >>> > >> >> >>something
>> >> > >>> > >> >> >> >>went
>> >> > >>> > >> >> >> >> > > wrong.
>> >> > >>> > >> >> >> >> > >
>> >> > >>> > >> >> >> >> > > Thanks.
>> >> > >>> > >> >> >> >> > >
>> >> > >>> > >> >> >> >> > > Jiangjie (Becket) Qin
>> >> > >>> > >> >> >> >> > >
>> >> > >>> > >> >> >> >> > > On 3/14/15, 11:37 AM, "Jay Kreps"
>> >> > >>><jay.kr...@gmail.com <javascript:;>>
>> >> > >>> > >> wrote:
>> >> > >>> > >> >> >> >> > >
>> >> > >>> > >> >> >> >> > > >Hey Jiangjie,
>> >> > >>> > >> >> >> >> > > >
>> >> > >>> > >> >> >> >> > > >I think this is going to be very confusing
>>that
>> >> > >>> > >> >> >> >> > > >  close(0) waits indefinitely and
>> >> > >>> > >> >> >> >> > > >  close(-1) waits for 0.
>> >> > >>> > >> >> >> >> > > >I understand this appears in other apis,
>>but it
>> >> is a
>> >> > >>> > >>constant
>> >> > >>> > >> >> >> >>cause of
>> >> > >>> > >> >> >> >> > > >bugs. Let's not repeat that mistake.
>> >> > >>> > >> >> >> >> > > >
>> >> > >>> > >> >> >> >> > > >Let's make close(0) wait for 0. We don't
>>need a
>> >> way
>> >> > >>>to
>> >> > >>> > >>wait
>> >> > >>> > >> >> >> >> indefinitely
>> >> > >>> > >> >> >> >> > > >as
>> >> > >>> > >> >> >> >> > > >we already have close() so having a magical
>> >> constant
>> >> > >>>for
>> >> > >>> > >> >>that is
>> >> > >>> > >> >> >> >> > > >redundant.
>> >> > >>> > >> >> >> >> > > >
>> >> > >>> > >> >> >> >> > > >Calling close() from the I/O thread was
>>already
>> >> > >>>possible
>> >> > >>> > >>and
>> >> > >>> > >> >> >>would
>> >> > >>> > >> >> >> >> block
>> >> > >>> > >> >> >> >> > > >indefinitely. I think trying to silently
>>change
>> >> the
>> >> > >>> > >>behavior
>> >> > >>> > >> >>is
>> >> > >>> > >> >> >> >> probably
>> >> > >>> > >> >> >> >> > > >not right. I.e. if the user calls close() in
>> >>the
>> >> > >>> callback
>> >> > >>> > >> >>there
>> >> > >>> > >> >> >>is
>> >> > >>> > >> >> >> >> > > >actually
>> >> > >>> > >> >> >> >> > > >some misunderstanding and they need to think
>> >>more,
>> >> > >>> > >>silently
>> >> > >>> > >> >> >>making
>> >> > >>> > >> >> >> >> this
>> >> > >>> > >> >> >> >> > > >not
>> >> > >>> > >> >> >> >> > > >block will hide the problem from them which
>>is
>> >>the
>> >> > >>> > >>opposite
>> >> > >>> > >> >>of
>> >> > >>> > >> >> >> >>what we
>> >> > >>> > >> >> >> >> > > >want.
>> >> > >>> > >> >> >> >> > > >
>> >> > >>> > >> >> >> >> > > >-Jay
>> >> > >>> > >> >> >> >> > > >
>> >> > >>> > >> >> >> >> > > >On Thu, Mar 12, 2015 at 1:49 AM, Jiangjie
>>Qin
>> >> > >>> > >> >> >> >> <j...@linkedin.com.invalid
>> >> > >>> > >> >> >> >> > >
>> >> > >>> > >> >> >> >> > > >wrote:
>> >> > >>> > >> >> >> >> > > >
>> >> > >>> > >> >> >> >> > > >> Hey Joe & Jay,
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > > >> Thanks for the comments on the voting
>>thread.
>> >> > >>>Since it
>> >> > >>> > >> >>seems
>> >> > >>> > >> >> >>we
>> >> > >>> > >> >> >> >> > probably
>> >> > >>> > >> >> >> >> > > >> will have more discussion on this, I am
>>just
>> >> > >>>replying
>> >> > >>> > >>from
>> >> > >>> > >> >>the
>> >> > >>> > >> >> >> >> > > >>discussion
>> >> > >>> > >> >> >> >> > > >> thread here.
>> >> > >>> > >> >> >> >> > > >> I’ve updated the KIP page to make it less
>> >>like
>> >> > >>> > >>half-baked,
>> >> > >>> > >> >> >> >>apologize
>> >> > >>> > >> >> >> >> > for
>> >> > >>> > >> >> >> >> > > >> the rush...
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > > >> The contract in current KIP is:
>> >> > >>> > >> >> >> >> > > >>   1. close() - wait until all requests
>>either
>> >> are
>> >> > >>>sent
>> >> > >>> > >>or
>> >> > >>> > >> >> >>reach
>> >> > >>> > >> >> >> >> > request
>> >> > >>> > >> >> >> >> > > >> timeout.
>> >> > >>> > >> >> >> >> > > >>   2. close(-1, TimeUnit.MILLISECONDS) -
>>close
>> >> > >>> > >>immediately
>> >> > >>> > >> >> >> >> > > >>   3. close(0, TimeUnit.MILLISECONDS) -
>> >> equivalent
>> >> > >>>to
>> >> > >>> > >> >>close(),
>> >> > >>> > >> >> >> >>i.e.
>> >> > >>> > >> >> >> >> > Wait
>> >> > >>> > >> >> >> >> > > >> until all requests are sent or reach
>>request
>> >> > >>>timeout
>> >> > >>> > >> >> >> >> > > >>   4. close(5, TimeUnit.MILLISECONDS) - try
>> >>the
>> >> > >>>best to
>> >> > >>> > >> >>finish
>> >> > >>> > >> >> >> >> sending
>> >> > >>> > >> >> >> >> > > >>in 5
>> >> > >>> > >> >> >> >> > > >> milliseconds, if something went wrong,
>>just
>> >> > >>>shutdown
>> >> > >>> the
>> >> > >>> > >> >> >>producer
>> >> > >>> > >> >> >> >> > > >>anyway,
>> >> > >>> > >> >> >> >> > > >> my callback will handle the failures.
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > > >> About how we define what timeout value
>>stands
>> >> for,
>> >> > >>>I
>> >> > >>> > >> >>actually
>> >> > >>> > >> >> >> >> > struggled
>> >> > >>> > >> >> >> >> > > >>a
>> >> > >>> > >> >> >> >> > > >> little bit when wrote the patch.
>>Intuitively,
>> >> > >>>close(0)
>> >> > >>> > >> >>should
>> >> > >>> > >> >> >> >>mean
>> >> > >>> > >> >> >> >> > > >> immediately, however it seems that all the
>> >> > >>>existing
>> >> > >>> java
>> >> > >>> > >> >>class
>> >> > >>> > >> >> >> >>have
>> >> > >>> > >> >> >> >> > this
>> >> > >>> > >> >> >> >> > > >> convention of timeout=0 means no timeout
>>or
>> >> never
>> >> > >>> > >>timeout
>> >> > >>> > >> >> >> >> > > >>(Thread.join(0),
>> >> > >>> > >> >> >> >> > > >> Object.wait(0), etc.) So here the dilemma
>>is
>> >> > >>>either we
>> >> > >>> > >> >>follow
>> >> > >>> > >> >> >>the
>> >> > >>> > >> >> >> >> > > >> intuition or we follow the convention.
>>What I
>> >> > >>>chose is
>> >> > >>> > >>to
>> >> > >>> > >> >> >>follow
>> >> > >>> > >> >> >> >>the
>> >> > >>> > >> >> >> >> > > >> convention but document the interface to
>>let
>> >> user
>> >> > >>>be
>> >> > >>> > >>aware
>> >> > >>> > >> >>of
>> >> > >>> > >> >> >>the
>> >> > >>> > >> >> >> >> > usage.
>> >> > >>> > >> >> >> >> > > >> The reason is that I think
>>producer.close()
>> >>is a
>> >> > >>> public
>> >> > >>> > >> >> >> >>interface so
>> >> > >>> > >> >> >> >> > it
>> >> > >>> > >> >> >> >> > > >> might be better to follow java convention.
>> >> Whereas
>> >> > >>> > >> >>selector is
>> >> > >>> > >> >> >> >>not a
>> >> > >>> > >> >> >> >> > > >> public interface that used by user, so as
>> >>long
>> >> as
>> >> > >>>it
>> >> > >>> > >>makes
>> >> > >>> > >> >> >>sense
>> >> > >>> > >> >> >> >>to
>> >> > >>> > >> >> >> >> > us,
>> >> > >>> > >> >> >> >> > > >>it
>> >> > >>> > >> >> >> >> > > >> is less a problem to be different from
>>java
>> >> > >>> convention.
>> >> > >>> > >> >>That
>> >> > >>> > >> >> >>said
>> >> > >>> > >> >> >> >> > since
>> >> > >>> > >> >> >> >> > > >> consumer.poll(timeout) is also a public
>> >> interface,
>> >> > >>>I
>> >> > >>> > >>think
>> >> > >>> > >> >>it
>> >> > >>> > >> >> >> >>also
>> >> > >>> > >> >> >> >> > makes
>> >> > >>> > >> >> >> >> > > >> sense to make producer.close() to have the
>> >>same
>> >> > >>> > >>definition
>> >> > >>> > >> >>of
>> >> > >>> > >> >> >> >> > > >> consumer.poll(timeout).
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > > >> The main argument for keeping a timeout in
>> >>close
>> >> > >>>would
>> >> > >>> > >>be
>> >> > >>> > >> >> >> >>separating
>> >> > >>> > >> >> >> >> > the
>> >> > >>> > >> >> >> >> > > >> close timeout from request timeout, which
>> >> probably
>> >> > >>> makes
>> >> > >>> > >> >> >>sense. I
>> >> > >>> > >> >> >> >> > would
>> >> > >>> > >> >> >> >> > > >> guess typically the request timeout would
>>be
>> >> long
>> >> > >>> (e.g.
>> >> > >>> > >>60
>> >> > >>> > >> >> >> >>seconds)
>> >> > >>> > >> >> >> >> > > >> because we might want to consider retries
>> >>with
>> >> > >>>back
>> >> > >>> off
>> >> > >>> > >> >>time.
>> >> > >>> > >> >> >>If
>> >> > >>> > >> >> >> >>we
>> >> > >>> > >> >> >> >> > have
>> >> > >>> > >> >> >> >> > > >> multiple batches in accumulator, in worst
>> >>case
>> >> > >>>that
>> >> > >>> > >>could
>> >> > >>> > >> >>take
>> >> > >>> > >> >> >> >>up to
>> >> > >>> > >> >> >> >> > > >> several minutes to complete all the
>>requests.
>> >> But
>> >> > >>>when
>> >> > >>> > >>we
>> >> > >>> > >> >> >>close a
>> >> > >>> > >> >> >> >> > > >> producer, we might not want to wait for
>>that
>> >> long
>> >> > >>>as
>> >> > >>> it
>> >> > >>> > >> >>might
>> >> > >>> > >> >> >> >>cause
>> >> > >>> > >> >> >> >> > some
>> >> > >>> > >> >> >> >> > > >> other problem like deployment tool
>>timeout.
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > > >> There is also a subtle difference between
>> >> > >>> close(timeout)
>> >> > >>> > >> >>and
>> >> > >>> > >> >> >> >> > > >> flush(timeout). The only purpose for
>>flush()
>> >>is
>> >> to
>> >> > >>> write
>> >> > >>> > >> >>data
>> >> > >>> > >> >> >>to
>> >> > >>> > >> >> >> >>the
>> >> > >>> > >> >> >> >> > > >> broker, so it makes perfect sense to wait
>> >>until
>> >> > >>> request
>> >> > >>> > >> >> >>timeout.
>> >> > >>> > >> >> >> >>I
>> >> > >>> > >> >> >> >> > think
>> >> > >>> > >> >> >> >> > > >> that is why flush(timeout) looks strange.
>>On
>> >>the
>> >> > >>>other
>> >> > >>> > >> >>hand,
>> >> > >>> > >> >> >>the
>> >> > >>> > >> >> >> >>top
>> >> > >>> > >> >> >> >> > > >> priority for close() is to close the
>>producer
>> >> > >>>rather
>> >> > >>> > >>than
>> >> > >>> > >> >> >>flush()
>> >> > >>> > >> >> >> >> > data,
>> >> > >>> > >> >> >> >> > > >>so
>> >> > >>> > >> >> >> >> > > >> close(timeout) gives guarantee on bounded
>> >> waiting
>> >> > >>>for
>> >> > >>> > >>its
>> >> > >>> > >> >>main
>> >> > >>> > >> >> >> >>job.
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > > >> Sorry for the confusion about forceClose
>> >>flag.
>> >> It
>> >> > >>>is
>> >> > >>> > >>not a
>> >> > >>> > >> >> >>public
>> >> > >>> > >> >> >> >> > > >> interface. I mentioned it in Proposed
>>Changes
>> >> > >>>section
>> >> > >>> > >> >>which I
>> >> > >>> > >> >> >> >> thought
>> >> > >>> > >> >> >> >> > > >>was
>> >> > >>> > >> >> >> >> > > >> supposed to provide implementation
>>details.
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > > >> Thanks again for all the comments and
>> >> suggestions!
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > > >> Jiangjie (Becket) Qin
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > > >> On 3/10/15, 8:57 PM, "Jiangjie Qin" <
>> >> > >>> j...@linkedin.com <javascript:;>>
>> >> > >>> > >> >> wrote:
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > > >> >The KIP page has been updated per Jay¹s
>> >> comments.
>> >> > >>> > >> >> >> >> > > >> >I¹d like to initiate the voting process
>>if
>> >>no
>> >> > >>>further
>> >> > >>> > >> >> >>comments
>> >> > >>> > >> >> >> >>are
>> >> > >>> > >> >> >> >> > > >> >received by tomorrow.
>> >> > >>> > >> >> >> >> > > >> >
>> >> > >>> > >> >> >> >> > > >> >Jiangjie (Becket) Qin
>> >> > >>> > >> >> >> >> > > >> >
>> >> > >>> > >> >> >> >> > > >> >On 3/8/15, 9:45 AM, "Jay Kreps"
>> >> > >>><jay.kr...@gmail.com <javascript:;>
>> >> > >>> >
>> >> > >>> > >> >>wrote:
>> >> > >>> > >> >> >> >> > > >> >
>> >> > >>> > >> >> >> >> > > >> >>Hey Jiangjie,
>> >> > >>> > >> >> >> >> > > >> >>
>> >> > >>> > >> >> >> >> > > >> >>Can you capture the full motivation and
>>use
>> >> > >>>cases
>> >> > >>> for
>> >> > >>> > >>the
>> >> > >>> > >> >> >> >>feature?
>> >> > >>> > >> >> >> >> > > >>This
>> >> > >>> > >> >> >> >> > > >> >>mentions your interest in having a way
>>of
>> >> > >>>aborting
>> >> > >>> > >>from
>> >> > >>> > >> >> >>inside
>> >> > >>> > >> >> >> >>the
>> >> > >>> > >> >> >> >> > > >> >>Callback. But it doesn't really explain
>> >>that
>> >> > >>>usage
>> >> > >>> or
>> >> > >>> > >>why
>> >> > >>> > >> >> >>other
>> >> > >>> > >> >> >> >> > people
>> >> > >>> > >> >> >> >> > > >> >>would want to do that. It also doesn't
>>list
>> >> the
>> >> > >>> > >>primary
>> >> > >>> > >> >>use
>> >> > >>> > >> >> >> >>case
>> >> > >>> > >> >> >> >> for
>> >> > >>> > >> >> >> >> > > >> >>having
>> >> > >>> > >> >> >> >> > > >> >>close with a bounded timeout which was
>>to
>> >> avoid
>> >> > >>> > >>blocking
>> >> > >>> > >> >>too
>> >> > >>> > >> >> >> >>long
>> >> > >>> > >> >> >> >> on
>> >> > >>> > >> >> >> >> > > >> >>shutdown.
>> >> > >>> > >> >> >> >> > > >> >>
>> >> > >>> > >> >> >> >> > > >> >>-Jay
>> >> > >>> > >> >> >> >> > > >> >>
>> >> > >>> > >> >> >> >> > > >> >>
>> >> > >>> > >> >> >> >> > > >> >>
>> >> > >>> > >> >> >> >> > > >> >>On Sat, Mar 7, 2015 at 12:25 PM,
>>Jiangjie
>> >>Qin
>> >> > >>> > >> >> >> >> > > >><j...@linkedin.com.invalid
>> >> > >>> > >> >> >> >> > > >> >
>> >> > >>> > >> >> >> >> > > >> >>wrote:
>> >> > >>> > >> >> >> >> > > >> >>
>> >> > >>> > >> >> >> >> > > >> >>> Hi,
>> >> > >>> > >> >> >> >> > > >> >>>
>> >> > >>> > >> >> >> >> > > >> >>> I just created a KIP for adding a
>> >> > >>>close(timeout)
>> >> > >>> to
>> >> > >>> > >>new
>> >> > >>> > >> >> >> >> producer.
>> >> > >>> > >> >> >> >> > > >>Most
>> >> > >>> > >> >> >> >> > > >> >>>of
>> >> > >>> > >> >> >> >> > > >> >>> the previous discussions are in
>> >>KAFKA-1660
>> >> > >>>where
>> >> > >>> > >>Parth
>> >> > >>> > >> >> >> >> Brahmbhatt
>> >> > >>> > >> >> >> >> > > >>has
>> >> > >>> > >> >> >> >> > > >> >>> already done a lot of work.
>> >> > >>> > >> >> >> >> > > >> >>> Since this is an interface change so
>>we
>> >>are
>> >> > >>>going
>> >> > >>> > >> >>through
>> >> > >>> > >> >> >>the
>> >> > >>> > >> >> >> >> KIP
>> >> > >>> > >> >> >> >> > > >> >>>process.
>> >> > >>> > >> >> >> >> > > >> >>> Here is the KIP link:
>> >> > >>> > >> >> >> >> > > >> >>>
>> >> > >>> > >> >> >> >> > > >> >>>
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > >
>> >> > >>> > >> >> >> >>
>> >> > >>> > >> >> >>
>> >> > >>> > >> >>
>> >> > >>> > >>
>> >> > >>> >
>> >> > >>>
>> >> >
>> 
>>>>https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=537397
>>>>8
>> >> > >>> > >> >> >> >> > > >> >>>2
>> >> > >>> > >> >> >> >> > > >> >>>
>> >> > >>> > >> >> >> >> > > >> >>> Thanks.
>> >> > >>> > >> >> >> >> > > >> >>>
>> >> > >>> > >> >> >> >> > > >> >>> Jiangjie (Becket) Qin
>> >> > >>> > >> >> >> >> > > >> >>>
>> >> > >>> > >> >> >> >> > > >> >
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > > >>
>> >> > >>> > >> >> >> >> > >
>> >> > >>> > >> >> >> >> > >
>> >> > >>> > >> >> >> >> >
>> >> > >>> > >> >> >> >>
>> >> > >>> > >> >> >> >>
>> >> > >>> > >> >> >> >>
>> >> > >>> > >> >> >> >> --
>> >> > >>> > >> >> >> >> Thanks,
>> >> > >>> > >> >> >> >> Neha
>> >> > >>> > >> >> >> >>
>> >> > >>> > >> >> >> >
>> >> > >>> > >> >> >> >
>> >> > >>> > >> >> >> >
>> >> > >>> > >> >> >> >--
>> >> > >>> > >> >> >> >-- Guozhang
>> >> > >>> > >> >> >>
>> >> > >>> > >> >> >>
>> >> > >>> > >> >> >
>> >> > >>> > >> >> >
>> >> > >>> > >> >> >--
>> >> > >>> > >> >> >-- Guozhang
>> >> > >>> > >> >>
>> >> > >>> > >> >>
>> >> > >>> > >> >
>> >> > >>> > >> >
>> >> > >>> > >> >--
>> >> > >>> > >> >-- Guozhang
>> >> > >>> > >>
>> >> > >>> > >>
>> >> > >>> >
>> >> > >>> >
>> >> > >>>
>> >> > >>
>> >> > >>
>> >> > >>
>> >> > >>--
>> >> > >>-- Guozhang
>> >> > >
>> >> >
>> >> >
>> >>
>> >
>> >
>> >--
>> >Sent from Gmail Mobile
>>
>>

Reply via email to