Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ private void handleRunningAndSuspendedTasks(final Map<TaskId, Set<TopicPartition
}
final TaskId taskId = task.id();
if (activeTasksToCreate.containsKey(taskId)) {
handleReAssignedActiveTask(task, activeTasksToCreate.get(taskId));
handleReassignedActiveTask(task, activeTasksToCreate.get(taskId));
activeTasksToCreate.remove(taskId);
} else if (standbyTasksToCreate.containsKey(taskId)) {
tasksToRecycle.put(task, standbyTasksToCreate.get(taskId));
Expand All @@ -505,22 +505,18 @@ private void handleRunningAndSuspendedTasks(final Map<TaskId, Set<TopicPartition
}
}

private void handleReAssignedActiveTask(final Task task,
private void handleReassignedActiveTask(final Task task,
final Set<TopicPartition> inputPartitions) {
if (tasks.updateActiveTaskInputPartitions(task, inputPartitions)) {
task.updateInputPartitions(inputPartitions, topologyMetadata.nodeToSourceTopics(task.id()));
}
if (task.state() == State.SUSPENDED) {
tasks.removeTask(task);
task.resume();
moveTaskFromTasksRegistryToStateUpdater(task);
stateUpdater.add(task);
}
}

private void moveTaskFromTasksRegistryToStateUpdater(final Task task) {
tasks.removeTask(task);
stateUpdater.add(task);
}

private void handleTasksInStateUpdater(final Map<TaskId, Set<TopicPartition>> activeTasksToCreate,
final Map<TaskId, Set<TopicPartition>> standbyTasksToCreate) {
for (final Task task : stateUpdater.getTasks()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.apache.kafka.common.utils.LogContext;
import org.apache.kafka.streams.processor.TaskId;
import org.apache.kafka.streams.processor.internals.PendingUpdateAction.Action;
import org.apache.kafka.streams.processor.internals.Task.State;
import org.slf4j.Logger;

import java.util.Collection;
Expand Down Expand Up @@ -240,8 +241,8 @@ public synchronized void addTask(final Task task) {
public synchronized void removeTask(final Task taskToRemove) {
final TaskId taskId = taskToRemove.id();

if (taskToRemove.state() != Task.State.CLOSED) {
throw new IllegalStateException("Attempted to remove a task that is not closed: " + taskId);
if (taskToRemove.state() != Task.State.CLOSED && taskToRemove.state() != State.SUSPENDED) {
Comment thread
lucasbru marked this conversation as resolved.
throw new IllegalStateException("Attempted to remove a task that is not closed or suspended: " + taskId);
}

if (taskToRemove.isActive()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,7 @@ public void shouldUpdateInputPartitionOfActiveTaskInStateUpdater() {
}

@Test
public void shouldKeepReAssignedActiveTaskInStateUpdater() {
public void shouldKeepReassignedActiveTaskInStateUpdater() {
final StreamTask reassignedActiveTask = statefulTask(taskId03, taskId03ChangelogPartitions)
.inState(State.RESTORING)
.withInputPartitions(taskId03Partitions).build();
Expand All @@ -435,21 +435,41 @@ public void shouldKeepReAssignedActiveTaskInStateUpdater() {
}

@Test
public void shouldRemoveReAssignedRevokedActiveTaskInStateUpdaterFromPendingTaskToSuspend() {
final StreamTask reAssignedRevokedActiveTask = statefulTask(taskId03, taskId03ChangelogPartitions)
public void shouldMoveReassignedSuspendedActiveTaskToStateUpdater() {
final StreamTask reassignedActiveTask = statefulTask(taskId03, taskId03ChangelogPartitions)
.inState(State.SUSPENDED)
.withInputPartitions(taskId03Partitions).build();
final TasksRegistry tasks = Mockito.mock(TasksRegistry.class);
final TaskManager taskManager = setUpTaskManager(ProcessingMode.AT_LEAST_ONCE, tasks, true);
when(tasks.allTasks()).thenReturn(mkSet(reassignedActiveTask));

taskManager.handleAssignment(
mkMap(mkEntry(reassignedActiveTask.id(), reassignedActiveTask.inputPartitions())),
Collections.emptyMap()
);

Mockito.verify(tasks).removeTask(reassignedActiveTask);
Mockito.verify(stateUpdater).add(reassignedActiveTask);
Mockito.verify(activeTaskCreator).createTasks(consumer, Collections.emptyMap());
Mockito.verify(standbyTaskCreator).createTasks(Collections.emptyMap());
}

@Test
public void shouldRemoveReassignedRevokedActiveTaskInStateUpdaterFromPendingTaskToSuspend() {
final StreamTask reassignedRevokedActiveTask = statefulTask(taskId03, taskId03ChangelogPartitions)
.inState(State.RESTORING)
.withInputPartitions(taskId03Partitions).build();
final TasksRegistry tasks = Mockito.mock(TasksRegistry.class);
final TaskManager taskManager = setUpTaskManager(ProcessingMode.AT_LEAST_ONCE, tasks, true);
when(stateUpdater.getTasks()).thenReturn(mkSet(reAssignedRevokedActiveTask));
when(stateUpdater.getTasks()).thenReturn(mkSet(reassignedRevokedActiveTask));

taskManager.handleAssignment(
mkMap(mkEntry(reAssignedRevokedActiveTask.id(), reAssignedRevokedActiveTask.inputPartitions())),
mkMap(mkEntry(reassignedRevokedActiveTask.id(), reassignedRevokedActiveTask.inputPartitions())),
Collections.emptyMap()
);

Mockito.verify(activeTaskCreator).createTasks(consumer, Collections.emptyMap());
Mockito.verify(tasks).removePendingActiveTaskToSuspend(reAssignedRevokedActiveTask.id());
Mockito.verify(tasks).removePendingActiveTaskToSuspend(reassignedRevokedActiveTask.id());
Mockito.verify(standbyTaskCreator).createTasks(Collections.emptyMap());
}

Expand All @@ -476,17 +496,17 @@ public void shouldNeverUpdateInputPartitionsOfStandbyTaskInStateUpdater() {
}

@Test
public void shouldKeepReAssignedStandbyTaskInStateUpdater() {
final StandbyTask reAssignedStandbyTask = standbyTask(taskId02, taskId02ChangelogPartitions)
public void shouldKeepReassignedStandbyTaskInStateUpdater() {
final StandbyTask reassignedStandbyTask = standbyTask(taskId02, taskId02ChangelogPartitions)
.inState(State.RUNNING)
.withInputPartitions(taskId02Partitions).build();
final TasksRegistry tasks = Mockito.mock(TasksRegistry.class);
final TaskManager taskManager = setUpTaskManager(ProcessingMode.AT_LEAST_ONCE, tasks, true);
when(stateUpdater.getTasks()).thenReturn(mkSet(reAssignedStandbyTask));
when(stateUpdater.getTasks()).thenReturn(mkSet(reassignedStandbyTask));

taskManager.handleAssignment(
Collections.emptyMap(),
mkMap(mkEntry(reAssignedStandbyTask.id(), reAssignedStandbyTask.inputPartitions()))
mkMap(mkEntry(reassignedStandbyTask.id(), reassignedStandbyTask.inputPartitions()))
);

Mockito.verify(activeTaskCreator).createTasks(consumer, Collections.emptyMap());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.utils.LogContext;
import org.apache.kafka.streams.processor.TaskId;
import org.apache.kafka.streams.processor.internals.Task.State;
import org.junit.jupiter.api.Test;

import java.util.Collections;
Expand All @@ -31,10 +32,12 @@
import static org.apache.kafka.test.StreamsTestUtils.TaskBuilder.standbyTask;
import static org.apache.kafka.test.StreamsTestUtils.TaskBuilder.statefulTask;
import static org.apache.kafka.test.StreamsTestUtils.TaskBuilder.statelessTask;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class TasksTest {
Expand All @@ -52,6 +55,20 @@ public class TasksTest {

private final Tasks tasks = new Tasks(new LogContext());

@Test
public void shouldCheckStateWhenClosedTasks() {
Comment thread
lucasbru marked this conversation as resolved.
Outdated
final StreamTask closedTask = statefulTask(TASK_0_0, mkSet(TOPIC_PARTITION_A_0)).inState(State.CLOSED).build();
final StandbyTask suspendedTask = standbyTask(TASK_0_1, mkSet(TOPIC_PARTITION_A_1)).inState(State.SUSPENDED).build();
final StreamTask runningTask = statelessTask(TASK_1_0).inState(State.RUNNING).build();

tasks.addActiveTasks(mkSet(closedTask, runningTask));
tasks.addStandbyTasks(Collections.singletonList(suspendedTask));

assertDoesNotThrow(() -> tasks.removeTask(closedTask));
assertDoesNotThrow(() -> tasks.removeTask(suspendedTask));
assertThrows(IllegalStateException.class, () -> tasks.removeTask(runningTask));
}

@Test
public void shouldKeepAddedTasks() {
final StreamTask statefulTask = statefulTask(TASK_0_0, mkSet(TOPIC_PARTITION_A_0)).build();
Expand Down