Skip to content

Commit 87b2cf9

Browse files
stevanbzstevanbuzejic
authored andcommitted
Bugfix/496 rollover alias with filters (opensearch-project#4499)
* 496: Added filters, indexRouting and searchRouting when doing rollover on alias Signed-off-by: Stevan Buzejic <buzejic.stevan@gmail.com> * 496: Removed unused map property in metada alias rollover tests Signed-off-by: Stevan Buzejic <buzejic.stevan@gmail.com> Signed-off-by: Stevan Buzejic <buzejic.stevan@gmail.com> Co-authored-by: Stevan Buzejic <stevan.buzejic@htecgroup.com>
1 parent 83068a1 commit 87b2cf9

File tree

4 files changed

+187
-9
lines changed

4 files changed

+187
-9
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
8888
- [Segment Replication] Ignore lock file when testing cleanupAndPreserveLatestCommitPoint ([#4544](https://github.com/opensearch-project/OpenSearch/pull/4544))
8989
- Updated jackson to 2.13.4 and snakeyml to 1.32 ([#4556](https://github.com/opensearch-project/OpenSearch/pull/4556))
9090
- [Bug]: Fixed invalid location of JDK dependency for arm64 architecture([#4613](https://github.com/opensearch-project/OpenSearch/pull/4613))
91+
- [Bug]: Alias filter lost after rollover ([#4499](https://github.com/opensearch-project/OpenSearch/pull/4499))
9192

9293
### Security
9394
- CVE-2022-25857 org.yaml:snakeyaml DOS vulnerability ([#4341](https://github.com/opensearch-project/OpenSearch/pull/4341))

server/src/main/java/org/opensearch/action/admin/indices/rollover/MetadataRolloverService.java

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ private RolloverResult rolloverAlias(
188188
ClusterState newState = createIndexService.applyCreateIndexRequest(currentState, createIndexClusterStateRequest, silent);
189189
newState = indexAliasesService.applyAliasActions(
190190
newState,
191-
rolloverAliasToNewIndex(sourceIndexName, rolloverIndexName, explicitWriteIndex, aliasMetadata.isHidden(), aliasName)
191+
rolloverAliasToNewIndex(sourceIndexName, rolloverIndexName, explicitWriteIndex, aliasMetadata, aliasName)
192192
);
193193

194194
RolloverInfo rolloverInfo = new RolloverInfo(aliasName, metConditions, threadPool.absoluteTimeInMillis());
@@ -309,20 +309,46 @@ static List<AliasAction> rolloverAliasToNewIndex(
309309
String oldIndex,
310310
String newIndex,
311311
boolean explicitWriteIndex,
312-
@Nullable Boolean isHidden,
312+
AliasMetadata aliasMetadata,
313313
String alias
314314
) {
315+
String filterAsString = aliasMetadata.getFilter() != null ? aliasMetadata.getFilter().string() : null;
316+
315317
if (explicitWriteIndex) {
316318
return Collections.unmodifiableList(
317319
Arrays.asList(
318-
new AliasAction.Add(newIndex, alias, null, null, null, true, isHidden),
319-
new AliasAction.Add(oldIndex, alias, null, null, null, false, isHidden)
320+
new AliasAction.Add(
321+
newIndex,
322+
alias,
323+
filterAsString,
324+
aliasMetadata.getIndexRouting(),
325+
aliasMetadata.getSearchRouting(),
326+
true,
327+
aliasMetadata.isHidden()
328+
),
329+
new AliasAction.Add(
330+
oldIndex,
331+
alias,
332+
filterAsString,
333+
aliasMetadata.getIndexRouting(),
334+
aliasMetadata.getSearchRouting(),
335+
false,
336+
aliasMetadata.isHidden()
337+
)
320338
)
321339
);
322340
} else {
323341
return Collections.unmodifiableList(
324342
Arrays.asList(
325-
new AliasAction.Add(newIndex, alias, null, null, null, null, isHidden),
343+
new AliasAction.Add(
344+
newIndex,
345+
alias,
346+
filterAsString,
347+
aliasMetadata.getIndexRouting(),
348+
aliasMetadata.getSearchRouting(),
349+
null,
350+
aliasMetadata.isHidden()
351+
),
326352
new AliasAction.Remove(oldIndex, alias, null)
327353
)
328354
);

server/src/main/java/org/opensearch/cluster/metadata/AliasAction.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,18 @@ public String getAlias() {
138138
return alias;
139139
}
140140

141+
public String getFilter() {
142+
return filter;
143+
}
144+
145+
public String getSearchRouting() {
146+
return searchRouting;
147+
}
148+
149+
public String getIndexRouting() {
150+
return indexRouting;
151+
}
152+
141153
public Boolean writeIndex() {
142154
return writeIndex;
143155
}

server/src/test/java/org/opensearch/action/admin/indices/rollover/MetadataRolloverServiceTests.java

Lines changed: 143 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,13 @@ public void testRolloverAliasActions() {
126126
String sourceIndex = randomAlphaOfLength(10);
127127
String targetIndex = randomAlphaOfLength(10);
128128

129-
List<AliasAction> actions = MetadataRolloverService.rolloverAliasToNewIndex(sourceIndex, targetIndex, false, null, sourceAlias);
129+
List<AliasAction> actions = MetadataRolloverService.rolloverAliasToNewIndex(
130+
sourceIndex,
131+
targetIndex,
132+
false,
133+
createDefaultAliasMetadata(sourceAlias, null),
134+
sourceAlias
135+
);
130136
assertThat(actions, hasSize(2));
131137
boolean foundAdd = false;
132138
boolean foundRemove = false;
@@ -149,7 +155,13 @@ public void testRolloverAliasActionsWithExplicitWriteIndex() {
149155
String sourceAlias = randomAlphaOfLength(10);
150156
String sourceIndex = randomAlphaOfLength(10);
151157
String targetIndex = randomAlphaOfLength(10);
152-
List<AliasAction> actions = MetadataRolloverService.rolloverAliasToNewIndex(sourceIndex, targetIndex, true, null, sourceAlias);
158+
List<AliasAction> actions = MetadataRolloverService.rolloverAliasToNewIndex(
159+
sourceIndex,
160+
targetIndex,
161+
true,
162+
createDefaultAliasMetadata(sourceAlias, null),
163+
sourceAlias
164+
);
153165

154166
assertThat(actions, hasSize(2));
155167
boolean foundAddWrite = false;
@@ -172,11 +184,64 @@ public void testRolloverAliasActionsWithExplicitWriteIndex() {
172184
assertTrue(foundRemoveWrite);
173185
}
174186

187+
public void testRolloverAliasActionsWithFilterAndExplicitWriteIndex() {
188+
String sourceAlias = randomAlphaOfLength(10);
189+
String sourceIndex = randomAlphaOfLength(10);
190+
String targetIndex = randomAlphaOfLength(10);
191+
String indexRouting = randomAlphaOfLength(10);
192+
String sourceRouting = randomAlphaOfLength(10);
193+
AliasMetadata aliasMetadata = createAliasMetadata(
194+
sourceAlias,
195+
Collections.singletonMap(randomAlphaOfLength(2), randomAlphaOfLength(2)),
196+
indexRouting,
197+
sourceRouting,
198+
true
199+
);
200+
201+
List<AliasAction> actions = MetadataRolloverService.rolloverAliasToNewIndex(
202+
sourceIndex,
203+
targetIndex,
204+
true,
205+
aliasMetadata,
206+
sourceAlias
207+
);
208+
209+
assertThat(actions, hasSize(2));
210+
boolean foundAddWrite = false;
211+
boolean foundRemoveWrite = false;
212+
for (AliasAction action : actions) {
213+
AliasAction.Add addAction = (AliasAction.Add) action;
214+
if (action.getIndex().equals(targetIndex)) {
215+
assertEquals(sourceAlias, addAction.getAlias());
216+
assertEquals(aliasMetadata.filter().string(), addAction.getFilter());
217+
assertEquals(indexRouting, addAction.getIndexRouting());
218+
assertEquals(sourceRouting, addAction.getSearchRouting());
219+
220+
assertTrue(addAction.writeIndex());
221+
foundAddWrite = true;
222+
} else if (action.getIndex().equals(sourceIndex)) {
223+
assertEquals(sourceAlias, addAction.getAlias());
224+
assertFalse(addAction.writeIndex());
225+
foundRemoveWrite = true;
226+
} else {
227+
throw new AssertionError("Unknown index [" + action.getIndex() + "]");
228+
}
229+
}
230+
assertTrue(foundAddWrite);
231+
assertTrue(foundRemoveWrite);
232+
}
233+
175234
public void testRolloverAliasActionsWithHiddenAliasAndExplicitWriteIndex() {
176235
String sourceAlias = randomAlphaOfLength(10);
177236
String sourceIndex = randomAlphaOfLength(10);
178237
String targetIndex = randomAlphaOfLength(10);
179-
List<AliasAction> actions = MetadataRolloverService.rolloverAliasToNewIndex(sourceIndex, targetIndex, true, true, sourceAlias);
238+
List<AliasAction> actions = MetadataRolloverService.rolloverAliasToNewIndex(
239+
sourceIndex,
240+
targetIndex,
241+
true,
242+
createDefaultAliasMetadata(sourceAlias, true),
243+
sourceAlias
244+
);
180245

181246
assertThat(actions, hasSize(2));
182247
boolean foundAddWrite = false;
@@ -202,11 +267,66 @@ public void testRolloverAliasActionsWithHiddenAliasAndExplicitWriteIndex() {
202267
assertTrue(foundRemoveWrite);
203268
}
204269

270+
public void testRolloverAliasActionsWithFilterAndHiddenAliasAndImplicitWriteIndex() {
271+
String sourceAlias = randomAlphaOfLength(10);
272+
String sourceIndex = randomAlphaOfLength(10);
273+
String targetIndex = randomAlphaOfLength(10);
274+
String indexRouting = randomAlphaOfLength(10);
275+
String sourceRouting = randomAlphaOfLength(10);
276+
AliasMetadata aliasMetadata = createAliasMetadata(
277+
sourceAlias,
278+
Collections.singletonMap(randomAlphaOfLength(2), randomAlphaOfLength(2)),
279+
indexRouting,
280+
sourceRouting,
281+
true
282+
);
283+
284+
List<AliasAction> actions = MetadataRolloverService.rolloverAliasToNewIndex(
285+
sourceIndex,
286+
targetIndex,
287+
false,
288+
aliasMetadata,
289+
sourceAlias
290+
);
291+
292+
assertThat(actions, hasSize(2));
293+
boolean foundAddWrite = false;
294+
boolean foundRemoveWrite = false;
295+
for (AliasAction action : actions) {
296+
if (action.getIndex().equals(targetIndex)) {
297+
assertThat(action, instanceOf(AliasAction.Add.class));
298+
AliasAction.Add addAction = (AliasAction.Add) action;
299+
assertEquals(sourceAlias, addAction.getAlias());
300+
assertThat(addAction.writeIndex(), nullValue());
301+
assertTrue(addAction.isHidden());
302+
assertEquals(aliasMetadata.filter().string(), addAction.getFilter());
303+
assertEquals(indexRouting, addAction.getIndexRouting());
304+
assertEquals(sourceRouting, addAction.getSearchRouting());
305+
foundAddWrite = true;
306+
} else if (action.getIndex().equals(sourceIndex)) {
307+
assertThat(action, instanceOf(AliasAction.Remove.class));
308+
AliasAction.Remove removeAction = (AliasAction.Remove) action;
309+
assertEquals(sourceAlias, removeAction.getAlias());
310+
foundRemoveWrite = true;
311+
} else {
312+
throw new AssertionError("Unknown index [" + action.getIndex() + "]");
313+
}
314+
}
315+
assertTrue(foundAddWrite);
316+
assertTrue(foundRemoveWrite);
317+
}
318+
205319
public void testRolloverAliasActionsWithHiddenAliasAndImplicitWriteIndex() {
206320
String sourceAlias = randomAlphaOfLength(10);
207321
String sourceIndex = randomAlphaOfLength(10);
208322
String targetIndex = randomAlphaOfLength(10);
209-
List<AliasAction> actions = MetadataRolloverService.rolloverAliasToNewIndex(sourceIndex, targetIndex, false, true, sourceAlias);
323+
List<AliasAction> actions = MetadataRolloverService.rolloverAliasToNewIndex(
324+
sourceIndex,
325+
targetIndex,
326+
false,
327+
createDefaultAliasMetadata(sourceAlias, true),
328+
sourceAlias
329+
);
210330

211331
assertThat(actions, hasSize(2));
212332
boolean foundAddWrite = false;
@@ -1010,4 +1130,23 @@ private static IndexMetadata createMetadata(String indexName) {
10101130
.settings(settings)
10111131
.build();
10121132
}
1133+
1134+
private static AliasMetadata createDefaultAliasMetadata(String alias, Boolean isHidden) {
1135+
return AliasMetadata.builder(alias).isHidden(isHidden).build();
1136+
}
1137+
1138+
private static AliasMetadata createAliasMetadata(
1139+
String alias,
1140+
Map filter,
1141+
String indexRouting,
1142+
String searchRouting,
1143+
Boolean isHidden
1144+
) {
1145+
return AliasMetadata.builder(alias)
1146+
.isHidden(isHidden)
1147+
.filter(filter)
1148+
.indexRouting(indexRouting)
1149+
.searchRouting(searchRouting)
1150+
.build();
1151+
}
10131152
}

0 commit comments

Comments
 (0)