} else { logger.debug("Replacing counter " + value.get()); counter.increment(txRecoverCounter, value.get(), sizeValue.get());
@Override public void ackTx(final Transaction tx, final PagedReference reference) throws Exception { //pre-calculate persistentSize final long persistentSize = getPersistentSize(reference); confirmPosition(tx, reference.getPosition(), persistentSize); counter.increment(tx, -1, -persistentSize); PageTransactionInfo txInfo = getPageTransaction(reference); if (txInfo != null) { txInfo.storeUpdate(store, pageStore.getPagingManager(), tx); } }
/** * This is done to prevent non tx to get out of sync in case of failures * * @param tx * @param page * @param ctx * @throws Exception */ private void applyPageCounters(Transaction tx, Page page, RouteContextList ctx, long size) throws Exception { List<org.apache.activemq.artemis.core.server.Queue> durableQueues = ctx.getDurableQueues(); List<org.apache.activemq.artemis.core.server.Queue> nonDurableQueues = ctx.getNonDurableQueues(); for (org.apache.activemq.artemis.core.server.Queue q : durableQueues) { if (tx == null) { // non transactional writes need an intermediate place // to avoid the counter getting out of sync q.getPageSubscription().getCounter().pendingCounter(page, 1, size); } else { // null tx is treated through pending counters q.getPageSubscription().getCounter().increment(tx, 1, size); } } for (org.apache.activemq.artemis.core.server.Queue q : nonDurableQueues) { q.getPageSubscription().getCounter().increment(tx, 1, size); } }
@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 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()); }
@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()); }
counter.increment(tx, 1, 1000);
counter.increment(tx, 1, 1000);