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