pentaho/pentaho-kettle · error · KettleStepException
SalesforceUpdate.log.Exception
Error message
SalesforceUpdate.log.Exception
What it means
SalesforceUpdate.processRow() calls writeToSalesForce(outputRowData) inside a try/catch and rethrows any exception as a KettleStepException with the localized message key 'SalesforceUpdate.log.Exception'. It is the outer wrapper: whatever failed inside the Salesforce write (connection, batch flush, API error) surfaces here wrapped as a step exception that stops the transformation.
Solutions
- Look at the chained cause — the actionable error is almost always inside writeToSalesForce/flushBuffers.
- Verify Salesforce connectivity and credentials (endpoint, username/password/token).
- Enable error handling on the step if you want rows routed to an error stream instead of aborting the transformation.
- Fix the root cause indicated by the inner exception (e.g. field errors from 3747/3748).
Defensive patterns
Strategy: try-catch
Try / catch
try {
trans.execute(null);
trans.waitUntilFinished();
} catch (KettleStepException e) {
log.error("Salesforce write failed: {}", e.getCause() != null ? e.getCause().toString() : e.getMessage(), e);
// inspect the chained cause to find the real failure (connection, flush, API error)
} Prevention
- Always log the chained cause — this exception is only a wrapper.
- Configure step error handling to divert bad rows instead of aborting.
- Monitor Salesforce connectivity/token validity for long-running jobs.
- Test the Salesforce connection in the step dialog before scheduling.
When it happens
Trigger: Any exception escaping writeToSalesForce during normal row processing: Salesforce connection failures, batch flush errors (see flushBuffers), or NPEs inside the write logic.
Common situations: Expired/invalid Salesforce credentials mid-run; network outage during the update batch; an earlier KettleException raised in flushBuffers propagating through this wrapper.
Understand the failure class
Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.
Related errors
- SalesforceDelete.log.Exception
- SalesforceUpsert.log.Exception
- AddSequence.Exception.NoSpecifiedMethod
- Erreur getting fields from module [
- Error during processing a row
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/bb02ec6eb780f65a.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforceupdate/SalesforceUpdate.java:104
meta.getFields( getTransMeta().getBowl(), data.outputRowMeta, getStepname(), null, null, this, repository,
metaStore );
// Build the mapping of input position to field name
data.fieldnrs = new int[meta.getUpdateStream().length];
for ( int i = 0; i < meta.getUpdateStream().length; i++ ) {
data.fieldnrs[i] = getInputRowMeta().indexOfValue( meta.getUpdateStream()[i] );
if ( data.fieldnrs[i] < 0 ) {
throw new KettleException( "Field [" + meta.getUpdateStream()[i]
+ "] couldn't be found in the input stream!" );
}
}
}
try {
writeToSalesForce( outputRowData );
} catch ( Exception e ) {
throw new KettleStepException( BaseMessages.getString( PKG, "SalesforceUpdate.log.Exception" ), e );
}
return true;
}
@VisibleForTesting
void writeToSalesForce( Object[] rowData ) throws KettleException {
try {
if ( log.isDetailed() ) {
logDetailed( "Called writeToSalesForce with " + data.iBufferPos + " out of " + meta.getBatchSizeInt() );
}
// if there is room in the buffer
if ( data.iBufferPos < meta.getBatchSizeInt() ) {
// Reserve for empty fields
ArrayList<String> fieldsToNull = new ArrayList<String>();
ArrayList<XmlObject> updatefields = new ArrayList<>();
View on GitHub (pinned to f3058517a1)