Skip to content

Commit fbd0449

Browse files
nibixDarshitChanpura
authored andcommitted
Moved configuration reloading to a single dedicated thread (opensearch-project#5479)
Signed-off-by: Nils Bandener <[email protected]> Signed-off-by: Nils Bandener <[email protected]> Signed-off-by: Darshit Chanpura <[email protected]> Co-authored-by: Darshit Chanpura <[email protected]> Signed-off-by: Dennis Toepker <[email protected]>
1 parent cd8ee64 commit fbd0449

File tree

8 files changed

+739
-184
lines changed

8 files changed

+739
-184
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
99
### Features
1010

1111
### Enhancements
12+
- Moved configuration reloading to dedicated thread to improve node stability ([#5479](https://github.com/opensearch-project/security/pull/5479))
1213
- Makes resource settings dynamic ([#5677](https://github.com/opensearch-project/security/pull/5677))
1314
- [Resource Sharing] Allow multiple sharable resource types in single resource index ([#5713](https://github.com/opensearch-project/security/pull/5713))
1415

src/main/java/org/opensearch/security/OpenSearchSecurityPlugin.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,6 +1181,7 @@ public Collection<Object> createComponents(
11811181
final XFFResolver xffResolver = new XFFResolver(threadPool);
11821182
backendRegistry = new BackendRegistry(settings, adminDns, xffResolver, auditLog, threadPool, cih);
11831183
backendRegistry.registerClusterSettingsChangeListener(clusterService.getClusterSettings());
1184+
cr.subscribeOnChange(configMap -> { backendRegistry.invalidateCache(); });
11841185
tokenManager = new SecurityTokenManager(cs, threadPool, userService);
11851186

11861187
final CompatConfig compatConfig = new CompatConfig(environment, transportPassiveAuthSetting);

src/main/java/org/opensearch/security/action/configupdate/TransportConfigUpdateAction.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,22 @@
3535

3636
import org.opensearch.action.FailedNodeException;
3737
import org.opensearch.action.support.ActionFilters;
38-
import org.opensearch.action.support.nodes.TransportNodesAction;
3938
import org.opensearch.cluster.service.ClusterService;
4039
import org.opensearch.common.inject.Inject;
4140
import org.opensearch.common.inject.Provider;
4241
import org.opensearch.common.settings.Settings;
42+
import org.opensearch.core.action.ActionListener;
4343
import org.opensearch.core.common.io.stream.StreamInput;
4444
import org.opensearch.core.common.io.stream.StreamOutput;
4545
import org.opensearch.security.auth.BackendRegistry;
4646
import org.opensearch.security.configuration.ConfigurationRepository;
47-
import org.opensearch.security.securityconf.DynamicConfigFactory;
4847
import org.opensearch.security.securityconf.impl.CType;
48+
import org.opensearch.security.util.TransportNodesAsyncAction;
4949
import org.opensearch.threadpool.ThreadPool;
5050
import org.opensearch.transport.TransportRequest;
5151
import org.opensearch.transport.TransportService;
5252

53-
public class TransportConfigUpdateAction extends TransportNodesAction<
53+
public class TransportConfigUpdateAction extends TransportNodesAsyncAction<
5454
ConfigUpdateRequest,
5555
ConfigUpdateResponse,
5656
TransportConfigUpdateAction.NodeConfigUpdateRequest,
@@ -59,7 +59,6 @@ public class TransportConfigUpdateAction extends TransportNodesAction<
5959
protected Logger logger = LogManager.getLogger(getClass());
6060
private final Provider<BackendRegistry> backendRegistry;
6161
private final ConfigurationRepository configurationRepository;
62-
private DynamicConfigFactory dynamicConfigFactory;
6362
private static final Set<CType<?>> SELECTIVE_VALIDATION_TYPES = Set.of(CType.INTERNALUSERS);
6463
// Note: While INTERNALUSERS is used as a marker, the cache invalidation
6564
// applies to all user types (internal, LDAP, etc.)
@@ -72,8 +71,7 @@ public TransportConfigUpdateAction(
7271
final TransportService transportService,
7372
final ConfigurationRepository configurationRepository,
7473
final ActionFilters actionFilters,
75-
Provider<BackendRegistry> backendRegistry,
76-
DynamicConfigFactory dynamicConfigFactory
74+
Provider<BackendRegistry> backendRegistry
7775
) {
7876
super(
7977
ConfigUpdateAction.NAME,
@@ -84,12 +82,12 @@ public TransportConfigUpdateAction(
8482
ConfigUpdateRequest::new,
8583
TransportConfigUpdateAction.NodeConfigUpdateRequest::new,
8684
ThreadPool.Names.MANAGEMENT,
85+
ThreadPool.Names.SAME,
8786
ConfigUpdateNodeResponse.class
8887
);
8988

9089
this.configurationRepository = configurationRepository;
9190
this.backendRegistry = backendRegistry;
92-
this.dynamicConfigFactory = dynamicConfigFactory;
9391
}
9492

9593
public static class NodeConfigUpdateRequest extends TransportRequest {
@@ -128,17 +126,29 @@ protected ConfigUpdateResponse newResponse(
128126
}
129127

130128
@Override
131-
protected ConfigUpdateNodeResponse nodeOperation(final NodeConfigUpdateRequest request) {
129+
protected void nodeOperation(NodeConfigUpdateRequest request, ActionListener<ConfigUpdateNodeResponse> listener) {
132130
final var configupdateRequest = request.request;
133131
if (canHandleSelectively(configupdateRequest)) {
134132
backendRegistry.get().invalidateUserCache(configupdateRequest.getEntityNames());
133+
listener.onResponse(new ConfigUpdateNodeResponse(clusterService.localNode(), configupdateRequest.getConfigTypes(), null));
135134
} else {
136-
boolean didReload = configurationRepository.reloadConfiguration(CType.fromStringValues((configupdateRequest.getConfigTypes())));
137-
if (didReload) {
138-
backendRegistry.get().invalidateCache();
139-
}
135+
configurationRepository.reloadConfiguration(
136+
CType.fromStringValues((configupdateRequest.getConfigTypes())),
137+
new ActionListener<>() {
138+
@Override
139+
public void onResponse(ConfigurationRepository.ConfigReloadResponse configReloadResponse) {
140+
listener.onResponse(
141+
new ConfigUpdateNodeResponse(clusterService.localNode(), configupdateRequest.getConfigTypes(), null)
142+
);
143+
}
144+
145+
@Override
146+
public void onFailure(Exception e) {
147+
listener.onFailure(e);
148+
}
149+
}
150+
);
140151
}
141-
return new ConfigUpdateNodeResponse(clusterService.localNode(), configupdateRequest.getConfigTypes(), null);
142152
}
143153

144154
private boolean canHandleSelectively(ConfigUpdateRequest request) {

src/main/java/org/opensearch/security/configuration/ConfigUpdateAlreadyInProgressException.java

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)