pentaho/pentaho-kettle · error · KettleException
WebServiceAvailableMeta.Exception.UnableToSaveStepInfo
Error message
WebServiceAvailableMeta.Exception.UnableToSaveStepInfo
What it means
Thrown by WebServiceAvailableMeta.saveRep() when persisting this step's attributes (urlField, connectTimeOut, readTimeOut, resultfieldname) to a Kettle repository fails. The raw repository exception is wrapped in a KettleException with a localized 'Unable to save step information' message plus the step id. It indicates a repository storage problem, not a step-configuration problem.
Solutions
- Check repository database connectivity and reconnect
- Verify the user has write permission on R_STEP_ATTRIBUTE
- Retry the save; if it persists, save to file (XML) instead of repository
- Inspect the wrapped cause exception for the underlying repository error
Example fix
// before
meta.saveRep( rep, transMeta, transformationId, stepId ); // throws KettleException
// after
try {
meta.saveRep( rep, transMeta, transformationId, stepId );
} catch ( KettleException e ) {
logError( "Failed to save WebServiceAvailable step info: " + e.getCause(), e );
// rethrow or fall back to file-based save
} Defensive patterns
Strategy: try-catch
Validate before calling
// before saveRep
if ( rep == null || !rep.isConnected() ) {
throw new KettleException( "Repository is not connected; cannot save step info" );
} Try / catch
try {
meta.saveRep( rep, transMeta, id_transformation, id_step );
} catch ( KettleException e ) {
logError( "Repository save failed: " + e.getCause(), e );
// surface cause to user or fall back to XML export
} Prevention
- Verify repository connectivity before programmatic saves
- Grant write access on R_STEP_ATTRIBUTE tables
- Catch KettleException and log e.getCause() for the real repository error
- Keep repository DB connections alive / use connection pooling health checks
When it happens
Trigger: Calling saveRep() on a repository whose connection has dropped, whose tables are read-only, or which throws while executing saveStepAttribute for any of the step's attributes.
Common situations: Saving a transformation to a database repository with an expired DB connection, insufficient permissions on Kettle attribute tables (R_STEP_ATTRIBUTE), network interruption mid-save, or a corrupt/locked repository.
Related errors
- ERROR_0002
- HTTPMeta.Exception.UnableToSaveStepInfo
- JobEntryEval.UnableToSaveToRepo
- JobEntryEvalTableContent.UnableSaveRep
- JobEntrySimple.Error.Exception.UnableSaveRep
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/af9cb7688977c267.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/webserviceavailable/WebServiceAvailableMeta.java:182
try {
urlField = rep.getStepAttributeString( id_step, "urlField" );
connectTimeOut = rep.getStepAttributeString( id_step, "connectTimeOut" );
readTimeOut = rep.getStepAttributeString( id_step, "readTimeOut" );
resultfieldname = rep.getStepAttributeString( id_step, "resultfieldname" );
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "WebServiceAvailableMeta.Exception.UnexpectedErrorReadingStepInfo" ), e );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
try {
rep.saveStepAttribute( id_transformation, id_step, "urlField", urlField );
rep.saveStepAttribute( id_transformation, id_step, "connectTimeOut", connectTimeOut );
rep.saveStepAttribute( id_transformation, id_step, "readTimeOut", readTimeOut );
rep.saveStepAttribute( id_transformation, id_step, "resultfieldname", resultfieldname );
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "WebServiceAvailableMeta.Exception.UnableToSaveStepInfo" )
+ id_step, e );
}
}
public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,
RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,
Repository repository, IMetaStore metaStore ) {
CheckResult cr;
String error_message = "";
if ( Utils.isEmpty( resultfieldname ) ) {
error_message = BaseMessages.getString( PKG, "WebServiceAvailableMeta.CheckResult.ResultFieldMissing" );
cr = new CheckResult( CheckResult.TYPE_RESULT_ERROR, error_message, stepMeta );
remarks.add( cr );
} else {
error_message = BaseMessages.getString( PKG, "WebServiceAvailableMeta.CheckResult.ResultFieldOK" );
cr = new CheckResult( CheckResult.TYPE_RESULT_OK, error_message, stepMeta );View on GitHub (pinned to f3058517a1)