pentaho/pentaho-kettle · error · Carte.CarteCommandException
Carte.Error.NoShutdown
Carte.Error.NoShutdown
Error message
Carte.Error.NoShutdown
What it means
CarteCommandException thrown by callStopCarteRestService when the REST response from the remote Carte server's /stopCarte endpoint is null or does not contain 'Shutting Down'. It means the server was contacted (or not) but did not confirm shutdown. The library throws it to signal that the remote Carte instance could not be verified as stopping.
Solutions
- Verify the Carte server is running and reachable at the given hostname:port before calling shutdown
- Check the /stopCarte endpoint manually (curl http://host:port/stopCarte) to see the actual response
- Confirm no proxy, firewall, or servlet filter is altering the response body
- Check remote Carte logs for errors during shutdown handling
- Ensure the remote Carte version returns the standard 'Shutting Down' confirmation
Example fix
// before
response = target.request().get( String.class );
if ( response == null || !response.contains( "Shutting Down" ) ) {
throw new CarteCommandException(...);
}
// after
response = target.request().get( String.class );
if ( response == null || !(response.contains( "Shutting Down" ) || response.contains( "shutting down" )) ) {
// retry once before failing, then log the raw body for diagnosis
LOG.warn("Unexpected /stopCarte response: " + response);
throw new CarteCommandException(...);
} Defensive patterns
Strategy: try-catch
Validate before calling
// Before shutdown, ping the server HttpGet ping = new HttpGet( "http://" + hostname + ":" + port + "/kettle/status/" ); // expect HTTP 200; if not reachable, skip shutdown call
Type guard
boolean isShutdownConfirmation( String response ) {
return response != null && response.contains( "Shutting Down" );
} Try / catch
try {
carte.shutdown( hostname, port );
} catch ( Carte.CarteCommandException e ) {
// distinguish: response received but no confirmation vs network error
LOG.warn( "Carte at " + hostname + ":" + port + " did not confirm shutdown: " + e.getMessage() );
} Prevention
- Health-check the Carte server before calling shutdown
- Pin/verify Carte versions so confirmation text is stable
- Avoid proxies between client and Carte for management calls
- Log raw /stopCarte responses during troubleshooting
When it happens
Trigger: Carte.shutdown() -> callStopCarteRestService() performs GET {contextURL}/stopCarte; the response body is null, empty, or lacks the 'Shutting Down' confirmation string (e.g. wrong port, already stopped, auth or proxy interfering, non-Carte service on that port).
Common situations: Pointing at the wrong Carte hostname/port; Carte already shut down so /stopCarte returns an error page; a firewall/proxy strips or rewrites the response; the Carte version on the remote host returns a different confirmation text.
Understand the failure class
Background: "invalid response format", "malformed payload", "missing data field": when an API returns 200 but the response shape is wrong — this error's family across 23 libraries.
Related errors
- Carte.Error.NoServerFound
- Auth error
- Client error creating folder
- Failed to fetch driver metadata for
- Failed with error-code
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/58caa773610111af.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/www/Carte.java:377
}
client.register( HttpAuthenticationFeature.basic( username, Encr.decryptPasswordOptionallyEncrypted( password ) ) );
// check if the user can access the carte server. Don't really need this call but may want to check it's output at
// some point
String contextURL = HttpUtil.constructUrl( new Variables(), hostname, port, "kettle", "", sslMode );
WebTarget target = client.target( contextURL + "/status/?xml=Y" );
String response = target.request().get( String.class );
if ( response == null || !response.contains( "<serverstatus>" ) ) {
throw new Carte.CarteCommandException( BaseMessages.getString( PKG, NO_SERVER_FOUND_ERROR, hostname, ""
+ port ) );
}
// This is the call that matters
target = client.target( contextURL + "/stopCarte" );
response = target.request().get( String.class );
if ( response == null || !response.contains( "Shutting Down" ) ) {
throw new Carte.CarteCommandException( BaseMessages.getString( PKG, "Carte.Error.NoShutdown", hostname, ""
+ port ) );
}
} catch ( Exception e ) {
throw new Carte.CarteCommandException( BaseMessages.getString( PKG, NO_SERVER_FOUND_ERROR, hostname, ""
+ port ), e );
}
}
private static Client createClientWithSSLConfig( SslConfiguration sslConfig, String hostname, String port )
throws CarteCommandException {
HostnameVerifier hostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
SSLContext sslContext;
try {
sslContext = getSSLContext( sslConfig.getKeyStore(), sslConfig.getKeyStorePassword() );
} catch ( Exception e ) {
CarteSingleton.getInstance().getLog().logError( "Unable to create SSL context. Please check SSL configuration." );
throw new Carte.CarteCommandException( BaseMessages.getString( PKG, NO_SERVER_FOUND_ERROR, hostname, "" + port ), e );
}View on GitHub (pinned to f3058517a1)