[
https://issues.apache.org/jira/browse/ARTEMIS-5609?focusedWorklogId=977729&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-977729
]
ASF GitHub Bot logged work on ARTEMIS-5609:
-------------------------------------------
Author: ASF GitHub Bot
Created on: 05/Aug/25 14:43
Start Date: 05/Aug/25 14:43
Worklog Time Spent: 10m
Work Description: tabish121 commented on code in PR #5854:
URL: https://github.com/apache/activemq-artemis/pull/5854#discussion_r2254576757
##########
artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java:
##########
@@ -571,11 +610,110 @@ public void loadProtocolServices(List<ActiveMQComponent>
protocolServices) {
@Override
public void updateProtocolServices(List<ActiveMQComponent>
protocolServices) throws Exception {
+ updateAcceptors();
+
for (ProtocolManagerFactory protocolManagerFactory :
protocolMap.values()) {
protocolManagerFactory.updateProtocolServices(this.server,
protocolServices);
}
}
+ private void updateAcceptors() throws Exception {
+ final Set<TransportConfiguration> updatedConfigurationSet =
Objects.requireNonNullElse(server.getConfiguration().getAcceptorConfigurations(),
Collections.emptySet());
+ final Map<String, TransportConfiguration> updatedConfiguration =
+ updatedConfigurationSet.stream()
+ .collect(Collectors.toMap(c -> c.getName(),
Function.identity()));
+
+ final Set<TransportConfiguration> acceptorsToStop = new HashSet<>();
+ final Set<TransportConfiguration> acceptorsToCreate = new HashSet<>();
+
+ for (TransportConfiguration candidateConfiguration :
updatedConfiguration.values()) {
+ final TransportConfiguration previous =
acceptorsConfig.get(candidateConfiguration.getName());
+
+ if (previous == null) {
+ // New configuration that was added during the update
+ acceptorsToCreate.add(candidateConfiguration);
+ } else if (!previous.equals(candidateConfiguration)) {
+ // Updated configuration that needs to be stopped and restarted.
+ acceptorsToCreate.add(candidateConfiguration);
+ acceptorsToStop.add(candidateConfiguration);
+ }
+ }
+
+ for (TransportConfiguration currentConfiguration :
acceptorsConfig.values()) {
+ if
(!updatedConfiguration.containsKey(currentConfiguration.getName())) {
+ // Acceptor that was removed from the configuration which needs
stopped and removed.
+ acceptorsToStop.add(currentConfiguration);
+ }
+ }
+
+ // Replace old configuration map with new configurations ahead of the
stop and restart phase.
+ acceptorsConfig.clear();
+ acceptorsConfig.putAll(updatedConfiguration);
+
+ final CountDownLatch acceptorsStoppedLatch = new
CountDownLatch(acceptorsToStop.size());
+
+ for (TransportConfiguration acceptorToStop : acceptorsToStop) {
+ final Acceptor acceptor = acceptors.remove(acceptorToStop.getName());
+
+ if (acceptor == null) {
+ continue;
+ }
+
+ final Map<String, Object> acceptorToStopParams =
acceptorToStop.getCombinedParams();
+
+ removeAcceptorStoreReloadCallback(acceptorToStop.getName(),
+ fileUrlFrom(acceptorToStopParams.get(KEYSTORE_PATH_PROP_NAME)),
+ storeTypeFrom(acceptorToStopParams.get(KEYSTORE_TYPE_PROP_NAME)));
+
+ removeAcceptorStoreReloadCallback(acceptorToStop.getName(),
+ fileUrlFrom(acceptorToStopParams.get(TRUSTSTORE_PATH_PROP_NAME)),
+
storeTypeFrom(acceptorToStopParams.get(TRUSTSTORE_TYPE_PROP_NAME)));
+
+ try {
+ managementService.unregisterAcceptor(acceptor.getName());
+ } catch (Throwable t) {
+
ActiveMQServerLogger.LOGGER.errorStoppingAcceptor(acceptor.getName());
+ }
+
+ try {
+ acceptor.notifyStop();
+ } catch (Throwable t) {
+
ActiveMQServerLogger.LOGGER.errorStoppingAcceptor(acceptor.getName());
+ }
+
+ try {
+ acceptor.pause();
+ } catch (Throwable t) {
+
ActiveMQServerLogger.LOGGER.errorStoppingAcceptor(acceptor.getName());
+ }
+
+ try {
+ acceptor.asyncStop(acceptorsStoppedLatch::countDown);
+ } catch (Throwable t) {
+
ActiveMQServerLogger.LOGGER.errorStoppingAcceptor(acceptor.getName());
+ }
+ }
+
+ // In some cases an acceptor stopping could be locked ie NettyAcceptor
stopping could be locked by a network failure.
+ if (!acceptorsStoppedLatch.await(UPDATE_ACCEPTORS_STOP_TIMEOUT,
TimeUnit.MILLISECONDS)) {
+ logger.warn("Timed out waiting on removed or updated acceptors
stopping.");
+ }
+
+ // Add all the new or updated acceptors now that removed or updated
acceptors have been stopped.
+ for (TransportConfiguration candidateConfiguration : acceptorsToCreate) {
+ final Acceptor acceptor = createAcceptor(candidateConfiguration);
+
+ if (isStarted() && acceptor instanceof NettyAcceptor startable &&
startable.isAutoStart()) {
+ try {
+ startable.start();
+ } catch (Throwable t) {
+
ActiveMQServerLogger.LOGGER.errorStartingAcceptor(acceptor.getName(),
acceptor.getConfiguration());
+ throw t;
+ }
+ }
+ }
Review Comment:
Pushed change to start after all creates are done and only report error
after trying to start the batch.
Issue Time Tracking
-------------------
Worklog Id: (was: 977729)
Time Spent: 1.5h (was: 1h 20m)
> Add support for (add/remove/update) of acceptors via config reload
> ------------------------------------------------------------------
>
> Key: ARTEMIS-5609
> URL: https://issues.apache.org/jira/browse/ARTEMIS-5609
> Project: ActiveMQ Artemis
> Issue Type: New Feature
> Components: Broker
> Affects Versions: 2.42.0
> Reporter: Timothy A. Bish
> Priority: Minor
> Labels: pull-request-available
> Fix For: 2.43.0
>
> Time Spent: 1.5h
> Remaining Estimate: 0h
>
> Acceptors are not part of config reload at the moment.
> [https://activemq.apache.org/components/artemis/documentation/latest/config-reload.html]
> In support of an multi-tenant deployment, having the ability to onboard a new
> acceptor to a running broker is needed.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact