Skip to content

Commit 1c95cbc

Browse files
fred84bleskes
authored andcommitted
Rollover max docs should only count primaries (#24977)
max_doc condition for index rollover should use document count only from primary shards Fixes #24217
1 parent 01d7c21 commit 1c95cbc

File tree

3 files changed

+116
-1
lines changed

3 files changed

+116
-1
lines changed

core/src/main/java/org/elasticsearch/action/admin/indices/rollover/TransportRolloverAction.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ protected void masterOperation(final RolloverRequest rolloverRequest, final Clus
119119
@Override
120120
public void onResponse(IndicesStatsResponse statsResponse) {
121121
final Set<Condition.Result> conditionResults = evaluateConditions(rolloverRequest.getConditions(),
122-
statsResponse.getTotal().getDocs(), metaData.index(sourceIndexName));
122+
metaData.index(sourceIndexName), statsResponse);
123123

124124
if (rolloverRequest.isDryRun()) {
125125
listener.onResponse(
@@ -201,6 +201,11 @@ static Set<Condition.Result> evaluateConditions(final Set<Condition> conditions,
201201
.collect(Collectors.toSet());
202202
}
203203

204+
static Set<Condition.Result> evaluateConditions(final Set<Condition> conditions, final IndexMetaData metaData,
205+
final IndicesStatsResponse statsResponse) {
206+
return evaluateConditions(conditions, statsResponse.getPrimaries().getDocs(), metaData);
207+
}
208+
204209
static void validate(MetaData metaData, RolloverRequest request) {
205210
final AliasOrIndex aliasOrIndex = metaData.getAliasAndIndexLookup().get(request.getAlias());
206211
if (aliasOrIndex == null) {

core/src/test/java/org/elasticsearch/action/admin/indices/rollover/TransportRolloverActionTests.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.elasticsearch.Version;
2323
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesClusterStateUpdateRequest;
2424
import org.elasticsearch.action.admin.indices.create.CreateIndexClusterStateUpdateRequest;
25+
import org.elasticsearch.action.admin.indices.stats.CommonStats;
26+
import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse;
2527
import org.elasticsearch.action.support.ActiveShardCount;
2628
import org.elasticsearch.cluster.metadata.AliasAction;
2729
import org.elasticsearch.cluster.metadata.AliasMetaData;
@@ -40,12 +42,30 @@
4042
import java.util.Locale;
4143
import java.util.Set;
4244

45+
import org.mockito.ArgumentCaptor;
4346
import static org.elasticsearch.action.admin.indices.rollover.TransportRolloverAction.evaluateConditions;
4447
import static org.hamcrest.Matchers.equalTo;
4548
import static org.hamcrest.Matchers.hasSize;
49+
import static org.mockito.Matchers.any;
50+
import static org.mockito.Mockito.verify;
51+
import static org.mockito.Mockito.mock;
52+
import static org.mockito.Mockito.when;
53+
4654

4755
public class TransportRolloverActionTests extends ESTestCase {
4856

57+
public void testDocStatsSelectionFromPrimariesOnly() throws Exception {
58+
long docsInPrimaryShards = 100;
59+
long docsInShards = 200;
60+
61+
final Condition condition = createTestCondition();
62+
evaluateConditions(Sets.newHashSet(condition), createMetaData(), createIndecesStatResponse(docsInShards, docsInPrimaryShards));
63+
final ArgumentCaptor<Condition.Stats> argument = ArgumentCaptor.forClass(Condition.Stats.class);
64+
verify(condition).evaluate(argument.capture());
65+
66+
assertEquals(docsInPrimaryShards, argument.getValue().numDocs);
67+
}
68+
4969
public void testEvaluateConditions() throws Exception {
5070
MaxDocsCondition maxDocsCondition = new MaxDocsCondition(100L);
5171
MaxAgeCondition maxAgeCondition = new MaxAgeCondition(TimeValue.timeValueHours(2));
@@ -190,4 +210,37 @@ public void testCreateIndexRequest() throws Exception {
190210
assertThat(createIndexRequest.index(), equalTo(rolloverIndex));
191211
assertThat(createIndexRequest.cause(), equalTo("rollover_index"));
192212
}
213+
214+
private IndicesStatsResponse createIndecesStatResponse(long totalDocs, long primaryDocs) {
215+
final CommonStats primaryStats = mock(CommonStats.class);
216+
when(primaryStats.getDocs()).thenReturn(new DocsStats(primaryDocs, 0));
217+
218+
final CommonStats totalStats = mock(CommonStats.class);
219+
when(totalStats.getDocs()).thenReturn(new DocsStats(totalDocs, 0));
220+
221+
final IndicesStatsResponse response = mock(IndicesStatsResponse.class);
222+
when(response.getPrimaries()).thenReturn(primaryStats);
223+
when(response.getTotal()).thenReturn(totalStats);
224+
225+
return response;
226+
}
227+
228+
private IndexMetaData createMetaData() {
229+
final Settings settings = Settings.builder()
230+
.put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
231+
.put(IndexMetaData.SETTING_INDEX_UUID, UUIDs.randomBase64UUID())
232+
.put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1)
233+
.put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
234+
.build();
235+
return IndexMetaData.builder(randomAlphaOfLength(10))
236+
.creationDate(System.currentTimeMillis() - TimeValue.timeValueHours(3).getMillis())
237+
.settings(settings)
238+
.build();
239+
}
240+
241+
private Condition createTestCondition() {
242+
final Condition condition = mock(Condition.class);
243+
when(condition.evaluate(any())).thenReturn(new Condition.Result(condition, true));
244+
return condition;
245+
}
193246
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
---
2+
"Max docs rollover conditions matches only primary shards":
3+
- skip:
4+
version: "- 5.6.1"
5+
reason: "matching docs changed from all shards to primary shards"
6+
7+
# create index with alias and replica
8+
- do:
9+
indices.create:
10+
index: logs-1
11+
wait_for_active_shards: 1
12+
body:
13+
aliases:
14+
logs_search: {}
15+
16+
# index first document and wait for refresh
17+
- do:
18+
index:
19+
index: logs-1
20+
type: test
21+
id: "1"
22+
body: { "foo": "hello world" }
23+
refresh: true
24+
25+
# perform alias rollover with no result
26+
- do:
27+
indices.rollover:
28+
alias: "logs_search"
29+
wait_for_active_shards: 1
30+
body:
31+
conditions:
32+
max_docs: 2
33+
34+
- match: { conditions: { "[max_docs: 2]": false } }
35+
- match: { rolled_over: false }
36+
37+
# index second document and wait for refresh
38+
- do:
39+
index:
40+
index: logs-1
41+
type: test
42+
id: "2"
43+
body: { "foo": "hello world" }
44+
refresh: true
45+
46+
# perform alias rollover
47+
- do:
48+
indices.rollover:
49+
alias: "logs_search"
50+
wait_for_active_shards: 1
51+
body:
52+
conditions:
53+
max_docs: 2
54+
55+
- match: { conditions: { "[max_docs: 2]": true } }
56+
- match: { rolled_over: true }
57+

0 commit comments

Comments
 (0)