Search in sources :

Example 1 with CompleteTransactionMessage

use of org.voltdb.messaging.CompleteTransactionMessage in project voltdb by VoltDB.

the class Site method replayFromTaskLog.

boolean replayFromTaskLog(MinimumRatioMaintainer mrm) throws IOException {
    // not yet time to catch-up.
    if (m_rejoinState != kStateReplayingRejoin) {
        return false;
    }
    TransactionInfoBaseMessage tibm = m_rejoinTaskLog.getNextMessage();
    if (tibm != null) {
        mrm.didUnrestricted();
        if (tibm instanceof Iv2InitiateTaskMessage) {
            Iv2InitiateTaskMessage m = (Iv2InitiateTaskMessage) tibm;
            SpProcedureTask t = new SpProcedureTask(m_initiatorMailbox, m.getStoredProcedureName(), null, m);
            if (!filter(tibm)) {
                m_currentTxnId = t.getTxnId();
                m_lastTxnTime = EstTime.currentTimeMillis();
                t.runFromTaskLog(this);
            }
        } else if (tibm instanceof FragmentTaskMessage) {
            FragmentTaskMessage m = (FragmentTaskMessage) tibm;
            if (global_replay_mpTxn == null) {
                global_replay_mpTxn = new ParticipantTransactionState(m.getTxnId(), m);
            } else if (global_replay_mpTxn.txnId != m.getTxnId()) {
                VoltDB.crashLocalVoltDB("Started a MP transaction during replay before completing " + " open transaction.", false, null);
            }
            TransactionTask t;
            if (m.isSysProcTask()) {
                t = new SysprocFragmentTask(m_initiatorMailbox, m, global_replay_mpTxn);
            } else {
                t = new FragmentTask(m_initiatorMailbox, m, global_replay_mpTxn);
            }
            if (!filter(tibm)) {
                m_currentTxnId = t.getTxnId();
                m_lastTxnTime = EstTime.currentTimeMillis();
                t.runFromTaskLog(this);
            }
        } else if (tibm instanceof CompleteTransactionMessage) {
            // Only complete transactions that are open...
            if (global_replay_mpTxn != null) {
                CompleteTransactionMessage m = (CompleteTransactionMessage) tibm;
                CompleteTransactionTask t = new CompleteTransactionTask(m_initiatorMailbox, global_replay_mpTxn, null, m);
                if (!m.isRestart()) {
                    global_replay_mpTxn = null;
                }
                if (!filter(tibm)) {
                    t.runFromTaskLog(this);
                }
            }
        } else {
            VoltDB.crashLocalVoltDB("Can not replay message type " + tibm + " during live rejoin. Unexpected error.", false, null);
        }
    }
    // is wrong. Run MP txns fully kStateRejoining or fully kStateRunning.
    if (m_rejoinTaskLog.isEmpty() && global_replay_mpTxn == null) {
        setReplayRejoinComplete();
    }
    return tibm != null;
}
Also used : FragmentTaskMessage(org.voltdb.messaging.FragmentTaskMessage) Iv2InitiateTaskMessage(org.voltdb.messaging.Iv2InitiateTaskMessage) CompleteTransactionMessage(org.voltdb.messaging.CompleteTransactionMessage) TransactionInfoBaseMessage(org.voltcore.messaging.TransactionInfoBaseMessage)

Example 2 with CompleteTransactionMessage

use of org.voltdb.messaging.CompleteTransactionMessage in project voltdb by VoltDB.

the class RepairLog method deliver.

// Offer a new message to the repair log. This will truncate
// the repairLog if the message includes a truncation hint.
public void deliver(VoltMessage msg) {
    if (!m_isLeader && msg instanceof Iv2InitiateTaskMessage) {
        final Iv2InitiateTaskMessage m = (Iv2InitiateTaskMessage) msg;
        // We can't repair read only SP transactions. Just don't log them to the repair log.
        if (m.isReadOnly()) {
            return;
        }
        m_lastSpHandle = m.getSpHandle();
        truncate(m.getTruncationHandle(), IS_SP);
        m_logSP.add(new Item(IS_SP, m, m.getSpHandle(), m.getTxnId()));
    } else if (msg instanceof FragmentTaskMessage) {
        final FragmentTaskMessage m = (FragmentTaskMessage) msg;
        // We can't repair read only SP transactions. Just don't log them to the repair log.
        if (m.isReadOnly()) {
            return;
        }
        truncate(m.getTruncationHandle(), IS_MP);
        // only log the first fragment of a procedure (and handle 1st case)
        if (m.getTxnId() > m_lastMpHandle || m_lastMpHandle == Long.MAX_VALUE) {
            m_logMP.add(new Item(IS_MP, m, m.getSpHandle(), m.getTxnId()));
            m_lastMpHandle = m.getTxnId();
            m_lastSpHandle = m.getSpHandle();
        }
    } else if (msg instanceof CompleteTransactionMessage) {
        // a CompleteTransactionMessage which indicates restart is not the end of the
        // transaction.  We don't want to log it in the repair log.
        CompleteTransactionMessage ctm = (CompleteTransactionMessage) msg;
        // Restart transaction do not need to be repaired here, don't log them as well.
        if (ctm.isReadOnly() || ctm.isRestart()) {
            return;
        }
        truncate(ctm.getTruncationHandle(), IS_MP);
        m_logMP.add(new Item(IS_MP, ctm, ctm.getSpHandle(), ctm.getTxnId()));
        //Restore will send a complete transaction message with a lower mp transaction id because
        //the restore transaction precedes the loading of the right mp transaction id from the snapshot
        //Hence Math.max
        m_lastMpHandle = Math.max(m_lastMpHandle, ctm.getTxnId());
        m_lastSpHandle = ctm.getSpHandle();
    } else if (msg instanceof DumpMessage) {
        String who = CoreUtils.hsIdToString(m_HSId);
        tmLog.warn("Repair log dump for site: " + who + ", isLeader: " + m_isLeader + ", " + who + ": lastSpHandle: " + m_lastSpHandle + ", lastMpHandle: " + m_lastMpHandle);
        for (Iv2RepairLogResponseMessage il : contents(0l, false)) {
            tmLog.warn("[Repair log contents]" + who + ": msg: " + il);
        }
    } else if (msg instanceof RepairLogTruncationMessage) {
        final RepairLogTruncationMessage truncateMsg = (RepairLogTruncationMessage) msg;
        truncate(truncateMsg.getHandle(), IS_SP);
    }
}
Also used : Iv2RepairLogResponseMessage(org.voltdb.messaging.Iv2RepairLogResponseMessage) FragmentTaskMessage(org.voltdb.messaging.FragmentTaskMessage) Iv2InitiateTaskMessage(org.voltdb.messaging.Iv2InitiateTaskMessage) CompleteTransactionMessage(org.voltdb.messaging.CompleteTransactionMessage) DumpMessage(org.voltdb.messaging.DumpMessage) RepairLogTruncationMessage(org.voltdb.messaging.RepairLogTruncationMessage)

Example 3 with CompleteTransactionMessage

use of org.voltdb.messaging.CompleteTransactionMessage in project voltdb by VoltDB.

the class TestMpPromoteAlgo method makeCompleteResponse.

Iv2RepairLogResponseMessage makeCompleteResponse(long handle, long uniqueId) {
    CompleteTransactionMessage complete = mock(CompleteTransactionMessage.class);
    Iv2RepairLogResponseMessage m = mock(Iv2RepairLogResponseMessage.class);
    when(m.getPayload()).thenReturn(complete);
    when(m.getHandle()).thenReturn(-1L);
    when(m.getTxnId()).thenReturn(handle);
    return m;
}
Also used : Iv2RepairLogResponseMessage(org.voltdb.messaging.Iv2RepairLogResponseMessage) CompleteTransactionMessage(org.voltdb.messaging.CompleteTransactionMessage)

Example 4 with CompleteTransactionMessage

use of org.voltdb.messaging.CompleteTransactionMessage in project voltdb by VoltDB.

the class TestMpPromoteAlgo method makeRealCompleteResponse.

Iv2RepairLogResponseMessage makeRealCompleteResponse(long requestId, long sourceHSId, int sequence, int ofTotal, long handle) {
    CompleteTransactionMessage complete = mock(CompleteTransactionMessage.class);
    Iv2RepairLogResponseMessage m = new Iv2RepairLogResponseMessage(requestId, sequence, ofTotal, handle, handle, complete);
    m.m_sourceHSId = sourceHSId;
    return m;
}
Also used : Iv2RepairLogResponseMessage(org.voltdb.messaging.Iv2RepairLogResponseMessage) CompleteTransactionMessage(org.voltdb.messaging.CompleteTransactionMessage)

Example 5 with CompleteTransactionMessage

use of org.voltdb.messaging.CompleteTransactionMessage in project voltdb by VoltDB.

the class TestRepairLog method truncCompleteMsg.

VoltMessage truncCompleteMsg(long truncPt, long mpTxnId) {
    CompleteTransactionMessage msg = mock(CompleteTransactionMessage.class);
    when(msg.getTxnId()).thenReturn(mpTxnId);
    when(msg.getTruncationHandle()).thenReturn(truncPt);
    return msg;
}
Also used : CompleteTransactionMessage(org.voltdb.messaging.CompleteTransactionMessage)

Aggregations

CompleteTransactionMessage (org.voltdb.messaging.CompleteTransactionMessage)19 FragmentTaskMessage (org.voltdb.messaging.FragmentTaskMessage)9 Iv2InitiateTaskMessage (org.voltdb.messaging.Iv2InitiateTaskMessage)7 Iv2RepairLogResponseMessage (org.voltdb.messaging.Iv2RepairLogResponseMessage)7 TransactionInfoBaseMessage (org.voltcore.messaging.TransactionInfoBaseMessage)4 VoltTrace (org.voltdb.utils.VoltTrace)4 Test (org.junit.Test)3 ArrayList (java.util.ArrayList)2 Random (java.util.Random)2 AtomicLong (java.util.concurrent.atomic.AtomicLong)2 RepairResult (org.voltdb.iv2.RepairAlgo.RepairResult)2 HashMap (java.util.HashMap)1 List (java.util.List)1 VoltMessage (org.voltcore.messaging.VoltMessage)1 ClientResponseImpl (org.voltdb.ClientResponseImpl)1 VoltTable (org.voltdb.VoltTable)1 TransactionState (org.voltdb.dtxn.TransactionState)1 CompleteTransactionResponseMessage (org.voltdb.messaging.CompleteTransactionResponseMessage)1 DumpMessage (org.voltdb.messaging.DumpMessage)1 InitiateResponseMessage (org.voltdb.messaging.InitiateResponseMessage)1