Skip to content

Commit f4e8a91

Browse files
committed
Handle case where index level override is removed and index should pick up cluster level default
1 parent 70a31d9 commit f4e8a91

File tree

4 files changed

+77
-12
lines changed

4 files changed

+77
-12
lines changed

server/src/internalClusterTest/java/org/opensearch/index/ClusterMaxMergesAtOnceIT.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
import org.opensearch.action.admin.indices.get.GetIndexRequest;
3636
import org.opensearch.action.admin.indices.get.GetIndexResponse;
37+
import org.opensearch.action.admin.indices.settings.put.UpdateSettingsRequestBuilder;
3738
import org.opensearch.cluster.metadata.IndexMetadata;
3839
import org.opensearch.common.settings.Settings;
3940
import org.opensearch.core.index.Index;
@@ -90,8 +91,44 @@ public void testClusterLevelDefaultUpdatesMergePolicy() throws ExecutionExceptio
9091
getIndexResponse = client(clusterManagerName).admin().indices().getIndex(new GetIndexRequest()).get();
9192
indicesService = internalCluster().getInstance(IndicesService.class, randomFrom(dataNodes));
9293
uuid = getIndexResponse.getSettings().get(indexName).get(IndexMetadata.SETTING_INDEX_UUID);
93-
IndexService newIndexService = indicesService.indexService(new Index(indexName, uuid));
94+
IndexService secondIndexService = indicesService.indexService(new Index(indexName, uuid));
9495
assertEquals(20, ((OpenSearchTieredMergePolicy) indexService.getIndexSettings().getMergePolicy(true)).getMaxMergeAtOnce());
95-
assertEquals(20, ((OpenSearchTieredMergePolicy) newIndexService.getIndexSettings().getMergePolicy(true)).getMaxMergeAtOnce());
96+
assertEquals(20, ((OpenSearchTieredMergePolicy) secondIndexService.getIndexSettings().getMergePolicy(true)).getMaxMergeAtOnce());
97+
98+
// Create index with index level override in settings
99+
indexName = "log-myindex-3";
100+
createIndex(
101+
indexName,
102+
Settings.builder().put(TieredMergePolicyProvider.INDEX_MERGE_POLICY_MAX_MERGE_AT_ONCE_SETTING.getKey(), 15).build()
103+
);
104+
ensureYellowAndNoInitializingShards(indexName);
105+
ensureGreen(indexName);
106+
getIndexResponse = client(clusterManagerName).admin().indices().getIndex(new GetIndexRequest()).get();
107+
indicesService = internalCluster().getInstance(IndicesService.class, randomFrom(dataNodes));
108+
uuid = getIndexResponse.getSettings().get(indexName).get(IndexMetadata.SETTING_INDEX_UUID);
109+
IndexService thirdIndexService = indicesService.indexService(new Index(indexName, uuid));
110+
assertEquals(15, ((OpenSearchTieredMergePolicy) thirdIndexService.getIndexSettings().getMergePolicy(true)).getMaxMergeAtOnce());
111+
112+
// changing cluster level default should only affect indices without index level override
113+
client(clusterManagerName).admin()
114+
.cluster()
115+
.prepareUpdateSettings()
116+
.setTransientSettings(Settings.builder().put(CLUSTER_DEFAULT_INDEX_MAX_MERGE_AT_ONCE_SETTING.getKey(), 35))
117+
.get();
118+
assertEquals(35, ((OpenSearchTieredMergePolicy) indexService.getIndexSettings().getMergePolicy(true)).getMaxMergeAtOnce());
119+
assertEquals(35, ((OpenSearchTieredMergePolicy) secondIndexService.getIndexSettings().getMergePolicy(true)).getMaxMergeAtOnce());
120+
assertEquals(15, ((OpenSearchTieredMergePolicy) thirdIndexService.getIndexSettings().getMergePolicy(true)).getMaxMergeAtOnce());
121+
122+
// removing index level override should pick up the cluster level default
123+
final UpdateSettingsRequestBuilder builder = client().admin().indices().prepareUpdateSettings(indexName);
124+
builder.setSettings(
125+
Settings.builder().putNull(TieredMergePolicyProvider.INDEX_MERGE_POLICY_MAX_MERGE_AT_ONCE_SETTING.getKey()).build()
126+
);
127+
builder.execute().actionGet();
128+
129+
assertEquals(35, ((OpenSearchTieredMergePolicy) indexService.getIndexSettings().getMergePolicy(true)).getMaxMergeAtOnce());
130+
assertEquals(35, ((OpenSearchTieredMergePolicy) secondIndexService.getIndexSettings().getMergePolicy(true)).getMaxMergeAtOnce());
131+
assertEquals(35, ((OpenSearchTieredMergePolicy) thirdIndexService.getIndexSettings().getMergePolicy(true)).getMaxMergeAtOnce());
132+
96133
}
97134
}

server/src/main/java/org/opensearch/index/IndexService.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ public class IndexService extends AbstractIndexComponent implements IndicesClust
198198
private final CompositeIndexSettings compositeIndexSettings;
199199
private final Consumer<IndexShard> replicator;
200200
private final Function<ShardId, ReplicationStats> segmentReplicationStatsProvider;
201-
private final Supplier<Integer> clusterDefaultMaxMergeAtOnce;
202201

203202
public IndexService(
204203
IndexSettings indexSettings,
@@ -327,9 +326,7 @@ public IndexService(
327326
this.fileCache = fileCache;
328327
this.replicator = replicator;
329328
this.segmentReplicationStatsProvider = segmentReplicationStatsProvider;
330-
this.clusterDefaultMaxMergeAtOnce = clusterDefaultMaxMergeAtOnceSupplier;
331-
332-
indexSettings.setMaxMergesAtOnce(this.clusterDefaultMaxMergeAtOnce.get());
329+
indexSettings.setDefaultMaxMergesAtOnce(clusterDefaultMaxMergeAtOnceSupplier.get());
333330
updateFsyncTaskIfNecessary();
334331
}
335332

@@ -1131,8 +1128,8 @@ private void updateReplicationTask() {
11311128
/**
11321129
* Called whenever the cluster level {@code cluster.default.index.max_merge_at_once} changes.
11331130
*/
1134-
public void onDefaultMaxMergeAtOnceChanged(int defaultMaxMergeAtOnce) {
1135-
indexSettings.setMaxMergesAtOnce(defaultMaxMergeAtOnce);
1131+
public void onDefaultMaxMergeAtOnceChanged(int newDefaultMaxMergeAtOnce) {
1132+
indexSettings.setDefaultMaxMergesAtOnce(newDefaultMaxMergeAtOnce);
11361133
}
11371134

11381135
/**

server/src/main/java/org/opensearch/index/IndexSettings.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,7 +1096,7 @@ public IndexSettings(final IndexMetadata indexMetadata, final Settings nodeSetti
10961096
);
10971097
scopedSettings.addSettingsUpdateConsumer(
10981098
TieredMergePolicyProvider.INDEX_MERGE_POLICY_MAX_MERGE_AT_ONCE_SETTING,
1099-
tieredMergePolicyProvider::setMaxMergesAtOnce
1099+
this::updateMaxMergesAtOnce
11001100
);
11011101
scopedSettings.addSettingsUpdateConsumer(
11021102
TieredMergePolicyProvider.INDEX_MERGE_POLICY_MAX_MERGED_SEGMENT_SETTING,
@@ -1251,11 +1251,26 @@ private void setRefreshInterval(TimeValue timeValue) {
12511251
}
12521252

12531253
/**
1254-
* Update the maxMergesAtOnce if no index level override exists in index level settings
1255-
*/
1256-
void setMaxMergesAtOnce(int newMaxMergesAtOnce) {
1254+
* Update the default maxMergesAtOnce
1255+
* 1. sets the new default in {@code TieredMergePolicyProvide}
1256+
* 2. sets the maxMergesAtOnce on the actual TieredMergePolicy used by the engine if no index level override exists
1257+
*/
1258+
void setDefaultMaxMergesAtOnce(int newDefaultMaxMergesAtOnce) {
1259+
tieredMergePolicyProvider.setDefaultMaxMergesAtOnce(newDefaultMaxMergesAtOnce);
1260+
if (TieredMergePolicyProvider.INDEX_MERGE_POLICY_MAX_MERGE_AT_ONCE_SETTING.exists(getSettings()) == false) {
1261+
tieredMergePolicyProvider.setMaxMergesAtOnceToDefault();
1262+
}
1263+
}
1264+
1265+
/**
1266+
* Updates the maxMergesAtOnce for actual TieredMergePolicy used by the engine.
1267+
* Sets it to default maxMergesAtOnce if index level settings is being removed
1268+
*/
1269+
void updateMaxMergesAtOnce(int newMaxMergesAtOnce) {
12571270
if (TieredMergePolicyProvider.INDEX_MERGE_POLICY_MAX_MERGE_AT_ONCE_SETTING.exists(getSettings()) == false) {
12581271
tieredMergePolicyProvider.setMaxMergesAtOnce(newMaxMergesAtOnce);
1272+
} else {
1273+
tieredMergePolicyProvider.setMaxMergesAtOnceToDefault();
12591274
}
12601275
}
12611276

server/src/main/java/org/opensearch/index/TieredMergePolicyProvider.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ public final class TieredMergePolicyProvider implements MergePolicyProvider {
134134

135135
private final Logger logger;
136136
private final boolean mergesEnabled;
137+
private int defaultMaxMergeAtOnce = 30;
137138

138139
public static final double DEFAULT_EXPUNGE_DELETES_ALLOWED = 10d;
139140

@@ -249,6 +250,21 @@ void setMaxMergesAtOnce(Integer maxMergeAtOnce) {
249250
tieredMergePolicy.setMaxMergeAtOnce(maxMergeAtOnce);
250251
}
251252

253+
/**
254+
* Update the value for maxMergesAtOnce in TieredMergePolicy used by engine to default value.
255+
* This would happen if index level override is being removed and we need to fallback to cluster level default
256+
*/
257+
void setMaxMergesAtOnceToDefault() {
258+
tieredMergePolicy.setMaxMergeAtOnce(defaultMaxMergeAtOnce);
259+
}
260+
261+
/**
262+
* Update the default value for maxMergesAtOnce. It is used when index level override is not present
263+
*/
264+
void setDefaultMaxMergesAtOnce(Integer defaultMaxMergesAtOnce) {
265+
this.defaultMaxMergeAtOnce = defaultMaxMergesAtOnce;
266+
}
267+
252268
void setFloorSegmentSetting(ByteSizeValue floorSegementSetting) {
253269
tieredMergePolicy.setFloorSegmentMB(floorSegementSetting.getMbFrac());
254270
}

0 commit comments

Comments
 (0)