From 886ae7bfc524fcd3250bd82e17594976b940f59f Mon Sep 17 00:00:00 2001 From: Justin Bertram Date: Fri, 21 Jun 2019 11:45:23 -0500 Subject: [PATCH] ARTEMIS-2395 empty address.txt causes NPE --- .../paging/impl/PagingStoreFactoryNIO.java | 8 ++- .../core/server/ActiveMQServerLogger.java | 5 ++ .../tests/integration/paging/PagingTest.java | 65 +++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreFactoryNIO.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreFactoryNIO.java index ef1d7aa07c..364f221b81 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreFactoryNIO.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreFactoryNIO.java @@ -56,7 +56,7 @@ public class PagingStoreFactoryNIO implements PagingStoreFactory { // Constants ----------------------------------------------------- - private static final String ADDRESS_FILE = "address.txt"; + public static final String ADDRESS_FILE = "address.txt"; // Attributes ---------------------------------------------------- @@ -217,6 +217,12 @@ public class PagingStoreFactoryNIO implements PagingStoreFactory { addressString = reader.readLine(); } + // there's no address listed in the file so we just skip it + if (addressString == null) { + ActiveMQServerLogger.LOGGER.emptyAddressFile(PagingStoreFactoryNIO.ADDRESS_FILE, file.toString()); + continue; + } + SimpleString address = new SimpleString(addressString); SequentialFileFactory factory = newFileFactory(guid); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java index 0bda71be8e..4751473f43 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java @@ -1629,6 +1629,11 @@ public interface ActiveMQServerLogger extends BasicLogger { @Message(id = 222281, value = "Federation upstream {0} policy ref {1} are too self referential, avoiding stack overflow , ", format = Message.Format.MESSAGE_FORMAT) void federationAvoidStackOverflowPolicyRef(String upstreamName, String policyRef); + @LogMessage(level = Logger.Level.WARN) + @Message(id = 222282, value = "File {0} at {1} is empty. Delete the empty file to stop this message.", + format = Message.Format.MESSAGE_FORMAT) + void emptyAddressFile(String addressFile, String directory); + @LogMessage(level = Logger.Level.ERROR) @Message(id = 224000, value = "Failure in initialisation", format = Message.Format.MESSAGE_FORMAT) void initializationError(@Cause Throwable e); diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java index cbae0a0a38..b12f25c05e 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java @@ -25,6 +25,7 @@ import javax.transaction.xa.Xid; import java.io.File; import java.io.IOException; import java.io.OutputStream; +import java.io.PrintWriter; import java.lang.management.ManagementFactory; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -491,6 +492,70 @@ public class PagingTest extends ActiveMQTestBase { System.out.println("pgComplete = " + pgComplete); } + @Test + public void testEmptyAddress() throws Exception { + if (storeType == StoreConfiguration.StoreType.FILE) { + clearDataRecreateServerDirs(); + + Configuration config = createDefaultInVMConfig().setJournalSyncNonTransactional(false); + + server = createServer(true, config, PagingTest.PAGE_SIZE, PagingTest.PAGE_MAX); + + server.start(); + + final int numberOfMessages = 5000; + + locator = createInVMNonHALocator().setBlockOnNonDurableSend(true).setBlockOnDurableSend(true).setBlockOnAcknowledge(true); + + sf = createSessionFactory(locator); + + ClientSession session = sf.createSession(false, false, false); + + session.createQueue(PagingTest.ADDRESS, RoutingType.ANYCAST, PagingTest.ADDRESS, null, true); + + ClientProducer producer = session.createProducer(PagingTest.ADDRESS); + + byte[] body = new byte[MESSAGE_SIZE]; + + ByteBuffer bb = ByteBuffer.wrap(body); + + for (int j = 1; j <= MESSAGE_SIZE; j++) { + bb.put(getSamplebyte(j)); + } + + for (int i = 0; i < numberOfMessages; i++) { + ClientMessage message = session.createMessage(true); + + message.getBodyBuffer().writeBytes(body); + + producer.send(message); + if (i % 1000 == 0) { + session.commit(); + } + } + session.commit(); + producer.close(); + session.close(); + + String addressTxt = server.getPagingManager().getPageStore(PagingTest.ADDRESS).getFolder().getAbsolutePath() + File.separator + PagingStoreFactoryNIO.ADDRESS_FILE; + + server.stop(); + + // delete contents of address.txt + new PrintWriter(addressTxt).close(); + + final AtomicBoolean activationFailures = new AtomicBoolean(); + + server.registerActivationFailureListener(exception -> activationFailures.set(true)); + + server.start(); + + server.stop(); + + assertFalse(activationFailures.get()); + } + } + @Test public void testPurge() throws Exception { clearDataRecreateServerDirs();