mirror of https://github.com/apache/kafka.git
KAFKA-10564: only process non-empty task directories when internally cleaning obsolete state stores (#9373)
Avoid continuous repeated logging by not trying to clean empty task directories, which are longer fully deleted during internal cleanup as of https://issues.apache.org/jira/browse/KAFKA-6647. Reviewers: A. Sophie Blee-Goldman <sophie@confluent.io>, Guozhang Wang <wangguoz@gmail.com>
This commit is contained in:
parent
65c29a9dec
commit
250c71b532
|
|
@ -315,7 +315,7 @@ public class StateDirectory {
|
|||
}
|
||||
|
||||
private void cleanRemovedTasksCalledByCleanerThread(final long cleanupDelayMs) {
|
||||
for (final File taskDir : listAllTaskDirectories()) {
|
||||
for (final File taskDir : listNonEmptyTaskDirectories()) {
|
||||
final String dirName = taskDir.getName();
|
||||
final TaskId id = TaskId.parse(dirName);
|
||||
if (!locks.containsKey(id)) {
|
||||
|
|
|
|||
|
|
@ -50,9 +50,11 @@ import java.util.stream.Collectors;
|
|||
import static org.apache.kafka.common.utils.Utils.mkSet;
|
||||
import static org.apache.kafka.streams.processor.internals.StateDirectory.LOCK_FILE_NAME;
|
||||
import static org.apache.kafka.streams.processor.internals.StateManagerUtil.CHECKPOINT_FILE_NAME;
|
||||
import static org.hamcrest.CoreMatchers.containsString;
|
||||
import static org.hamcrest.CoreMatchers.endsWith;
|
||||
import static org.hamcrest.CoreMatchers.hasItem;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.CoreMatchers.not;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
|
|
@ -286,6 +288,7 @@ public class StateDirectoryTest {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void shouldCleanupStateDirectoriesWhenLastModifiedIsLessThanNowMinusCleanupDelay() {
|
||||
final File dir = directory.directoryForTask(new TaskId(2, 0));
|
||||
|
|
@ -304,6 +307,36 @@ public class StateDirectoryTest {
|
|||
assertEquals(0, directory.listNonEmptyTaskDirectories().length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldCleanupObsoleteStateDirectoriesOnlyOnce() {
|
||||
final File dir = directory.directoryForTask(new TaskId(2, 0));
|
||||
assertTrue(new File(dir, "store").mkdir());
|
||||
assertEquals(1, directory.listAllTaskDirectories().length);
|
||||
assertEquals(1, directory.listNonEmptyTaskDirectories().length);
|
||||
|
||||
try (final LogCaptureAppender appender = LogCaptureAppender.createAndRegister(StateDirectory.class)) {
|
||||
directory.cleanRemovedTasks(0);
|
||||
assertTrue(dir.exists());
|
||||
assertEquals(1, directory.listAllTaskDirectories().length);
|
||||
assertEquals(0, directory.listNonEmptyTaskDirectories().length);
|
||||
assertThat(
|
||||
appender.getMessages(),
|
||||
hasItem(containsString("Deleting obsolete state directory"))
|
||||
);
|
||||
}
|
||||
|
||||
try (final LogCaptureAppender appender = LogCaptureAppender.createAndRegister(StateDirectory.class)) {
|
||||
directory.cleanRemovedTasks(0);
|
||||
assertTrue(dir.exists());
|
||||
assertEquals(1, directory.listAllTaskDirectories().length);
|
||||
assertEquals(0, directory.listNonEmptyTaskDirectories().length);
|
||||
assertThat(
|
||||
appender.getMessages(),
|
||||
not(hasItem(containsString("Deleting obsolete state directory")))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldNotRemoveNonTaskDirectoriesAndFiles() {
|
||||
final File otherDir = TestUtils.tempDirectory(stateDir.toPath(), "foo");
|
||||
|
|
|
|||
Loading…
Reference in New Issue