@Override public void init() throws Exception { txManager.startAndWait(); }
@Override public void destroy() throws Exception { txManager.stopAndWait(); } }
@Override public void abort(Transaction tx) { txManager.abort(tx); }
public synchronized TransactionSnapshot getSnapshot() throws IOException { TransactionSnapshot snapshot = null; if (!isRunning() && !isStopping()) { return null; } long now = System.currentTimeMillis(); // avoid duplicate snapshots at same timestamp if (now == lastSnapshotTime || (currentLog != null && now == currentLog.getTimestamp())) { try { TimeUnit.MILLISECONDS.sleep(1); } catch (InterruptedException ie) { } } // copy in memory state snapshot = getCurrentState(); LOG.debug("Starting snapshot of transaction state with timestamp {}", snapshot.getTimestamp()); LOG.debug("Returning snapshot of state: " + snapshot); return snapshot; }
TransactionManager txm = new TransactionManager (conf, new InMemoryTransactionStateStorage(), new TxMetricsCollector()); txm.startAndWait(); try { Assert.assertEquals(0, txm.getInvalidSize()); Assert.assertEquals(0, txm.getCommittedSize()); Transaction tx1 = txm.startShort(); Transaction tx2 = txm.startLong(); Transaction tx3 = txm.startLong(); Transaction tx = txm.startShort(); Assert.assertTrue(txm.canCommit(tx, Collections.singleton(new byte[] { (byte) i }))); Assert.assertTrue(txm.commit(tx)); Assert.assertEquals(0, txm.getInvalidSize()); Assert.assertEquals(10, txm.getCommittedSize()); Assert.assertEquals(1, txm.getInvalidSize()); Transaction txx = txm.startShort(); Assert.assertTrue(txm.canCommit(txx, Collections.singleton(new byte[] { 0x0a }))); Assert.assertTrue(txm.commit(txx)); Assert.assertEquals(0, txm.getCommittedSize()); txm.canCommit(tx1, Collections.singleton(new byte[] { 0x11 }));
TransactionManager txm1 = new TransactionManager(testConf, storage, new TxMetricsCollector()); txm1.startAndWait(); Transaction tx6; try { Assert.assertEquals(0, txm1.getInvalidSize()); tx1 = txm1.startLong(); tx2 = txm1.startShort(); tx3 = txm1.startLong(); tx4 = txm1.startShort(); TimeUnit.MILLISECONDS.sleep(1); long timeBeforeTx5 = System.currentTimeMillis(); tx5 = txm1.startLong(); tx6 = txm1.startShort(); txm1.invalidate(tx1.getTransactionId()); txm1.invalidate(tx2.getTransactionId()); txm1.invalidate(tx5.getTransactionId()); txm1.invalidate(tx6.getTransactionId()); ImmutableList.of(tx1.getTransactionId(), tx2.getTransactionId(), tx5.getTransactionId(), tx6.getTransactionId()), txm1.getCurrentState().getInvalid() ); Assert.assertTrue(txm1.truncateInvalidTxBefore(timeBeforeTx3));
conf.setInt(TxConstants.Manager.CFG_TX_LONG_TIMEOUT, 2); TransactionManager txm = new TransactionManager (conf, new InMemoryTransactionStateStorage(), new TxMetricsCollector()); txm.startAndWait(); try { Assert.assertEquals(0, txm.getInvalidSize()); Assert.assertEquals(0, txm.getCommittedSize()); Transaction tx1 = txm.startLong(); Assert.assertEquals(0, txm.getInvalidSize()); Assert.assertEquals(0, txm.getCommittedSize()); Assert.assertEquals(1, txm.getInvalidSize()); Assert.assertEquals(0, txm.getCommittedSize()); txm.canCommit(tx1, Collections.singleton(new byte[] { 0x11 })); Assert.fail(); } catch (TransactionNotInProgressException e) { txm.abort(tx1); Assert.assertEquals(1, txm.getInvalidSize()); } finally { txm.stopAndWait();
try { storage = getStorage(conf); TransactionManager txManager = new TransactionManager (conf, storage, new TxMetricsCollector()); txManager.startAndWait(); Transaction tx1 = txManager.startShort(); Assert.assertTrue(txManager.canCommit(tx1, Collections.singleton(a))); Assert.assertTrue(txManager.commit(tx1)); Transaction tx2 = txManager.startShort(); Assert.assertTrue(txManager.canCommit(tx2, Collections.singleton(b))); Transaction tx3 = txManager.startShort(); txManager.stopAndWait(); TransactionSnapshot origState = txManager.getCurrentState(); LOG.info("Orig state: " + origState); txManager = new TransactionManager(conf, storage2, new TxMetricsCollector()); txManager.startAndWait(); TransactionSnapshot newState = txManager.getCurrentState(); LOG.info("New state: " + newState); assertEquals(origState, newState); Assert.assertTrue(txManager.commit(tx2)); Transaction tx4 = txManager.startShort();
txManager.startAndWait(); Transaction transaction = txManager.startLong(); Transaction checkpointTx = txManager.checkpoint(transaction); txManager.stopAndWait(); txManager.startAndWait(); snapshot = txManager.getCurrentState(); inProgress = snapshot.getInProgress(); Assert.assertEquals(1, inProgress.size()); Assert.assertTrue(txManager.canCommit(checkpointTx, Collections.<byte[]>emptyList())); Assert.assertTrue(txManager.commit(checkpointTx)); txManager.stopAndWait();
long longTimeout = TimeUnit.SECONDS.toMillis(conf.getLong(TxConstants.Manager.CFG_TX_LONG_TIMEOUT, TxConstants.Manager.DEFAULT_TX_LONG_TIMEOUT)); TransactionManager txm = new TransactionManager(conf, storage, new TxMetricsCollector()); txm.startAndWait(); try { TransactionSnapshot snapshot1 = txm.getCurrentState(); Assert.assertEquals(ImmutableSortedSet.of(wp1, wp2, wp3, wp4), snapshot1.getInProgress().keySet()); verifyInProgress(snapshot1.getInProgress().get(wp1), TransactionType.LONG, time1 + longTimeout); Assert.assertEquals(0, snapshot1.getInvalid().size()); } finally { txm.stopAndWait();
try { storage1 = getStorage(conf); TransactionManager txManager = new TransactionManager (conf, storage1, new TxMetricsCollector()); txManager.startAndWait(); final byte[] b = { 'b' }; Transaction tx1 = txManager.startShort(); Assert.assertTrue(txManager.canCommit(tx1, Collections.singleton(a))); Assert.assertTrue(txManager.commit(tx1)); Transaction tx2 = txManager.startShort(); Assert.assertTrue(txManager.canCommit(tx2, Collections.singleton(b))); Transaction tx3 = txManager.startShort(); TransactionSnapshot origState = txManager.getCurrentState(); LOG.info("Orig state: " + origState); txManager = new TransactionManager(conf, storage2, new TxMetricsCollector()); txManager.startAndWait(); TransactionSnapshot newState = txManager.getCurrentState(); LOG.info("New state: " + newState); assertEquals(origState, newState);
expiration = getTxExpirationFromWritePointer(edit.getWritePointer(), defaultLongTimeout); type = TransactionType.LONG; } else if (type == null) { type = TransactionType.SHORT; addInProgressAndAdvance(edit.getWritePointer(), edit.getVisibilityUpperBound(), expiration, type); break; case COMMITTING: addCommittingChangeSet(edit.getWritePointer(), edit.getChanges()); break; case COMMITTED: long writePointer = checkpointPointers == null || checkpointPointers.length == 0 ? transactionId : checkpointPointers[checkpointPointers.length - 1]; doCommit(transactionId, writePointer, edit.getChanges(), edit.getCommitPointer(), edit.getCanCommit()); break; case INVALID: doInvalidate(edit.getWritePointer()); break; case ABORTED: doInvalidate(edit.getWritePointer()); break; doAbort(edit.getWritePointer(), edit.getCheckpointPointers(), type); break; case TRUNCATE_INVALID_TX:
txManager.startAndWait(); txManager.startLong(); txManager.stopAndWait(); txManager2.startAndWait(); TransactionSnapshot snapshot2 = txManager2.getCurrentState(); assertEquals(1, snapshot2.getInProgress().size()); Map.Entry<Long, TransactionManager.InProgressTx> inProgressTx = txManager2.stopAndWait();
@Override protected void configure() { TransactionManager txManager = new TransactionManager(conf); txManager.startAndWait(); bind(TransactionManager.class).toInstance(txManager); bind(TransactionSystemClient.class).to(DummyTxClient.class).in(Singleton.class); } }));
TransactionManager.getTxExpirationFromWritePointer(tLong, TxConstants.Manager.DEFAULT_TX_LONG_TIMEOUT), TransactionType.LONG), tShort, new TransactionManager.InProgressTx(readPtr, now + 1000, TransactionType.SHORT))); Map<Long, TransactionManager.InProgressTx> fixedInProgress = TransactionManager.txnBackwardsCompatCheck( TxConstants.Manager.DEFAULT_TX_LONG_TIMEOUT, 10000L, snapshot2.getInProgress()); assertEquals(snapshot.getInProgress(), fixedInProgress);
@Override public int invalidTxSize() throws TException { return txManager.getInvalidSize(); }
@Override public boolean commit(Transaction tx) throws TransactionNotInProgressException { return txManager.commit(tx); }
@Override public boolean invalidate(long tx) { return txManager.invalidate(tx); }
@Override public boolean canCommit(Transaction tx, Collection<byte[]> changeIds) throws TransactionNotInProgressException { return changeIds.isEmpty() || txManager.canCommit(tx, changeIds); }
@Override public Transaction checkpoint(Transaction tx) throws TransactionNotInProgressException { return txManager.checkpoint(tx); }