Hey group,

I am planning on starting a voting thread tomorrow. Please do reply if you
feel there is anything left to discuss.

Best,
Stanislav

On Fri, Jul 27, 2018 at 11:05 PM Stanislav Kozlovski <stanis...@confluent.io>
wrote:

> Hey, Ray
>
> Thanks for pointing that out, it's fixed now
>
> Best,
> Stanislav
>
> On Fri, Jul 27, 2018 at 9:43 PM Ray Chiang <rchi...@apache.org> wrote:
>
>> Thanks.  Can you fix the link in the "KIPs under discussion" table on
>> the main KIP landing page
>> <
>> https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Improvement+Proposals#>?
>>
>> I tried, but the Wiki won't let me.
>>
>> -Ray
>>
>> On 7/26/18 2:01 PM, Stanislav Kozlovski wrote:
>> > Hey guys,
>> >
>> > @Colin - good point. I added some sentences mentioning recent
>> improvements
>> > in the introductory section.
>> >
>> > *Disk Failure* - I tend to agree with what Colin said - once a disk
>> fails,
>> > you don't want to work with it again. As such, I've changed my mind and
>> > believe that we should mark the LogDir (assume its a disk) as offline on
>> > the first `IOException` encountered. This is the LogCleaner's current
>> > behavior. We shouldn't change that.
>> >
>> > *Respawning Threads* - I believe we should never re-spawn a thread. The
>> > correct approach in my mind is to either have it stay dead or never let
>> it
>> > die in the first place.
>> >
>> > *Uncleanable-partition-names metric* - Colin is right, this metric is
>> > unneeded. Users can monitor the `uncleanable-partitions-count` metric
>> and
>> > inspect logs.
>> >
>> >
>> > Hey Ray,
>> >
>> >> 2) I'm 100% with James in agreement with setting up the LogCleaner to
>> >> skip over problematic partitions instead of dying.
>> > I think we can do this for every exception that isn't `IOException`.
>> This
>> > will future-proof us against bugs in the system and potential other
>> errors.
>> > Protecting yourself against unexpected failures is always a good thing
>> in
>> > my mind, but I also think that protecting yourself against bugs in the
>> > software is sort of clunky. What does everybody think about this?
>> >
>> >> 4) The only improvement I can think of is that if such an
>> >> error occurs, then have the option (configuration setting?) to create a
>> >> <log_segment>.skip file (or something similar).
>> > This is a good suggestion. Have others also seen corruption be generally
>> > tied to the same segment?
>> >
>> > On Wed, Jul 25, 2018 at 11:55 AM Dhruvil Shah <dhru...@confluent.io>
>> wrote:
>> >
>> >> For the cleaner thread specifically, I do not think respawning will
>> help at
>> >> all because we are more than likely to run into the same issue again
>> which
>> >> would end up crashing the cleaner. Retrying makes sense for transient
>> >> errors or when you believe some part of the system could have healed
>> >> itself, both of which I think are not true for the log cleaner.
>> >>
>> >> On Wed, Jul 25, 2018 at 11:08 AM Ron Dagostino <rndg...@gmail.com>
>> wrote:
>> >>
>> >>> <<<respawning threads is likely to make things worse, by putting you
>> in
>> >> an
>> >>> infinite loop which consumes resources and fires off continuous log
>> >>> messages.
>> >>> Hi Colin.  In case it could be relevant, one way to mitigate this
>> effect
>> >> is
>> >>> to implement a backoff mechanism (if a second respawn is to occur then
>> >> wait
>> >>> for 1 minute before doing it; then if a third respawn is to occur wait
>> >> for
>> >>> 2 minutes before doing it; then 4 minutes, 8 minutes, etc. up to some
>> max
>> >>> wait time).
>> >>>
>> >>> I have no opinion on whether respawn is appropriate or not in this
>> >> context,
>> >>> but a mitigation like the increasing backoff described above may be
>> >>> relevant in weighing the pros and cons.
>> >>>
>> >>> Ron
>> >>>
>> >>> On Wed, Jul 25, 2018 at 1:26 PM Colin McCabe <cmcc...@apache.org>
>> wrote:
>> >>>
>> >>>> On Mon, Jul 23, 2018, at 23:20, James Cheng wrote:
>> >>>>> Hi Stanislav! Thanks for this KIP!
>> >>>>>
>> >>>>> I agree that it would be good if the LogCleaner were more tolerant
>> of
>> >>>>> errors. Currently, as you said, once it dies, it stays dead.
>> >>>>>
>> >>>>> Things are better now than they used to be. We have the metric
>> >>>>>        kafka.log:type=LogCleanerManager,name=time-since-last-run-ms
>> >>>>> which we can use to tell us if the threads are dead. And as of
>> 1.1.0,
>> >>> we
>> >>>>> have KIP-226, which allows you to restart the log cleaner thread,
>> >>>>> without requiring a broker restart.
>> >>>>>
>> >>
>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-226+-+Dynamic+Broker+Configuration
>> >>>>> <
>> >>
>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-226+-+Dynamic+Broker+Configuration
>> >>>>
>> >>>>> I've only read about this, I haven't personally tried it.
>> >>>> Thanks for pointing this out, James!  Stanislav, we should probably
>> >> add a
>> >>>> sentence or two mentioning the KIP-226 changes somewhere in the KIP.
>> >>> Maybe
>> >>>> in the intro section?
>> >>>>
>> >>>> I think it's clear that requiring the users to manually restart the
>> log
>> >>>> cleaner is not a very good solution.  But it's good to know that
>> it's a
>> >>>> possibility on some older releases.
>> >>>>
>> >>>>> Some comments:
>> >>>>> * I like the idea of having the log cleaner continue to clean as
>> many
>> >>>>> partitions as it can, skipping over the problematic ones if
>> possible.
>> >>>>>
>> >>>>> * If the log cleaner thread dies, I think it should automatically be
>> >>>>> revived. Your KIP attempts to do that by catching exceptions during
>> >>>>> execution, but I think we should go all the way and make sure that a
>> >>> new
>> >>>>> one gets created, if the thread ever dies.
>> >>>> This is inconsistent with the way the rest of Kafka works.  We don't
>> >>>> automatically re-create other threads in the broker if they
>> terminate.
>> >>> In
>> >>>> general, if there is a serious bug in the code, respawning threads is
>> >>>> likely to make things worse, by putting you in an infinite loop which
>> >>>> consumes resources and fires off continuous log messages.
>> >>>>
>> >>>>> * It might be worth trying to re-clean the uncleanable partitions.
>> >> I've
>> >>>>> seen cases where an uncleanable partition later became cleanable. I
>> >>>>> unfortunately don't remember how that happened, but I remember being
>> >>>>> surprised when I discovered it. It might have been something like a
>> >>>>> follower was uncleanable but after a leader election happened, the
>> >> log
>> >>>>> truncated and it was then cleanable again. I'm not sure.
>> >>>> James, I disagree.  We had this behavior in the Hadoop Distributed
>> File
>> >>>> System (HDFS) and it was a constant source of user problems.
>> >>>>
>> >>>> What would happen is disks would just go bad over time.  The DataNode
>> >>>> would notice this and take them offline.  But then, due to some
>> >>>> "optimistic" code, the DataNode would periodically try to re-add them
>> >> to
>> >>>> the system.  Then one of two things would happen: the disk would just
>> >>> fail
>> >>>> immediately again, or it would appear to work and then fail after a
>> >> short
>> >>>> amount of time.
>> >>>>
>> >>>> The way the disk failed was normally having an I/O request take a
>> >> really
>> >>>> long time and time out.  So a bunch of request handler threads would
>> >>>> basically slam into a brick wall when they tried to access the bad
>> >> disk,
>> >>>> slowing the DataNode to a crawl.  It was even worse in the second
>> >>> scenario,
>> >>>> if the disk appeared to work for a while, but then failed.  Any data
>> >> that
>> >>>> had been written on that DataNode to that disk would be lost, and we
>> >>> would
>> >>>> need to re-replicate it.
>> >>>>
>> >>>> Disks aren't biological systems-- they don't heal over time.  Once
>> >>> they're
>> >>>> bad, they stay bad.  The log cleaner needs to be robust against cases
>> >>> where
>> >>>> the disk really is failing, and really is returning bad data or
>> timing
>> >>> out.
>> >>>>> * For your metrics, can you spell out the full metric in JMX-style
>> >>>>> format, such as:
>> >>>>>
>> >>>   kafka.log:type=LogCleanerManager,name=uncleanable-partitions-count
>> >>>>>                value=4
>> >>>>>
>> >>>>> * For "uncleanable-partitions": topic-partition names can be very
>> >> long.
>> >>>>> I think the current max size is 210 characters (or maybe 240-ish?).
>> >>>>> Having the "uncleanable-partitions" being a list could be very large
>> >>>>> metric. Also, having the metric come out as a csv might be difficult
>> >> to
>> >>>>> work with for monitoring systems. If we *did* want the topic names
>> to
>> >>> be
>> >>>>> accessible, what do you think of having the
>> >>>>>        kafka.log:type=LogCleanerManager,topic=topic1,partition=2
>> >>>>> I'm not sure if LogCleanerManager is the right type, but my example
>> >> was
>> >>>>> that the topic and partition can be tags in the metric. That will
>> >> allow
>> >>>>> monitoring systems to more easily slice and dice the metric. I'm not
>> >>>>> sure what the attribute for that metric would be. Maybe something
>> >> like
>> >>>>> "uncleaned bytes" for that topic-partition? Or
>> time-since-last-clean?
>> >>> Or
>> >>>>> maybe even just "Value=1".
>> >>>> I haven't though about this that hard, but do we really need the
>> >>>> uncleanable topic names to be accessible through a metric?  It seems
>> >> like
>> >>>> the admin should notice that uncleanable partitions are present, and
>> >> then
>> >>>> check the logs?
>> >>>>
>> >>>>> * About `max.uncleanable.partitions`, you said that this likely
>> >>>>> indicates that the disk is having problems. I'm not sure that is the
>> >>>>> case. For the 4 JIRAs that you mentioned about log cleaner problems,
>> >>> all
>> >>>>> of them are partition-level scenarios that happened during normal
>> >>>>> operation. None of them were indicative of disk problems.
>> >>>> I don't think this is a meaningful comparison.  In general, we don't
>> >>>> accept JIRAs for hard disk problems that happen on a particular
>> >> cluster.
>> >>>> If someone opened a JIRA that said "my hard disk is having problems"
>> we
>> >>>> could close that as "not a Kafka bug."  This doesn't prove that disk
>> >>>> problems don't happen, but  just that JIRA isn't the right place for
>> >>> them.
>> >>>> I do agree that the log cleaner has had a significant number of logic
>> >>>> bugs, and that we need to be careful to limit their impact.  That's
>> one
>> >>>> reason why I think that a threshold of "number of uncleanable logs"
>> is
>> >> a
>> >>>> good idea, rather than just failing after one IOException.  In all
>> the
>> >>>> cases I've seen where a user hit a logic bug in the log cleaner, it
>> was
>> >>>> just one partition that had the issue.  We also should increase test
>> >>>> coverage for the log cleaner.
>> >>>>
>> >>>>> * About marking disks as offline when exceeding a certain threshold,
>> >>>>> that actually increases the blast radius of log compaction failures.
>> >>>>> Currently, the uncleaned partitions are still readable and writable.
>> >>>>> Taking the disks offline would impact availability of the
>> uncleanable
>> >>>>> partitions, as well as impact all other partitions that are on the
>> >>> disk.
>> >>>> In general, when we encounter I/O errors, we take the disk partition
>> >>>> offline.  This is spelled out in KIP-112 (
>> >>>>
>> >>
>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-112%3A+Handle+disk+failure+for+JBOD
>> >>>> ) :
>> >>>>
>> >>>>> - Broker assumes a log directory to be good after it starts, and
>> mark
>> >>>> log directory as
>> >>>>> bad once there is IOException when broker attempts to access (i.e.
>> >> read
>> >>>> or write) the log directory.
>> >>>>> - Broker will be offline if all log directories are bad.
>> >>>>> - Broker will stop serving replicas in any bad log directory. New
>> >>>> replicas will only be created
>> >>>>> on good log directory.
>> >>>> The behavior Stanislav is proposing for the log cleaner is actually
>> >> more
>> >>>> optimistic than what we do for regular broker I/O, since we will
>> >> tolerate
>> >>>> multiple IOExceptions, not just one.  But it's generally consistent.
>> >>>> Ignoring errors is not.  In any case, if you want to tolerate an
>> >>> unlimited
>> >>>> number of I/O errors, you can just set the threshold to an infinite
>> >> value
>> >>>> (although I think that would be a bad idea).
>> >>>>
>> >>>> best,
>> >>>> Colin
>> >>>>
>> >>>>> -James
>> >>>>>
>> >>>>>
>> >>>>>> On Jul 23, 2018, at 5:46 PM, Stanislav Kozlovski <
>> >>>> stanis...@confluent.io> wrote:
>> >>>>>> I renamed the KIP and that changed the link. Sorry about that. Here
>> >>> is
>> >>>> the
>> >>>>>> new link:
>> >>>>>>
>> >>
>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-346+-+Improve+LogCleaner+behavior+on+error
>> >>>>>> On Mon, Jul 23, 2018 at 5:11 PM Stanislav Kozlovski <
>> >>>> stanis...@confluent.io>
>> >>>>>> wrote:
>> >>>>>>
>> >>>>>>> Hey group,
>> >>>>>>>
>> >>>>>>> I created a new KIP about making log compaction more
>> >> fault-tolerant.
>> >>>>>>> Please give it a look here and please share what you think,
>> >>>> especially in
>> >>>>>>> regards to the points in the "Needs Discussion" paragraph.
>> >>>>>>>
>> >>>>>>> KIP: KIP-346
>> >>>>>>> <
>> >>
>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-346+-+Limit+blast+radius+of+log+compaction+failure
>> >>>>>>> --
>> >>>>>>> Best,
>> >>>>>>> Stanislav
>> >>>>>>>
>> >>>>>>
>> >>>>>> --
>> >>>>>> Best,
>> >>>>>> Stanislav
>> >
>>
>>
>
> --
> Best,
> Stanislav
>


-- 
Best,
Stanislav

Reply via email to