apache/seatunnel · warning

Reader {} is not registered. Pending splits {} are not assig

Error message

Reader {} is not registered. Pending splits {} are not assigned.

What it means

IoTDBSourceSplitEnumerator (v1 connector) logs this warning in addSplitsBack when the returning reader's subtaskId is not registered with the coordinator; the splits are kept as pending and not immediately assigned. This is a failover/restore race guard; assignment happens once the reader registers.

Source

Thrown at seatunnel-connectors-v2/connector-iotdb/src/main/java/org/apache/seatunnel/connectors/seatunnel/iotdb/source/IoTDBSourceSplitEnumerator.java:195

                query = query + " and ( " + sqlCondition + " ) ";
            }
            if (!Strings.isNullOrEmpty(sqlAlign)) {
                query = query + " align by " + sqlAlign;
            }
            iotDBSourceSplits.add(new IoTDBSourceSplit(String.valueOf(query.hashCode()), query));
        }
        return iotDBSourceSplits;
    }

    @Override
    public void addSplitsBack(List<IoTDBSourceSplit> splits, int subtaskId) {
        log.debug("Add back splits {} to IoTDBSourceSplitEnumerator.", splits);
        if (!splits.isEmpty()) {
            addPendingSplit(splits, subtaskId);
            if (context.registeredReaders().contains(subtaskId)) {
                assignSplit(Collections.singletonList(subtaskId));
            } else {
                log.warn(
                        "Reader {} is not registered. Pending splits {} are not assigned.",
                        subtaskId,
                        splits);
            }
        }
    }

    @Override
    public int currentUnassignedSplitSize() {
        return pendingSplit.size();
    }

    @Override
    public void registerReader(int subtaskId) {
        log.debug("Register reader {} to IoTDBSourceSplitEnumerator.", subtaskId);
        if (!pendingSplit.isEmpty()) {
            assignSplit(Collections.singletonList(subtaskId));
        }

View on GitHub (pinned to cf67b549a7)

Solutions

  1. No action typically required — pending splits get assigned after registration
  2. If splits remain unassigned, verify reader startup and restart the job if needed
  3. Reduce reader failures by checking IoTDB connectivity/session limits
  4. Ensure the standard register-reader flow is used in any customized source code
Defensive patterns

Strategy: fallback

Prevention

When it happens

Trigger: addSplitsBack(splits, subtaskId) with subtaskId absent from context.registeredReaders() — reader failed over or job was restored and the new reader hasn't registered yet.

Common situations: Task failure on IoTDB source readers; checkpoint restore ordering where enumerator starts before readers; dynamic scaling moving readers.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/03f0ffda1f4b0ab3. Report an issue: GitHub.