pentaho/pentaho-kettle · error · KettleXMLException
AbortMeta.Exception.UnexpectedErrorInReadingStepInfoFromRepo…
Error message
AbortMeta.Exception.UnexpectedErrorInReadingStepInfoFromRepository
What it means
AbortMeta.readData (invoked by loadXML) throws KettleXMLException with this message when any unexpected Exception occurs while reading the Abort step's settings (row_threshold, message, always_log_rows, abort_option) from XML. It signals the transformation step metadata could not be deserialized.
Solutions
- Open the .ktr in Spoon and re-create or repair the Abort step whose XML is malformed.
- Validate XML well-formedness and confirm required attributes (row_threshold, abort_option) exist.
- Check version compatibility of the transformation file with the Pentaho/PDI runtime.
Example fix
// before abortOption = "Y".equalsIgnoreCase( awe ) ? AbortOption.ABORT_WITH_ERROR : AbortOption.ABORT; // after abortOption = "Y".equalsIgnoreCase( Const.NVL( awe, "Y" ) ) ? AbortOption.ABORT_WITH_ERROR : AbortOption.ABORT;
Defensive patterns
Strategy: validation
Validate before calling
// validate transformation XML before loading metadata Document doc = XMLHandler.loadXMLFile( new File( ktrPath ) ); if ( doc == null ) throw new IllegalStateException( "unreadable ktr file" );
Try / catch
try { stepMeta.getStepMetaInterface().loadXML( stepnode, databases, metaStore ); } catch ( KettleXMLException e ) { logError( "Abort step metadata unreadable: " + e.getMessage(), e ); } Prevention
- Do not hand-edit .ktr files; use Spoon.
- Transfer transformation files in binary-safe mode to avoid truncation.
- Check plugin/version compatibility when loading old transformations.
When it happens
Trigger: loadXML on a <step> node where attributes like <abort_option> are missing/corrupt or attribute parsing throws; readData is the shared parser both loadXML paths go through.
Common situations: Hand-edited .ktr files, transformations produced by newer plugin versions read by older ones, XML truncated by bad merges or incomplete file transfer.
Related errors
- RulesMeta.Error.LoadFromXML
- RulesMeta.Error.LoadFromXML
- AggregateRowsMeta.Exception.UnableToLoadStepInfo
- CubeOutputMeta.Exception.UnableToLoadStepInfo
- DelayMeta.Exception.UnableToReadStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/5cc6131b9a395c2c.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/abort/AbortMeta.java:143
private void readData( Node stepnode ) throws KettleXMLException {
try {
rowThreshold = XMLHandler.getTagValue( stepnode, "row_threshold" );
message = XMLHandler.getTagValue( stepnode, "message" );
alwaysLogRows = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "always_log_rows" ) );
String abortOptionString = XMLHandler.getTagValue( stepnode, "abort_option" );
if ( !isEmpty( abortOptionString ) ) {
abortOption = AbortOption.valueOf( abortOptionString );
} else {
// Backwards compatibility
String awe = XMLHandler.getTagValue( stepnode, "abort_with_error" );
if ( awe == null ) {
awe = "Y"; // existing transformations will have to maintain backward compatibility with yes
}
abortOption = "Y".equalsIgnoreCase( awe ) ? AbortOption.ABORT_WITH_ERROR : AbortOption.ABORT;
}
} catch ( Exception e ) {
throw new KettleXMLException( BaseMessages.getString(
PKG, "AbortMeta.Exception.UnexpectedErrorInReadingStepInfoFromRepository" ), e );
}
}
public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases ) throws KettleException {
try {
rowThreshold = rep.getStepAttributeString( id_step, "row_threshold" );
message = rep.getStepAttributeString( id_step, "message" );
alwaysLogRows = rep.getStepAttributeBoolean( id_step, "always_log_rows" );
String abortOptionString = rep.getStepAttributeString( id_step, 0, "abort_option" );
if ( !isEmpty( abortOptionString ) ) {
abortOption = AbortOption.valueOf( abortOptionString );
} else {
// Backward compatibility
// existing transformations will have to maintain backward compatibility with yes
boolean abortWithError = rep.getStepAttributeBoolean( id_step, 0, "abort_with_error", true );
abortOption = abortWithError ? AbortOption.ABORT_WITH_ERROR : AbortOption.ABORT;View on GitHub (pinned to f3058517a1)