@Override public long getAddressMemoryUsage() { checkStarted(); clearIO(); try { //this should not happen but if it does, return -1 to highlight it is not working if (server.getPagingManager() == null) { return -1L; } return server.getPagingManager().getGlobalSize(); } finally { blockOnIO(); } }
/** Will execute a Runnable on an Address when there's space in memory*/ public void flow(final SimpleString address, Runnable runnable) { try { PagingManager pagingManager = manager.getServer().getPagingManager(); if (address == null) { pagingManager.checkMemory(runnable); } else { final PagingStore store = manager.getServer().getPagingManager().getPageStore(address); if (store != null) { store.checkMemory(runnable); } else { runnable.run(); } } } catch (Exception e) { throw new RuntimeException(e); } }
/** Will execute a Runnable on an Address when there's space in memory*/ public void flow(final SimpleString address, Runnable runnable) { try { PagingManager pagingManager = manager.getServer().getPagingManager(); if (address == null) { pagingManager.checkMemory(runnable); } else { final PagingStore store = manager.getServer().getPagingManager().getPageStore(address); if (store != null) { store.checkMemory(runnable); } else { runnable.run(); } } } catch (Exception e) { throw new RuntimeException(e); } }
@Override public void requestProducerCredits(SimpleString address, final int credits) throws Exception { final SimpleString addr = removePrefix(address); PagingStore store = server.getPagingManager().getPageStore(addr); if (store == null) { callback.sendProducerCreditsMessage(credits, address); } else if (!store.checkMemory(new Runnable() { @Override public void run() { callback.sendProducerCreditsMessage(credits, address); } })) { callback.sendProducerCreditsFailMessage(credits, address); } }
@Test public void testSyncPageTX() throws Exception { Configuration config = createDefaultInVMConfig(); server = createServer(true, config, PagingTest.PAGE_SIZE, PagingTest.PAGE_MAX); server.start(); server.createQueue(PagingTest.ADDRESS, RoutingType.ANYCAST, PagingTest.ADDRESS, null, true, false); final CountDownLatch pageUp = new CountDownLatch(0); final CountDownLatch pageDone = new CountDownLatch(1); OperationContext ctx = new DummyOperationContext(pageUp, pageDone); OperationContextImpl.setContext(ctx); PagingManager paging = server.getPagingManager(); PagingStore store = paging.getPageStore(ADDRESS); store.sync(); assertTrue(pageUp.await(10, TimeUnit.SECONDS)); assertTrue(pageDone.await(10, TimeUnit.SECONDS)); }
@Test(timeout = 60000) public void testAddressIsBlockedForOtherProdudersWhenFull() throws Exception { Connection connection = createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination d = session.createQueue(getQueueName()); MessageProducer p = session.createProducer(d); fillAddress(getQueueName()); Exception e = null; try { p.send(session.createBytesMessage()); } catch (ResourceAllocationException rae) { e = rae; } assertTrue(e instanceof ResourceAllocationException); assertTrue(e.getMessage().contains("resource-limit-exceeded")); long addressSize = server.getPagingManager().getPageStore(new SimpleString(getQueueName())).getAddressSize(); assertTrue(addressSize >= MAX_SIZE_BYTES_REJECT_THRESHOLD); }
/** * @param queue * @return * @throws Exception */ private PageSubscriptionCounter locateCounter(Queue queue) throws Exception { PageSubscription subscription = server.getPagingManager().getPageStore(new SimpleString("A1")).getCursorProvider().getSubscription(queue.getID()); PageSubscriptionCounter counter = subscription.getCounter(); return counter; }
@Test public void testPaginStoreIsRemovedWhenQueueIsDeleted() throws Exception { SimpleString queue = RandomUtil.randomSimpleString(); SimpleString address = RandomUtil.randomSimpleString(); session.createTemporaryQueue(address, queue); ClientProducer producer = session.createProducer(address); ClientMessage msg = session.createMessage(false); producer.send(msg); session.start(); ClientConsumer consumer = session.createConsumer(queue); ClientMessage message = consumer.receive(500); assertNotNull(message); message.acknowledge(); SimpleString[] storeNames = server.getPagingManager().getStoreNames(); assertTrue(Arrays.asList(storeNames).contains(address)); consumer.close(); session.deleteQueue(queue); session.close(); storeNames = server.getPagingManager().getStoreNames(); assertFalse(Arrays.asList(storeNames).contains(address)); }
assertTrue(server.getPagingManager().getPageStore(ADDRESS).isPaging()); ready.countDown();
@Test public void testSyncPage() throws Exception { Configuration config = createDefaultInVMConfig(); server = createServer(true, config, PagingTest.PAGE_SIZE, PagingTest.PAGE_MAX); server.start(); try { server.addAddressInfo(new AddressInfo(PagingTest.ADDRESS, RoutingType.ANYCAST)); server.createQueue(PagingTest.ADDRESS, RoutingType.ANYCAST, PagingTest.ADDRESS, null, true, false); final CountDownLatch pageUp = new CountDownLatch(0); final CountDownLatch pageDone = new CountDownLatch(1); OperationContext ctx = new DummyOperationContext(pageUp, pageDone); OperationContextImpl.setContext(ctx); PagingManager paging = server.getPagingManager(); PagingStore store = paging.getPageStore(ADDRESS); store.sync(); assertTrue(pageUp.await(10, TimeUnit.SECONDS)); assertTrue(pageDone.await(10, TimeUnit.SECONDS)); server.stop(); } finally { try { server.stop(); } catch (Throwable ignored) { } OperationContextImpl.clearContext(); } }
maxSizField.setLong(server.getPagingManager(), 10240); clearDataRecreateServerDirs();
@Test public void testTooLongPageStoreTableNamePrefix() throws Exception { if (storeType == StoreConfiguration.StoreType.DATABASE) { final Configuration config = createDefaultInVMConfig(); final DatabaseStorageConfiguration storageConfiguration = (DatabaseStorageConfiguration) config.getStoreConfiguration(); //set the page store table to be longer than 10 chars -> the paging manager initialization will fail storageConfiguration.setPageStoreTableName("PAGE_STORE_"); final int PAGE_MAX = 20 * 1024; final int PAGE_SIZE = 10 * 1024; final ActiveMQServer server = createServer(true, config, PAGE_SIZE, PAGE_MAX); server.start(); //due to a failed initialisation of the paging manager, it must be null Assert.assertNull(server.getPagingManager()); server.stop(); } }
private long performScaledown() throws Exception { ScaleDownHandler handler = new ScaleDownHandler(servers[0].getPagingManager(), servers[0].getPostOffice(), servers[0].getNodeManager(), servers[0].getClusterManager().getClusterController(), servers[0].getStorageManager()); return handler.scaleDownMessages(sfs[1], servers[1].getNodeID(), servers[0].getConfiguration().getClusterUser(), servers[0].getConfiguration().getClusterPassword()); }
@Test(timeout = 60000) public void testCreditsAreNotAllocatedWhenAddressIsFull() throws Exception { AmqpClient client = createAmqpClient(new URI(singleCreditAcceptorURI)); AmqpConnection connection = addConnection(client.connect()); try { AmqpSession session = connection.createSession(); AmqpSender sender = session.createSender(getQueueName()); // Use blocking send to ensure buffered messages do not interfere with credit. sender.setSendTimeout(-1); sendUntilFull(sender); // This should be -1. A single message is buffered in the client, and 0 credit has been allocated. assertTrue(sender.getSender().getCredit() == -1); long addressSize = server.getPagingManager().getPageStore(new SimpleString(getQueueName())).getAddressSize(); assertTrue(addressSize >= MAX_SIZE_BYTES && addressSize <= MAX_SIZE_BYTES_REJECT_THRESHOLD); } finally { connection.close(); } }
private void receiveAllMessagesTxAndPageCheckPendingTx() throws Exception { final ClientSessionFactory sf = createSessionFactory(locator); ClientSession session = sf.createSession(null, null, false, true, false, false, 0); session.start(); ClientConsumer consumer = session.createConsumer(ADDRESS); for (int i = 0; i < numMsgs; i++) { ClientMessage message = consumer.receive(2000); assertNotNull(message); message.acknowledge(); } //before committing the pendingTx should be positive. PagingStore store = server.getPagingManager().getPageStore(ADDRESS); long qid = server.locateQueue(ADDRESS).getID(); PageSubscription pageSub = store.getCursorProvider().getSubscription(qid); long pageNr = store.getCurrentWritingPage(); PageSubscriptionImpl.PageCursorInfo info = ((PageSubscriptionImpl)pageSub).getPageInfo(pageNr); System.out.println("pendingTx: " + info.getPendingTx()); //The positive pendingTx will prevent a page being removed //before ResOperation is completed. assertTrue(info.getPendingTx() > 0); session.commit(); session.close(); }
@Test public void testPagingDoesNotDuplicateBatchMessagesAfterPagingStarted() throws Exception { int batchSize = 20; ClientSessionFactory sf = createSessionFactory(locator); ClientSession session = sf.createSession(false, false); // Create a queue SimpleString queueAddr = new SimpleString("testQueue"); session.createQueue(queueAddr, queueAddr, null, true); // Set up paging on the queue address AddressSettings addressSettings = new AddressSettings().setPageSizeBytes(10 * 1024) /** This actually causes the address to start paging messages after 10 x messages with 1024 payload is sent. Presumably due to additional meta-data, message headers etc... **/.setMaxSizeBytes(16 * 1024); server.getAddressSettingsRepository().addMatch("#", addressSettings); int numberOfMessages = 0; // ensure the server is paging while (!server.getPagingManager().getPageStore(queueAddr).isPaging()) { sendMessageBatch(batchSize, session, queueAddr); numberOfMessages += batchSize; } sendMessageBatch(batchSize, session, queueAddr); numberOfMessages += batchSize; Queue queue = server.locateQueue(queueAddr); checkBatchMessagesAreNotPagedTwice(queue); for (int i = 0; i < 10; i++) { // execute the same count a couple times. This is to make sure the iterators have no impact regardless // the number of times they are called assertEquals(numberOfMessages, processCountThroughIterator(queue)); } }
servers[0].getAddressSettingsRepository().addMatch("#", defaultSetting); while (!servers[0].getPagingManager().getPageStore(new SimpleString(addressName)).isPaging()) { for (int i = 0; i < CHUNK_SIZE; i++) { ClientMessage message = session.createMessage(true);
@Test public void testNoCursors() throws Exception { Configuration config = createDefaultInVMConfig().setJournalSyncNonTransactional(false); server = createServer(true, config, PagingTest.PAGE_SIZE, PagingTest.PAGE_MAX); server.start(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory sf = locator.createSessionFactory(); ClientSession session = sf.createSession(); session.createQueue(ADDRESS, ADDRESS, true); ClientProducer prod = session.createProducer(ADDRESS); for (int i = 0; i < 100; i++) { Message msg = session.createMessage(true); msg.toCore().getBodyBuffer().writeBytes(new byte[1024]); prod.send(msg); } session.commit(); session.deleteQueue(ADDRESS); session.close(); sf.close(); locator.close(); server.stop(); server.start(); waitForNotPaging(server.getPagingManager().getPageStore(ADDRESS)); server.stop(); }
@Test public void testPaging() throws Exception { final int CHUNK_SIZE = 50; int messageCount = 0; final String addressName = "testAddress"; final String queueName = "testQueue"; createQueue(0, addressName, queueName, null, false); createQueue(1, addressName, queueName, null, false); ClientSessionFactory sf = sfs[0]; ClientSession session = addClientSession(sf.createSession(false, false)); ClientProducer producer = addClientProducer(session.createProducer(addressName)); AddressSettings defaultSetting = new AddressSettings().setPageSizeBytes(10 * 1024).setMaxSizeBytes(20 * 1024); servers[0].getAddressSettingsRepository().addMatch("#", defaultSetting); while (!servers[0].getPagingManager().getPageStore(new SimpleString(addressName)).isPaging()) { for (int i = 0; i < CHUNK_SIZE; i++) { ClientMessage message = session.createMessage(true); message.getBodyBuffer().writeBytes(new byte[1024]); producer.send(message); messageCount++; } session.commit(); } servers[0].stop(); addConsumer(0, 1, queueName, null); for (int i = 0; i < messageCount; i++) { Assert.assertNotNull(consumers[0].getConsumer().receive(250)); } Assert.assertNull(consumers[0].getConsumer().receive(250)); removeConsumer(0); }
servers[0].getAddressSettingsRepository().addMatch("#", defaultSetting); while (!servers[0].getPagingManager().getPageStore(new SimpleString(addressName)).isPaging()) { for (int i = 0; i < CHUNK_SIZE; i++) { Message message = session.createMessage(true);