Skip to content

Commit 123bc98

Browse files
committed
Fix possible NPE in ClusterState.toString()
ClusterState.toString() can throw NPE if at least on index template exists in the cluster state.
1 parent b93dac6 commit 123bc98

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

src/main/java/org/elasticsearch/cluster/ClusterState.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,11 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
297297
builder.field("order", templateMetaData.order());
298298

299299
builder.startObject("settings");
300-
Settings settings = settingsFilter.filterSettings(templateMetaData.settings());
300+
Settings settings = templateMetaData.settings();
301+
if (settingsFilter != null) {
302+
settings = settingsFilter.filterSettings(settings);
303+
}
304+
301305
for (Map.Entry<String, String> entry : settings.getAsMap().entrySet()) {
302306
builder.field(entry.getKey(), entry.getValue());
303307
}
@@ -331,7 +335,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
331335
builder.startObject("settings");
332336
Settings settings = indexMetaData.settings();
333337
if (settingsFilter != null) {
334-
settings = settingsFilter.filterSettings(indexMetaData.settings());
338+
settings = settingsFilter.filterSettings(settings);
335339
}
336340
for (Map.Entry<String, String> entry : settings.getAsMap().entrySet()) {
337341
builder.field(entry.getKey(), entry.getValue());
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.elasticsearch.cluster.serialization;
2+
3+
import org.elasticsearch.Version;
4+
import org.elasticsearch.cluster.ClusterState;
5+
import org.elasticsearch.cluster.metadata.IndexMetaData;
6+
import org.elasticsearch.cluster.metadata.IndexTemplateMetaData;
7+
import org.elasticsearch.cluster.metadata.MetaData;
8+
import org.elasticsearch.cluster.node.DiscoveryNode;
9+
import org.elasticsearch.cluster.node.DiscoveryNodes;
10+
import org.elasticsearch.cluster.routing.RoutingTable;
11+
import org.elasticsearch.cluster.routing.allocation.AllocationService;
12+
import org.elasticsearch.common.transport.DummyTransportAddress;
13+
import org.elasticsearch.test.ElasticsearchTestCase;
14+
import org.junit.Test;
15+
16+
import static org.hamcrest.Matchers.containsString;
17+
18+
/**
19+
*
20+
*/
21+
public class ClusterStateToStringTests extends ElasticsearchTestCase {
22+
@Test
23+
public void testClusterStateSerialization() throws Exception {
24+
MetaData metaData = MetaData.builder()
25+
.put(IndexMetaData.builder("test_idx").numberOfShards(10).numberOfReplicas(1))
26+
.put(IndexTemplateMetaData.builder("test_template").build())
27+
.build();
28+
29+
RoutingTable routingTable = RoutingTable.builder()
30+
.addAsNew(metaData.index("test_idx"))
31+
.build();
32+
33+
DiscoveryNodes nodes = DiscoveryNodes.builder().put(new DiscoveryNode("node_foo", DummyTransportAddress.INSTANCE, Version.CURRENT)).localNodeId("node_foo").masterNodeId("node_foo").build();
34+
35+
ClusterState clusterState = ClusterState.builder().nodes(nodes).metaData(metaData).routingTable(routingTable).build();
36+
37+
AllocationService strategy = new AllocationService();
38+
clusterState = ClusterState.builder(clusterState).routingTable(strategy.reroute(clusterState).routingTable()).build();
39+
40+
String clusterStateString = clusterState.toString();
41+
assertNotNull(clusterStateString);
42+
43+
assertThat(clusterStateString, containsString("test_idx"));
44+
assertThat(clusterStateString, containsString("test_template"));
45+
assertThat(clusterStateString, containsString("node_foo"));
46+
47+
}
48+
49+
}

0 commit comments

Comments
 (0)