|
27 | 27 | import org.elasticsearch.cluster.metadata.IndexMetaData; |
28 | 28 | import org.elasticsearch.common.Strings; |
29 | 29 | import org.elasticsearch.common.settings.Settings; |
| 30 | +import org.elasticsearch.common.xcontent.XContentHelper; |
30 | 31 | import org.elasticsearch.common.xcontent.XContentType; |
| 32 | +import org.elasticsearch.common.xcontent.json.JsonXContent; |
31 | 33 | import org.elasticsearch.index.IndexSettings; |
32 | 34 | import org.elasticsearch.index.seqno.SeqNoStats; |
33 | 35 | import org.elasticsearch.index.seqno.SequenceNumbersService; |
34 | 36 | import org.elasticsearch.test.rest.ESRestTestCase; |
35 | 37 | import org.elasticsearch.test.rest.yaml.ObjectPath; |
36 | 38 |
|
37 | 39 | import java.io.IOException; |
| 40 | +import java.io.InputStream; |
38 | 41 | import java.nio.charset.StandardCharsets; |
39 | 42 | import java.util.ArrayList; |
40 | 43 | import java.util.Collections; |
@@ -109,26 +112,58 @@ public void testSeqNoCheckpoints() throws Exception { |
109 | 112 | createIndex(index, settings.build()); |
110 | 113 | try (RestClient newNodeClient = buildClient(restClientSettings(), |
111 | 114 | nodes.getNewNodes().stream().map(Node::getPublishAddress).toArray(HttpHost[]::new))) { |
112 | | - int numDocs = indexDocs(index, 0, randomInt(5)); |
| 115 | + int numDocs = 0; |
| 116 | + final int numberOfInitialDocs = 1 + randomInt(5); |
| 117 | + logger.info("indexing [{}] docs initially", numberOfInitialDocs); |
| 118 | + numDocs += indexDocs(index, 0, numberOfInitialDocs); |
113 | 119 | assertSeqNoOnShards(nodes, checkGlobalCheckpoints, 0, newNodeClient); |
114 | | - |
115 | 120 | logger.info("allowing shards on all nodes"); |
116 | 121 | updateIndexSetting(index, Settings.builder().putNull("index.routing.allocation.include._name")); |
117 | 122 | ensureGreen(); |
118 | | - logger.info("indexing some more docs"); |
119 | | - numDocs += indexDocs(index, numDocs, randomInt(5)); |
| 123 | + final int numberOfDocsAfterAllowingShardsOnAllNodes = 1 + randomInt(5); |
| 124 | + logger.info("indexing [{}] docs after allowing shards on all nodes", numberOfDocsAfterAllowingShardsOnAllNodes); |
| 125 | + numDocs += indexDocs(index, numDocs, numberOfDocsAfterAllowingShardsOnAllNodes); |
120 | 126 | assertSeqNoOnShards(nodes, checkGlobalCheckpoints, 0, newNodeClient); |
121 | | - logger.info("moving primary to new node"); |
122 | 127 | Shard primary = buildShards(nodes, newNodeClient).stream().filter(Shard::isPrimary).findFirst().get(); |
| 128 | + logger.info("moving primary to new node by excluding {}", primary.getNode().getNodeName()); |
123 | 129 | updateIndexSetting(index, Settings.builder().put("index.routing.allocation.exclude._name", primary.getNode().getNodeName())); |
124 | 130 | ensureGreen(); |
125 | | - logger.info("indexing some more docs"); |
126 | | - int numDocsOnNewPrimary = indexDocs(index, numDocs, randomInt(5)); |
127 | | - numDocs += numDocsOnNewPrimary; |
| 131 | + int numDocsOnNewPrimary = 0; |
| 132 | + final int numberOfDocsAfterMovingPrimary = 1 + randomInt(5); |
| 133 | + logger.info("indexing [{}] docs after moving primary", numberOfDocsAfterMovingPrimary); |
| 134 | + numDocsOnNewPrimary += indexDocs(index, numDocs, numberOfDocsAfterMovingPrimary); |
| 135 | + numDocs += numberOfDocsAfterMovingPrimary; |
| 136 | + assertSeqNoOnShards(nodes, checkGlobalCheckpoints, numDocsOnNewPrimary, newNodeClient); |
| 137 | + /* |
| 138 | + * Dropping the number of replicas to zero, and then increasing it to one triggers a recovery thus exercising any BWC-logic in |
| 139 | + * the recovery code. |
| 140 | + */ |
| 141 | + logger.info("setting number of replicas to 0"); |
| 142 | + updateIndexSetting(index, Settings.builder().put("index.number_of_replicas", 0)); |
| 143 | + final int numberOfDocsAfterDroppingReplicas = 1 + randomInt(5); |
| 144 | + logger.info("indexing [{}] docs after setting number of replicas to 0", numberOfDocsAfterDroppingReplicas); |
| 145 | + numDocsOnNewPrimary += indexDocs(index, numDocs, numberOfDocsAfterDroppingReplicas); |
| 146 | + numDocs += numberOfDocsAfterDroppingReplicas; |
| 147 | + logger.info("setting number of replicas to 1"); |
| 148 | + updateIndexSetting(index, Settings.builder().put("index.number_of_replicas", 1)); |
| 149 | + ensureGreen(); |
| 150 | + assertOK(client().performRequest("POST", index + "/_refresh")); |
| 151 | + // the number of documents on the primary and on the recovered replica should match the number of indexed documents |
| 152 | + assertCount(index, "_primary", numDocs); |
| 153 | + assertCount(index, "_replica", numDocs); |
128 | 154 | assertSeqNoOnShards(nodes, checkGlobalCheckpoints, numDocsOnNewPrimary, newNodeClient); |
129 | 155 | } |
130 | 156 | } |
131 | 157 |
|
| 158 | + private void assertCount(final String index, final String preference, final int expectedCount) throws IOException { |
| 159 | + final Response response = client().performRequest("GET", index + "/_count", Collections.singletonMap("preference", preference)); |
| 160 | + assertOK(response); |
| 161 | + final InputStream content = response.getEntity().getContent(); |
| 162 | + final int actualCount = |
| 163 | + Integer.parseInt(XContentHelper.convertToMap(JsonXContent.jsonXContent, content, false).get("count").toString()); |
| 164 | + assertThat(actualCount, equalTo(expectedCount)); |
| 165 | + } |
| 166 | + |
132 | 167 | private void assertSeqNoOnShards(Nodes nodes, boolean checkGlobalCheckpoints, int numDocs, RestClient client) throws Exception { |
133 | 168 | assertBusy(() -> { |
134 | 169 | try { |
|
0 commit comments