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