Search in sources :

Example 1 with Xid

use of org.apache.qpid.server.txn.Xid in project qpid-broker-j by apache.

the class AbstractBDBMessageStore method removeXid.

private void removeXid(Transaction txn, long format, byte[] globalId, byte[] branchId) throws StoreException {
    DatabaseEntry key = new DatabaseEntry();
    Xid xid = new Xid(format, globalId, branchId);
    XidBinding keyBinding = XidBinding.getInstance();
    keyBinding.objectToEntry(xid, key);
    try {
        OperationStatus status = getXidDb().delete(txn, key);
        if (status == OperationStatus.NOTFOUND) {
            throw new StoreException("Unable to find xid");
        } else if (status != OperationStatus.SUCCESS) {
            throw new StoreException("Unable to remove xid");
        }
    } catch (RuntimeException e) {
        getLogger().error("Failed to remove xid in transaction " + txn, e);
        throw getEnvironmentFacade().handleDatabaseException("Error accessing database while removing xid: " + e.getMessage(), e);
    }
}
Also used : Xid(org.apache.qpid.server.txn.Xid) OperationStatus(com.sleepycat.je.OperationStatus) XidBinding(org.apache.qpid.server.store.berkeleydb.tuple.XidBinding) DatabaseEntry(com.sleepycat.je.DatabaseEntry) StoreException(org.apache.qpid.server.store.StoreException)

Example 2 with Xid

use of org.apache.qpid.server.txn.Xid in project qpid-broker-j by apache.

the class UpgradeFrom5To6Test method getXidKey.

protected DatabaseEntry getXidKey() {
    final DatabaseEntry value = new DatabaseEntry();
    byte[] globalId = { 1 };
    byte[] branchId = { 2 };
    Xid xid = new Xid(1l, globalId, branchId);
    XidBinding xidBinding = XidBinding.getInstance();
    xidBinding.objectToEntry(xid, value);
    return value;
}
Also used : Xid(org.apache.qpid.server.txn.Xid) XidBinding(org.apache.qpid.server.store.berkeleydb.tuple.XidBinding) DatabaseEntry(com.sleepycat.je.DatabaseEntry)

Example 3 with Xid

use of org.apache.qpid.server.txn.Xid in project qpid-broker-j by apache.

the class SynchronousMessageStoreRecovererTest method testRecoveryOfSingleDequeueWithDistributedTransaction.

public void testRecoveryOfSingleDequeueWithDistributedTransaction() {
    final UUID queueId = UUID.randomUUID();
    final Queue<?> queue = createRegisteredMockQueue(queueId);
    final Transaction transaction = mock(Transaction.class);
    final StoredMessage<StorableMessageMetaData> storedMessage = createMockStoredMessage(1);
    final long messageId = storedMessage.getMessageNumber();
    Transaction.DequeueRecord dequeueRecord = createMockDequeueRecord(queueId, messageId);
    QueueEntry queueEntry = mock(QueueEntry.class);
    when(queueEntry.acquire()).thenReturn(true);
    when(queue.getMessageOnTheQueue(messageId)).thenReturn(queueEntry);
    final long format = 1;
    final byte[] globalId = new byte[] { 0 };
    final byte[] branchId = new byte[] { 0 };
    final EnqueueRecord[] enqueues = {};
    final Transaction.DequeueRecord[] dequeues = { dequeueRecord };
    MessageStore store = new NullMessageStore() {

        @Override
        public void visitMessages(MessageHandler handler) throws StoreException {
            handler.handle(storedMessage);
        }

        @Override
        public void visitMessageInstances(MessageInstanceHandler handler) throws StoreException {
            // We need the message to be enqueued onto the queue so that later the distributed transaction
            // can dequeue it.
            handler.handle(new TestMessageEnqueueRecord(queue.getId(), messageId));
        }

        @Override
        public void visitDistributedTransactions(DistributedTransactionHandler handler) throws StoreException {
            handler.handle(new Transaction.StoredXidRecord() {

                @Override
                public long getFormat() {
                    return format;
                }

                @Override
                public byte[] getGlobalId() {
                    return globalId;
                }

                @Override
                public byte[] getBranchId() {
                    return branchId;
                }
            }, enqueues, dequeues);
        }

        @Override
        public Transaction newTransaction() {
            return transaction;
        }
    };
    DtxRegistry dtxRegistry = new DtxRegistry(_virtualHost);
    when(_virtualHost.getMessageStore()).thenReturn(store);
    when(_virtualHost.getDtxRegistry()).thenReturn(dtxRegistry);
    SynchronousMessageStoreRecoverer recoverer = new SynchronousMessageStoreRecoverer();
    recoverer.recover(_virtualHost);
    DtxBranch branch = dtxRegistry.getBranch(new Xid(format, globalId, branchId));
    assertNotNull("Expected dtx branch to be created", branch);
    branch.commit();
    verify(queueEntry, times(1)).delete();
    verify(transaction).commitTran();
}
Also used : MessageStore(org.apache.qpid.server.store.MessageStore) NullMessageStore(org.apache.qpid.server.store.NullMessageStore) MessageHandler(org.apache.qpid.server.store.handler.MessageHandler) EnqueueRecord(org.apache.qpid.server.store.Transaction.EnqueueRecord) MessageEnqueueRecord(org.apache.qpid.server.store.MessageEnqueueRecord) UUID(java.util.UUID) StorableMessageMetaData(org.apache.qpid.server.store.StorableMessageMetaData) DistributedTransactionHandler(org.apache.qpid.server.store.handler.DistributedTransactionHandler) NullMessageStore(org.apache.qpid.server.store.NullMessageStore) QueueEntry(org.apache.qpid.server.queue.QueueEntry) Xid(org.apache.qpid.server.txn.Xid) Transaction(org.apache.qpid.server.store.Transaction) DtxRegistry(org.apache.qpid.server.txn.DtxRegistry) MessageInstanceHandler(org.apache.qpid.server.store.handler.MessageInstanceHandler) DtxBranch(org.apache.qpid.server.txn.DtxBranch)

Example 4 with Xid

use of org.apache.qpid.server.txn.Xid in project qpid-broker-j by apache.

the class AbstractBDBMessageStore method recordXid.

private List<Runnable> recordXid(Transaction txn, long format, byte[] globalId, byte[] branchId, org.apache.qpid.server.store.Transaction.EnqueueRecord[] enqueues, org.apache.qpid.server.store.Transaction.DequeueRecord[] dequeues) throws StoreException {
    DatabaseEntry key = new DatabaseEntry();
    Xid xid = new Xid(format, globalId, branchId);
    XidBinding keyBinding = XidBinding.getInstance();
    keyBinding.objectToEntry(xid, key);
    DatabaseEntry value = new DatabaseEntry();
    PreparedTransaction preparedTransaction = new PreparedTransaction(enqueues, dequeues);
    PreparedTransactionBinding.objectToEntry(preparedTransaction, value);
    for (org.apache.qpid.server.store.Transaction.EnqueueRecord enqueue : enqueues) {
        StoredMessage storedMessage = enqueue.getMessage().getStoredMessage();
        if (storedMessage instanceof StoredBDBMessage) {
            ((StoredBDBMessage) storedMessage).store(txn);
        }
    }
    try {
        getXidDb().put(txn, key, value);
        return Collections.emptyList();
    } catch (RuntimeException e) {
        getLogger().error("Failed to write xid: " + e.getMessage(), e);
        throw getEnvironmentFacade().handleDatabaseException("Error writing xid to database", e);
    }
}
Also used : Xid(org.apache.qpid.server.txn.Xid) PreparedTransaction(org.apache.qpid.server.store.berkeleydb.entry.PreparedTransaction) PreparedTransaction(org.apache.qpid.server.store.berkeleydb.entry.PreparedTransaction) Transaction(com.sleepycat.je.Transaction) StoredMessage(org.apache.qpid.server.store.StoredMessage) XidBinding(org.apache.qpid.server.store.berkeleydb.tuple.XidBinding) DatabaseEntry(com.sleepycat.je.DatabaseEntry)

Example 5 with Xid

use of org.apache.qpid.server.txn.Xid in project qpid-broker-j by apache.

the class SynchronousMessageStoreRecovererTest method testRecoveryOfSingleEnqueueWithDistributedTransaction.

@SuppressWarnings("unchecked")
public void testRecoveryOfSingleEnqueueWithDistributedTransaction() {
    Queue<?> queue = createRegisteredMockQueue();
    final Transaction transaction = mock(Transaction.class);
    final StoredMessage<StorableMessageMetaData> storedMessage = createMockStoredMessage(1);
    long messageId = storedMessage.getMessageNumber();
    EnqueueableMessage enqueueableMessage = createMockEnqueueableMessage(messageId, storedMessage);
    EnqueueRecord enqueueRecord = createMockRecord(queue, enqueueableMessage);
    final long format = 1;
    final byte[] globalId = new byte[] { 0 };
    final byte[] branchId = new byte[] { 0 };
    final EnqueueRecord[] enqueues = { enqueueRecord };
    final Transaction.DequeueRecord[] dequeues = {};
    MessageStore store = new NullMessageStore() {

        @Override
        public void visitMessages(MessageHandler handler) throws StoreException {
            handler.handle(storedMessage);
        }

        @Override
        public void visitMessageInstances(MessageInstanceHandler handler) throws StoreException {
        // No messages instances
        }

        @Override
        public void visitDistributedTransactions(DistributedTransactionHandler handler) throws StoreException {
            handler.handle(new Transaction.StoredXidRecord() {

                @Override
                public long getFormat() {
                    return format;
                }

                @Override
                public byte[] getGlobalId() {
                    return globalId;
                }

                @Override
                public byte[] getBranchId() {
                    return branchId;
                }
            }, enqueues, dequeues);
        }

        @Override
        public Transaction newTransaction() {
            return transaction;
        }
    };
    DtxRegistry dtxRegistry = new DtxRegistry(_virtualHost);
    when(_virtualHost.getMessageStore()).thenReturn(store);
    when(_virtualHost.getDtxRegistry()).thenReturn(dtxRegistry);
    SynchronousMessageStoreRecoverer recoverer = new SynchronousMessageStoreRecoverer();
    recoverer.recover(_virtualHost);
    DtxBranch branch = dtxRegistry.getBranch(new Xid(format, globalId, branchId));
    assertNotNull("Expected dtx branch to be created", branch);
    branch.commit();
    ServerMessage<?> message = storedMessage.getMetaData().getType().createMessage(storedMessage);
    verify(queue, times(1)).enqueue(eq(message), (Action<? super MessageInstance>) isNull(), any(MessageEnqueueRecord.class));
    verify(transaction).commitTran();
}
Also used : MessageStore(org.apache.qpid.server.store.MessageStore) NullMessageStore(org.apache.qpid.server.store.NullMessageStore) DistributedTransactionHandler(org.apache.qpid.server.store.handler.DistributedTransactionHandler) MessageHandler(org.apache.qpid.server.store.handler.MessageHandler) EnqueueRecord(org.apache.qpid.server.store.Transaction.EnqueueRecord) MessageEnqueueRecord(org.apache.qpid.server.store.MessageEnqueueRecord) NullMessageStore(org.apache.qpid.server.store.NullMessageStore) MessageEnqueueRecord(org.apache.qpid.server.store.MessageEnqueueRecord) Xid(org.apache.qpid.server.txn.Xid) Transaction(org.apache.qpid.server.store.Transaction) DtxRegistry(org.apache.qpid.server.txn.DtxRegistry) EnqueueableMessage(org.apache.qpid.server.message.EnqueueableMessage) MessageInstanceHandler(org.apache.qpid.server.store.handler.MessageInstanceHandler) StorableMessageMetaData(org.apache.qpid.server.store.StorableMessageMetaData) DtxBranch(org.apache.qpid.server.txn.DtxBranch)

Aggregations

Xid (org.apache.qpid.server.txn.Xid)6 DatabaseEntry (com.sleepycat.je.DatabaseEntry)3 XidBinding (org.apache.qpid.server.store.berkeleydb.tuple.XidBinding)3 UUID (java.util.UUID)2 MessageEnqueueRecord (org.apache.qpid.server.store.MessageEnqueueRecord)2 MessageStore (org.apache.qpid.server.store.MessageStore)2 NullMessageStore (org.apache.qpid.server.store.NullMessageStore)2 StorableMessageMetaData (org.apache.qpid.server.store.StorableMessageMetaData)2 Transaction (org.apache.qpid.server.store.Transaction)2 EnqueueRecord (org.apache.qpid.server.store.Transaction.EnqueueRecord)2 DistributedTransactionHandler (org.apache.qpid.server.store.handler.DistributedTransactionHandler)2 MessageHandler (org.apache.qpid.server.store.handler.MessageHandler)2 MessageInstanceHandler (org.apache.qpid.server.store.handler.MessageInstanceHandler)2 DtxBranch (org.apache.qpid.server.txn.DtxBranch)2 DtxRegistry (org.apache.qpid.server.txn.DtxRegistry)2 OperationStatus (com.sleepycat.je.OperationStatus)1 Transaction (com.sleepycat.je.Transaction)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 Map (java.util.Map)1