[ 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)