Search in sources :

Example 1 with Driver

use of io.trino.operator.Driver in project trino by trinodb.

the class SqlTaskExecution method addSplitAssignments.

public void addSplitAssignments(List<SplitAssignment> splitAssignments) {
    requireNonNull(splitAssignments, "splitAssignments is null");
    checkState(!Thread.holdsLock(this), "Cannot add split assignments while holding a lock on the %s", getClass().getSimpleName());
    try (SetThreadName ignored = new SetThreadName("Task-%s", taskId)) {
        // update our record of split assignments and schedule drivers for new partitioned splits
        Map<PlanNodeId, SplitAssignment> updatedUnpartitionedSources = updateSplitAssignments(splitAssignments);
        // the unpartitioned splits
        for (WeakReference<Driver> driverReference : drivers) {
            Driver driver = driverReference.get();
            // the driver can be GCed due to a failure or a limit
            if (driver == null) {
                // remove the weak reference from the list to avoid a memory leak
                // NOTE: this is a concurrent safe operation on a CopyOnWriteArrayList
                drivers.remove(driverReference);
                continue;
            }
            Optional<PlanNodeId> sourceId = driver.getSourceId();
            if (sourceId.isEmpty()) {
                continue;
            }
            SplitAssignment splitAssignmentUpdate = updatedUnpartitionedSources.get(sourceId.get());
            if (splitAssignmentUpdate == null) {
                continue;
            }
            driver.updateSplitAssignment(splitAssignmentUpdate);
        }
        // we may have transitioned to no more splits, so check for completion
        checkTaskCompletion();
    }
}
Also used : PlanNodeId(io.trino.sql.planner.plan.PlanNodeId) SetThreadName(io.airlift.concurrent.SetThreadName) Driver(io.trino.operator.Driver)

Example 2 with Driver

use of io.trino.operator.Driver in project trino by trinodb.

the class LocalQueryRunner method executeInternal.

private MaterializedResultWithPlan executeInternal(Session session, @Language("SQL") String sql) {
    lock.readLock().lock();
    try (Closer closer = Closer.create()) {
        accessControl.checkCanExecuteQuery(session.getIdentity());
        AtomicReference<MaterializedResult.Builder> builder = new AtomicReference<>();
        PageConsumerOutputFactory outputFactory = new PageConsumerOutputFactory(types -> {
            builder.compareAndSet(null, MaterializedResult.resultBuilder(session, types));
            return builder.get()::page;
        });
        TaskContext taskContext = TestingTaskContext.builder(notificationExecutor, yieldExecutor, session).setMaxSpillSize(nodeSpillConfig.getMaxSpillPerNode()).setQueryMaxSpillSize(nodeSpillConfig.getQueryMaxSpillPerNode()).build();
        Plan plan = createPlan(session, sql, WarningCollector.NOOP);
        List<Driver> drivers = createDrivers(session, plan, outputFactory, taskContext);
        drivers.forEach(closer::register);
        boolean done = false;
        while (!done) {
            boolean processed = false;
            for (Driver driver : drivers) {
                if (alwaysRevokeMemory) {
                    driver.getDriverContext().getOperatorContexts().stream().filter(operatorContext -> operatorContext.getNestedOperatorStats().stream().mapToLong(stats -> stats.getRevocableMemoryReservation().toBytes()).sum() > 0).forEach(OperatorContext::requestMemoryRevoking);
                }
                if (!driver.isFinished()) {
                    driver.process();
                    processed = true;
                }
            }
            done = !processed;
        }
        verify(builder.get() != null, "Output operator was not created");
        return new MaterializedResultWithPlan(builder.get().build(), plan);
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    } finally {
        lock.readLock().unlock();
    }
}
Also used : Closer(com.google.common.io.Closer) ConnectorManager(io.trino.connector.ConnectorManager) PagesIndexPageSorter(io.trino.operator.PagesIndexPageSorter) TransactionManager(io.trino.transaction.TransactionManager) TransactionManagerConfig(io.trino.transaction.TransactionManagerConfig) FilterStatsCalculator(io.trino.cost.FilterStatsCalculator) FinalizerService(io.trino.util.FinalizerService) PlanNodeId(io.trino.sql.planner.plan.PlanNodeId) MaterializedViewPropertiesSystemTable(io.trino.connector.system.MaterializedViewPropertiesSystemTable) HandleResolver(io.trino.metadata.HandleResolver) Map(java.util.Map) MetadataManager(io.trino.metadata.MetadataManager) CostCalculatorUsingExchanges(io.trino.cost.CostCalculatorUsingExchanges) TableScanNode(io.trino.sql.planner.plan.TableScanNode) InMemoryTransactionManager(io.trino.transaction.InMemoryTransactionManager) InjectedFailureType(io.trino.execution.FailureInjector.InjectedFailureType) SplitSource(io.trino.split.SplitSource) SystemSessionPropertiesProvider(io.trino.SystemSessionPropertiesProvider) PreparedQuery(io.trino.execution.QueryPreparer.PreparedQuery) PlanSanityChecker(io.trino.sql.planner.sanity.PlanSanityChecker) Plugin(io.trino.spi.Plugin) NOT_PARTITIONED(io.trino.spi.connector.NotPartitionedPartitionHandle.NOT_PARTITIONED) InternalBlockEncodingSerde(io.trino.metadata.InternalBlockEncodingSerde) SubPlan(io.trino.sql.planner.SubPlan) ShowStatsRewrite(io.trino.sql.rewrite.ShowStatsRewrite) Split(io.trino.metadata.Split) InMemoryNodeManager(io.trino.metadata.InMemoryNodeManager) Session(io.trino.Session) Analyzer(io.trino.sql.analyzer.Analyzer) MaterializedViewSystemTable(io.trino.connector.system.MaterializedViewSystemTable) NodePartitioningManager(io.trino.sql.planner.NodePartitioningManager) PluginManager(io.trino.server.PluginManager) RuleStatsRecorder(io.trino.sql.planner.RuleStatsRecorder) ColumnPropertiesSystemTable(io.trino.connector.system.ColumnPropertiesSystemTable) ComposableStatsCalculator(io.trino.cost.ComposableStatsCalculator) PageIndexerFactory(io.trino.spi.PageIndexerFactory) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) Lifespan(io.trino.execution.Lifespan) StageExecutionDescriptor(io.trino.operator.StageExecutionDescriptor) LocalExecutionPlan(io.trino.sql.planner.LocalExecutionPlanner.LocalExecutionPlan) SpillerStats(io.trino.spiller.SpillerStats) IOException(java.io.IOException) LocalExecutionPlanner(io.trino.sql.planner.LocalExecutionPlanner) FunctionBundle(io.trino.metadata.FunctionBundle) SessionPropertyDefaults(io.trino.server.SessionPropertyDefaults) TableHandle(io.trino.metadata.TableHandle) QualifiedObjectName(io.trino.metadata.QualifiedObjectName) EventListenerManager(io.trino.eventlistener.EventListenerManager) InternalFunctionBundle(io.trino.metadata.InternalFunctionBundle) StatementAnalyzerFactory(io.trino.sql.analyzer.StatementAnalyzerFactory) TablePropertyManager(io.trino.metadata.TablePropertyManager) TransactionId(io.trino.transaction.TransactionId) Driver(io.trino.operator.Driver) AllowAllSystemAccessControl(io.trino.plugin.base.security.AllowAllSystemAccessControl) OptimizerConfig(io.trino.sql.planner.OptimizerConfig) AnalyzePropertiesSystemTable(io.trino.connector.system.AnalyzePropertiesSystemTable) ParsingUtil.createParsingOptions(io.trino.sql.ParsingUtil.createParsingOptions) StatementRewrite(io.trino.sql.rewrite.StatementRewrite) TransactionBuilder.transaction(io.trino.transaction.TransactionBuilder.transaction) NodeTaskMap(io.trino.execution.NodeTaskMap) JoinFilterFunctionCompiler(io.trino.sql.gen.JoinFilterFunctionCompiler) InternalTypeManager(io.trino.type.InternalTypeManager) NodeSpillConfig(io.trino.spiller.NodeSpillConfig) Duration(io.airlift.units.Duration) StatsCalculator(io.trino.cost.StatsCalculator) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) DisabledSystemSecurityMetadata(io.trino.metadata.DisabledSystemSecurityMetadata) TreeAssertions.assertFormattedSql(io.trino.sql.testing.TreeAssertions.assertFormattedSql) PageSorter(io.trino.spi.PageSorter) LiteralFunction(io.trino.metadata.LiteralFunction) DescribeInputRewrite(io.trino.sql.rewrite.DescribeInputRewrite) ImmutableSet(com.google.common.collect.ImmutableSet) GroupProviderManager(io.trino.security.GroupProviderManager) NodeSystemTable(io.trino.connector.system.NodeSystemTable) CostComparator(io.trino.cost.CostComparator) Constraint.alwaysTrue(io.trino.spi.connector.Constraint.alwaysTrue) PlanOptimizers(io.trino.sql.planner.PlanOptimizers) ColumnPropertyManager(io.trino.metadata.ColumnPropertyManager) GlobalSystemConnectorFactory(io.trino.connector.system.GlobalSystemConnectorFactory) PlannerContext(io.trino.sql.PlannerContext) Analysis(io.trino.sql.analyzer.Analysis) GlobalFunctionCatalog(io.trino.metadata.GlobalFunctionCatalog) TableCommentSystemTable(io.trino.connector.system.TableCommentSystemTable) FileSingleStreamSpillerFactory(io.trino.spiller.FileSingleStreamSpillerFactory) OrderingCompiler(io.trino.sql.gen.OrderingCompiler) ExchangeHandleResolver(io.trino.metadata.ExchangeHandleResolver) Function(java.util.function.Function) ExpressionCompiler(io.trino.sql.gen.ExpressionCompiler) GROUPED_SCHEDULING(io.trino.spi.connector.ConnectorSplitManager.SplitSchedulingStrategy.GROUPED_SCHEDULING) ImmutableList(com.google.common.collect.ImmutableList) SystemSessionProperties(io.trino.SystemSessionProperties) TaskContext(io.trino.operator.TaskContext) DynamicFilterConfig(io.trino.execution.DynamicFilterConfig) IndexManager(io.trino.index.IndexManager) ExecutorService(java.util.concurrent.ExecutorService) PagesIndex(io.trino.operator.PagesIndex) TaskCountEstimator(io.trino.cost.TaskCountEstimator) SchemaPropertyManager(io.trino.metadata.SchemaPropertyManager) MetadataUtil(io.trino.metadata.MetadataUtil) TableExecuteContextManager(io.trino.execution.TableExecuteContextManager) GenericSpillerFactory(io.trino.spiller.GenericSpillerFactory) PageSourceManager(io.trino.split.PageSourceManager) FunctionManager(io.trino.metadata.FunctionManager) FeaturesConfig(io.trino.FeaturesConfig) CatalogManager(io.trino.metadata.CatalogManager) WarningCollector(io.trino.execution.warnings.WarningCollector) Plan(io.trino.sql.planner.Plan) TypeManager(io.trino.spi.type.TypeManager) QueryExplainerFactory(io.trino.sql.analyzer.QueryExplainerFactory) SplitAssignment(io.trino.execution.SplitAssignment) ExchangeManagerRegistry(io.trino.exchange.ExchangeManagerRegistry) EMPTY(io.trino.spi.connector.DynamicFilter.EMPTY) TableProceduresPropertyManager(io.trino.metadata.TableProceduresPropertyManager) SchemaPropertiesSystemTable(io.trino.connector.system.SchemaPropertiesSystemTable) NoOpResourceGroupManager(io.trino.execution.resourcegroups.NoOpResourceGroupManager) NodeInfo(io.airlift.node.NodeInfo) TypeOperators(io.trino.spi.type.TypeOperators) AnalyzerFactory(io.trino.sql.analyzer.AnalyzerFactory) OperatorContext(io.trino.operator.OperatorContext) PlanNode(io.trino.sql.planner.plan.PlanNode) CatalogName(io.trino.connector.CatalogName) NodeScheduler(io.trino.execution.scheduler.NodeScheduler) Executors.newScheduledThreadPool(java.util.concurrent.Executors.newScheduledThreadPool) ReadWriteLock(java.util.concurrent.locks.ReadWriteLock) StatsRulesProvider(io.trino.cost.StatsCalculatorModule.StatsRulesProvider) NodeSchedulerConfig(io.trino.execution.scheduler.NodeSchedulerConfig) PageSinkManager(io.trino.split.PageSinkManager) PasswordAuthenticatorConfig(io.trino.server.security.PasswordAuthenticatorConfig) LogicalPlanner(io.trino.sql.planner.LogicalPlanner) Set(java.util.Set) TrinoOperatorFactories(io.trino.operator.TrinoOperatorFactories) QueryPreparer(io.trino.execution.QueryPreparer) IndexJoinLookupStats(io.trino.operator.index.IndexJoinLookupStats) UncheckedIOException(java.io.UncheckedIOException) TaskManagerConfig(io.trino.execution.TaskManagerConfig) EmbedVersion.testingVersionEmbedder(io.trino.version.EmbedVersion.testingVersionEmbedder) SpillerFactory(io.trino.spiller.SpillerFactory) GlobalSystemConnector(io.trino.connector.system.GlobalSystemConnector) PlanPrinter(io.trino.sql.planner.planprinter.PlanPrinter) PlanNodeSearcher.searchFrom(io.trino.sql.planner.optimizations.PlanNodeSearcher.searchFrom) ExplainRewrite(io.trino.sql.rewrite.ExplainRewrite) ShowQueriesRewrite(io.trino.sql.rewrite.ShowQueriesRewrite) JoinCompiler(io.trino.sql.gen.JoinCompiler) ReentrantReadWriteLock(java.util.concurrent.locks.ReentrantReadWriteLock) GroupByHashPageIndexerFactory(io.trino.operator.GroupByHashPageIndexerFactory) ArrayList(java.util.ArrayList) TypeRegistry(io.trino.metadata.TypeRegistry) Closer(com.google.common.io.Closer) UNGROUPED_SCHEDULING(io.trino.spi.connector.ConnectorSplitManager.SplitSchedulingStrategy.UNGROUPED_SCHEDULING) SystemFunctionBundle(io.trino.metadata.SystemFunctionBundle) PlanOptimizer(io.trino.sql.planner.optimizations.PlanOptimizer) EventListenerConfig(io.trino.eventlistener.EventListenerConfig) ConnectorFactory(io.trino.spi.connector.ConnectorFactory) BlockTypeOperators(io.trino.type.BlockTypeOperators) Language(org.intellij.lang.annotations.Language) HeaderAuthenticatorConfig(io.trino.server.security.HeaderAuthenticatorConfig) MoreFutures.getFutureValue(io.airlift.concurrent.MoreFutures.getFutureValue) PasswordAuthenticatorManager(io.trino.server.security.PasswordAuthenticatorManager) Lock(java.util.concurrent.locks.Lock) TypeAnalyzer(io.trino.sql.planner.TypeAnalyzer) MaterializedViewPropertyManager(io.trino.metadata.MaterializedViewPropertyManager) PlanNodeIdAllocator(io.trino.sql.planner.PlanNodeIdAllocator) PlanOptimizersFactory(io.trino.sql.planner.PlanOptimizersFactory) NodeMemoryConfig(io.trino.memory.NodeMemoryConfig) DriverFactory(io.trino.operator.DriverFactory) OPTIMIZED_AND_VALIDATED(io.trino.sql.planner.LogicalPlanner.Stage.OPTIMIZED_AND_VALIDATED) SplitManager(io.trino.split.SplitManager) ParameterUtils.parameterExtractor(io.trino.sql.ParameterUtils.parameterExtractor) TransactionsSystemTable(io.trino.connector.system.TransactionsSystemTable) ErrorType(io.trino.spi.ErrorType) SqlParser(io.trino.sql.parser.SqlParser) StatsNormalizer(io.trino.cost.StatsNormalizer) CertificateAuthenticatorManager(io.trino.server.security.CertificateAuthenticatorManager) ImmutableMap(com.google.common.collect.ImmutableMap) TablePropertiesSystemTable(io.trino.connector.system.TablePropertiesSystemTable) PageFunctionCompiler(io.trino.sql.gen.PageFunctionCompiler) PropertyMetadata(io.trino.spi.session.PropertyMetadata) OutputFactory(io.trino.operator.OutputFactory) ScalarStatsCalculator(io.trino.cost.ScalarStatsCalculator) ScheduledSplit(io.trino.execution.ScheduledSplit) UniformNodeSelectorFactory(io.trino.execution.scheduler.UniformNodeSelectorFactory) HeaderAuthenticatorManager(io.trino.server.security.HeaderAuthenticatorManager) Preconditions.checkState(com.google.common.base.Preconditions.checkState) SessionPropertyManager(io.trino.metadata.SessionPropertyManager) QueryManagerConfig(io.trino.execution.QueryManagerConfig) List(java.util.List) DriverContext(io.trino.operator.DriverContext) Optional(java.util.Optional) OperatorFactories(io.trino.operator.OperatorFactories) PlanFragmenter(io.trino.sql.planner.PlanFragmenter) HashMap(java.util.HashMap) AtomicReference(java.util.concurrent.atomic.AtomicReference) MemoryManagerConfig(io.trino.memory.MemoryManagerConfig) BlockEncodingManager(io.trino.metadata.BlockEncodingManager) Verify.verify(com.google.common.base.Verify.verify) QueryExplainer(io.trino.sql.analyzer.QueryExplainer) Threads.daemonThreadsNamed(io.airlift.concurrent.Threads.daemonThreadsNamed) DescribeOutputRewrite(io.trino.sql.rewrite.DescribeOutputRewrite) Objects.requireNonNull(java.util.Objects.requireNonNull) PageConsumerOutputFactory(io.trino.testing.PageConsumerOperator.PageConsumerOutputFactory) GenericPartitioningSpillerFactory(io.trino.spiller.GenericPartitioningSpillerFactory) TableProceduresRegistry(io.trino.metadata.TableProceduresRegistry) QualifiedTablePrefix(io.trino.metadata.QualifiedTablePrefix) TimeUnit(java.util.concurrent.TimeUnit) PartitioningSpillerFactory(io.trino.spiller.PartitioningSpillerFactory) CatalogSystemTable(io.trino.connector.system.CatalogSystemTable) Executors.newCachedThreadPool(java.util.concurrent.Executors.newCachedThreadPool) CostCalculator(io.trino.cost.CostCalculator) ProcedureRegistry(io.trino.metadata.ProcedureRegistry) CostCalculatorWithEstimatedExchanges(io.trino.cost.CostCalculatorWithEstimatedExchanges) Metadata(io.trino.metadata.Metadata) AnalyzePropertyManager(io.trino.metadata.AnalyzePropertyManager) TaskContext(io.trino.operator.TaskContext) PageConsumerOutputFactory(io.trino.testing.PageConsumerOperator.PageConsumerOutputFactory) Driver(io.trino.operator.Driver) AtomicReference(java.util.concurrent.atomic.AtomicReference) UncheckedIOException(java.io.UncheckedIOException) IOException(java.io.IOException) UncheckedIOException(java.io.UncheckedIOException) SubPlan(io.trino.sql.planner.SubPlan) LocalExecutionPlan(io.trino.sql.planner.LocalExecutionPlanner.LocalExecutionPlan) Plan(io.trino.sql.planner.Plan) OperatorContext(io.trino.operator.OperatorContext)

Example 3 with Driver

use of io.trino.operator.Driver in project trino by trinodb.

the class TestMemoryBlocking method testTableScanMemoryBlocking.

@Test
public void testTableScanMemoryBlocking() {
    PlanNodeId sourceId = new PlanNodeId("source");
    List<Type> types = ImmutableList.of(VARCHAR);
    TableScanOperator source = new TableScanOperator(driverContext.addOperatorContext(1, new PlanNodeId("test"), "values"), sourceId, (session, split, table, columns, dynamicFilter) -> new FixedPageSource(rowPagesBuilder(types).addSequencePage(10, 1).addSequencePage(10, 1).addSequencePage(10, 1).addSequencePage(10, 1).addSequencePage(10, 1).build()), TEST_TABLE_HANDLE, ImmutableList.of(), DynamicFilter.EMPTY);
    PageConsumerOperator sink = createSinkOperator(types);
    Driver driver = Driver.createDriver(driverContext, source, sink);
    assertSame(driver.getDriverContext(), driverContext);
    assertFalse(driver.isFinished());
    Split testSplit = new Split(new CatalogName("test"), new TestSplit(), Lifespan.taskWide());
    driver.updateSplitAssignment(new SplitAssignment(sourceId, ImmutableSet.of(new ScheduledSplit(0, sourceId, testSplit)), true));
    ListenableFuture<Void> blocked = driver.processFor(new Duration(1, NANOSECONDS));
    // the driver shouldn't block in the first call as it will be able to move a page between source and the sink operator
    // but the operator should be blocked
    assertTrue(blocked.isDone());
    assertFalse(source.getOperatorContext().isWaitingForMemory().isDone());
    // and they should stay blocked until more memory becomes available
    for (int i = 0; i < 10; i++) {
        blocked = driver.processFor(new Duration(1, NANOSECONDS));
        assertFalse(blocked.isDone());
        assertFalse(source.getOperatorContext().isWaitingForMemory().isDone());
    }
    // free up some memory
    memoryPool.free(QUERY_ID, "test", memoryPool.getReservedBytes());
    // the operator should be unblocked
    assertTrue(source.getOperatorContext().isWaitingForMemory().isDone());
    // the driver shouldn't be blocked
    blocked = driver.processFor(new Duration(1, NANOSECONDS));
    assertTrue(blocked.isDone());
}
Also used : TableScanOperator(io.trino.operator.TableScanOperator) ScheduledSplit(io.trino.execution.ScheduledSplit) Driver(io.trino.operator.Driver) SplitAssignment(io.trino.execution.SplitAssignment) Duration(io.airlift.units.Duration) FixedPageSource(io.trino.spi.connector.FixedPageSource) PlanNodeId(io.trino.sql.planner.plan.PlanNodeId) PageConsumerOperator(io.trino.testing.PageConsumerOperator) Type(io.trino.spi.type.Type) CatalogName(io.trino.connector.CatalogName) ConnectorSplit(io.trino.spi.connector.ConnectorSplit) ScheduledSplit(io.trino.execution.ScheduledSplit) Split(io.trino.metadata.Split) Test(org.testng.annotations.Test)

Example 4 with Driver

use of io.trino.operator.Driver in project trino by trinodb.

the class TestHashJoinOperator method innerJoinWithSpill.

private void innerJoinWithSpill(boolean probeHashEnabled, List<WhenSpill> whenSpill, SingleStreamSpillerFactory buildSpillerFactory, PartitioningSpillerFactory joinSpillerFactory) throws Exception {
    TaskStateMachine taskStateMachine = new TaskStateMachine(new TaskId(new StageId("query", 0), 0, 0), executor);
    TaskContext taskContext = TestingTaskContext.createTaskContext(executor, scheduledExecutor, TEST_SESSION, taskStateMachine);
    DriverContext joinDriverContext = taskContext.addPipelineContext(2, true, true, false).addDriverContext();
    // force a yield for every match in LookupJoinOperator, set called to true after first
    AtomicBoolean called = new AtomicBoolean(false);
    InternalJoinFilterFunction filterFunction = new TestInternalJoinFilterFunction((leftPosition, leftPage, rightPosition, rightPage) -> {
        called.set(true);
        joinDriverContext.getYieldSignal().forceYieldForTesting();
        return true;
    });
    // build factory
    RowPagesBuilder buildPages = rowPagesBuilder(false, Ints.asList(0), ImmutableList.of(VARCHAR, BIGINT)).addSequencePage(4, 20, 200).addSequencePage(4, 20, 200).addSequencePage(4, 30, 300).addSequencePage(4, 40, 400);
    BuildSideSetup buildSideSetup = setupBuildSide(nodePartitioningManager, true, taskContext, buildPages, Optional.of(filterFunction), true, buildSpillerFactory);
    JoinBridgeManager<PartitionedLookupSourceFactory> lookupSourceFactoryManager = buildSideSetup.getLookupSourceFactoryManager();
    // probe factory
    RowPagesBuilder probePages = rowPagesBuilder(probeHashEnabled, Ints.asList(0), ImmutableList.of(VARCHAR, BIGINT)).row("20", 123_000L).row("20", 123_000L).pageBreak().addSequencePage(20, 0, 123_000).addSequencePage(10, 30, 123_000);
    OperatorFactory joinOperatorFactory = innerJoinOperatorFactory(operatorFactories, lookupSourceFactoryManager, probePages, joinSpillerFactory, true);
    // build drivers and operators
    instantiateBuildDrivers(buildSideSetup, taskContext);
    List<Driver> buildDrivers = buildSideSetup.getBuildDrivers();
    int buildOperatorCount = buildDrivers.size();
    checkState(buildOperatorCount == whenSpill.size());
    LookupSourceFactory lookupSourceFactory = lookupSourceFactoryManager.getJoinBridge(Lifespan.taskWide());
    try (Operator joinOperator = joinOperatorFactory.createOperator(joinDriverContext)) {
        // build lookup source
        ListenableFuture<LookupSourceProvider> lookupSourceProvider = lookupSourceFactory.createLookupSourceProvider();
        List<Boolean> revoked = new ArrayList<>(nCopies(buildOperatorCount, false));
        while (!lookupSourceProvider.isDone()) {
            for (int i = 0; i < buildOperatorCount; i++) {
                checkErrors(taskStateMachine);
                buildDrivers.get(i).process();
                HashBuilderOperator buildOperator = buildSideSetup.getBuildOperators().get(i);
                if (whenSpill.get(i) == WhenSpill.DURING_BUILD && buildOperator.getOperatorContext().getReservedRevocableBytes() > 0) {
                    checkState(!lookupSourceProvider.isDone(), "Too late, LookupSource already done");
                    revokeMemory(buildOperator);
                    revoked.set(i, true);
                }
            }
        }
        getFutureValue(lookupSourceProvider).close();
        assertEquals(revoked, whenSpill.stream().map(WhenSpill.DURING_BUILD::equals).collect(toImmutableList()), "Some operators not spilled before LookupSource built");
        for (int i = 0; i < buildOperatorCount; i++) {
            if (whenSpill.get(i) == WhenSpill.AFTER_BUILD) {
                revokeMemory(buildSideSetup.getBuildOperators().get(i));
            }
        }
        for (Driver buildDriver : buildDrivers) {
            runDriverInThread(executor, buildDriver);
        }
        ValuesOperatorFactory valuesOperatorFactory = new ValuesOperatorFactory(17, new PlanNodeId("values"), probePages.build());
        PageBuffer pageBuffer = new PageBuffer(10);
        PageBufferOperatorFactory pageBufferOperatorFactory = new PageBufferOperatorFactory(18, new PlanNodeId("pageBuffer"), pageBuffer);
        Driver joinDriver = Driver.createDriver(joinDriverContext, valuesOperatorFactory.createOperator(joinDriverContext), joinOperator, pageBufferOperatorFactory.createOperator(joinDriverContext));
        while (!called.get()) {
            // process first row of first page of LookupJoinOperator
            processRow(joinDriver, taskStateMachine);
        }
        for (int i = 0; i < buildOperatorCount; i++) {
            if (whenSpill.get(i) == WhenSpill.DURING_USAGE) {
                triggerMemoryRevokingAndWait(buildSideSetup.getBuildOperators().get(i), taskStateMachine);
            }
        }
        // process remaining LookupJoinOperator pages
        while (!joinDriver.isFinished()) {
            checkErrors(taskStateMachine);
            processRow(joinDriver, taskStateMachine);
        }
        checkErrors(taskStateMachine);
        List<Page> actualPages = getPages(pageBuffer);
        MaterializedResult expected = MaterializedResult.resultBuilder(taskContext.getSession(), concat(probePages.getTypesWithoutHash(), buildPages.getTypesWithoutHash())).row("20", 123_000L, "20", 200L).row("20", 123_000L, "20", 200L).row("20", 123_000L, "20", 200L).row("20", 123_000L, "20", 200L).row("30", 123_000L, "30", 300L).row("31", 123_001L, "31", 301L).row("32", 123_002L, "32", 302L).row("33", 123_003L, "33", 303L).build();
        assertEqualsIgnoreOrder(getProperColumns(joinOperator, concat(probePages.getTypes(), buildPages.getTypes()), probePages, actualPages).getMaterializedRows(), expected.getMaterializedRows());
    } finally {
        joinOperatorFactory.noMoreOperators();
    }
}
Also used : WorkProcessorOperator(io.trino.operator.WorkProcessorOperator) Operator(io.trino.operator.Operator) DriverContext(io.trino.operator.DriverContext) TaskId(io.trino.execution.TaskId) StageId(io.trino.execution.StageId) ArrayList(java.util.ArrayList) Driver(io.trino.operator.Driver) Page(io.trino.spi.Page) TestInternalJoinFilterFunction(io.trino.operator.join.JoinTestUtils.TestInternalJoinFilterFunction) TaskStateMachine(io.trino.execution.TaskStateMachine) PlanNodeId(io.trino.sql.planner.plan.PlanNodeId) BuildSideSetup(io.trino.operator.join.JoinTestUtils.BuildSideSetup) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) PageBuffer(io.trino.operator.index.PageBuffer) TestingTaskContext(io.trino.testing.TestingTaskContext) TaskContext(io.trino.operator.TaskContext) TestInternalJoinFilterFunction(io.trino.operator.join.JoinTestUtils.TestInternalJoinFilterFunction) RowPagesBuilder(io.trino.RowPagesBuilder) PageBufferOperatorFactory(io.trino.operator.index.PageBufferOperator.PageBufferOperatorFactory) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) WorkProcessorOperatorFactory(io.trino.operator.WorkProcessorOperatorFactory) ValuesOperatorFactory(io.trino.operator.ValuesOperator.ValuesOperatorFactory) PageBufferOperatorFactory(io.trino.operator.index.PageBufferOperator.PageBufferOperatorFactory) JoinTestUtils.innerJoinOperatorFactory(io.trino.operator.join.JoinTestUtils.innerJoinOperatorFactory) OperatorFactory(io.trino.operator.OperatorFactory) ValuesOperatorFactory(io.trino.operator.ValuesOperator.ValuesOperatorFactory) MaterializedResult(io.trino.testing.MaterializedResult)

Example 5 with Driver

use of io.trino.operator.Driver in project trino by trinodb.

the class JoinTestUtils method instantiateBuildDrivers.

public static void instantiateBuildDrivers(BuildSideSetup buildSideSetup, TaskContext taskContext) {
    PipelineContext buildPipeline = taskContext.addPipelineContext(1, true, true, false);
    List<Driver> buildDrivers = new ArrayList<>();
    List<HashBuilderOperator> buildOperators = new ArrayList<>();
    for (int i = 0; i < buildSideSetup.getPartitionCount(); i++) {
        DriverContext buildDriverContext = buildPipeline.addDriverContext();
        HashBuilderOperator buildOperator = buildSideSetup.getBuildOperatorFactory().createOperator(buildDriverContext);
        Driver driver = Driver.createDriver(buildDriverContext, buildSideSetup.getBuildSideSourceOperatorFactory().createOperator(buildDriverContext), buildOperator);
        buildDrivers.add(driver);
        buildOperators.add(buildOperator);
    }
    buildSideSetup.setDriversAndOperators(buildDrivers, buildOperators);
}
Also used : DriverContext(io.trino.operator.DriverContext) PipelineContext(io.trino.operator.PipelineContext) ArrayList(java.util.ArrayList) Driver(io.trino.operator.Driver)

Aggregations

Driver (io.trino.operator.Driver)19 PlanNodeId (io.trino.sql.planner.plan.PlanNodeId)13 DriverContext (io.trino.operator.DriverContext)9 DriverFactory (io.trino.operator.DriverFactory)7 PagesIndex (io.trino.operator.PagesIndex)6 ImmutableList (com.google.common.collect.ImmutableList)5 ScheduledSplit (io.trino.execution.ScheduledSplit)4 SplitAssignment (io.trino.execution.SplitAssignment)4 Split (io.trino.metadata.Split)4 OperatorFactory (io.trino.operator.OperatorFactory)4 TaskContext (io.trino.operator.TaskContext)4 Type (io.trino.spi.type.Type)4 TypeOperators (io.trino.spi.type.TypeOperators)4 BlockTypeOperators (io.trino.type.BlockTypeOperators)4 ImmutableMap (com.google.common.collect.ImmutableMap)3 Session (io.trino.Session)3 HashBuilderOperatorFactory (io.trino.operator.join.HashBuilderOperator.HashBuilderOperatorFactory)3 Page (io.trino.spi.Page)3 ArrayList (java.util.ArrayList)3 Preconditions.checkState (com.google.common.base.Preconditions.checkState)2