mirror of https://github.com/apache/kafka.git
				
				
				
			KAFKA-4073; MirrorMaker should handle messages without timestamp correctly
Author: Ismael Juma <ismael@juma.me.uk>
Reviewers: Jun Rao <junrao@gmail.com>
Closes #1773 from ijuma/kafka-4073-mirror-maker-timestamps
(cherry picked from commit a1e0b2240d)
Signed-off-by: Jun Rao <junrao@gmail.com>
			
			
This commit is contained in:
		
							parent
							
								
									8bf9addd25
								
							
						
					
					
						commit
						4e4e2fb508
					
				| 
						 | 
				
			
			@ -38,6 +38,7 @@ import org.apache.kafka.common.TopicPartition
 | 
			
		|||
import org.apache.kafka.common.serialization.ByteArrayDeserializer
 | 
			
		||||
import org.apache.kafka.common.utils.Utils
 | 
			
		||||
import org.apache.kafka.common.errors.WakeupException
 | 
			
		||||
import org.apache.kafka.common.record.Record
 | 
			
		||||
 | 
			
		||||
import scala.collection.JavaConversions._
 | 
			
		||||
import scala.collection.mutable.HashMap
 | 
			
		||||
| 
						 | 
				
			
			@ -675,7 +676,8 @@ object MirrorMaker extends Logging with KafkaMetricsGroup {
 | 
			
		|||
 | 
			
		||||
  private[tools] object defaultMirrorMakerMessageHandler extends MirrorMakerMessageHandler {
 | 
			
		||||
    override def handle(record: BaseConsumerRecord): util.List[ProducerRecord[Array[Byte], Array[Byte]]] = {
 | 
			
		||||
      Collections.singletonList(new ProducerRecord[Array[Byte], Array[Byte]](record.topic, null, record.timestamp, record.key, record.value))
 | 
			
		||||
      val timestamp: java.lang.Long = if (record.timestamp == Record.NO_TIMESTAMP) null else record.timestamp
 | 
			
		||||
      Collections.singletonList(new ProducerRecord[Array[Byte], Array[Byte]](record.topic, null, timestamp, record.key, record.value))
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,7 @@
 | 
			
		|||
package kafka.tools
 | 
			
		||||
 | 
			
		||||
import kafka.consumer.BaseConsumerRecord
 | 
			
		||||
import org.apache.kafka.common.record.TimestampType
 | 
			
		||||
import org.apache.kafka.common.record.{Record, TimestampType}
 | 
			
		||||
import org.junit.Assert._
 | 
			
		||||
import org.junit.Test
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -39,4 +39,20 @@ class MirrorMakerTest {
 | 
			
		|||
    assertEquals("key", new String(producerRecord.key))
 | 
			
		||||
    assertEquals("value", new String(producerRecord.value))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  def testDefaultMirrorMakerMessageHandlerWithNoTimestampInSourceMessage() {
 | 
			
		||||
    val consumerRecord = BaseConsumerRecord("topic", 0, 1L, Record.NO_TIMESTAMP, TimestampType.CREATE_TIME, "key".getBytes, "value".getBytes)
 | 
			
		||||
 | 
			
		||||
    val result = MirrorMaker.defaultMirrorMakerMessageHandler.handle(consumerRecord)
 | 
			
		||||
    assertEquals(1, result.size)
 | 
			
		||||
 | 
			
		||||
    val producerRecord = result.get(0)
 | 
			
		||||
    assertNull(producerRecord.timestamp)
 | 
			
		||||
    assertEquals("topic", producerRecord.topic)
 | 
			
		||||
    assertNull(producerRecord.partition)
 | 
			
		||||
    assertEquals("key", new String(producerRecord.key))
 | 
			
		||||
    assertEquals("value", new String(producerRecord.value))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue