This commit is contained in:
Clebert Suconic 2019-04-22 10:49:08 -04:00
commit aa0bf60649
4 changed files with 146 additions and 107 deletions

View File

@ -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 {

View File

@ -339,6 +339,8 @@ public interface ActiveMQServer extends ServiceComponent {
PostOffice getPostOffice(); PostOffice getPostOffice();
void clearAddressCache();
QueueFactory getQueueFactory(); QueueFactory getQueueFactory();
ResourceManager getResourceManager(); ResourceManager getResourceManager();

View File

@ -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

View File

@ -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();
}
}
}
} }