pprovenzano commented on code in PR #14628:
URL: https://github.com/apache/kafka/pull/14628#discussion_r1385810018


##########
core/src/main/scala/kafka/server/KafkaServer.scala:
##########
@@ -270,10 +271,31 @@ class KafkaServer(
 
         logDirFailureChannel = new LogDirFailureChannel(config.logDirs.size)
 
+        // Make sure all storage directories have meta.properties files.
+        val metaPropsEnsemble = {
+          val copier = new 
MetaPropertiesEnsemble.Copier(initialMetaPropsEnsemble)
+          
initialMetaPropsEnsemble.nonFailedDirectoryProps().forEachRemaining(e => {
+            val logDir = e.getKey
+            val builder = new MetaProperties.Builder(e.getValue).
+              setClusterId(_clusterId).
+              setNodeId(config.brokerId)
+            if (!builder.directoryId().isPresent()) {
+              builder.setDirectoryId(copier.generateValidDirectoryId())
+            }
+            copier.setLogDirProps(logDir, builder.build())
+          })
+          copier.emptyLogDirs().clear()
+          copier.writeLogDirChanges((logDir, e) => {
+            logDirFailureChannel.maybeAddOfflineLogDir(logDir, s"Error while 
writing meta.properties to $logDir", e)
+          })
+          copier.copy()
+        }
+        metaPropsEnsemble.verify(Optional.of(_clusterId), 
OptionalInt.of(config.brokerId), verificationFlags)

Review Comment:
   Need to create the directory if it doesn't exist here. Here is some code 
that I basicly took from LogManager.scala
   
   `diff --git a/core/src/main/scala/kafka/server/KafkaServer.scala 
b/core/src/main/scala/kafka/server/KafkaServer.scala
   index 9843204dc1..48eee053ce 100755
   --- a/core/src/main/scala/kafka/server/KafkaServer.scala
   +++ b/core/src/main/scala/kafka/server/KafkaServer.scala
   @@ -62,7 +62,7 @@ import org.apache.kafka.server.util.KafkaScheduler
    import org.apache.kafka.storage.internals.log.LogDirFailureChannel
    import org.apache.zookeeper.client.ZKClientConfig
    
   -import java.io.IOException
   +import java.io._
    import java.net.{InetAddress, SocketTimeoutException}
    import java.util
    import java.util.{Optional, OptionalInt, OptionalLong}
   @@ -276,13 +276,28 @@ class KafkaServer(
              val copier = new 
MetaPropertiesEnsemble.Copier(initialMetaPropsEnsemble)
              
initialMetaPropsEnsemble.nonFailedDirectoryProps().forEachRemaining(e => {
                val logDir = e.getKey
   +
   +            val dir = new File(logDir).getAbsoluteFile
                val builder = new MetaProperties.Builder(e.getValue).
                  setClusterId(_clusterId).
                  setNodeId(config.brokerId)
   -            if (!builder.directoryId().isPresent()) {
   -              builder.setDirectoryId(copier.generateValidDirectoryId())
   +
   +            try {
   +              if (!builder.directoryId().isPresent()) {
   +                if (!dir.exists) {
   +                  info(s"Log directory ${dir.getAbsolutePath} not found, 
creating it.")
   +                  val created = dir.mkdirs()
   +                  if (!created)
   +                    throw new IOException(s"Failed to create data directory 
${dir.getAbsolutePath}")
   +                  
Utils.flushDir(dir.toPath.toAbsolutePath.normalize.getParent)
   +                }
   +                builder.setDirectoryId(copier.generateValidDirectoryId())
   +              }
   +              copier.setLogDirProps(logDir, builder.build())
   +            } catch {
   +              case e: IOException =>
   +                info(s"Failed to create or validate data directory 
${dir.getAbsolutePath}", e)
                }
   -            copier.setLogDirProps(logDir, builder.build())
              })
              copier.emptyLogDirs().clear()
              copier.writeLogDirChanges((logDir, e) => {
   `



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: jira-unsubscr...@kafka.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to