Search in sources :

Example 11 with ParameterSet

use of org.voltdb.ParameterSet in project voltdb by VoltDB.

the class FragmentTask method processFragmentTask.

// Cut and pasted from ExecutionSite processFragmentTask(), then
// modifed to work in the new world
public FragmentResponseMessage processFragmentTask(SiteProcedureConnection siteConnection) {
    // Ensure default procs loaded here
    // Also used for LoadMultipartitionTable
    String procNameToLoad = m_fragmentMsg.getProcNameToLoad();
    if (procNameToLoad != null) {
        // this will ensure proc is loaded
        ProcedureRunner runner = siteConnection.getProcedureRunner(procNameToLoad);
        assert (runner != null);
    }
    // IZZY: actually need the "executor" HSId these days?
    final FragmentResponseMessage currentFragResponse = new FragmentResponseMessage(m_fragmentMsg, m_initiator.getHSId());
    currentFragResponse.setStatus(FragmentResponseMessage.SUCCESS, null);
    if (m_inputDeps != null) {
        siteConnection.stashWorkUnitDependencies(m_inputDeps);
    }
    if (m_fragmentMsg.isEmptyForRestart()) {
        int outputDepId = m_fragmentMsg.getOutputDepId(0);
        currentFragResponse.addDependency(new DependencyPair.BufferDependencyPair(outputDepId, m_rawDummyResponse, 0, m_rawDummyResponse.length));
        return currentFragResponse;
    }
    ProcedureRunner currRunner = siteConnection.getProcedureRunner(m_fragmentMsg.getProcedureName());
    long[] executionTimes = null;
    int succeededFragmentsCount = 0;
    if (currRunner != null) {
        currRunner.getExecutionEngine().setPerFragmentTimingEnabled(m_fragmentMsg.isPerFragmentStatsRecording());
        if (m_fragmentMsg.isPerFragmentStatsRecording()) {
            // At this point, we will execute the fragments one by one.
            executionTimes = new long[1];
        }
    }
    for (int frag = 0; frag < m_fragmentMsg.getFragmentCount(); frag++) {
        byte[] planHash = m_fragmentMsg.getPlanHash(frag);
        final int outputDepId = m_fragmentMsg.getOutputDepId(frag);
        ParameterSet params = m_fragmentMsg.getParameterSetForFragment(frag);
        final int inputDepId = m_fragmentMsg.getOnlyInputDepId(frag);
        long fragmentId = 0;
        byte[] fragmentPlan = null;
        /*
             * Currently the error path when executing plan fragments
             * does not adequately distinguish between fatal errors and
             * abort type errors that should result in a roll back.
             * Assume that it is ninja: succeeds or doesn't return.
             * No roll back support.
             *
             * AW in 2012, the preceding comment might be wrong,
             * I am pretty sure what we don't support is partial rollback.
             * The entire procedure will roll back successfully on failure
             */
        VoltTable dependency = null;
        try {
            FastDeserializer fragResult;
            fragmentPlan = m_fragmentMsg.getFragmentPlan(frag);
            String stmtText = null;
            // if custom fragment, load the plan and get local fragment id
            if (fragmentPlan != null) {
                // statement text for unplanned fragments are pulled from the message,
                // to ensure that we get the correct constants from the most recent
                // invocation.
                stmtText = m_fragmentMsg.getStmtText(frag);
                fragmentId = ActivePlanRepository.loadOrAddRefPlanFragment(planHash, fragmentPlan, null);
            } else // otherwise ask the plan source for a local fragment id
            {
                fragmentId = ActivePlanRepository.getFragmentIdForPlanHash(planHash);
                stmtText = ActivePlanRepository.getStmtTextForPlanHash(planHash);
            }
            // set up the batch context for the fragment set
            siteConnection.setBatch(m_fragmentMsg.getCurrentBatchIndex());
            fragResult = siteConnection.executePlanFragments(1, new long[] { fragmentId }, new long[] { inputDepId }, new ParameterSet[] { params }, null, // for long-running queries
            stmtText == null ? null : new String[] { stmtText }, // FragmentTasks don't generate statement hashes,
            new boolean[] { false }, null, m_txnState.txnId, m_txnState.m_spHandle, m_txnState.uniqueId, m_txnState.isReadOnly(), VoltTrace.log(VoltTrace.Category.EE) != null);
            // get a copy of the result buffers from the cache buffer so we can post the
            // fragment response to the network
            final int tableSize;
            final byte[] fullBacking;
            try {
                // read the complete size of the buffer used
                fragResult.readInt();
                // read number of dependencies (1)
                fragResult.readInt();
                // read the dependencyId() -1;
                fragResult.readInt();
                tableSize = fragResult.readInt();
                fullBacking = new byte[tableSize];
                // get a copy of the buffer
                fragResult.readFully(fullBacking);
            } catch (final IOException ex) {
                LOG.error("Failed to deserialze result table" + ex);
                throw new EEException(ExecutionEngine.ERRORCODE_WRONG_SERIALIZED_BYTES);
            }
            if (hostLog.isTraceEnabled()) {
                hostLog.l7dlog(Level.TRACE, LogKeys.org_voltdb_ExecutionSite_SendingDependency.name(), new Object[] { outputDepId }, null);
            }
            currentFragResponse.addDependency(new DependencyPair.BufferDependencyPair(outputDepId, fullBacking, 0, tableSize));
        } catch (final EEException e) {
            hostLog.l7dlog(Level.TRACE, LogKeys.host_ExecutionSite_ExceptionExecutingPF.name(), new Object[] { Encoder.hexEncode(planHash) }, e);
            currentFragResponse.setStatus(FragmentResponseMessage.UNEXPECTED_ERROR, e);
            if (currentFragResponse.getTableCount() == 0) {
                // Make sure the response has at least 1 result with a valid DependencyId
                currentFragResponse.addDependency(new DependencyPair.BufferDependencyPair(outputDepId, m_rawDummyResult, 0, m_rawDummyResult.length));
            }
            break;
        } catch (final SQLException e) {
            hostLog.l7dlog(Level.TRACE, LogKeys.host_ExecutionSite_ExceptionExecutingPF.name(), new Object[] { Encoder.hexEncode(planHash) }, e);
            currentFragResponse.setStatus(FragmentResponseMessage.UNEXPECTED_ERROR, e);
            if (currentFragResponse.getTableCount() == 0) {
                // Make sure the response has at least 1 result with a valid DependencyId
                currentFragResponse.addDependency(new DependencyPair.BufferDependencyPair(outputDepId, m_rawDummyResult, 0, m_rawDummyResult.length));
            }
            break;
        } catch (final InterruptException e) {
            hostLog.l7dlog(Level.TRACE, LogKeys.host_ExecutionSite_ExceptionExecutingPF.name(), new Object[] { Encoder.hexEncode(planHash) }, e);
            currentFragResponse.setStatus(FragmentResponseMessage.UNEXPECTED_ERROR, e);
            if (currentFragResponse.getTableCount() == 0) {
                // Make sure the response has at least 1 result with a valid DependencyId
                currentFragResponse.addDependency(new DependencyPair.BufferDependencyPair(outputDepId, m_rawDummyResult, 0, m_rawDummyResult.length));
            }
            break;
        } finally {
            // ensure adhoc plans are unloaded
            if (fragmentPlan != null) {
                ActivePlanRepository.decrefPlanFragmentById(fragmentId);
            }
            // The single-partition stored procedure handler is in the ProcedureRunner.
            if (currRunner != null) {
                succeededFragmentsCount = currRunner.getExecutionEngine().extractPerFragmentStats(1, executionTimes);
                long stmtDuration = 0;
                int stmtResultSize = 0;
                int stmtParameterSetSize = 0;
                if (m_fragmentMsg.isPerFragmentStatsRecording()) {
                    stmtDuration = executionTimes == null ? 0 : executionTimes[0];
                    stmtResultSize = dependency == null ? 0 : dependency.getSerializedSize();
                    stmtParameterSetSize = params == null ? 0 : params.getSerializedSize();
                }
                currRunner.getStatsCollector().endFragment(m_fragmentMsg.getStmtName(frag), m_fragmentMsg.isCoordinatorTask(), succeededFragmentsCount == 0, m_fragmentMsg.isPerFragmentStatsRecording(), stmtDuration, stmtResultSize, stmtParameterSetSize);
            }
        }
    }
    return currentFragResponse;
}
Also used : ParameterSet(org.voltdb.ParameterSet) FastDeserializer(org.voltdb.messaging.FastDeserializer) SQLException(org.voltdb.exceptions.SQLException) InterruptException(org.voltdb.exceptions.InterruptException) IOException(java.io.IOException) VoltTable(org.voltdb.VoltTable) ProcedureRunner(org.voltdb.ProcedureRunner) FragmentResponseMessage(org.voltdb.messaging.FragmentResponseMessage) EEException(org.voltdb.exceptions.EEException) DependencyPair(org.voltdb.DependencyPair)

Example 12 with ParameterSet

use of org.voltdb.ParameterSet in project voltdb by VoltDB.

the class ExecutionEngineJNI method updateHashinator.

@Override
public void updateHashinator(HashinatorConfig config) {
    if (config.configPtr == 0) {
        ParameterSet parameterSet = ParameterSet.fromArrayNoCopy(config.configBytes);
        // serialize the param set
        clearPsetAndEnsureCapacity(parameterSet.getSerializedSize());
        try {
            parameterSet.flattenToBuffer(m_psetBuffer);
        } catch (final IOException exception) {
            // can't happen
            throw new RuntimeException(exception);
        }
    }
    nativeUpdateHashinator(pointer, config.type.typeId(), config.configPtr, config.numTokens);
}
Also used : ParameterSet(org.voltdb.ParameterSet) IOException(java.io.IOException)

Example 13 with ParameterSet

use of org.voltdb.ParameterSet in project voltdb by VoltDB.

the class MockExecutionEngine method coreExecutePlanFragments.

@Override
protected FastDeserializer coreExecutePlanFragments(final int bufferHint, final int numFragmentIds, final long[] planFragmentIds, final long[] inputDepIds, final Object[] parameterSets, final DeterminismHash determinismHash, boolean[] isWriteFrags, int[] sqlCRCs, final long txnId, final long spHandle, final long lastCommittedSpHandle, final long uniqueId, final long undoToken, boolean traceOn) throws EEException {
    if (numFragmentIds != 1) {
        return null;
    }
    VoltTable vt;
    // TestExecutionSite uses this mock site.
    //
    // For interesting things to happen, the fuzz tester must provide a parameter
    // named 'txn_outcome'.  If this parameter is present, then the transaction
    // result will be determined by the parameter which follows 'txn_outcome'
    // according to:
    //
    // commit : every execution site will complete this transaction normally
    // rollback_all : every execution site should throw an exception for rollback
    // rollback_random : each execution site should randomly decide to rollback
    //                   This includes the final aggregating execution site call.
    ArrayList<Object> params = new ArrayList<Object>();
    // de-serialize all parameter sets
    if (parameterSets[0] instanceof ByteBuffer) {
        try {
            parameterSets[0] = ParameterSet.fromByteBuffer((ByteBuffer) parameterSets[0]);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    for (Object param : ((ParameterSet) parameterSets[0]).toArray()) {
        params.add(param);
    }
    int txn_outcome_index = params.indexOf("txn_outcome");
    if (txn_outcome_index != -1) {
        String txn_outcome = (String) params.get(txn_outcome_index + 1);
        if (txn_outcome.equals("rollback_all")) {
            //System.out.println("Throwing MASSIVE exception for rollback.");
            throwExceptionForError(ERRORCODE_ERROR);
        } else if (txn_outcome.equals("rollback_random")) {
            Random rand = new Random(System.currentTimeMillis());
            if (rand.nextInt(100) < 20) {
                //System.out.println("Throwing exception for rollback");
                //if (planFragmentId == 1)
                //{
                //    System.out.println("ROLLING BACK COORDINATOR");
                //}
                throwExceptionForError(ERRORCODE_ERROR);
            }
        }
    }
    vt = new VoltTable(new VoltTable.ColumnInfo[] { new VoltTable.ColumnInfo("foo", VoltType.INTEGER) });
    vt.addRow(Integer.valueOf(1));
    ByteBuffer buf = ByteBuffer.allocate(vt.getSerializedSize());
    vt.flattenToBuffer(buf);
    return new FastDeserializer(buf);
}
Also used : ParameterSet(org.voltdb.ParameterSet) FastDeserializer(org.voltdb.messaging.FastDeserializer) Random(java.util.Random) ArrayList(java.util.ArrayList) IOException(java.io.IOException) VoltTable(org.voltdb.VoltTable) ByteBuffer(java.nio.ByteBuffer)

Example 14 with ParameterSet

use of org.voltdb.ParameterSet in project voltdb by VoltDB.

the class FragmentTaskMessage method setEmptyForRestart.

// We're going to use this fragment task to generate a null distributed
// fragment to serialize Completion and Borrow messages.  Create an empty
// fragment with the provided outputDepId
public void setEmptyForRestart(int outputDepId) {
    m_emptyForRestart = true;
    ParameterSet blank = ParameterSet.emptyParameterSet();
    ByteBuffer mt = ByteBuffer.allocate(blank.getSerializedSize());
    try {
        blank.flattenToBuffer(mt);
    } catch (IOException ioe) {
        // Shouldn't ever happen, just bail out to not-obviously equivalent behavior
        mt = ByteBuffer.allocate(2);
        mt.putShort((short) 0);
    }
    addFragment(EMPTY_HASH, outputDepId, mt);
}
Also used : ParameterSet(org.voltdb.ParameterSet) IOException(java.io.IOException) ByteBuffer(java.nio.ByteBuffer)

Example 15 with ParameterSet

use of org.voltdb.ParameterSet in project voltdb by VoltDB.

the class ExecutionEngineIPC method hashinate.

@Override
public int hashinate(Object value, HashinatorConfig config) {
    ParameterSet parameterSet = ParameterSet.fromArrayNoCopy(value);
    // in case this memoizes stuff
    parameterSet.getSerializedSize();
    m_data.clear();
    m_data.putInt(Commands.Hashinate.m_id);
    m_data.putInt(config.type.typeId());
    m_data.putInt(config.configBytes.length);
    m_data.put(config.configBytes);
    try {
        parameterSet.flattenToBuffer(m_data);
        m_data.flip();
        m_connection.write();
        m_connection.readStatusByte();
        ByteBuffer part = ByteBuffer.allocate(4);
        while (part.hasRemaining()) {
            int read = m_connection.m_socketChannel.read(part);
            if (read <= 0) {
                throw new EOFException();
            }
        }
        part.flip();
        return part.getInt();
    } catch (final Exception e) {
        System.out.println("Exception: " + e.getMessage());
        throw new RuntimeException(e);
    }
}
Also used : ParameterSet(org.voltdb.ParameterSet) EOFException(java.io.EOFException) ByteBuffer(java.nio.ByteBuffer) SerializableException(org.voltdb.exceptions.SerializableException) IOException(java.io.IOException) EOFException(java.io.EOFException) EEException(org.voltdb.exceptions.EEException) UnsupportedEncodingException(java.io.UnsupportedEncodingException)

Aggregations

ParameterSet (org.voltdb.ParameterSet)28 IOException (java.io.IOException)9 ByteBuffer (java.nio.ByteBuffer)9 EEException (org.voltdb.exceptions.EEException)5 PlanFragment (org.voltdb.catalog.PlanFragment)3 Statement (org.voltdb.catalog.Statement)3 SerializableException (org.voltdb.exceptions.SerializableException)3 FastDeserializer (org.voltdb.messaging.FastDeserializer)3 Iv2InitiateTaskMessage (org.voltdb.messaging.Iv2InitiateTaskMessage)3 EOFException (java.io.EOFException)2 UnsupportedEncodingException (java.io.UnsupportedEncodingException)2 CloseableHttpResponse (org.apache.http.client.methods.CloseableHttpResponse)2 DependencyPair (org.voltdb.DependencyPair)2 StoredProcedureInvocation (org.voltdb.StoredProcedureInvocation)2 VoltTable (org.voltdb.VoltTable)2 SQLException (org.voltdb.exceptions.SQLException)2 FragmentResponseMessage (org.voltdb.messaging.FragmentResponseMessage)2 CorePlan (org.voltdb.planner.CorePlan)2 ArrayList (java.util.ArrayList)1 Random (java.util.Random)1