Skip to content

Commit 5006fc0

Browse files
committed
Check before switching to strict mode
Signed-off-by: Lakshya Taragi <lakshya.taragi@gmail.com>
1 parent baca379 commit 5006fc0

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

server/src/internalClusterTest/java/org/opensearch/remotemigration/RemoteStoreMigrationSettingsUpdateIT.java

+33
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
import org.opensearch.action.admin.cluster.snapshots.restore.RestoreSnapshotResponse;
1212
import org.opensearch.client.Client;
1313
import org.opensearch.common.settings.Settings;
14+
import org.opensearch.common.settings.SettingsException;
1415
import org.opensearch.core.rest.RestStatus;
1516
import org.opensearch.index.IndexSettings;
1617
import org.opensearch.indices.replication.common.ReplicationType;
18+
import org.opensearch.test.InternalTestCluster;
1719
import org.opensearch.test.OpenSearchIntegTestCase;
1820

1921
import java.util.Optional;
@@ -76,6 +78,37 @@ public void testNewIndexIsRemoteStoreBackedForRemoteStoreDirectionAndMixedMode()
7678
assertRemoteStoreBackedIndex(indexName2);
7779
}
7880

81+
// compatibility mode setting test
82+
83+
public void testSwitchToStrictMode() throws Exception {
84+
logger.info(" --> initialize cluster");
85+
initializeCluster(false);
86+
87+
logger.info(" --> create a mixed mode cluster");
88+
setClusterMode(MIXED.mode);
89+
addRemote = true;
90+
String remoteNodeName = internalCluster().startNode();
91+
addRemote = false;
92+
String nonRemoteNodeName = internalCluster().startNode();
93+
internalCluster().validateClusterFormed();
94+
assertNodeInCluster(remoteNodeName);
95+
assertNodeInCluster(nonRemoteNodeName);
96+
97+
logger.info(" --> attempt switching to strict mode");
98+
SettingsException exception = assertThrows(SettingsException.class, () -> setClusterMode(STRICT.mode));
99+
assertEquals(
100+
"can not switch to STRICT compatibility mode when the cluster contains both remote and non-remote nodes",
101+
exception.getMessage()
102+
);
103+
104+
logger.info(" --> stop remote node");
105+
internalCluster().stopRandomNode(InternalTestCluster.nameFilter(remoteNodeName));
106+
ensureStableCluster(2);
107+
108+
logger.info(" --> attempt switching to strict mode");
109+
setClusterMode(STRICT.mode);
110+
}
111+
79112
// verify that the created index is not remote store backed
80113
private void assertNonRemoteStoreBackedIndex(String indexName) {
81114
Settings indexSettings = client.admin().indices().prepareGetIndex().execute().actionGet().getSettings().get(indexName);

server/src/main/java/org/opensearch/action/admin/cluster/settings/TransportClusterUpdateSettingsAction.java

+29
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,17 @@
5353
import org.opensearch.common.Priority;
5454
import org.opensearch.common.inject.Inject;
5555
import org.opensearch.common.settings.ClusterSettings;
56+
import org.opensearch.common.settings.SettingsException;
5657
import org.opensearch.core.action.ActionListener;
5758
import org.opensearch.core.common.io.stream.StreamInput;
59+
import org.opensearch.node.remotestore.RemoteStoreNodeService;
5860
import org.opensearch.threadpool.ThreadPool;
5961
import org.opensearch.transport.TransportService;
6062

6163
import java.io.IOException;
64+
import java.util.ArrayList;
65+
import java.util.List;
66+
import java.util.Optional;
6267

6368
/**
6469
* Transport action for updating cluster settings
@@ -137,6 +142,7 @@ protected void clusterManagerOperation(
137142
final ClusterState state,
138143
final ActionListener<ClusterUpdateSettingsResponse> listener
139144
) {
145+
validateCompatibilityModeSettingRequest(request, state);
140146
final SettingsUpdater updater = new SettingsUpdater(clusterSettings);
141147
clusterService.submitStateUpdateTask(
142148
"cluster_update_settings",
@@ -264,4 +270,27 @@ public ClusterState execute(final ClusterState currentState) {
264270
);
265271
}
266272

273+
/**
274+
* Verifies that while trying to switch to STRICT compatibility mode, all nodes must be of the
275+
* same type (all remote or all non-remote). If not, it throws SettingsException error
276+
* @param request cluster settings update request, for settings to be updated and new values
277+
* @param clusterState current state of cluster, for information on nodes
278+
*/
279+
private void validateCompatibilityModeSettingRequest(ClusterUpdateSettingsRequest request, ClusterState clusterState) {
280+
if (RemoteStoreNodeService.REMOTE_STORE_COMPATIBILITY_MODE_SETTING.exists(request.persistentSettings())) {
281+
String value = request.persistentSettings().get(RemoteStoreNodeService.REMOTE_STORE_COMPATIBILITY_MODE_SETTING.getKey());
282+
if (value.equals(RemoteStoreNodeService.CompatibilityMode.STRICT.mode)) {
283+
List<DiscoveryNode> discoveryNodeList = new ArrayList<>(clusterState.nodes().getNodes().values());
284+
Optional<DiscoveryNode> remoteNode = discoveryNodeList.stream().filter(DiscoveryNode::isRemoteStoreNode).findFirst();
285+
Optional<DiscoveryNode> nonRemoteNode = discoveryNodeList.stream()
286+
.filter(dn -> dn.isRemoteStoreNode() == false)
287+
.findFirst();
288+
if (remoteNode.isPresent() && nonRemoteNode.isPresent()) {
289+
throw new SettingsException(
290+
"can not switch to STRICT compatibility mode when the cluster contains both remote and non-remote nodes"
291+
);
292+
}
293+
}
294+
}
295+
}
267296
}

0 commit comments

Comments
 (0)