|
@@ -28,26 +28,19 @@ import org.elasticsearch.cluster.ClusterService;
|
|
|
import org.elasticsearch.cluster.ClusterState;
|
|
|
import org.elasticsearch.cluster.block.ClusterBlockException;
|
|
|
import org.elasticsearch.cluster.block.ClusterBlockLevel;
|
|
|
-import org.elasticsearch.cluster.block.ClusterBlocks;
|
|
|
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
|
|
|
import org.elasticsearch.cluster.metadata.MetaData;
|
|
|
import org.elasticsearch.cluster.node.DiscoveryNode;
|
|
|
import org.elasticsearch.cluster.routing.allocation.AllocationService;
|
|
|
import org.elasticsearch.cluster.routing.allocation.RoutingAllocation;
|
|
|
-import org.elasticsearch.common.settings.ClusterSettings;
|
|
|
import org.elasticsearch.common.Nullable;
|
|
|
import org.elasticsearch.common.Priority;
|
|
|
import org.elasticsearch.common.inject.Inject;
|
|
|
-import org.elasticsearch.common.regex.Regex;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.common.settings.ClusterSettingsService;
|
|
|
import org.elasticsearch.threadpool.ThreadPool;
|
|
|
import org.elasticsearch.transport.TransportService;
|
|
|
|
|
|
-import java.util.HashSet;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Set;
|
|
|
-
|
|
|
import static org.elasticsearch.cluster.ClusterState.builder;
|
|
|
|
|
|
/**
|
|
@@ -57,16 +50,13 @@ public class TransportClusterUpdateSettingsAction extends TransportMasterNodeAct
|
|
|
|
|
|
private final AllocationService allocationService;
|
|
|
|
|
|
- private final ClusterSettings dynamicSettings;
|
|
|
private final ClusterSettingsService clusterSettingsService;
|
|
|
|
|
|
@Inject
|
|
|
public TransportClusterUpdateSettingsAction(Settings settings, TransportService transportService, ClusterService clusterService, ThreadPool threadPool,
|
|
|
- AllocationService allocationService, ClusterSettings dynamicSettings,
|
|
|
- ActionFilters actionFilters, IndexNameExpressionResolver indexNameExpressionResolver, ClusterSettingsService clusterSettingsService) {
|
|
|
+ AllocationService allocationService, ActionFilters actionFilters, IndexNameExpressionResolver indexNameExpressionResolver, ClusterSettingsService clusterSettingsService) {
|
|
|
super(settings, ClusterUpdateSettingsAction.NAME, transportService, clusterService, threadPool, actionFilters, indexNameExpressionResolver, ClusterUpdateSettingsRequest::new);
|
|
|
this.allocationService = allocationService;
|
|
|
- this.dynamicSettings = dynamicSettings;
|
|
|
this.clusterSettingsService = clusterSettingsService;
|
|
|
}
|
|
|
|
|
@@ -93,9 +83,7 @@ public class TransportClusterUpdateSettingsAction extends TransportMasterNodeAct
|
|
|
|
|
|
@Override
|
|
|
protected void masterOperation(final ClusterUpdateSettingsRequest request, final ClusterState state, final ActionListener<ClusterUpdateSettingsResponse> listener) {
|
|
|
- final Settings.Builder transientUpdates = Settings.settingsBuilder();
|
|
|
- final Settings.Builder persistentUpdates = Settings.settingsBuilder();
|
|
|
-
|
|
|
+ final SettingsUpdater updater = new SettingsUpdater(clusterSettingsService);
|
|
|
clusterService.submitStateUpdateTask("cluster_update_settings",
|
|
|
new AckedClusterStateUpdateTask<ClusterUpdateSettingsResponse>(Priority.IMMEDIATE, request, listener) {
|
|
|
|
|
@@ -103,7 +91,7 @@ public class TransportClusterUpdateSettingsAction extends TransportMasterNodeAct
|
|
|
|
|
|
@Override
|
|
|
protected ClusterUpdateSettingsResponse newResponse(boolean acknowledged) {
|
|
|
- return new ClusterUpdateSettingsResponse(acknowledged, transientUpdates.build(), persistentUpdates.build());
|
|
|
+ return new ClusterUpdateSettingsResponse(acknowledged, updater.getTransientUpdates(), updater.getPersistentUpdate());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -130,7 +118,7 @@ public class TransportClusterUpdateSettingsAction extends TransportMasterNodeAct
|
|
|
// so we should *not* execute the reroute.
|
|
|
if (!clusterService.state().nodes().localNodeMaster()) {
|
|
|
logger.debug("Skipping reroute after cluster update settings, because node is no longer master");
|
|
|
- listener.onResponse(new ClusterUpdateSettingsResponse(updateSettingsAcked, transientUpdates.build(), persistentUpdates.build()));
|
|
|
+ listener.onResponse(new ClusterUpdateSettingsResponse(updateSettingsAcked, updater.getTransientUpdates(), updater.getPersistentUpdate()));
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -150,13 +138,13 @@ public class TransportClusterUpdateSettingsAction extends TransportMasterNodeAct
|
|
|
@Override
|
|
|
//we return when the cluster reroute is acked or it times out but the acknowledged flag depends on whether the update settings was acknowledged
|
|
|
protected ClusterUpdateSettingsResponse newResponse(boolean acknowledged) {
|
|
|
- return new ClusterUpdateSettingsResponse(updateSettingsAcked && acknowledged, transientUpdates.build(), persistentUpdates.build());
|
|
|
+ return new ClusterUpdateSettingsResponse(updateSettingsAcked && acknowledged, updater.getTransientUpdates(), updater.getPersistentUpdate());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onNoLongerMaster(String source) {
|
|
|
logger.debug("failed to preform reroute after cluster settings were updated - current node is no longer a master");
|
|
|
- listener.onResponse(new ClusterUpdateSettingsResponse(updateSettingsAcked, transientUpdates.build(), persistentUpdates.build()));
|
|
|
+ listener.onResponse(new ClusterUpdateSettingsResponse(updateSettingsAcked, updater.getTransientUpdates(), updater.getPersistentUpdate()));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -186,83 +174,11 @@ public class TransportClusterUpdateSettingsAction extends TransportMasterNodeAct
|
|
|
|
|
|
@Override
|
|
|
public ClusterState execute(final ClusterState currentState) {
|
|
|
- Settings.Builder transientSettings = Settings.settingsBuilder();
|
|
|
- transientSettings.put(currentState.metaData().transientSettings());
|
|
|
- for (Map.Entry<String, String> entry : request.transientSettings().getAsMap().entrySet()) {
|
|
|
- if (dynamicSettings.isLoggerSetting(entry.getKey()) || dynamicSettings.hasDynamicSetting(entry.getKey())) {
|
|
|
- transientSettings.put(entry.getKey(), entry.getValue());
|
|
|
- transientUpdates.put(entry.getKey(), entry.getValue());
|
|
|
- changed = true;
|
|
|
- } else {
|
|
|
- throw new IllegalArgumentException("transient setting [" + entry.getKey() + "], not dynamically updateable");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- Settings.Builder persistentSettings = Settings.settingsBuilder();
|
|
|
- persistentSettings.put(currentState.metaData().persistentSettings());
|
|
|
- for (Map.Entry<String, String> entry : request.persistentSettings().getAsMap().entrySet()) {
|
|
|
- if (dynamicSettings.isLoggerSetting(entry.getKey()) || dynamicSettings.hasDynamicSetting(entry.getKey())) {
|
|
|
- persistentSettings.put(entry.getKey(), entry.getValue());
|
|
|
- persistentUpdates.put(entry.getKey(), entry.getValue());
|
|
|
- changed = true;
|
|
|
- } else {
|
|
|
- throw new IllegalArgumentException("persistent setting [" + entry.getKey() + "], not dynamically updateable");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for (String entry : request.getPersistentReset()) {
|
|
|
- Set<String> strings = persistentSettings.internalMap().keySet();
|
|
|
- Set<String> keysToRemove = new HashSet<String>();
|
|
|
- for (String key : strings) {
|
|
|
- if (Regex.simpleMatch(entry, key)) {
|
|
|
- keysToRemove.add(key);
|
|
|
- }
|
|
|
- }
|
|
|
- for (String keyToRemove : keysToRemove) {
|
|
|
- persistentSettings.remove(keyToRemove);
|
|
|
- persistentUpdates.remove(keyToRemove);
|
|
|
- }
|
|
|
- changed |= keysToRemove.isEmpty() == false;
|
|
|
- }
|
|
|
-
|
|
|
- for (String entry : request.getTransientReset()) {
|
|
|
- Set<String> strings = transientSettings.internalMap().keySet();
|
|
|
- Set<String> keysToRemove = new HashSet<>();
|
|
|
- for (String key : strings) {
|
|
|
- if (Regex.simpleMatch(entry, key)) {
|
|
|
- keysToRemove.add(key);
|
|
|
- }
|
|
|
- }
|
|
|
- for (String keyToRemove : keysToRemove) {
|
|
|
- transientSettings.remove(keyToRemove);
|
|
|
- transientUpdates.remove(keyToRemove);
|
|
|
- }
|
|
|
- changed |= keysToRemove.isEmpty() == false;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if (!changed) {
|
|
|
- return currentState;
|
|
|
- }
|
|
|
-
|
|
|
- MetaData.Builder metaData = MetaData.builder(currentState.metaData())
|
|
|
- .persistentSettings(persistentSettings.build())
|
|
|
- .transientSettings(transientSettings.build());
|
|
|
-
|
|
|
- ClusterBlocks.Builder blocks = ClusterBlocks.builder().blocks(currentState.blocks());
|
|
|
- boolean updatedReadOnly = MetaData.SETTING_READ_ONLY_SETTING.get(metaData.persistentSettings()) || MetaData.SETTING_READ_ONLY_SETTING.get(metaData.transientSettings());
|
|
|
- if (updatedReadOnly) {
|
|
|
- blocks.addGlobalBlock(MetaData.CLUSTER_READ_ONLY_BLOCK);
|
|
|
- } else {
|
|
|
- blocks.removeGlobalBlock(MetaData.CLUSTER_READ_ONLY_BLOCK);
|
|
|
- }
|
|
|
- ClusterState build = builder(currentState).metaData(metaData).blocks(blocks).build();
|
|
|
- Settings settings = build.metaData().settings();
|
|
|
- // now we try to apply things and if they are invalid we fail
|
|
|
- // this dryRun will validate & parse settings but won't actually apply them.
|
|
|
- clusterSettingsService.dryRun(settings);
|
|
|
- return build;
|
|
|
+ ClusterState clusterState = updater.updateSettings(currentState, request.transientSettings(), request.persistentSettings());
|
|
|
+ changed = clusterState != currentState;
|
|
|
+ return clusterState;
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
+
|
|
|
}
|