pentaho/pentaho-kettle · error · FileSystemException
vfs.provider/get-type.error
vfs.provider/get-type.error
Error message
vfs.provider/get-type.error
What it means
S3FileObject.handleAttachException() resolves the file's type during attach. When the underlying S3 getObjectMetadata call fails with an error code other than 'NoSuchKey' (i.e. the connection itself failed), it throws FileSystemException('vfs.provider/get-type.error', qualifiedName, cause). NoSuchKey is treated as 'file does not exist'; everything else is a real connectivity or permissions problem.
Solutions
- Read the logged AWS error code to identify the exact S3 failure.
- Verify the bucket name and that it belongs to your account (403 is returned for foreign buckets).
- Grant the IAM user s3:GetObject / s3:ListBucket on the bucket.
- Check credentials validity and region/endpoint configuration.
- Retry on transient 5xx/network codes.
Example fix
// before
if ( !errorCode.equals( "NoSuchKey" ) ) {
throw new FileSystemException( "vfs.provider/get-type.error", getQualifiedName(), e2 );
}
// after
if ( !errorCode.equals( "NoSuchKey" ) ) {
if ( errorCode.startsWith( "Internal" ) || errorCode.equals( "RequestTimeout" ) ) {
// retry transient failures
retryAttach();
} else {
throw new FileSystemException( "vfs.provider/get-type.error", getQualifiedName(), e2 );
}
} Defensive patterns
Strategy: try-catch
Validate before calling
// check bucket exists/accessible before resolving files
try {
s3.headBucket( new HeadBucketRequest( bucketName ) );
} catch ( AmazonServiceException e ) {
throw new IllegalStateException( "Bucket inaccessible: " + bucketName + " code=" + e.getErrorCode() );
} Try / catch
try {
FileObject fo = fs.resolveFile( "s3://bucket/key" );
} catch ( FileSystemException e ) {
if ( e.getCause() instanceof AmazonServiceException ) {
String code = ((AmazonServiceException) e.getCause()).getErrorCode();
if ( !"NoSuchKey".equals( code ) ) { /* real connectivity/permission issue */ }
}
} Prevention
- Verify bucket names against the target account before use
- Keep credentials refreshed for long-running servers
- Match region/endpoint to the bucket's actual region
- Log AWS error codes, not just messages, when diagnosing
When it happens
Trigger: Attaching (resolving) an S3 VFS file when S3 returns an error code other than NoSuchKey: AccessDenied, InvalidAccessKeyId, network timeout, 403 from a missing bucket, or wrong endpoint/region.
Common situations: Bucket name typo (bucket resolves to another account → 403), IAM policy lacking s3:GetObject, expired session credentials, or S3 VFS used with a path in a nonexistent bucket.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- vfs.provider/get-type.error
- FileSystemException wrapping SdkClientException
- vfs.provider.local/create-folder.error
- vfs.provider.s3/transfer.error
- Exception getting the list of buckets
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/ab9ee9855bd1d7ee.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/s3-vfs/core/src/main/java/org/pentaho/s3/vfs/S3FileObject.java:153
injectType( FileType.FOLDER );
} catch ( AmazonS3Exception e2 ) {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName( newPath.getValue() )
.withPrefix( keyWithDelimiter )
.withDelimiter( DELIMITER );
ObjectListing ol = fileSystem.getS3Client().listObjects( listObjectsRequest );
if ( !( ol.getCommonPrefixes().isEmpty() && ol.getObjectSummaries().isEmpty() ) ) {
injectType( FileType.FOLDER );
} else {
//Folders don't really exist - they will generate a "NoSuchKey" exception
String errorCode = e2.getErrorCode();
// confirms key doesn't exist but connection okay
if ( !errorCode.equals( "NoSuchKey" ) ) {
// bubbling up other connection errors
logger.error( "Could not get information on " + getQualifiedName(),
e2 ); // make sure this gets printed for the user
throw new FileSystemException( "vfs.provider/get-type.error", getQualifiedName(), e2 );
}
}
}
}
// See if the first name on the path is actually a bucket. If not, it's probably an old-style path.
protected SimpleEntry<String, String> fixFilePath( String key, String bucket ) {
String newBucket = bucket;
String newKey = key;
//see if the folder exists; if not, it might be from an old path and the real bucket is in the key
if ( !bucketExists( bucket ) ) {
logger.warn( "Bucket {} from original path not found, might be an old path from the old driver", bucket );
if ( key.split( DELIMITER ).length > 1 ) {
newBucket = key.split( DELIMITER )[0];
newKey = key.replaceFirst( newBucket + DELIMITER, "" );
} else {
newBucket = key;View on GitHub (pinned to f3058517a1)