protected void blockOnIO() { // the storage manager could be null on the backup on certain components if (storageManager != null) { try { storageManager.waitOnOperations(); storageManager.clearContext(); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } }
@Override public void waitOnOperations() throws Exception { manager.waitOnOperations(); }
@Override public boolean waitOnOperations(long timeout) throws Exception { return manager.waitOnOperations(timeout); }
/** * @param cursorList * @param currentPage * @throws Exception */ protected void storeBookmark(ArrayList<PageSubscription> cursorList, Page currentPage) throws Exception { try { // First step: Move every cursor to the next bookmarked page (that was just created) for (PageSubscription cursor : cursorList) { cursor.confirmPosition(new PagePositionImpl(currentPage.getPageId(), -1)); } // we just need to make sure the storage is done.. // if the thread pool is full, we will just log it once instead of looping if (!storageManager.waitOnOperations(5000)) { ActiveMQServerLogger.LOGGER.problemCompletingOperations(storageManager.getContext()); } } finally { for (PageSubscription cursor : cursorList) { cursor.enableAutoCleanup(); } } }
@Override public synchronized boolean commitPreparedTransaction(final String transactionAsBase64) throws Exception { checkStarted(); clearIO(); try { List<Xid> xids = resourceManager.getPreparedTransactions(); for (Xid xid : xids) { if (XidImpl.toBase64String(xid).equals(transactionAsBase64)) { Transaction transaction = resourceManager.removeTransaction(xid); transaction.commit(false); long recordID = server.getStorageManager().storeHeuristicCompletion(xid, true); storageManager.waitOnOperations(); resourceManager.putHeuristicCompletion(recordID, xid, true); return true; } } return false; } finally { blockOnIO(); } }
@Override public synchronized boolean rollbackPreparedTransaction(final String transactionAsBase64) throws Exception { checkStarted(); clearIO(); try { List<Xid> xids = resourceManager.getPreparedTransactions(); for (Xid xid : xids) { if (XidImpl.toBase64String(xid).equals(transactionAsBase64)) { Transaction transaction = resourceManager.removeTransaction(xid); transaction.rollback(); long recordID = server.getStorageManager().storeHeuristicCompletion(xid, false); server.getStorageManager().waitOnOperations(); resourceManager.putHeuristicCompletion(recordID, xid, false); return true; } } return false; } finally { blockOnIO(); } }
@Test public void testPrepareCounter() throws Exception { Xid xid = newXID(); Queue queue = server.createQueue(new SimpleString("A1"), RoutingType.ANYCAST, new SimpleString("A1"), null, true, false); PageSubscriptionCounter counter = locateCounter(queue); StorageManager storage = server.getStorageManager(); Transaction tx = new TransactionImpl(xid, server.getStorageManager(), 300); for (int i = 0; i < 2000; i++) { counter.increment(tx, 1, 1000); } assertEquals(0, counter.getValue()); tx.prepare(); storage.waitOnOperations(); assertEquals(0, counter.getValue()); server.stop(); server = newActiveMQServer(); server.start(); storage = server.getStorageManager(); queue = server.locateQueue(new SimpleString("A1")); assertNotNull(queue); counter = locateCounter(queue); tx = server.getResourceManager().removeTransaction(xid); assertNotNull(tx); assertEquals(0, counter.getValue()); tx.commit(false); storage.waitOnOperations(); assertEquals(2000, counter.getValue()); }
tx.commit(); storage.waitOnOperations(); storage.waitOnOperations();
tx.commit(); storage.waitOnOperations(); storage.waitOnOperations();
@Test public void testCounter() throws Exception { ClientSessionFactory sf = createSessionFactory(sl); ClientSession session = sf.createSession(); try { server.addAddressInfo(new AddressInfo(new SimpleString("A1"), RoutingType.ANYCAST)); Queue queue = server.createQueue(new SimpleString("A1"), RoutingType.ANYCAST, new SimpleString("A1"), null, true, false); PageSubscriptionCounter counter = locateCounter(queue); StorageManager storage = server.getStorageManager(); Transaction tx = new TransactionImpl(server.getStorageManager()); counter.increment(tx, 1, 1000); assertEquals(0, counter.getValue()); assertEquals(0, counter.getPersistentSize()); tx.commit(); storage.waitOnOperations(); assertEquals(1, counter.getValue()); assertEquals(1000, counter.getPersistentSize()); } finally { sf.close(); session.close(); } }
@Test public void testRestartCounter() throws Exception { server.addAddressInfo(new AddressInfo(new SimpleString("A1"), RoutingType.ANYCAST)); Queue queue = server.createQueue(new SimpleString("A1"), RoutingType.ANYCAST, new SimpleString("A1"), null, true, false); PageSubscriptionCounter counter = locateCounter(queue); StorageManager storage = server.getStorageManager(); Transaction tx = new TransactionImpl(server.getStorageManager()); counter.increment(tx, 1, 1000); assertEquals(0, counter.getValue()); assertEquals(0, counter.getPersistentSize()); tx.commit(); storage.waitOnOperations(); assertEquals(1, counter.getValue()); assertEquals(1000, counter.getPersistentSize()); sl.close(); server.stop(); server = newActiveMQServer(); server.start(); queue = server.locateQueue(new SimpleString("A1")); assertNotNull(queue); counter = locateCounter(queue); assertEquals(1, counter.getValue()); assertEquals(1000, counter.getPersistentSize()); }