Skip to content

Commit

Permalink
prevent possible race conditions in skipping index sets during rotation
Browse files Browse the repository at this point in the history
  • Loading branch information
todvora committed Aug 20, 2024
1 parent ec832a4 commit 7b8eda2
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,9 @@ public void initialize() {
public void doRun() {
// Point deflector to a new index if required.
if (cluster.isConnected()) {
indexSetRegistry
.getAll().stream()
.filter(indexSet -> !isCurrentlyMigrated(indexSet))
.forEach((indexSet) -> {
indexSetRegistry.forEach((indexSet) -> {
try {
if (indexSet.getConfig().isWritable()) {
if (indexSet.getConfig().isWritable() && !isCurrentlyMigrated(indexSet)) {
checkAndRepair(indexSet);
checkForRotation(indexSet);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import com.google.common.collect.ImmutableMap;
import jakarta.annotation.Nonnull;
import jakarta.inject.Provider;
import org.assertj.core.api.Assertions;
import org.graylog2.datatiering.DataTieringOrchestrator;
import org.graylog2.indexer.IndexSet;
Expand All @@ -41,10 +42,9 @@
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

import jakarta.inject.Provider;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.function.Consumer;

import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
Expand Down Expand Up @@ -174,9 +174,17 @@ private Cluster mockCluster(boolean connected) {

@Nonnull
private IndexSetRegistry mockIndexSetRegistry(IndexSet... indexSets) {
final IndexSetRegistry indexSetRegistry = Mockito.mock(IndexSetRegistry.class);
Mockito.when(indexSetRegistry.getAll()).thenReturn(new HashSet<>(Arrays.asList(indexSets)));
return indexSetRegistry;
final IndexSetRegistry registry = Mockito.mock(IndexSetRegistry.class);
final List<IndexSet> sets = Arrays.asList(indexSets);

// mock the Iterable forEach implementation :-/
Mockito.doAnswer(invocation -> {
Consumer<IndexSet> action = invocation.getArgument(0);
sets.forEach(action);
return null;
}).when(registry).forEach(Mockito.any());

return registry;
}

@Test
Expand Down

0 comments on commit 7b8eda2

Please sign in to comment.