/* * Multi-partition/non-replicated fragment with collector and aggregator. */ void addFragmentPair( int index, PlanFragment collectorFragment, PlanFragment aggregatorFragment, ByteBuffer params) { assert (index >= 0); assert (index < m_batchSize); assert (collectorFragment != null); assert (aggregatorFragment != null); assert (collectorFragment.getHasdependencies() == false); assert (aggregatorFragment.getHasdependencies() == true); // frags with no deps are usually collector frags that go to all partitions long distributedFragId = CatalogUtil.getUniqueIdForFragment(collectorFragment); long localFragId = CatalogUtil.getUniqueIdForFragment(aggregatorFragment); // if any frag is transactional, update this check if (aggregatorFragment.getNontransactional() == true) { m_localFragsAreNonTransactional = true; } int outputDepId = m_txnState.getNextDependencyId() | DtxnConstants.MULTIPARTITION_DEPENDENCY; m_depsForLocalTask[index] = outputDepId; // Add local and distributed fragments. m_localTask.addFragment(localFragId, m_depsToResume[index], params); m_distributedTask.addFragment(distributedFragId, outputDepId, params); }
/* * Replicated fragment. */ void addFragment(int index, PlanFragment frag, ByteBuffer params) { assert (index >= 0); assert (index < m_batchSize); assert (frag != null); assert (frag.getHasdependencies() == false); // if any frag is transactional, update this check if (frag.getNontransactional() == true) m_localFragsAreNonTransactional = true; long localFragId = CatalogUtil.getUniqueIdForFragment(frag); m_depsForLocalTask[index] = -1; // Add the local fragment data. m_localTask.addFragment(localFragId, m_depsToResume[index], params); }
public static void initSQLStmt(SQLStmt stmt, Statement catStmt) { stmt.catStmt = catStmt; stmt.numFragGUIDs = catStmt.getFragments().size(); PlanFragment fragments[] = new PlanFragment[stmt.numFragGUIDs]; stmt.fragGUIDs = new long[stmt.numFragGUIDs]; int i = 0; for (PlanFragment frag : stmt.catStmt.getFragments()) { fragments[i] = frag; stmt.fragGUIDs[i] = CatalogUtil.getUniqueIdForFragment(frag); i++; } stmt.numStatementParamJavaTypes = stmt.catStmt.getParameters().size(); // StmtParameter parameters[] = new StmtParameter[stmt.numStatementParamJavaTypes]; stmt.statementParamJavaTypes = new byte[stmt.numStatementParamJavaTypes]; for (StmtParameter param : stmt.catStmt.getParameters()) { // parameters[i] = param; stmt.statementParamJavaTypes[param.getIndex()] = (byte) param.getJavatype(); i++; } }
@SuppressWarnings("deprecation") @Override public void setUp() throws IOException, InterruptedException { VoltDB.instance().readBuildInfo("Test"); // compile a catalog String testDir = BuildDirectoryUtils.getBuildDirectoryPath(); String catalogJar = testDir + File.separator + JAR; TPCCProjectBuilder pb = new TPCCProjectBuilder(); pb.addDefaultSchema(); pb.addDefaultPartitioning(); pb.addProcedures(MultiSiteSelect.class, InsertNewOrder.class); pb.compile(catalogJar, 2, 0); // load a catalog byte[] bytes = CatalogUtil.toBytes(new File(catalogJar)); String serializedCatalog = CatalogUtil.loadCatalogFromJar(bytes, null); // create the catalog (that will be passed to the ClientInterface catalog = new Catalog(); catalog.execute(serializedCatalog); // update the catalog with the data from the deployment file String pathToDeployment = pb.getPathToDeployment(); assertTrue(CatalogUtil.compileDeploymentAndGetCRC(catalog, pathToDeployment, true) >= 0); cluster = catalog.getClusters().get("cluster"); CatalogMap<Procedure> procedures = cluster.getDatabases().get("database").getProcedures(); Procedure insertProc = procedures.get("InsertNewOrder"); assert (insertProc != null); selectProc = procedures.get("MultiSiteSelect"); assert (selectProc != null); // Each EE needs its own thread for correct initialization. final AtomicReference<ExecutionEngine> site1Reference = new AtomicReference<ExecutionEngine>(); final byte configBytes[] = LegacyHashinator.getConfigureBytes(2); Thread site1Thread = new Thread() { @Override public void run() { site1Reference.set( new ExecutionEngineJNI( cluster.getRelativeIndex(), 1, 0, 0, "", 100, HashinatorType.LEGACY, configBytes)); } }; site1Thread.start(); site1Thread.join(); final AtomicReference<ExecutionEngine> site2Reference = new AtomicReference<ExecutionEngine>(); Thread site2Thread = new Thread() { @Override public void run() { site2Reference.set( new ExecutionEngineJNI( cluster.getRelativeIndex(), 2, 1, 0, "", 100, HashinatorType.LEGACY, configBytes)); } }; site2Thread.start(); site2Thread.join(); // create two EEs site1 = new ExecutionSite(0); // site 0 ee1 = site1Reference.get(); ee1.loadCatalog(0, catalog.serialize()); site2 = new ExecutionSite(1); // site 1 ee2 = site2Reference.get(); ee2.loadCatalog(0, catalog.serialize()); // cache some plan fragments selectStmt = selectProc.getStatements().get("selectAll"); assert (selectStmt != null); int i = 0; // this kinda assumes the right order for (PlanFragment f : selectStmt.getFragments()) { if (i == 0) selectTopFrag = f; else selectBottomFrag = f; i++; } assert (selectTopFrag != null); assert (selectBottomFrag != null); if (selectTopFrag.getHasdependencies() == false) { PlanFragment temp = selectTopFrag; selectTopFrag = selectBottomFrag; selectBottomFrag = temp; } // get the insert frag Statement insertStmt = insertProc.getStatements().get("insert"); assert (insertStmt != null); for (PlanFragment f : insertStmt.getFragments()) insertFrag = f; // populate plan cache ActivePlanRepository.clear(); ActivePlanRepository.addFragmentForTest( CatalogUtil.getUniqueIdForFragment(selectBottomFrag), Encoder.base64Decode(selectBottomFrag.getPlannodetree())); ActivePlanRepository.addFragmentForTest( CatalogUtil.getUniqueIdForFragment(selectTopFrag), Encoder.base64Decode(selectTopFrag.getPlannodetree())); ActivePlanRepository.addFragmentForTest( CatalogUtil.getUniqueIdForFragment(insertFrag), Encoder.base64Decode(insertFrag.getPlannodetree())); // insert some data ParameterSet params = ParameterSet.fromArrayNoCopy(1L, 1L, 1L); VoltTable[] results = ee2.executePlanFragments( 1, new long[] {CatalogUtil.getUniqueIdForFragment(insertFrag)}, null, new ParameterSet[] {params}, 1, 0, 42, Long.MAX_VALUE); assert (results.length == 1); assert (results[0].asScalarLong() == 1L); params = ParameterSet.fromArrayNoCopy(2L, 2L, 2L); results = ee1.executePlanFragments( 1, new long[] {CatalogUtil.getUniqueIdForFragment(insertFrag)}, null, new ParameterSet[] {params}, 2, 1, 42, Long.MAX_VALUE); assert (results.length == 1); assert (results[0].asScalarLong() == 1L); }
public void testMultiSiteSelectAll() { ParameterSet params = ParameterSet.emptyParameterSet(); int outDepId = 1 | DtxnConstants.MULTIPARTITION_DEPENDENCY; VoltTable dependency1 = ee1.executePlanFragments( 1, new long[] {CatalogUtil.getUniqueIdForFragment(selectBottomFrag)}, null, new ParameterSet[] {params}, 3, 2, 42, Long.MAX_VALUE)[0]; try { System.out.println(dependency1.toString()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } assertTrue(dependency1 != null); VoltTable dependency2 = ee2.executePlanFragments( 1, new long[] {CatalogUtil.getUniqueIdForFragment(selectBottomFrag)}, null, new ParameterSet[] {params}, 3, 2, 42, Long.MAX_VALUE)[0]; try { System.out.println(dependency2.toString()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } assertTrue(dependency2 != null); ee1.stashDependency(outDepId, dependency1); ee1.stashDependency(outDepId, dependency2); dependency1 = ee1.executePlanFragments( 1, new long[] {CatalogUtil.getUniqueIdForFragment(selectTopFrag)}, new long[] {outDepId}, new ParameterSet[] {params}, 3, 2, 42, Long.MAX_VALUE)[0]; try { System.out.println("Final Result"); System.out.println(dependency1.toString()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }