apache/flink · error · InvalidProgramException

The iteration {} has no solution set delta defined (is not c

Error message

The iteration {} has no solution set delta defined (is not closed).

What it means

Thrown by CollectionExecutor.executeDeltaIteration() when iteration.getSolutionSetDelta() returns null. The solution set delta is the operator that produces the changes to the solution set each iteration; a null value means the delta iteration was never 'closed' — the developer forgot to call closeWith(solutionSetDelta, nextWorkset). This is an InvalidProgramException.

Source

Thrown at flink-core/src/main/java/org/apache/flink/api/common/operators/CollectionExecutor.java:418

        return currentResult;
    }

    @SuppressWarnings("unchecked")
    private <T> List<T> executeDeltaIteration(DeltaIterationBase<?, ?> iteration, JobInfo jobInfo)
            throws Exception {
        Operator<?> solutionInput = iteration.getInitialSolutionSet();
        Operator<?> worksetInput = iteration.getInitialWorkset();
        if (solutionInput == null) {
            throw new InvalidProgramException(
                    "The delta iteration " + iteration.getName() + " has no initial solution set.");
        }
        if (worksetInput == null) {
            throw new InvalidProgramException(
                    "The delta iteration " + iteration.getName() + " has no initial workset.");
        }
        if (iteration.getSolutionSetDelta() == null) {
            throw new InvalidProgramException(
                    "The iteration "
                            + iteration.getName()
                            + " has no solution set delta defined (is not closed).");
        }
        if (iteration.getNextWorkset() == null) {
            throw new InvalidProgramException(
                    "The iteration "
                            + iteration.getName()
                            + " has no workset defined (is not closed).");
        }

        List<T> solutionInputData = (List<T>) execute(solutionInput, jobInfo);
        List<T> worksetInputData = (List<T>) execute(worksetInput, jobInfo);

        // get the operators that are iterative
        Set<Operator<?>> dynamics = new LinkedHashSet<Operator<?>>();
        DynamicPathCollector dynCollector = new DynamicPathCollector(dynamics);
        iteration.getSolutionSetDelta().accept(dynCollector);

View on GitHub (pinned to 2f3c205e92)

Solutions

  1. Call iter.closeWith(solutionSetDelta, nextWorkset) to close the delta iteration with both the delta and the next workset.
  2. Verify that the solutionSetDelta DataSet and nextWorkset DataSet are correctly produced by the step function body.
  3. Review the delta iteration structure: iterateDelta() → define step body → closeWith(delta, nextWorkset) → use the returned DataSet.

Example fix

// before — delta iteration never closed
DeltaIteration<S,W> iter = solutionSet.iterateDelta(workset, 100, 0);
DataSet<S> delta = iter.getWorkset().join(solutionSet).where(0).equalTo(0);
// missing: DataSet<S> result = iter.closeWith(delta, nextWorkset);
// after
DataSet<S> delta = iter.getWorkset().join(solutionSet).where(0).equalTo(0);
DataSet<W> nextWorkset = delta.project(0);
DataSet<S> result = iter.closeWith(delta, nextWorkset);
Defensive patterns

Strategy: validation

Validate before calling

// Ensure delta iteration is fully closed with solution set delta
DeltaIteration<S,W> iter = solutionSet.iterateDelta(workset, 100, 0);
DataSet<S> delta = computeDelta(iter);
DataSet<W> nextWorkset = computeNextWorkset(iter);
if (delta == null || nextWorkset == null) {
    throw new IllegalStateException("Delta iteration step results must not be null");
}
DataSet<S> result = iter.closeWith(delta, nextWorkset); // required call

Prevention

When it happens

Trigger: Creating a delta iteration via iterateDelta() but never calling closeWith() with the solution set delta. The step function body is defined but the loop is not terminated, leaving getSolutionSetDelta() as null.

Common situations: A developer writes a delta iterative algorithm, defines the step function, but forgets or incorrectly calls closeWith(). Delta iterations require closeWith(solutionSetDelta, nextWorkset) with two arguments, unlike bulk iterations which take one. Forgetting the two-argument form is a common mistake.

Related errors


AI-assisted analysis of apache/flink@2f3c205e92 (2026-08-14). Data as JSON: /api/errors/6b7a9c4d4c2f727f. Report an issue: GitHub.