Shuai Lin created KAFKA-5010:
--------------------------------

             Summary: Log cleaner crashed with BufferOverflowException when 
writing to the writeBuffer
                 Key: KAFKA-5010
                 URL: https://issues.apache.org/jira/browse/KAFKA-5010
             Project: Kafka
          Issue Type: Bug
          Components: log
    Affects Versions: 0.10.2.0
            Reporter: Shuai Lin


After upgrading from 0.10.0.1 to 0.10.2.0 the log cleaner thread crashed with 
BufferOverflowException when writing the filtered records into the writeBuffer:

{code}
[2017-03-24 10:41:03,926] INFO [kafka-log-cleaner-thread-0], Starting  
(kafka.log.LogCleaner)
[2017-03-24 10:41:04,177] INFO Cleaner 0: Beginning cleaning of log 
app-topic-20170317-20. (kafka.log.LogCleaner)
[2017-03-24 10:41:04,177] INFO Cleaner 0: Building offset map for 
app-topic-20170317-20... (kafka.log.LogCleaner)
[2017-03-24 10:41:04,387] INFO Cleaner 0: Building offset map for log 
app-topic-20170317-20 for 1 segments in offset range [9737795, 9887707). 
(kafka.log.LogCleaner)
[2017-03-24 10:41:07,101] INFO Cleaner 0: Offset map for log 
app-topic-20170317-20 complete. (kafka.log.LogCleaner)
[2017-03-24 10:41:07,106] INFO Cleaner 0: Cleaning log app-topic-20170317-20 
(cleaning prior to Fri Mar 24 10:36:06 GMT 2017, discarding tombstones prior to 
Thu Mar 23 10:18:02 GMT 2017)... (kafka.log.LogCleaner)
[2017-03-24 10:41:07,110] INFO Cleaner 0: Cleaning segment 0 in log 
app-topic-20170317-20 (largest timestamp Fri Mar 24 09:58:25 GMT 2017) into 0, 
retaining deletes. (kafka.log.LogCleaner)
[2017-03-24 10:41:07,372] ERROR [kafka-log-cleaner-thread-0], Error due to  
(kafka.log.LogCleaner)
java.nio.BufferOverflowException
        at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:206)
        at org.apache.kafka.common.record.LogEntry.writeTo(LogEntry.java:98)
        at 
org.apache.kafka.common.record.MemoryRecords.filterTo(MemoryRecords.java:158)
        at 
org.apache.kafka.common.record.MemoryRecords.filterTo(MemoryRecords.java:111)
        at kafka.log.Cleaner.cleanInto(LogCleaner.scala:468)
        at kafka.log.Cleaner.$anonfun$cleanSegments$1(LogCleaner.scala:405)
        at 
kafka.log.Cleaner.$anonfun$cleanSegments$1$adapted(LogCleaner.scala:401)
        at scala.collection.immutable.List.foreach(List.scala:378)
        at kafka.log.Cleaner.cleanSegments(LogCleaner.scala:401)
        at kafka.log.Cleaner.$anonfun$clean$6(LogCleaner.scala:363)
        at kafka.log.Cleaner.$anonfun$clean$6$adapted(LogCleaner.scala:362)
        at scala.collection.immutable.List.foreach(List.scala:378)
        at kafka.log.Cleaner.clean(LogCleaner.scala:362)
        at kafka.log.LogCleaner$CleanerThread.cleanOrSleep(LogCleaner.scala:241)
        at kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:220)
        at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)
[2017-03-24 10:41:07,375] INFO [kafka-log-cleaner-thread-0], Stopped  
(kafka.log.LogCleaner)
{code}

I tried different values of log.cleaner.buffer.size, from 512K to 2M to 10M to 
128M, all with no luck: The log cleaner thread crashed immediately after the 
broker got restarted. But setting it to 256MB fixed the problem!

Here are the settings for the cluster:
{code}
- log.message.format.version = 0.9.0.0 (we use 0.9 format because have old 
consumers)
- log.cleaner.enable = 'true'
- log.cleaner.min.cleanable.ratio = '0.1'
- log.cleaner.threads = '1'
- log.cleaner.io.buffer.load.factor = '0.98'
- log.roll.hours = '24'
- log.cleaner.dedupe.buffer.size = 2GB 
- log.segment.bytes = 256MB (global is 512MB, but we have been using 256MB for 
this topic)
- message.max.bytes = 10MB
{code}

Given that the size of readBuffer and writeBuffer are exactly the same (half of 
log.cleaner.io.buffer.size), why would the cleaner throw a 
BufferOverflowException when writing the filtered records into the writeBuffer? 
IIUC that should never happen because the size of the filtered records should 
be no greater that the size of the readBuffer, thus no greater than the size of 
the writeBuffer.





--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to