Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CCI] [BUG] Fixing extension settings update consumers #7456

Merged
merged 8 commits into from
Jun 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import org.opensearch.cluster.service.ClusterService;
import org.opensearch.common.settings.Setting;
import org.opensearch.common.settings.SettingsException;
import org.opensearch.common.settings.SettingsModule;
import org.opensearch.common.settings.WriteableSetting;
import org.opensearch.transport.TransportResponse;
import org.opensearch.transport.TransportService;
Expand All @@ -31,6 +32,7 @@
private final ClusterService clusterService;
private final TransportService transportService;
private final String updateSettingsRequestType;
private final SettingsModule settingsModule;

/**
* Instantiates a new Add Settings Update Consumer Request Handler with the {@link ClusterService} and {@link TransportService}
Expand All @@ -42,11 +44,13 @@
public AddSettingsUpdateConsumerRequestHandler(
ClusterService clusterService,
TransportService transportService,
String updateSettingsRequestType
String updateSettingsRequestType,
SettingsModule settingsModule
) {
this.clusterService = clusterService;
this.transportService = transportService;
this.updateSettingsRequestType = updateSettingsRequestType;
this.settingsModule = settingsModule;
}

/**
Expand All @@ -68,25 +72,53 @@

// Extract setting and type from writeable setting
Setting<?> setting = extensionComponentSetting.getSetting();

// we need to get the actual setting from nodeSetting or indexsetting maps in SettingsModule
// use conditional based on setting properties
Setting<?> settingForUpdateConsumer = null;
if (setting.hasIndexScope()) {
settingForUpdateConsumer = settingsModule.getIndexScopedSettings().get(setting.getKey());

Check warning on line 80 in server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java#L80

Added line #L80 was not covered by tests
} else if (setting.hasNodeScope()) {
settingForUpdateConsumer = settingsModule.getClusterSettings().get(setting.getKey());

Check warning on line 82 in server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java#L82

Added line #L82 was not covered by tests
}
// do a null check and throw IllegalArgument exception here if neither index or node scope
dbwiddis marked this conversation as resolved.
Show resolved Hide resolved
if (settingForUpdateConsumer == null) {
throw new IllegalArgumentException("Not index or node scope");
}

WriteableSetting.SettingType settingType = extensionComponentSetting.getType();

// Register setting update consumer with callback method to extension
clusterService.getClusterSettings().addSettingsUpdateConsumer(setting, (data) -> {
logger.debug("Sending extension request type: " + updateSettingsRequestType);
UpdateSettingsResponseHandler updateSettingsResponseHandler = new UpdateSettingsResponseHandler();
transportService.sendRequest(
extensionNode,
updateSettingsRequestType,
new UpdateSettingsRequest(settingType, setting, data),
updateSettingsResponseHandler
);
});
if (setting.hasIndexScope()) {
// Register setting update consumer with callback method to extension
clusterService.getClusterSettings().addSettingsUpdateConsumer(settingForUpdateConsumer, (data) -> {
logger.debug("Sending extension request type: " + updateSettingsRequestType);
UpdateSettingsResponseHandler updateSettingsResponseHandler = new UpdateSettingsResponseHandler();
transportService.sendRequest(

Check warning on line 96 in server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java#L93-L96

Added lines #L93 - L96 were not covered by tests
extensionNode,
updateSettingsRequestType,
new UpdateSettingsRequest(settingType, setting, data),
updateSettingsResponseHandler
);
});

Check warning on line 102 in server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java#L102

Added line #L102 was not covered by tests
}
if (setting.hasNodeScope()) {
// Register setting update consumer with callback method to extension
clusterService.getClusterSettings().addSettingsUpdateConsumer(settingForUpdateConsumer, (data) -> {
logger.debug("Sending extension request type: " + updateSettingsRequestType);
UpdateSettingsResponseHandler updateSettingsResponseHandler = new UpdateSettingsResponseHandler();
transportService.sendRequest(

Check warning on line 109 in server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java#L106-L109

Added lines #L106 - L109 were not covered by tests
extensionNode,
updateSettingsRequestType,
new UpdateSettingsRequest(settingType, setting, data),
updateSettingsResponseHandler
);
});

Check warning on line 115 in server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java

View check run for this annotation

Codecov / codecov/patch

server/src/main/java/org/opensearch/extensions/AddSettingsUpdateConsumerRequestHandler.java#L115

Added line #L115 was not covered by tests
}
}
} catch (SettingsException e) {
} catch (SettingsException | IllegalArgumentException e) {
logger.error(e.toString());
status = false;
}

return new AcknowledgedResponse(status);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,8 @@ public void initializeServicesAndRestHandler(
this.addSettingsUpdateConsumerRequestHandler = new AddSettingsUpdateConsumerRequestHandler(
clusterService,
transportService,
REQUEST_EXTENSION_UPDATE_SETTINGS
REQUEST_EXTENSION_UPDATE_SETTINGS,
settingsModule
);
this.client = client;
this.extensionTransportActionsHandler = new ExtensionTransportActionsHandler(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1462,4 +1462,20 @@ public List<String> getListValue(final List<String> value) {
);
}

public void testAddSettingsUpdateConsumer() {
Setting<Integer> testSetting = Setting.intSetting("foo.bar", 1, Property.Dynamic, Property.NodeScope);
Setting<Integer> testSetting2 = Setting.intSetting("foo.bar.baz", 1, Property.Dynamic, Property.NodeScope);
AbstractScopedSettings service = new ClusterSettings(Settings.EMPTY, new HashSet<>(Arrays.asList(testSetting, testSetting2)));
AtomicInteger consumer2 = new AtomicInteger();
service.addSettingsUpdateConsumer(testSetting2, consumer2::set, (s) -> assertTrue(s > 0));
Setting<Integer> wrongKeySetting = Setting.intSetting("foo.bar.wrong", 1, Property.Dynamic, Property.NodeScope);

expectThrows(SettingsException.class, () -> service.addSettingsUpdateConsumer(wrongKeySetting, consumer2::set, (i) -> {
if (i == 42) throw new AssertionError("wrong key");
}));

expectThrows(NullPointerException.class, () -> service.addSettingsUpdateConsumer(null, consumer2::set, (i) -> {
if (i == 42) throw new AssertionError("empty key");
}));
}
}
Loading