[ 
https://issues.apache.org/jira/browse/ARTEMIS-2923?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Aaron Steigerwald updated ARTEMIS-2923:
---------------------------------------
    Description: 
The org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.copy() 
method fails to serialize plugin list members containing one or more elements.

This can be demonstrated using the 
examples\features\ha\colocated-failover-scale-down example. In each broker.xml 
file, change the <ha-policy><shared-store> element to <ha-policy><replication> 
(also remove the <failover-on-shutdown> element) and add the 
NotificationActiveMQServerPlugin from 
[https://activemq.apache.org/components/artemis/documentation/latest/broker-plugins.html:]
{noformat}
<broker-plugins>
   <broker-plugin 
class-name="org.apache.activemq.artemis.core.server.plugin.impl.NotificationActiveMQServerPlugin">
      <property key="SEND_CONNECTION_NOTIFICATIONS" value="true" />
      <property key="SEND_SESSION_NOTIFICATIONS" value="true" />
   </broker-plugin>
</broker-plugins>{noformat}
Modified broker.xml files for the 
examples\features\ha\colocated-failover-scale-down example are attached.

The following exception is generated:
{noformat}
ColocatedFailoverScaleDownExample0-out:2020-09-29 17:22:31,917 WARN 
[org.apache.activemq.artemis.core.server] AMQ222261: Failed to activate a 
backup: java.security.PrivilegedActionException: 
java.io.NotSerializableException: 
org.apache.activemq.artemis.core.server.plugin.impl.NotificationActiveMQServerPlugin{noformat}
Two options exist for fixing this:

1) Implement the Serializable interface in all affected plugin classes.

2) Make all org.apache.activemq.artemis.core.config.impl.ConfigurationImpl 
plugin list members transient and NOT final, create setters for them, and 
manually copy the plugin lists after serialization in the 
org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.copy() method 
like so:
{noformat}
            // Manually copy all plugins because they have been defined as 
transient due to many classes in their hierarchy not implementing the 
Serializable interface.
            ((ConfigurationImpl) config).setBrokerPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerPlugins()));
            ((ConfigurationImpl) config).setBrokerConnectionPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerConnectionPlugins()));
            ((ConfigurationImpl) config).setBrokerSessionPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerSessionPlugins()));
            ((ConfigurationImpl) config).setBrokerConsumerPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerConsumerPlugins()));
            ((ConfigurationImpl) config).setBrokerAddressPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerAddressPlugins()));
            ((ConfigurationImpl) config).setBrokerQueuePlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerQueuePlugins()));
            ((ConfigurationImpl) config).setBrokerBindingPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerBindingPlugins()));
            ((ConfigurationImpl) config).setBrokerMessagePlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerMessagePlugins()));
            ((ConfigurationImpl) config).setBrokerBridgePlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerBridgePlugins()));
            ((ConfigurationImpl) config).setBrokerCriticalPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerCriticalPlugins()));
            ((ConfigurationImpl) config).setBrokerFederationPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerFederationPlugins()));
            ((ConfigurationImpl) config).setBrokerResourcePlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerResourcePlugins())); 
{noformat}
 

  was:
The org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.copy() 
method fails to serialize plugin list members containing one or more elements.

This can be demonstrated using the 
examples\features\ha\colocated-failover-scale-down example. In each broker.xml 
file, change the <ha-policy><shared-store> element to <ha-policy><replication> 
(also remove the <failover-on-shutdown> element) and add the 
NotificationActiveMQServerPlugin from 
[https://activemq.apache.org/components/artemis/documentation/latest/broker-plugins.html:]
{noformat}
<broker-plugins>
   <broker-plugin 
class-name="org.apache.activemq.artemis.core.server.plugin.impl.NotificationActiveMQServerPlugin">
      <property key="SEND_CONNECTION_NOTIFICATIONS" value="true" />
      <property key="SEND_SESSION_NOTIFICATIONS" value="true" />
   </broker-plugin>
</broker-plugins>{noformat}
The following exception is generated:
{noformat}
ColocatedFailoverScaleDownExample0-out:2020-09-29 17:22:31,917 WARN 
[org.apache.activemq.artemis.core.server] AMQ222261: Failed to activate a 
backup: java.security.PrivilegedActionException: 
java.io.NotSerializableException: 
org.apache.activemq.artemis.core.server.plugin.impl.NotificationActiveMQServerPlugin{noformat}
Two options exist for fixing this:

1) Implement the Serializable interface in all affected plugin classes.

2) Make all org.apache.activemq.artemis.core.config.impl.ConfigurationImpl 
plugin list members transient and NOT final, create setters for them, and 
manually copy the plugin lists after serialization in the 
org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.copy() method 
like so:
{noformat}
            // Manually copy all plugins because they have been defined as 
transient due to many classes in their hierarchy not implementing the 
Serializable interface.
            ((ConfigurationImpl) config).setBrokerPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerPlugins()));
            ((ConfigurationImpl) config).setBrokerConnectionPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerConnectionPlugins()));
            ((ConfigurationImpl) config).setBrokerSessionPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerSessionPlugins()));
            ((ConfigurationImpl) config).setBrokerConsumerPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerConsumerPlugins()));
            ((ConfigurationImpl) config).setBrokerAddressPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerAddressPlugins()));
            ((ConfigurationImpl) config).setBrokerQueuePlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerQueuePlugins()));
            ((ConfigurationImpl) config).setBrokerBindingPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerBindingPlugins()));
            ((ConfigurationImpl) config).setBrokerMessagePlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerMessagePlugins()));
            ((ConfigurationImpl) config).setBrokerBridgePlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerBridgePlugins()));
            ((ConfigurationImpl) config).setBrokerCriticalPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerCriticalPlugins()));
            ((ConfigurationImpl) config).setBrokerFederationPlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerFederationPlugins()));
            ((ConfigurationImpl) config).setBrokerResourcePlugins(new 
CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerResourcePlugins())); 
{noformat}


> Configuration plugins are not serializable and cause replication to fail
> ------------------------------------------------------------------------
>
>                 Key: ARTEMIS-2923
>                 URL: https://issues.apache.org/jira/browse/ARTEMIS-2923
>             Project: ActiveMQ Artemis
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 2.15.0
>            Reporter: Aaron Steigerwald
>            Priority: Major
>         Attachments: broker.xml.server0, broker.xml.server1
>
>
> The org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.copy() 
> method fails to serialize plugin list members containing one or more elements.
> This can be demonstrated using the 
> examples\features\ha\colocated-failover-scale-down example. In each 
> broker.xml file, change the <ha-policy><shared-store> element to 
> <ha-policy><replication> (also remove the <failover-on-shutdown> element) and 
> add the NotificationActiveMQServerPlugin from 
> [https://activemq.apache.org/components/artemis/documentation/latest/broker-plugins.html:]
> {noformat}
> <broker-plugins>
>    <broker-plugin 
> class-name="org.apache.activemq.artemis.core.server.plugin.impl.NotificationActiveMQServerPlugin">
>       <property key="SEND_CONNECTION_NOTIFICATIONS" value="true" />
>       <property key="SEND_SESSION_NOTIFICATIONS" value="true" />
>    </broker-plugin>
> </broker-plugins>{noformat}
> Modified broker.xml files for the 
> examples\features\ha\colocated-failover-scale-down example are attached.
> The following exception is generated:
> {noformat}
> ColocatedFailoverScaleDownExample0-out:2020-09-29 17:22:31,917 WARN 
> [org.apache.activemq.artemis.core.server] AMQ222261: Failed to activate a 
> backup: java.security.PrivilegedActionException: 
> java.io.NotSerializableException: 
> org.apache.activemq.artemis.core.server.plugin.impl.NotificationActiveMQServerPlugin{noformat}
> Two options exist for fixing this:
> 1) Implement the Serializable interface in all affected plugin classes.
> 2) Make all org.apache.activemq.artemis.core.config.impl.ConfigurationImpl 
> plugin list members transient and NOT final, create setters for them, and 
> manually copy the plugin lists after serialization in the 
> org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.copy() method 
> like so:
> {noformat}
>             // Manually copy all plugins because they have been defined as 
> transient due to many classes in their hierarchy not implementing the 
> Serializable interface.
>             ((ConfigurationImpl) config).setBrokerPlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerPlugins()));
>             ((ConfigurationImpl) config).setBrokerConnectionPlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerConnectionPlugins()));
>             ((ConfigurationImpl) config).setBrokerSessionPlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerSessionPlugins()));
>             ((ConfigurationImpl) config).setBrokerConsumerPlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerConsumerPlugins()));
>             ((ConfigurationImpl) config).setBrokerAddressPlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerAddressPlugins()));
>             ((ConfigurationImpl) config).setBrokerQueuePlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerQueuePlugins()));
>             ((ConfigurationImpl) config).setBrokerBindingPlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerBindingPlugins()));
>             ((ConfigurationImpl) config).setBrokerMessagePlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerMessagePlugins()));
>             ((ConfigurationImpl) config).setBrokerBridgePlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerBridgePlugins()));
>             ((ConfigurationImpl) config).setBrokerCriticalPlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerCriticalPlugins()));
>             ((ConfigurationImpl) config).setBrokerFederationPlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerFederationPlugins()));
>             ((ConfigurationImpl) config).setBrokerResourcePlugins(new 
> CopyOnWriteArrayList<>(ConfigurationImpl.this.getBrokerResourcePlugins())); 
> {noformat}
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to