This closes #2628
This commit is contained in:
commit
aa0bf60649
|
@ -725,7 +725,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
|
||||||
server.callBrokerBindingPlugins(plugin -> plugin.beforeRemoveBinding(uniqueName, tx, deleteData));
|
server.callBrokerBindingPlugins(plugin -> plugin.beforeRemoveBinding(uniqueName, tx, deleteData));
|
||||||
}
|
}
|
||||||
|
|
||||||
addressSettingsRepository.clearCache();
|
try {
|
||||||
|
|
||||||
Binding binding = addressManager.removeBinding(uniqueName, tx);
|
Binding binding = addressManager.removeBinding(uniqueName, tx);
|
||||||
|
|
||||||
|
@ -776,10 +776,13 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
|
||||||
binding.close();
|
binding.close();
|
||||||
|
|
||||||
if (server.hasBrokerBindingPlugins()) {
|
if (server.hasBrokerBindingPlugins()) {
|
||||||
server.callBrokerBindingPlugins(plugin -> plugin.afterRemoveBinding(binding, tx, deleteData) );
|
server.callBrokerBindingPlugins(plugin -> plugin.afterRemoveBinding(binding, tx, deleteData));
|
||||||
}
|
}
|
||||||
|
|
||||||
return binding;
|
return binding;
|
||||||
|
} finally {
|
||||||
|
server.clearAddressCache();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteDuplicateCache(SimpleString address) throws Exception {
|
private void deleteDuplicateCache(SimpleString address) throws Exception {
|
||||||
|
|
|
@ -339,6 +339,8 @@ public interface ActiveMQServer extends ServiceComponent {
|
||||||
|
|
||||||
PostOffice getPostOffice();
|
PostOffice getPostOffice();
|
||||||
|
|
||||||
|
void clearAddressCache();
|
||||||
|
|
||||||
QueueFactory getQueueFactory();
|
QueueFactory getQueueFactory();
|
||||||
|
|
||||||
ResourceManager getResourceManager();
|
ResourceManager getResourceManager();
|
||||||
|
|
|
@ -2075,9 +2075,7 @@ public class ActiveMQServerImpl implements ActiveMQServer {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
addressSettingsRepository.clearCache();
|
|
||||||
|
|
||||||
Binding binding = postOffice.getBinding(queueName);
|
Binding binding = postOffice.getBinding(queueName);
|
||||||
|
|
||||||
if (binding == null) {
|
if (binding == null) {
|
||||||
|
@ -2089,11 +2087,9 @@ public class ActiveMQServerImpl implements ActiveMQServer {
|
||||||
Queue queue = (Queue) binding.getBindable();
|
Queue queue = (Queue) binding.getBindable();
|
||||||
|
|
||||||
if (hasBrokerQueuePlugins()) {
|
if (hasBrokerQueuePlugins()) {
|
||||||
callBrokerQueuePlugins(plugin -> plugin.beforeDestroyQueue(queueName, session, checkConsumerCount,
|
callBrokerQueuePlugins(plugin -> plugin.beforeDestroyQueue(queueName, session, checkConsumerCount, removeConsumers, autoDeleteAddress));
|
||||||
removeConsumers, autoDeleteAddress));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (session != null) {
|
if (session != null) {
|
||||||
|
|
||||||
if (queue.isDurable()) {
|
if (queue.isDurable()) {
|
||||||
|
@ -2120,8 +2116,7 @@ public class ActiveMQServerImpl implements ActiveMQServer {
|
||||||
queue.deleteQueue(removeConsumers);
|
queue.deleteQueue(removeConsumers);
|
||||||
|
|
||||||
if (hasBrokerQueuePlugins()) {
|
if (hasBrokerQueuePlugins()) {
|
||||||
callBrokerQueuePlugins(plugin -> plugin.afterDestroyQueue(queue, address, session, checkConsumerCount,
|
callBrokerQueuePlugins(plugin -> plugin.afterDestroyQueue(queue, address, session, checkConsumerCount, removeConsumers, autoDeleteAddress));
|
||||||
removeConsumers, autoDeleteAddress));
|
|
||||||
}
|
}
|
||||||
AddressInfo addressInfo = getAddressInfo(address);
|
AddressInfo addressInfo = getAddressInfo(address);
|
||||||
|
|
||||||
|
@ -2134,6 +2129,15 @@ public class ActiveMQServerImpl implements ActiveMQServer {
|
||||||
}
|
}
|
||||||
|
|
||||||
callPostQueueDeletionCallbacks(address, queueName);
|
callPostQueueDeletionCallbacks(address, queueName);
|
||||||
|
} finally {
|
||||||
|
clearAddressCache();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearAddressCache() {
|
||||||
|
securityRepository.clearCache();
|
||||||
|
addressSettingsRepository.clearCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -24,12 +24,16 @@ import javax.jms.Session;
|
||||||
import javax.jms.TemporaryQueue;
|
import javax.jms.TemporaryQueue;
|
||||||
import javax.jms.TemporaryTopic;
|
import javax.jms.TemporaryTopic;
|
||||||
import javax.jms.TextMessage;
|
import javax.jms.TextMessage;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.apache.activemq.artemis.api.core.SimpleString;
|
import org.apache.activemq.artemis.api.core.SimpleString;
|
||||||
|
import org.apache.activemq.artemis.core.security.Role;
|
||||||
import org.apache.activemq.artemis.core.server.ServerSession;
|
import org.apache.activemq.artemis.core.server.ServerSession;
|
||||||
import org.apache.activemq.artemis.core.server.impl.ServerSessionImpl;
|
import org.apache.activemq.artemis.core.server.impl.ServerSessionImpl;
|
||||||
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
|
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
|
||||||
import org.apache.activemq.artemis.jms.client.ActiveMQConnection;
|
import org.apache.activemq.artemis.jms.client.ActiveMQConnection;
|
||||||
|
import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager;
|
||||||
import org.apache.activemq.artemis.tests.util.JMSTestBase;
|
import org.apache.activemq.artemis.tests.util.JMSTestBase;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
@ -222,4 +226,30 @@ public class TemporaryDestinationTest extends JMSTestBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testForSecurityCacheLeak() throws Exception {
|
||||||
|
server.getSecurityStore().setSecurityEnabled(true);
|
||||||
|
ActiveMQJAASSecurityManager securityManager = (ActiveMQJAASSecurityManager) server.getSecurityManager();
|
||||||
|
securityManager.getConfiguration().addUser("IDo", "Exist");
|
||||||
|
securityManager.getConfiguration().addRole("IDo", "myrole");
|
||||||
|
Role myRole = new Role("myrole", true, true, true, true, true, true, true, true, true, true);
|
||||||
|
Set<Role> anySet = new HashSet<>();
|
||||||
|
anySet.add(myRole);
|
||||||
|
server.getSecurityRepository().addMatch("#", anySet);
|
||||||
|
|
||||||
|
try {
|
||||||
|
conn = addConnection(cf.createConnection("IDo", "Exist"));
|
||||||
|
Session s = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
TemporaryQueue temporaryQueue = s.createTemporaryQueue();
|
||||||
|
temporaryQueue.delete();
|
||||||
|
}
|
||||||
|
assertEquals(0, server.getSecurityRepository().getCacheSize());
|
||||||
|
} finally {
|
||||||
|
if (conn != null) {
|
||||||
|
conn.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue