pentaho/pentaho-kettle · error · KettleException

No value retrieved from slave sequence

Error message

No value retrieved from slave sequence '<slaveSequenceName>' on slave <slaveServer>

What it means

Thrown by SlaveServer.getNextSequenceValue when the NextSequenceValueServlet responds without an error tag but also without a value: the nextValueString is empty. It means the slave acknowledged the request but returned no sequence value.

Solutions

  1. Ensure the sequence exists and is supported on the slave (check slave version/configuration)
  2. Inspect the raw response XML from the NextSequenceValueServlet to see why the value is empty
  3. Upgrade/align master and slave versions if the servlet protocol differs
  4. If sequences are unused, avoid calling getNextSequenceValue in clustered runs

Example fix

// before: assuming the sequence exists on the slave
long v = slaveServer.getNextSequenceValue(partitionId, "mySeq", sb);
// after: check sequence availability first
if (!slaveServer.getSlaves().isEmpty() && !sequenceExistsOnSlave(slaveServer, "mySeq")) { throw new KettleException("Sequence mySeq missing on slave"); }
long v = slaveServer.getNextSequenceValue(partitionId, "mySeq", sb);
Defensive patterns

Strategy: try-catch

Validate before calling

// Ensure the sequence is configured on the slave before requesting a value
// (no direct API; verify slave version supports sequences and sequence was initialized)
if (!slaveServer.ping()) { throw new KettleException("Slave down: " + slaveServer.getName()); }

Type guard

boolean hasValue(String xml) { return xml != null && xml.contains(NextSequenceValueServlet.XML_TAG_VALUE); }

Try / catch

try { Long v = slaveServer.getNextSequenceValue(partitionId, seqName, sb); }
catch (KettleException e) { if (e.getMessage().startsWith("No value retrieved")) { initializeSequenceOnSlave(seqName); } throw e; }

Prevention

When it happens

Trigger: getNextSequenceValue is called for slaveSequenceName on this slave; the HTTP response XML contains no error but the NextSequenceValue value tag is empty.

Common situations: Sequence not initialized/created on the slave; slave servlet returned an empty value due to an internal edge case; protocol/serialization mismatch between master and slave versions.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/8cb89085af8b3ac7. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/cluster/SlaveServer.java:1354

  }

  public long getNextSlaveSequenceValue( String slaveSequenceName, long incrementValue ) throws KettleException {
    try {
      String xml =
        execService( NextSequenceValueServlet.CONTEXT_PATH + "/" + "?" + NextSequenceValueServlet.PARAM_NAME + "="
          + URLEncoder.encode( slaveSequenceName, "UTF-8" ) + "&" + NextSequenceValueServlet.PARAM_INCREMENT + "="
          + Long.toString( incrementValue ) );

      Document doc = XMLHandler.loadXMLString( xml );
      Node seqNode = XMLHandler.getSubNode( doc, NextSequenceValueServlet.XML_TAG );
      String nextValueString = XMLHandler.getTagValue( seqNode, NextSequenceValueServlet.XML_TAG_VALUE );
      String errorString = XMLHandler.getTagValue( seqNode, NextSequenceValueServlet.XML_TAG_ERROR );

      if ( !Utils.isEmpty( errorString ) ) {
        throw new KettleException( errorString );
      }
      if ( Utils.isEmpty( nextValueString ) ) {
        throw new KettleException( "No value retrieved from slave sequence '" + slaveSequenceName + "' on slave "
          + toString() );
      }
      long nextValue = Const.toLong( nextValueString, Long.MIN_VALUE );
      if ( nextValue == Long.MIN_VALUE ) {
        throw new KettleException( "Incorrect value '" + nextValueString + "' retrieved from slave sequence '"
          + slaveSequenceName + "' on slave " + toString() );
      }

      return nextValue;
    } catch ( Exception e ) {
      throw new KettleException( "There was a problem retrieving a next sequence value from slave sequence '"
        + slaveSequenceName + "' on slave " + toString(), e );
    }
  }

  public SlaveServer getClient() {
    lock.readLock().lock();
    try {

View on GitHub (pinned to f3058517a1)