This is an automated email from the ASF dual-hosted git repository.
chia7712 pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git
The following commit(s) were added to refs/heads/trunk by this push:
new d9525e25cca MINOR: Write bootstrap checkpoint only to metadata
directories (#22418)
d9525e25cca is described below
commit d9525e25cca5849ad26072a1651bc178a6813672
Author: majialong <[email protected]>
AuthorDate: Sun May 31 01:55:35 2026 +0800
MINOR: Write bootstrap checkpoint only to metadata directories (#22418)
This patch ensures the storage formatter writes the `bootstrap
checkpoint` only to metadata directories, avoiding unexpected
`__cluster_metadata-0` directories in pure data log directories when
formatting multiple directories in KRaft mode.
Reviewers: Ken Huang <[email protected]>, Chia-Ping Tsai
<[email protected]>
---
.../apache/kafka/metadata/storage/Formatter.java | 10 ++++-----
.../kafka/metadata/storage/FormatterTest.java | 24 ++++++++++++++++++----
2 files changed, 25 insertions(+), 9 deletions(-)
diff --git
a/metadata/src/main/java/org/apache/kafka/metadata/storage/Formatter.java
b/metadata/src/main/java/org/apache/kafka/metadata/storage/Formatter.java
index 8c163cd4700..0cda5275f8b 100644
--- a/metadata/src/main/java/org/apache/kafka/metadata/storage/Formatter.java
+++ b/metadata/src/main/java/org/apache/kafka/metadata/storage/Formatter.java
@@ -445,11 +445,12 @@ public class Formatter {
build());
}
copier.setPreWriteHandler((writeLogDir, __, ____) -> {
+ DirectoryType directoryType = directoryTypes.get(writeLogDir);
printStream.printf("Formatting %s %s with %s %s.%n",
- directoryTypes.get(writeLogDir).description(), writeLogDir,
+ directoryType.description(), writeLogDir,
MetadataVersion.FEATURE_NAME, releaseVersion);
Files.createDirectories(Paths.get(writeLogDir));
- if (writeBootstrapSnapshot) {
+ if (writeBootstrapSnapshot &&
directoryType.isMetadataDirectory()) {
writeBoostrapSnapshot(writeLogDir,
bootstrapMetadata,
initialControllers,
@@ -480,9 +481,8 @@ public class Formatter {
};
}
- boolean isDynamicMetadataDirectory() {
- return this == DYNAMIC_METADATA_NON_VOTER_DIRECTORY ||
- this == DYNAMIC_METADATA_VOTER_DIRECTORY;
+ boolean isMetadataDirectory() {
+ return this != LOG_DIRECTORY;
}
static DirectoryType calculate(
diff --git
a/metadata/src/test/java/org/apache/kafka/metadata/storage/FormatterTest.java
b/metadata/src/test/java/org/apache/kafka/metadata/storage/FormatterTest.java
index 975c4db0e48..fa2125eb40b 100644
---
a/metadata/src/test/java/org/apache/kafka/metadata/storage/FormatterTest.java
+++
b/metadata/src/test/java/org/apache/kafka/metadata/storage/FormatterTest.java
@@ -118,6 +118,12 @@ public class FormatterTest {
}
}
+ private static File clusterMetadataDir(String directory) {
+ return new File(directory, String.format("%s-%d",
+ CLUSTER_METADATA_TOPIC_PARTITION.topic(),
+ CLUSTER_METADATA_TOPIC_PARTITION.partition()));
+ }
+
static class FormatterContext {
final Formatter formatter;
final ByteArrayOutputStream stream;
@@ -154,16 +160,26 @@ public class FormatterTest {
}
}
+ @Test
+ public void testWritesBootstrapSnapshotOnlyToMetadataDirectory() throws
Exception {
+ try (TestEnv testEnv = new TestEnv(3)) {
+ testEnv.newFormatter().formatter.run();
+ assertTrue(clusterMetadataDir(testEnv.directory(0)).exists());
+ assertFalse(clusterMetadataDir(testEnv.directory(1)).exists());
+ assertFalse(clusterMetadataDir(testEnv.directory(2)).exists());
+
+ BootstrapMetadata bootstrapMetadata =
BootstrapTestUtils.readBootstrapMetadata(testEnv.directory(0));
+ assertEquals(MetadataVersion.latestProduction(),
bootstrapMetadata.metadataVersion());
+ }
+ }
+
@Test
public void testSkipsBootstrapSnapshotWhenDisabled() throws Exception {
try (TestEnv testEnv = new TestEnv(1)) {
FormatterContext context = testEnv.newFormatter();
context.formatter.setWriteBootstrapSnapshot(false);
context.formatter.run();
- File clusterMetadataDir = new File(testEnv.directory(0),
String.format("%s-%d",
- CLUSTER_METADATA_TOPIC_PARTITION.topic(),
- CLUSTER_METADATA_TOPIC_PARTITION.partition()));
- assertFalse(clusterMetadataDir.exists());
+ assertFalse(clusterMetadataDir(testEnv.directory(0)).exists());
}
}