[
https://issues.apache.org/jira/browse/AMQ-9376?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Matt Pavlovich updated AMQ-9376:
--------------------------------
Description:
Need a class instance level lock or duplicate list around the broker map when
doing a .destroy() caused by bundle refesh
Calling .destroy() loops over a map which calls deleted.. which fails when
there is more than one bundle and the bundle is shutdown first (not a
service(s) removed via .cfg delete or osgi service shutdown lifecycle).
#1. OSGi calls..
{noformat}
synchronized public void destroy() {
for (String broker : brokers.keySet()) {
deleted(broker);
}
}
{noformat}
#2. Which blows up here.. due to concurrent modification on the _brokers_
collection
{noformat}
@Override
synchronized public void deleted(String pid) {
ServiceRegistration<BrokerService> reg = brokerRegs.remove(pid);
if (reg != null) {
reg.unregister();
}
BrokerService broker = brokers.remove(pid);
if (broker != null) {
stop(pid, broker);
}
}
{noformat}
was:
Need a class instance level lock or duplicate list around the broker map when
doing a .destroy() caused by bundle refesh
Calling .destroy() loops over a map which calls deleted.. which fails when
there is more than one bundle and the bundle is shutdown first (not a
service(s) removed via .cfg delete or osgi service shutdown lifecycle).
#1. OSGi calls..
{noformat}
synchronized public void destroy() {
for (String broker : brokers.keySet()) {
deleted(broker);
}
}
{noformat}
#2. Which blows up here.. due to concurrent modification on the collection
{noformat}
@Override
synchronized public void deleted(String pid) {
ServiceRegistration<BrokerService> reg = brokerRegs.remove(pid);
if (reg != null) {
reg.unregister();
}
BrokerService broker = brokers.remove(pid);
if (broker != null) {
stop(pid, broker);
}
}
{noformat}
> Fix concurrent modification in ActiveMQServiceFactory
> -----------------------------------------------------
>
> Key: AMQ-9376
> URL: https://issues.apache.org/jira/browse/AMQ-9376
> Project: ActiveMQ
> Issue Type: Bug
> Reporter: Matt Pavlovich
> Priority: Major
> Fix For: 6.0.0, 5.18.4
>
>
> Need a class instance level lock or duplicate list around the broker map when
> doing a .destroy() caused by bundle refesh
> Calling .destroy() loops over a map which calls deleted.. which fails when
> there is more than one bundle and the bundle is shutdown first (not a
> service(s) removed via .cfg delete or osgi service shutdown lifecycle).
> #1. OSGi calls..
> {noformat}
> synchronized public void destroy() {
> for (String broker : brokers.keySet()) {
> deleted(broker);
> }
> }
> {noformat}
> #2. Which blows up here.. due to concurrent modification on the _brokers_
> collection
> {noformat}
> @Override
> synchronized public void deleted(String pid) {
> ServiceRegistration<BrokerService> reg = brokerRegs.remove(pid);
> if (reg != null) {
> reg.unregister();
> }
> BrokerService broker = brokers.remove(pid);
> if (broker != null) {
> stop(pid, broker);
> }
> }
> {noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)