mirror of
https://github.com/apache/activemq.git
synced 2025-02-08 19:15:20 +00:00
[AMQ-6547] revert mod from AMQ-3143 such that waitForSpace respects child usage, fix test and validate mKahadb blocking send
This commit is contained in:
parent
f5baebb001
commit
fad50812af
@ -78,16 +78,6 @@ public class StoreUsage extends PercentLimitUsage<StoreUsage> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean waitForSpace(long timeout, int highWaterMark) throws InterruptedException {
|
|
||||||
if (parent != null) {
|
|
||||||
if (parent.waitForSpace(timeout, highWaterMark)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.waitForSpace(timeout, highWaterMark);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void updateLimitBasedOnPercent() {
|
protected void updateLimitBasedOnPercent() {
|
||||||
|
@ -21,6 +21,8 @@ import org.apache.activemq.broker.BrokerService;
|
|||||||
import org.apache.activemq.broker.region.BaseDestination;
|
import org.apache.activemq.broker.region.BaseDestination;
|
||||||
import org.apache.activemq.command.ActiveMQQueue;
|
import org.apache.activemq.command.ActiveMQQueue;
|
||||||
import org.apache.activemq.usage.StoreUsage;
|
import org.apache.activemq.usage.StoreUsage;
|
||||||
|
import org.apache.activemq.util.IOHelper;
|
||||||
|
import org.apache.activemq.util.Wait;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -32,8 +34,14 @@ import javax.jms.Destination;
|
|||||||
import javax.jms.MessageConsumer;
|
import javax.jms.MessageConsumer;
|
||||||
import javax.jms.MessageProducer;
|
import javax.jms.MessageProducer;
|
||||||
import javax.jms.Session;
|
import javax.jms.Session;
|
||||||
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
@ -160,6 +168,72 @@ public class MKahaDBStoreLimitTest {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExplicitAdapterBlockingProducer() throws Exception {
|
||||||
|
MultiKahaDBPersistenceAdapter persistenceAdapter = new MultiKahaDBPersistenceAdapter();
|
||||||
|
KahaDBPersistenceAdapter kahaStore = new KahaDBPersistenceAdapter();
|
||||||
|
kahaStore.setJournalMaxFileLength(1024*8);
|
||||||
|
kahaStore.setIndexDirectory(new File(IOHelper.getDefaultDataDirectory()));
|
||||||
|
|
||||||
|
FilteredKahaDBPersistenceAdapter filtered = new FilteredKahaDBPersistenceAdapter();
|
||||||
|
StoreUsage storeUsage = new StoreUsage();
|
||||||
|
storeUsage.setLimit(40*1024);
|
||||||
|
|
||||||
|
filtered.setUsage(storeUsage);
|
||||||
|
filtered.setDestination(queueA);
|
||||||
|
filtered.setPersistenceAdapter(kahaStore);
|
||||||
|
List<FilteredKahaDBPersistenceAdapter> stores = new ArrayList<>();
|
||||||
|
stores.add(filtered);
|
||||||
|
|
||||||
|
persistenceAdapter.setFilteredPersistenceAdapters(stores);
|
||||||
|
|
||||||
|
BrokerService brokerService = createBroker(persistenceAdapter);
|
||||||
|
brokerService.start();
|
||||||
|
|
||||||
|
final AtomicBoolean done = new AtomicBoolean();
|
||||||
|
ExecutorService executor = Executors.newCachedThreadPool();
|
||||||
|
executor.submit(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
produceMessages(queueA, 20);
|
||||||
|
done.set(true);
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
assertTrue("some messages got to dest", Wait.waitFor(new Wait.Condition() {
|
||||||
|
@Override
|
||||||
|
public boolean isSatisified() throws Exception {
|
||||||
|
BaseDestination baseDestinationA = (BaseDestination) broker.getRegionBroker().getDestinationMap().get(queueA);
|
||||||
|
return baseDestinationA != null && baseDestinationA.getDestinationStatistics().getMessages().getCount() > 4l;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
BaseDestination baseDestinationA = (BaseDestination) broker.getRegionBroker().getDestinationMap().get(queueA);
|
||||||
|
// loop till producer stalled
|
||||||
|
long enqueues = 0l;
|
||||||
|
do {
|
||||||
|
enqueues = baseDestinationA.getDestinationStatistics().getEnqueues().getCount();
|
||||||
|
LOG.info("Dest Enqueues: " + enqueues);
|
||||||
|
TimeUnit.MILLISECONDS.sleep(500);
|
||||||
|
} while (enqueues != baseDestinationA.getDestinationStatistics().getEnqueues().getCount());
|
||||||
|
|
||||||
|
|
||||||
|
assertFalse("expect producer to block", done.get());
|
||||||
|
|
||||||
|
LOG.info("Store global u: " + broker.getSystemUsage().getStoreUsage().getUsage() + ", %:" + broker.getSystemUsage().getStoreUsage().getPercentUsage());
|
||||||
|
|
||||||
|
assertTrue("some usage", broker.getSystemUsage().getStoreUsage().getUsage() > 0);
|
||||||
|
|
||||||
|
LOG.info("Store A u: " + baseDestinationA.getSystemUsage().getStoreUsage().getUsage() + ", %: " + baseDestinationA.getSystemUsage().getStoreUsage().getPercentUsage());
|
||||||
|
|
||||||
|
assertTrue("limited store has more % usage than parent", baseDestinationA.getSystemUsage().getStoreUsage().getPercentUsage() > broker.getSystemUsage().getStoreUsage().getPercentUsage());
|
||||||
|
|
||||||
|
executor.shutdownNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void consume(Destination queue) throws Exception {
|
private void consume(Destination queue) throws Exception {
|
||||||
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://localhost?create=false");
|
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://localhost?create=false");
|
||||||
@ -180,7 +254,7 @@ public class MKahaDBStoreLimitTest {
|
|||||||
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
|
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
|
||||||
MessageProducer producer = session.createProducer(queue);
|
MessageProducer producer = session.createProducer(queue);
|
||||||
BytesMessage bytesMessage = session.createBytesMessage();
|
BytesMessage bytesMessage = session.createBytesMessage();
|
||||||
bytesMessage.writeBytes(new byte[2*1024]);
|
bytesMessage.writeBytes(new byte[1*1024]);
|
||||||
for (int i = 0; i < count; ++i) {
|
for (int i = 0; i < count; ++i) {
|
||||||
producer.send(bytesMessage);
|
producer.send(bytesMessage);
|
||||||
}
|
}
|
||||||
|
@ -20,21 +20,24 @@ package org.apache.activemq.usage;
|
|||||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||||
import org.apache.activemq.EmbeddedBrokerTestSupport;
|
import org.apache.activemq.EmbeddedBrokerTestSupport;
|
||||||
import org.apache.activemq.broker.BrokerService;
|
import org.apache.activemq.broker.BrokerService;
|
||||||
|
import org.apache.activemq.broker.region.BaseDestination;
|
||||||
import org.apache.activemq.util.ProducerThread;
|
import org.apache.activemq.util.ProducerThread;
|
||||||
import org.apache.activemq.util.Wait;
|
import org.apache.activemq.util.Wait;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.jms.Connection;
|
import javax.jms.Connection;
|
||||||
import javax.jms.Destination;
|
import javax.jms.Destination;
|
||||||
import javax.jms.Session;
|
import javax.jms.Session;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class StoreUsageTest extends EmbeddedBrokerTestSupport {
|
public class StoreUsageTest extends EmbeddedBrokerTestSupport {
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(StoreUsageTest.class);
|
||||||
final int WAIT_TIME_MILLS = 20*1000;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BrokerService createBroker() throws Exception {
|
protected BrokerService createBroker() throws Exception {
|
||||||
BrokerService broker = super.createBroker();
|
BrokerService broker = super.createBroker();
|
||||||
broker.getSystemUsage().getStoreUsage().setLimit(10 * 1024);
|
broker.getSystemUsage().getStoreUsage().setLimit(34 * 1024);
|
||||||
broker.deleteAllMessages();
|
broker.deleteAllMessages();
|
||||||
return broker;
|
return broker;
|
||||||
}
|
}
|
||||||
@ -52,20 +55,36 @@ public class StoreUsageTest extends EmbeddedBrokerTestSupport {
|
|||||||
final ProducerThread producer = new ProducerThread(sess, dest);
|
final ProducerThread producer = new ProducerThread(sess, dest);
|
||||||
producer.start();
|
producer.start();
|
||||||
|
|
||||||
|
assertTrue("some messages sent", Wait.waitFor(new Wait.Condition() {
|
||||||
|
public boolean isSatisified() throws Exception {
|
||||||
|
BaseDestination baseDestination = (BaseDestination) broker.getRegionBroker().getDestinationMap().get(dest);
|
||||||
|
|
||||||
|
return baseDestination != null && baseDestination.getDestinationStatistics().getEnqueues().getCount() > 0;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
BaseDestination baseDestination = (BaseDestination) broker.getRegionBroker().getDestinationMap().get(dest);
|
||||||
|
LOG.info("Sent u: " + baseDestination.getDestinationStatistics().getEnqueues());
|
||||||
|
|
||||||
// wait for the producer to block
|
// wait for the producer to block
|
||||||
Thread.sleep(WAIT_TIME_MILLS / 2);
|
int sent = 0;
|
||||||
|
do {
|
||||||
|
sent = producer.getSentCount();
|
||||||
|
TimeUnit.SECONDS.sleep(1);
|
||||||
|
LOG.info("Sent: " + sent);
|
||||||
|
} while (sent != producer.getSentCount());
|
||||||
|
|
||||||
|
LOG.info("Increasing limit! enqueues: " + baseDestination.getDestinationStatistics().getEnqueues().getCount());
|
||||||
broker.getAdminView().setStoreLimit(1024 * 1024);
|
broker.getAdminView().setStoreLimit(1024 * 1024);
|
||||||
|
|
||||||
Thread.sleep(WAIT_TIME_MILLS);
|
|
||||||
|
|
||||||
Wait.waitFor(new Wait.Condition() {
|
Wait.waitFor(new Wait.Condition() {
|
||||||
public boolean isSatisified() throws Exception {
|
public boolean isSatisified() throws Exception {
|
||||||
return producer.getSentCount() == producer.getMessageCount();
|
return producer.getSentCount() == producer.getMessageCount();
|
||||||
}
|
}
|
||||||
}, WAIT_TIME_MILLS * 2);
|
});
|
||||||
|
|
||||||
assertEquals("Producer didn't send all messages", producer.getMessageCount(), producer.getSentCount());
|
assertEquals("Producer sent all messages", producer.getMessageCount(), producer.getSentCount());
|
||||||
|
assertEquals("Enqueues match sent", producer.getSentCount(), baseDestination.getDestinationStatistics().getEnqueues().getCount());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user