Skip to content

Commit 5c3830d

Browse files
author
Hendrik Muhs
authored
[Transform] Rename internal indexes for transform plugin (#47788)
rename internal indexes of transform plugin - rename audit index and create an alias for accessing it, BWC: add an alias for old indexes to keep them working, kibana UI will switch to use the read alias - rename config index and provide BWC to read from old and new ones
1 parent c56019e commit 5c3830d

File tree

13 files changed

+182
-43
lines changed

13 files changed

+182
-43
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/transform/transforms/persistence/TransformInternalIndexConstants.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,20 @@ public final class TransformInternalIndexConstants {
2222
*/
2323

2424
// internal index
25-
public static final String INDEX_VERSION = "2";
26-
public static final String INDEX_PATTERN = ".data-frame-internal-";
25+
26+
// version is not a rollover pattern, however padded because sort is string based
27+
public static final String INDEX_VERSION = "003";
28+
public static final String INDEX_PATTERN = ".transform-internal-";
2729
public static final String LATEST_INDEX_VERSIONED_NAME = INDEX_PATTERN + INDEX_VERSION;
2830
public static final String LATEST_INDEX_NAME = LATEST_INDEX_VERSIONED_NAME;
2931
public static final String INDEX_NAME_PATTERN = INDEX_PATTERN + "*";
32+
public static final String INDEX_NAME_PATTERN_DEPRECATED = ".data-frame-internal-*";
3033

3134
// audit index
32-
public static final String AUDIT_TEMPLATE_VERSION = "1";
35+
public static final String AUDIT_TEMPLATE_VERSION = "000001";
3336
public static final String AUDIT_INDEX_PREFIX = ".transform-notifications-";
3437
public static final String AUDIT_INDEX_PATTERN = AUDIT_INDEX_PREFIX + "*";
38+
public static final String AUDIT_INDEX_DEPRECATED = ".data-frame-notifications-1";
3539
public static final String AUDIT_INDEX_PATTERN_DEPRECATED = ".data-frame-notifications-*";
3640

3741
public static final String AUDIT_INDEX_READ_ALIAS = ".transform-notifications-read";

x-pack/plugin/transform/qa/single-node-tests/src/test/java/org/elasticsearch/xpack/transform/integration/TransformAuditorIT.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
package org.elasticsearch.xpack.transform.integration;
88

99
import org.elasticsearch.client.Request;
10+
import org.elasticsearch.cluster.metadata.IndexMetaData;
11+
import org.elasticsearch.common.settings.Settings;
1012
import org.elasticsearch.xpack.core.transform.transforms.persistence.TransformInternalIndexConstants;
1113
import org.junit.Before;
1214

@@ -48,7 +50,7 @@ public void createIndexes() throws IOException {
4850
createReviewsIndex();
4951
indicesCreated = true;
5052
setupDataAccessRole(DATA_ACCESS_ROLE, REVIEWS_INDEX_NAME);
51-
setupUser(TEST_USER_NAME, Arrays.asList("data_frame_transforms_admin", DATA_ACCESS_ROLE));
53+
setupUser(TEST_USER_NAME, Arrays.asList("transform_admin", DATA_ACCESS_ROLE));
5254
}
5355

5456
@SuppressWarnings("unchecked")
@@ -67,6 +69,7 @@ public void testAuditorWritesAudits() throws Exception {
6769
request.setJsonEntity("{\"query\":{\"term\":{\"transform_id\":\"simple_pivot_for_audit\"}}}");
6870
assertBusy(() -> {
6971
assertTrue(indexExists(TransformInternalIndexConstants.AUDIT_INDEX));
72+
assertTrue(aliasExists(TransformInternalIndexConstants.AUDIT_INDEX_READ_ALIAS));
7073
});
7174
// Since calls to write the AbstractAuditor are sent and forgot (async) we could have returned from the start,
7275
// finished the job (as this is a very short DF job), all without the audit being fully written.
@@ -85,4 +88,16 @@ public void testAuditorWritesAudits() throws Exception {
8588
});
8689

8790
}
91+
92+
public void testAliasCreatedforBWCIndexes() throws Exception {
93+
Settings.Builder settings = Settings.builder()
94+
.put(IndexMetaData.INDEX_NUMBER_OF_SHARDS_SETTING.getKey(), 1)
95+
.put(IndexMetaData.INDEX_NUMBER_OF_REPLICAS_SETTING.getKey(), 0);
96+
97+
createIndex(TransformInternalIndexConstants.AUDIT_INDEX_DEPRECATED, settings.build());
98+
assertBusy(() -> {
99+
assertTrue(aliasExists(TransformInternalIndexConstants.AUDIT_INDEX_DEPRECATED,
100+
TransformInternalIndexConstants.AUDIT_INDEX_READ_ALIAS));
101+
});
102+
}
88103
}

x-pack/plugin/transform/qa/single-node-tests/src/test/java/org/elasticsearch/xpack/transform/integration/TransformInternalIndexIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class TransformInternalIndexIT extends ESRestTestCase {
4343

4444

4545
private static final String CURRENT_INDEX = TransformInternalIndexConstants.LATEST_INDEX_NAME;
46-
private static final String OLD_INDEX = TransformInternalIndexConstants.INDEX_PATTERN + "1";
46+
private static final String OLD_INDEX = TransformInternalIndexConstants.INDEX_PATTERN + "001";
4747

4848

4949
public void testUpdateDeletesOldTransformConfig() throws Exception {

x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/Transform.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,8 @@ public Collection<Object> createComponents(Client client, ClusterService cluster
222222
transformConfigManager.get(),
223223
transformAuditor.get()));
224224

225-
return Arrays.asList(transformConfigManager.get(), transformAuditor.get(), transformCheckpointService.get());
225+
return Arrays.asList(transformConfigManager.get(), transformAuditor.get(), transformCheckpointService.get(),
226+
new TransformClusterStateListener(clusterService, client));
226227
}
227228

228229
@Override
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
package org.elasticsearch.xpack.transform;
8+
9+
import org.apache.logging.log4j.LogManager;
10+
import org.apache.logging.log4j.Logger;
11+
import org.elasticsearch.action.ActionListener;
12+
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
13+
import org.elasticsearch.action.support.master.AcknowledgedResponse;
14+
import org.elasticsearch.client.Client;
15+
import org.elasticsearch.cluster.ClusterChangedEvent;
16+
import org.elasticsearch.cluster.ClusterState;
17+
import org.elasticsearch.cluster.ClusterStateListener;
18+
import org.elasticsearch.cluster.service.ClusterService;
19+
import org.elasticsearch.gateway.GatewayService;
20+
import org.elasticsearch.xpack.core.transform.transforms.persistence.TransformInternalIndexConstants;
21+
22+
import java.util.concurrent.atomic.AtomicBoolean;
23+
24+
import static org.elasticsearch.xpack.core.ClientHelper.TRANSFORM_ORIGIN;
25+
import static org.elasticsearch.xpack.core.ClientHelper.executeAsyncWithOrigin;
26+
27+
class TransformClusterStateListener implements ClusterStateListener {
28+
29+
private static final Logger logger = LogManager.getLogger(TransformClusterStateListener.class);
30+
31+
private final Client client;
32+
private final AtomicBoolean isIndexCreationInProgress = new AtomicBoolean(false);
33+
34+
TransformClusterStateListener(ClusterService clusterService, Client client) {
35+
this.client = client;
36+
clusterService.addListener(this);
37+
logger.debug("Created TransformClusterStateListener");
38+
}
39+
40+
@Override
41+
public void clusterChanged(ClusterChangedEvent event) {
42+
if (event.state().blocks().hasGlobalBlock(GatewayService.STATE_NOT_RECOVERED_BLOCK)) {
43+
// Wait until the gateway has recovered from disk.
44+
return;
45+
}
46+
47+
// The atomic flag prevents multiple simultaneous attempts to run alias creation
48+
// if there is a flurry of cluster state updates in quick succession
49+
if (event.localNodeMaster() && isIndexCreationInProgress.compareAndSet(false, true)) {
50+
createAuditAliasForDataFrameBWC(event.state(), client, ActionListener.wrap(
51+
r -> {
52+
isIndexCreationInProgress.set(false);
53+
if (r) {
54+
logger.info("Created alias for deprecated data frame notifications index");
55+
} else {
56+
logger.debug("Skipped creating alias for deprecated data frame notifications index");
57+
}
58+
},
59+
e -> {
60+
isIndexCreationInProgress.set(false);
61+
logger.error("Error creating alias for deprecated data frame notifications index", e);
62+
}));
63+
}
64+
}
65+
66+
private static void createAuditAliasForDataFrameBWC(ClusterState state, Client client, final ActionListener<Boolean> finalListener) {
67+
68+
// check if old audit index exists, no need to create the alias if it does not
69+
if (state.getMetaData().getAliasAndIndexLookup().containsKey(TransformInternalIndexConstants.AUDIT_INDEX_DEPRECATED) == false) {
70+
finalListener.onResponse(false);
71+
return;
72+
}
73+
74+
if (state.getMetaData().getAliasAndIndexLookup().get(TransformInternalIndexConstants.AUDIT_INDEX_DEPRECATED).getIndices().stream()
75+
.anyMatch(metaData -> metaData.getAliases().containsKey(TransformInternalIndexConstants.AUDIT_INDEX_READ_ALIAS))) {
76+
finalListener.onResponse(false);
77+
return;
78+
}
79+
80+
final IndicesAliasesRequest request = client.admin().indices().prepareAliases()
81+
.addAlias(TransformInternalIndexConstants.AUDIT_INDEX_DEPRECATED, TransformInternalIndexConstants.AUDIT_INDEX_READ_ALIAS)
82+
.request();
83+
84+
executeAsyncWithOrigin(client.threadPool().getThreadContext(), TRANSFORM_ORIGIN, request,
85+
ActionListener.<AcknowledgedResponse>wrap(r -> finalListener.onResponse(r.isAcknowledged()), finalListener::onFailure),
86+
client.admin().indices()::aliases);
87+
}
88+
89+
}

x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/TransformInfoTransportAction.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,10 @@ static void getStatisticSummations(Client client, ActionListener<TransformIndexe
110110
.filter(QueryBuilders.termQuery(TransformField.INDEX_DOC_TYPE.getPreferredName(),
111111
TransformStoredDoc.NAME)));
112112

113-
SearchRequestBuilder requestBuilder = client.prepareSearch(TransformInternalIndexConstants.INDEX_NAME_PATTERN)
113+
SearchRequestBuilder requestBuilder = client
114+
.prepareSearch(
115+
TransformInternalIndexConstants.INDEX_NAME_PATTERN,
116+
TransformInternalIndexConstants.INDEX_NAME_PATTERN_DEPRECATED)
114117
.setSize(0)
115118
.setQuery(queryBuilder);
116119

x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/TransformUsageTransportAction.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@
3232
import org.elasticsearch.xpack.core.action.XPackUsageFeatureTransportAction;
3333
import org.elasticsearch.xpack.core.transform.TransformFeatureSetUsage;
3434
import org.elasticsearch.xpack.core.transform.TransformField;
35-
import org.elasticsearch.xpack.core.transform.transforms.TransformIndexerStats;
36-
import org.elasticsearch.xpack.core.transform.transforms.TransformTaskParams;
3735
import org.elasticsearch.xpack.core.transform.transforms.TransformConfig;
36+
import org.elasticsearch.xpack.core.transform.transforms.TransformIndexerStats;
3837
import org.elasticsearch.xpack.core.transform.transforms.TransformState;
38+
import org.elasticsearch.xpack.core.transform.transforms.TransformTaskParams;
3939
import org.elasticsearch.xpack.core.transform.transforms.TransformTaskState;
4040
import org.elasticsearch.xpack.core.transform.transforms.persistence.TransformInternalIndexConstants;
4141

@@ -118,7 +118,9 @@ protected void masterOperation(Task task, XPackUsageRequest request, ClusterStat
118118
}
119119
);
120120

121-
SearchRequest totalTransformCount = client.prepareSearch(TransformInternalIndexConstants.INDEX_NAME_PATTERN)
121+
SearchRequest totalTransformCount = client
122+
.prepareSearch(TransformInternalIndexConstants.INDEX_NAME_PATTERN,
123+
TransformInternalIndexConstants.INDEX_NAME_PATTERN_DEPRECATED)
122124
.setTrackTotalHits(true)
123125
.setQuery(QueryBuilders.constantScoreQuery(QueryBuilders.boolQuery()
124126
.filter(QueryBuilders.termQuery(TransformField.INDEX_DOC_TYPE.getPreferredName(), TransformConfig.NAME))))

x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransportGetTransformAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ protected ParseField getResultsField() {
6363

6464
@Override
6565
protected String[] getIndices() {
66-
return new String[]{TransformInternalIndexConstants.INDEX_NAME_PATTERN};
66+
return new String[] { TransformInternalIndexConstants.INDEX_NAME_PATTERN,
67+
TransformInternalIndexConstants.INDEX_NAME_PATTERN_DEPRECATED };
6768
}
6869

6970
@Override

0 commit comments

Comments
 (0)