Skip to content

Commit 32b3f65

Browse files
committed
Fix bugs with tests that have no cluster state
1 parent 2f726a2 commit 32b3f65

File tree

12 files changed

+150
-62
lines changed

12 files changed

+150
-62
lines changed

x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/CsvTestsDataLoader.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,10 @@ private static void deleteView(RestClient client, String viewName, Logger logger
665665
try {
666666
client.performRequest(new Request("DELETE", "/_query/view/" + viewName));
667667
} catch (ResponseException e) {
668-
if (e.getResponse().getStatusLine().getStatusCode() != 404) {
668+
logger.info("View delete error: {}", e.getMessage());
669+
int code = e.getResponse().getStatusLine().getStatusCode();
670+
// On older servers the view listing succeeds when it should, so we get here when we should not, hence the 400
671+
if (code != 404 && code != 400) {
669672
throw e;
670673
}
671674
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/EsqlPlugin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import org.elasticsearch.xpack.esql.querydsl.query.SingleValueQuery;
8383
import org.elasticsearch.xpack.esql.querylog.EsqlQueryLog;
8484
import org.elasticsearch.xpack.esql.session.IndexResolver;
85+
import org.elasticsearch.xpack.esql.view.ClusterViewService;
8586
import org.elasticsearch.xpack.esql.view.DeleteViewAction;
8687
import org.elasticsearch.xpack.esql.view.GetViewAction;
8788
import org.elasticsearch.xpack.esql.view.ListViewsAction;
@@ -233,7 +234,7 @@ public Collection<?> createComponents(PluginServices services) {
233234
BigArrays bigArrays = services.indicesService().getBigArrays().withCircuitBreaking();
234235
var blockFactoryProvider = blockFactoryProvider(circuitBreaker, bigArrays, maxPrimitiveArrayBlockSize);
235236
EsqlFunctionRegistry functionRegistry = new EsqlFunctionRegistry();
236-
ViewService viewService = new ViewService(services.clusterService(), functionRegistry);
237+
ViewService viewService = new ClusterViewService(functionRegistry, services.clusterService());
237238
setupSharedSecrets();
238239
List<BiConsumer<LogicalPlan, Failures>> extraCheckers = extraCheckerProviders.stream()
239240
.flatMap(p -> p.checkers(services.projectResolver(), services.clusterService()).stream())

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportEsqlQueryAction.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
import org.elasticsearch.xpack.esql.session.Configuration;
5656
import org.elasticsearch.xpack.esql.session.EsqlSession.PlanRunner;
5757
import org.elasticsearch.xpack.esql.session.Result;
58-
import org.elasticsearch.xpack.esql.view.ViewService;
58+
import org.elasticsearch.xpack.esql.view.ClusterViewService;
5959

6060
import java.io.IOException;
6161
import java.time.ZoneOffset;
@@ -80,7 +80,7 @@ public class TransportEsqlQueryAction extends HandledTransportAction<EsqlQueryRe
8080
private final ClusterService clusterService;
8181
private final Executor requestExecutor;
8282
private final EnrichPolicyResolver enrichPolicyResolver;
83-
private final ViewService viewService;
83+
private final ClusterViewService viewService;
8484
private final EnrichLookupService enrichLookupService;
8585
private final LookupFromIndexService lookupFromIndexService;
8686
private final AsyncTaskManagementService<EsqlQueryRequest, EsqlQueryResponse, EsqlQueryTask> asyncTaskManagementService;
@@ -102,7 +102,7 @@ public TransportEsqlQueryAction(
102102
SearchService searchService,
103103
ExchangeService exchangeService,
104104
ClusterService clusterService,
105-
ViewService viewService,
105+
ClusterViewService viewService,
106106
ProjectResolver projectResolver,
107107
ThreadPool threadPool,
108108
BigArrays bigArrays,
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
package org.elasticsearch.xpack.esql.view;
9+
10+
import org.elasticsearch.action.ActionListener;
11+
import org.elasticsearch.cluster.ClusterState;
12+
import org.elasticsearch.cluster.ClusterStateUpdateTask;
13+
import org.elasticsearch.cluster.metadata.Metadata;
14+
import org.elasticsearch.cluster.service.ClusterService;
15+
import org.elasticsearch.core.SuppressForbidden;
16+
import org.elasticsearch.xpack.esql.expression.function.EsqlFunctionRegistry;
17+
18+
import java.util.Map;
19+
import java.util.function.Function;
20+
21+
/**
22+
* Implementation of {@link ViewService} that keeps the views in the cluster state.
23+
*/
24+
public class ClusterViewService extends ViewService {
25+
private final ClusterService clusterService;
26+
27+
public ClusterViewService(EsqlFunctionRegistry functionRegistry, ClusterService clusterService) {
28+
super(functionRegistry);
29+
this.clusterService = clusterService;
30+
}
31+
32+
@Override
33+
protected ViewMetadata getMetadata() {
34+
return clusterService.state().metadata().custom(ViewMetadata.TYPE, ViewMetadata.EMPTY);
35+
}
36+
37+
@Override
38+
protected void updateViewMetadata(ActionListener<Void> callback, Function<ViewMetadata, Map<String, View>> function) {
39+
submitUnbatchedTask("update-esql-view-metadata", new ClusterStateUpdateTask() {
40+
@Override
41+
public ClusterState execute(ClusterState currentState) {
42+
var views = currentState.metadata().custom(ViewMetadata.TYPE, ViewMetadata.EMPTY);
43+
Map<String, View> policies = function.apply(views);
44+
Metadata metadata = Metadata.builder(currentState.metadata())
45+
.putCustom(ViewMetadata.TYPE, new ViewMetadata(policies))
46+
.build();
47+
return ClusterState.builder(currentState).metadata(metadata).build();
48+
}
49+
50+
@Override
51+
public void clusterStateProcessed(ClusterState oldState, ClusterState newState) {
52+
callback.onResponse(null);
53+
}
54+
55+
@Override
56+
public void onFailure(Exception e) {
57+
callback.onFailure(e);
58+
}
59+
});
60+
}
61+
62+
@SuppressForbidden(reason = "legacy usage of unbatched task") // TODO add support for batching here
63+
private void submitUnbatchedTask(@SuppressWarnings("SameParameterValue") String source, ClusterStateUpdateTask task) {
64+
clusterService.submitUnbatchedStateUpdateTask(source, task);
65+
}
66+
67+
@Override
68+
protected void assertMasterNode() {
69+
assert clusterService.localNode().isMasterNode();
70+
}
71+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
package org.elasticsearch.xpack.esql.view;
9+
10+
import org.elasticsearch.action.ActionListener;
11+
import org.elasticsearch.xpack.esql.expression.function.EsqlFunctionRegistry;
12+
13+
import java.util.Map;
14+
import java.util.function.Function;
15+
16+
/**
17+
* Simple implementation of {@link ClusterViewService} that keeps the views in memory.
18+
* This is useful for testing.
19+
*/
20+
public class InMemoryViewService extends ViewService {
21+
22+
private ViewMetadata metadata;
23+
24+
public InMemoryViewService(EsqlFunctionRegistry functionRegistry) {
25+
super(functionRegistry);
26+
this.metadata = ViewMetadata.EMPTY;
27+
}
28+
29+
@Override
30+
protected ViewMetadata getMetadata() {
31+
return metadata;
32+
}
33+
34+
@Override
35+
protected void updateViewMetadata(ActionListener<Void> callback, Function<ViewMetadata, Map<String, View>> function) {
36+
Map<String, View> updated = function.apply(metadata);
37+
this.metadata = new ViewMetadata(updated);
38+
}
39+
40+
@Override
41+
protected void assertMasterNode() {
42+
// no-op
43+
}
44+
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/view/TransportDeleteViewAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@
2121
import org.elasticsearch.transport.TransportService;
2222

2323
public class TransportDeleteViewAction extends AcknowledgedTransportMasterNodeAction<DeleteViewAction.Request> {
24-
private final ViewService viewService;
24+
private final ClusterViewService viewService;
2525

2626
@Inject
2727
public TransportDeleteViewAction(
2828
TransportService transportService,
2929
ClusterService clusterService,
3030
ThreadPool threadPool,
3131
ActionFilters actionFilters,
32-
ViewService viewService
32+
ClusterViewService viewService
3333
) {
3434
super(
3535
DeleteViewAction.NAME,

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/view/TransportGetViewAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818

1919
public class TransportGetViewAction extends HandledTransportAction<GetViewAction.Request, GetViewAction.Response> {
2020
public static final ActionType<RemoteInfoResponse> TYPE = new ActionType<>(GetViewAction.NAME);
21-
private final ViewService viewService;
21+
private final ClusterViewService viewService;
2222

2323
@Inject
24-
public TransportGetViewAction(TransportService transportService, ActionFilters actionFilters, ViewService viewService) {
24+
public TransportGetViewAction(TransportService transportService, ActionFilters actionFilters, ClusterViewService viewService) {
2525
super(GetViewAction.NAME, transportService, actionFilters, GetViewAction.Request::new, EsExecutors.DIRECT_EXECUTOR_SERVICE);
2626
this.viewService = viewService;
2727
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/view/TransportListViewsAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121

2222
public class TransportListViewsAction extends HandledTransportAction<ListViewsAction.Request, ListViewsAction.Response> {
2323
public static final ActionType<RemoteInfoResponse> TYPE = new ActionType<>(ListViewsAction.NAME);
24-
private final ViewService viewService;
24+
private final ClusterViewService viewService;
2525

2626
@Inject
27-
public TransportListViewsAction(TransportService transportService, ActionFilters actionFilters, ViewService viewService) {
27+
public TransportListViewsAction(TransportService transportService, ActionFilters actionFilters, ClusterViewService viewService) {
2828
super(ListViewsAction.NAME, transportService, actionFilters, ListViewsAction.Request::new, EsExecutors.DIRECT_EXECUTOR_SERVICE);
2929
this.viewService = viewService;
3030
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/view/TransportPutViewAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@
2828
import java.util.Map;
2929

3030
public class TransportPutViewAction extends AcknowledgedTransportMasterNodeAction<PutViewAction.Request> {
31-
private final ViewService viewService;
31+
private final ClusterViewService viewService;
3232

3333
@Inject
3434
public TransportPutViewAction(
3535
TransportService transportService,
3636
ClusterService clusterService,
3737
ThreadPool threadPool,
3838
ActionFilters actionFilters,
39-
ViewService viewService
39+
ClusterViewService viewService
4040
) {
4141
super(
4242
PutViewAction.NAME,

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/view/ViewMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import java.util.Objects;
2727

2828
/**
29-
* Encapsulates enrich policies as custom metadata inside cluster state.
29+
* Encapsulates view definitions as custom metadata inside cluster state.
3030
*/
3131
public final class ViewMetadata extends AbstractNamedDiffable<Metadata.ClusterCustom> implements Metadata.ClusterCustom {
3232
public static final String TYPE = "esql_view";

0 commit comments

Comments
 (0)