You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kafka.apache.org by ij...@apache.org on 2016/11/23 11:06:27 UTC
kafka git commit: KAFKA-4395;
Break static initialization order dependency between KafkaConfig and
Logconfig
Repository: kafka
Updated Branches:
refs/heads/trunk 4b003d8bc -> 0ea540552
KAFKA-4395; Break static initialization order dependency between KafkaConfig and Logconfig
Fixes static initialization order dependency between KafkaConfig and LogConfig. jjkoshy please take a look.
Author: Sumant Tambe <su...@yahoo.com>
Reviewers: Ismael Juma <is...@juma.me.uk>
Closes #2120 from sutambe/logconfig-static-init
Project: http://git-wip-us.apache.org/repos/asf/kafka/repo
Commit: http://git-wip-us.apache.org/repos/asf/kafka/commit/0ea54055
Tree: http://git-wip-us.apache.org/repos/asf/kafka/tree/0ea54055
Diff: http://git-wip-us.apache.org/repos/asf/kafka/diff/0ea54055
Branch: refs/heads/trunk
Commit: 0ea540552a52b3265c48aacbb9790ea6e71431a5
Parents: 4b003d8
Author: Sumant Tambe <su...@yahoo.com>
Authored: Wed Nov 23 10:02:47 2016 +0000
Committer: Ismael Juma <is...@juma.me.uk>
Committed: Wed Nov 23 10:06:10 2016 +0000
----------------------------------------------------------------------
core/src/main/scala/kafka/log/LogConfig.scala | 4 ++++
core/src/main/scala/kafka/server/KafkaConfig.scala | 7 +++----
.../test/scala/unit/kafka/log/LogConfigTest.scala | 17 +++++++++++++++++
3 files changed, 24 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/kafka/blob/0ea54055/core/src/main/scala/kafka/log/LogConfig.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/kafka/log/LogConfig.scala b/core/src/main/scala/kafka/log/LogConfig.scala
index d5b5884..55669c0 100755
--- a/core/src/main/scala/kafka/log/LogConfig.scala
+++ b/core/src/main/scala/kafka/log/LogConfig.scala
@@ -234,6 +234,8 @@ object LogConfig {
case _ => super.getConfigValue(key, headerName)
}
}
+
+ def serverConfigName(configName: String): Option[String] = serverDefaultConfigNames.get(configName)
}
private val configDef: LogConfigDef = {
@@ -299,6 +301,8 @@ object LogConfig {
def configNames: Seq[String] = configDef.names.asScala.toSeq.sorted
+ def serverConfigName(configName: String): Option[String] = configDef.serverConfigName(configName)
+
/**
* Create a log config instance using the given properties and defaults
*/
http://git-wip-us.apache.org/repos/asf/kafka/blob/0ea54055/core/src/main/scala/kafka/server/KafkaConfig.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/kafka/server/KafkaConfig.scala b/core/src/main/scala/kafka/server/KafkaConfig.scala
index 08e50dd..40a5e10 100755
--- a/core/src/main/scala/kafka/server/KafkaConfig.scala
+++ b/core/src/main/scala/kafka/server/KafkaConfig.scala
@@ -22,7 +22,6 @@ import kafka.api.{ApiVersion, KAFKA_0_10_0_IV1}
import kafka.cluster.EndPoint
import kafka.consumer.ConsumerConfig
import kafka.coordinator.OffsetConfig
-import kafka.log.LogConfig
import kafka.message.{BrokerCompressionCodec, CompressionCodec, Message, MessageSet}
import kafka.utils.CoreUtils
import org.apache.kafka.clients.CommonClientConfigs
@@ -267,9 +266,9 @@ object KafkaConfig {
val LogFlushIntervalMsProp = "log.flush.interval.ms"
val LogFlushOffsetCheckpointIntervalMsProp = "log.flush.offset.checkpoint.interval.ms"
val LogPreAllocateProp = "log.preallocate"
- val LogMessageFormatVersionProp = LogConfigPrefix + LogConfig.MessageFormatVersionProp
- val LogMessageTimestampTypeProp = LogConfigPrefix + LogConfig.MessageTimestampTypeProp
- val LogMessageTimestampDifferenceMaxMsProp = LogConfigPrefix + LogConfig.MessageTimestampDifferenceMaxMsProp
+ val LogMessageFormatVersionProp = LogConfigPrefix + "message.format.version"
+ val LogMessageTimestampTypeProp = LogConfigPrefix + "message.timestamp.type"
+ val LogMessageTimestampDifferenceMaxMsProp = LogConfigPrefix + "message.timestamp.difference.max.ms"
val NumRecoveryThreadsPerDataDirProp = "num.recovery.threads.per.data.dir"
val AutoCreateTopicsEnableProp = "auto.create.topics.enable"
val MinInSyncReplicasProp = "min.insync.replicas"
http://git-wip-us.apache.org/repos/asf/kafka/blob/0ea54055/core/src/test/scala/unit/kafka/log/LogConfigTest.scala
----------------------------------------------------------------------
diff --git a/core/src/test/scala/unit/kafka/log/LogConfigTest.scala b/core/src/test/scala/unit/kafka/log/LogConfigTest.scala
index 569264a..e79ceff 100644
--- a/core/src/test/scala/unit/kafka/log/LogConfigTest.scala
+++ b/core/src/test/scala/unit/kafka/log/LogConfigTest.scala
@@ -28,6 +28,23 @@ import org.scalatest.Assertions._
class LogConfigTest {
+ /**
+ * This test verifies that KafkaConfig object initialization does not depend on
+ * LogConfig initialization. Bad things happen due to static initialization
+ * order dependencies. For example, LogConfig.configDef ends up adding null
+ * values in serverDefaultConfigNames. This test ensures that the mapping of
+ * keys from LogConfig to KafkaConfig are not missing values.
+ */
+ @Test
+ def ensureNoStaticInitializationOrderDependency() {
+ // Access any KafkaConfig val to load KafkaConfig object before LogConfig.
+ assertTrue(KafkaConfig.LogRetentionTimeMillisProp != null)
+ assertTrue(LogConfig.configNames.forall { config =>
+ val serverConfigOpt = LogConfig.serverConfigName(config)
+ serverConfigOpt.isDefined && (serverConfigOpt.get != null)
+ })
+ }
+
@Test
def testKafkaConfigToProps() {
val millisInHour = 60L * 60L * 1000L