Skip to content

Commit 01ff029

Browse files
authored
Refactor DatabaseNodeService as a cluster state listener. (#91567) (#91596)
This PR changes the DatabaseNodeService to use a ClusterStateListener which will always run after the cluster state is globally applied instead of using a listener on the IngestService which is run before the cluster state is fully published.
1 parent c240141 commit 01ff029

File tree

6 files changed

+31
-8
lines changed

6 files changed

+31
-8
lines changed

docs/changelog/91567.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 91567
2+
summary: Refactor `DatabaseNodeService` as a cluster state listener
3+
area: Ingest Node
4+
type: bug
5+
issues:
6+
- 86999

modules/ingest-geoip/src/internalClusterTest/java/org/elasticsearch/ingest/geoip/ReloadingDatabasesWhilePerformingGeoLookupsIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ private static DatabaseNodeService createRegistry(Path geoIpConfigDir, Path geoI
201201
configDatabases,
202202
Runnable::run
203203
);
204-
databaseNodeService.initialize("nodeId", mock(ResourceWatcherService.class), mock(IngestService.class));
204+
databaseNodeService.initialize("nodeId", mock(ResourceWatcherService.class), mock(IngestService.class), mock(ClusterService.class));
205205
return databaseNodeService;
206206
}
207207

modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/DatabaseNodeService.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
import org.elasticsearch.cluster.metadata.IndexAbstraction;
2020
import org.elasticsearch.cluster.node.DiscoveryNode;
2121
import org.elasticsearch.cluster.routing.IndexRoutingTable;
22+
import org.elasticsearch.cluster.service.ClusterService;
2223
import org.elasticsearch.common.hash.MessageDigests;
2324
import org.elasticsearch.core.CheckedConsumer;
2425
import org.elasticsearch.core.CheckedRunnable;
2526
import org.elasticsearch.core.IOUtils;
2627
import org.elasticsearch.env.Environment;
28+
import org.elasticsearch.gateway.GatewayService;
2729
import org.elasticsearch.index.Index;
2830
import org.elasticsearch.index.query.TermQueryBuilder;
2931
import org.elasticsearch.ingest.IngestService;
@@ -113,7 +115,12 @@ public final class DatabaseNodeService implements Closeable {
113115
this.genericExecutor = genericExecutor;
114116
}
115117

116-
public void initialize(String nodeId, ResourceWatcherService resourceWatcher, IngestService ingestServiceArg) throws IOException {
118+
public void initialize(
119+
String nodeId,
120+
ResourceWatcherService resourceWatcher,
121+
IngestService ingestServiceArg,
122+
ClusterService clusterService
123+
) throws IOException {
117124
configDatabases.initialize(resourceWatcher);
118125
geoipTmpDirectory = geoipTmpBaseDirectory.resolve(nodeId);
119126
Files.walkFileTree(geoipTmpDirectory, new FileVisitor<>() {
@@ -150,8 +157,8 @@ public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
150157
Files.createDirectories(geoipTmpDirectory);
151158
}
152159
LOGGER.debug("initialized database node service, using geoip-databases directory [{}]", geoipTmpDirectory);
153-
ingestServiceArg.addIngestClusterStateListener(this::checkDatabases);
154160
this.ingestService = ingestServiceArg;
161+
clusterService.addListener(event -> checkDatabases(event.state()));
155162
}
156163

157164
public DatabaseReaderLazyLoader getDatabase(String name) {
@@ -184,6 +191,10 @@ public void close() throws IOException {
184191
}
185192

186193
void checkDatabases(ClusterState state) {
194+
if (state.blocks().hasGlobalBlock(GatewayService.STATE_NOT_RECOVERED_BLOCK)) {
195+
return;
196+
}
197+
187198
DiscoveryNode localNode = state.nodes().getLocalNode();
188199
if (localNode.isIngestNode() == false) {
189200
return;

modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/IngestGeoIpPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public Collection<Object> createComponents(
120120
) {
121121
try {
122122
String nodeId = nodeEnvironment.nodeId();
123-
databaseRegistry.get().initialize(nodeId, resourceWatcherService, ingestService.get());
123+
databaseRegistry.get().initialize(nodeId, resourceWatcherService, ingestService.get(), clusterService);
124124
} catch (IOException e) {
125125
throw new UncheckedIOException(e);
126126
}

modules/ingest-geoip/src/test/java/org/elasticsearch/ingest/geoip/DatabaseNodeServiceTests.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.elasticsearch.cluster.routing.RoutingTable;
3333
import org.elasticsearch.cluster.routing.ShardRouting;
3434
import org.elasticsearch.cluster.routing.UnassignedInfo;
35+
import org.elasticsearch.cluster.service.ClusterService;
3536
import org.elasticsearch.common.bytes.BytesArray;
3637
import org.elasticsearch.common.hash.MessageDigests;
3738
import org.elasticsearch.common.io.Streams;
@@ -106,6 +107,7 @@ public class DatabaseNodeServiceTests extends ESTestCase {
106107
private DatabaseNodeService databaseNodeService;
107108
private ResourceWatcherService resourceWatcherService;
108109
private IngestService ingestService;
110+
private ClusterService clusterService;
109111

110112
@Before
111113
public void setup() throws IOException {
@@ -121,9 +123,10 @@ public void setup() throws IOException {
121123

122124
client = mock(Client.class);
123125
ingestService = mock(IngestService.class);
126+
clusterService = mock(ClusterService.class);
124127
geoIpTmpDir = createTempDir();
125128
databaseNodeService = new DatabaseNodeService(geoIpTmpDir, client, cache, configDatabases, Runnable::run);
126-
databaseNodeService.initialize("nodeId", resourceWatcherService, ingestService);
129+
databaseNodeService.initialize("nodeId", resourceWatcherService, ingestService, clusterService);
127130
}
128131

129132
@After
@@ -295,14 +298,17 @@ public void testUpdateDatabase() throws Exception {
295298
databaseNodeService.updateDatabase("_name", "_md5", geoIpTmpDir.resolve("some-file"));
296299

297300
// Updating the first time may trigger a reload.
298-
verify(ingestService, times(1)).addIngestClusterStateListener(any());
301+
verify(clusterService, times(1)).addListener(any());
299302
verify(ingestService, times(1)).getPipelineWithProcessorType(any(), any());
300303
verify(ingestService, times(numPipelinesToBeReloaded)).reloadPipeline(anyString());
304+
verifyNoMoreInteractions(clusterService);
301305
verifyNoMoreInteractions(ingestService);
306+
reset(clusterService);
302307
reset(ingestService);
303308

304309
// Subsequent updates shouldn't trigger a reload.
305310
databaseNodeService.updateDatabase("_name", "_md5", geoIpTmpDir.resolve("some-file"));
311+
verifyNoMoreInteractions(clusterService);
306312
verifyNoMoreInteractions(ingestService);
307313
}
308314

modules/ingest-geoip/src/test/java/org/elasticsearch/ingest/geoip/GeoIpProcessorFactoryTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public void loadDatabaseReaders() throws IOException {
7373
copyDatabaseFiles(geoIpConfigDir, configDatabases);
7474
geoipTmpDir = createTempDir();
7575
databaseNodeService = new DatabaseNodeService(geoipTmpDir, client, cache, configDatabases, Runnable::run);
76-
databaseNodeService.initialize("nodeId", mock(ResourceWatcherService.class), mock(IngestService.class));
76+
databaseNodeService.initialize("nodeId", mock(ResourceWatcherService.class), mock(IngestService.class), mock(ClusterService.class));
7777
clusterService = mock(ClusterService.class);
7878
when(clusterService.state()).thenReturn(ClusterState.EMPTY_STATE);
7979
}
@@ -361,7 +361,7 @@ public void testLoadingCustomDatabase() throws IOException {
361361
Client client = mock(Client.class);
362362
GeoIpCache cache = new GeoIpCache(1000);
363363
DatabaseNodeService databaseNodeService = new DatabaseNodeService(createTempDir(), client, cache, configDatabases, Runnable::run);
364-
databaseNodeService.initialize("nodeId", resourceWatcherService, mock(IngestService.class));
364+
databaseNodeService.initialize("nodeId", resourceWatcherService, mock(IngestService.class), mock(ClusterService.class));
365365
GeoIpProcessor.Factory factory = new GeoIpProcessor.Factory(databaseNodeService, clusterService);
366366
for (DatabaseReaderLazyLoader lazyLoader : configDatabases.getConfigDatabases().values()) {
367367
assertNull(lazyLoader.databaseReader.get());

0 commit comments

Comments
 (0)