Skip to main content

Error codes and exit messages

This page describes Fusion's error reporting system, including exit codes, FUSE status codes (errno values), cloud provider error categories, and internal error types.

Error paths

Fusion is a FUSE filesystem that bridges applications and cloud object stores. As such, errors may originate from multiple layers, but will propagate through the filesystem components following three major paths:

  1. Cloud > Storage backend > FUSE Layer > Kernel > Application

    • Errors from the cloud provider (e.g. network timeouts, auth failures, rate limits) are captured by the Storage backend, which normalizes them into provider-agnostic categories (see #cloud-provider-error-categories).
    • The storage backend returns normalized cloud errors (with provider-agnostic categories). It may also return other internal errors when other logic errors are encountered.
    • The FUSE layer maps both cloud errors and internal errors to errno status codes (e.g., ENOENT, EACCES, EREMOTEIO, EIO etc.).
    • The kernel communicates the errno values to the application.
    • Fusion logs cloud errors with structured details (i.e., provider, error code, HTTP status, request ID).
  2. Failures during startup/shutdown → Exit code

    • Startup: Configuration errors, missing credentials, or mount failures will terminate Fusion immediately.
    • Shutdown: Async uploads or consolidation of pending operations.
    • Failures surface as exit code 174 (Fusion I/O error) or 1 (fatal error).
  3. Background operations → Logs

    • Async uploads during normal operation, cache eviction, and snapshot operations log errors but may not surface them to applications.
    • Errors are reported in Fusion (see Fusion logs).

Fusion logs

Fusion emits logs in two formats:

  • Console logs (stderr): Timestamped, human-readable format with [seqera-fusion] prefix. These logs are collected by Seqera Platform and shown in the UI. They provide immediate visibility during runtime.
  • File logs (${workdir}/.fusion.log): Structured logs in JSON format for detailed analysis and troubleshooting.
note

The [seqera-fusion] prefix for console logs was introduced in Fusion v2.5.9, and v2.4.20.

Log fields reference

Fusion uses structured logging with consistent field names. Understanding these fields is essential for troubleshooting.

Cloud error fields

These fields appear automatically when a cloud provider error is detected:

FieldDescriptionExample values
providerCloud provider names3, azure, gcs
error_codeNormalized error category (provider-agnostic)Forbidden, ResourceNotFound, InvalidCredentials
provider_codeProvider-specific error codeS3: NoSuchKey, Azure: BlobNotFound, GCS: invalid
provider_http_statusHTTP status code from cloud provider403, 404, 429, 500
provider_request_idRequest ID for cloud provider support ticketsABCD1234EXAMPLE, b8e8a1f5-...
provider_errorOriginal error message from cloud providerThe specified key does not exist.
tip

When opening support tickets with cloud providers, always include the provider_request_id from logs. This enables their support team to trace the exact request in their systems.

Common operational fields

These fields appear in most log entries to provide operation context:

FieldDescriptionExample values
pathFilesystem path where operation occurred/fusion/s3/bucket/file.txt, /.Trash
operationFUSE operation or internal operation nameRead, Write, Lookup, listDirectory
errorMain error message (non-cloud portion)not found, permission denied
messageHuman-readable log message describing what happenedfind entry error, configuration
levelLog severity leveldebug, info, warn, error, fatal

Log examples

Fatal error (causes termination)

This example indicates Fusion could not authenticate with the cloud provider and terminated immediately:

Console logs:

11:23AM FTL [seqera-fusion] creating data store error="NoCredentialProviders: no valid providers in chain"

File logs (.fusion.log):

{
"level": "fatal",
"error": "NoCredentialProviders: no valid providers in chain",
"time": 1765738531263809778,
"message": "creating data store"
}

Recoverable error (operation failed, Fusion continues)

This example indicates a file lookup failed and returned ENOENT to the application. Fusion continues running:

Console logs:

11:24AM ERR [seqera-fusion] find entry error error="element not found" path=/fusion/s3/bucket/missing-file.txt

File logs (.fusion.log):

{
"level": "error",
"error": "element not found",
"path": "/.Trash",
"time": 1765738531284473208,
"message": "listDirectory"
}

Cloud provider error

This example shows a cloud provider error with structured fields:

File logs (.fusion.log):

{
"level": "error",
"error": "not found",
"provider": "s3",
"error_code": "ResourceNotFound",
"provider_code": "NoSuchKey",
"provider_http_status": 404,
"provider_request_id": "ABCD1234EXAMPLE",
"provider_error": "The specified key does not exist.",
"message": "The requested resource was not found in cloud storage. Verify the file path is correct and the resource exists."
}

Searching logs

Console logs (grep-based searching):

# Find all cloud provider errors
grep 'provider=' .fusion.log

# Find specific error categories
grep 'error_code=' .fusion.log | grep 'Forbidden'

# Find operations on specific paths
grep 'path=/fusion/s3/bucket/file.txt' .fusion.log

JSON logs (jq-based searching):

# Find all cloud errors
jq 'select(.provider != null)' .fusion.log

# Find S3 errors only
jq 'select(.provider == "s3")' .fusion.log

# Find all Forbidden errors across providers
jq 'select(.error_code == "Forbidden")' .fusion.log

# Find errors with request IDs (for cloud support tickets)
jq 'select(.provider_request_id != null) | {provider, provider_request_id, provider_code, message}' .fusion.log

Identify and resolve errors

When troubleshooting Fusion errors:

  1. Check theexit code:

    • Check the task exit status in Platform to understand if Fusion terminated normally (0), encountered an I/O error (174), or had a command issue (127).
  2. Look for an errno code in the logs:

    • If a filesystem operation failed, use the logs to identify the errno status code (e.g., ENOENT, EREMOTEIO, EIO) returned to the application.
  3. Check for cloud error fields:

    • If you see EREMOTEIO or cloud-related failures, identify the specific cloud error fields in the logs:
      • provider
      • provider_code
      • provider_http_status
      • provider_request_id
    note

    The field error_code indicates Fusion's internal categorization of the cloud error normalized across providers (e.g., ResourceNotFound, Forbidden, RateLimited). See Cloud provider error categories

  4. Identify the mapped internal error (if any):

    • The errno codes map back to either a cloud error category or a specific internal error (e.g., EACCES indicates an authentication problem, EREMOTEIO indicates a cloud backend issue). Check the Fusion logs for more details on the error that triggered a specific errno code (see Fusion logs).
tip

Add the following to the nextflow.config to enable debug logging for the full log:

process.containerOptions = { '-e FUSION_LOG_LEVEL=debug' }

Exit codes

Fusion binaries return specific exit codes to indicate the outcome of execution.

tip

For exit codes 175 and 176, see Fusion Snapshots.

Fusion binary

Exit codeConstantDescription
0-Success, normal completion.
1-Fatal error during startup (via log.Fatal()).
127-Command not found (.command.sh missing). Triggers automatic retry up to FUSION_MAX_MOUNT_RETRIES times.
174ErrorExitCodeFusion I/O error, application-level input/output error.
note

log.Fatal() calls during startup produce exit code 1. See Fatal error messages for the specific messages that trigger this exit.

The sysexits.h standard uses exit code 74 for "input/output error" and reserves 150-199 for application use. In Fusion's context, 174 means "application input/output error".

ScenarioLog cueSuggested next step
Failed to start FUSE process in backgroundon FUSE processCheck FUSE/kernel support. Verify /dev/fuse exists.
Failed to send SIGTERM to FUSE processon FUSE sigterm sendCheck kernel logs (dmesg) for crashed processes.
Failed to wait for FUSE process terminationon FUSE stop waitCheck for zombie processes. Review kernel signal handling.
Error during filesystem shutdownon file system shutdownCheck Fusion logs for pending upload errors. See Fusion logs.
Error during filesystem unmounton file system unmountRun fusermount -u /fusion or umount -l /fusion manually.
Failed read/write path validationcheck-rw or check-roVerify cloud credentials and bucket permissions.

GPU tracer binary

Exit codeMeaningWhen
0SuccessNormal completion (GPU detected or not)
1ErrorFailed to start GPU monitoring
2Invalid inputMissing PID, invalid PID format, or PID <= 0

errno status codes

Fusion maps internal errors to standard POSIX status codes returned to the operating system. These are the errno values that applications receive when filesystem operations fail.

note

For a complete list of errno values and their meanings, see the Linux errno man page or run errno -l on a Linux system.

Returned status codes

Fusion's filesystem operations actively returns these status codes:

errnoStandard messageDescriptionCommon causes in Fusion
N/A0SuccessOperation completed successfully
ENOENT2No such file or directoryFile/entry not found in cache or remote store; cloud provider ResourceNotFound/ContainerNotFound errors
EINTR4Interrupted system callContext cancelled
EIO5I/O errorGeneral I/O errors, internal failures, remote store errors, unknown non-cloud errors
EACCES13Permission deniedWrite attempt to read-only path; cloud provider Unauthenticated/InvalidCredentials/Forbidden/AccountError errors
EBUSY16Device or resource busyCloud provider RateLimited/Busy/ResourceArchived errors
EEXIST17File existsCloud provider Conflict errors (e.g., resource already exists)
EINVAL22Invalid argumentInvalid parameters (e.g., readlink on non-symlink)
EROFS30Read-only file systemAttempt to modify read-only object
ERANGE34Result too largeBuffer too small for xattr value
ENOSYS38Function not implementedOperation not wired in Fusion's FUSE layer
ENOATTR93No such attributeExtended attribute not found
ENOTSUP95Operation not supportedOperation explicitly rejected (for example, hard links)
ETIMEDOUT110Connection timed outContext deadline exceeded
EREMOTEIO121Remote I/O errorCloud provider errors (QuotaExceeded, unknown cloud errors)

Troubleshoot errno status codes

When you encounter an errno status code, use the following table to identify likely causes and next steps:

StatusLikely causes and troubleshooting steps
ENOENTPath typo or object deleted from remote store. Check if the path exists using your cloud provider's CLI (aws s3 ls, gsutil ls, az storage blob list).
EACCESMount configured as read-only, object ACL blocking writes, or authentication/permission issues. Check cloud IAM permissions and credentials.
EEXISTResource already exists in cloud storage. Check if the operation was retried or if there's a naming conflict.
EIOGeneral I/O error or unknown internal failure. Check Fusion logs for the underlying cause. See Fusion logs.
EREMOTEIOCloud provider error. Check Fusion logs for detailed cloud error information (provider, error code, HTTP status, request ID). May indicate quota exceeded, rate limiting, or other cloud-specific issues. See Fusion logs.
EBUSYCloud provider rate limiting requests or temporarily busy. Retry with backoff. Check cloud provider dashboard for service status.
ETIMEDOUTOperation timed out due to network connectivity issues or slow cloud response. Check network connection and cloud service status.
EINTRCaller cancelled the operation. Usually safe to retry.
ENOTSUPUnsupported operation. Adjust workload to avoid hard links. Use symlinks or copies instead.
ENOSYSOperation not implemented in Fusion. Check if the operation is supported or use an alternative approach.

ENOSYS vs ENOTSUP

Fusion uses both to indicate an operation cannot be performed, but they have different meanings:

  • ENOSYS (Function not implemented): The operation is not implemented in Fusion's FUSE layer. This is the default response for operations Fusion doesn't handle.

  • ENOTSUP (Operation not supported): The operation exists in Fusion but is explicitly rejected for specific cases. For example:

    • Hard links (Link): Fusion explicitly returns ENOTSUP because hard links cannot be meaningfully represented on object storage backends.
    • Whiteout character device creation: During overlay-style renames, if creating the whiteout marker fails, ENOTSUP signals this specific failure.
tip

If you encounter ENOTSUP on hard links, use symbolic links (ln -s) or file copies instead.

EREMOTEIO vs EIO

Fusion distinguishes between local I/O failures and cloud provider errors:

  • EREMOTEIO (Remote I/O error): Used specifically for cloud provider errors. This errno value indicates that:

    • The error originated from a remote cloud storage system (S3, Azure Blob Storage, or Google Cloud Storage).
    • The failure is due to cloud provider issues (quota exceeded, rate limiting, service unavailable).
    • Debugging should focus on cloud provider logs and status, not local system issues.
    • The request ID from logs can be provided to cloud support for investigation.
  • EIO (I/O error): Used as a generic catch-all for:

    • Unknown internal errors that are not cloud-related.
    • Local filesystem or system failures.
    • Errors that cannot be classified into more specific categories.
note

Using EREMOTEIO for cloud errors provides more accurate error context, making it easier to distinguish between local system issues and cloud service problems during troubleshooting and monitoring.

tip

When you see EREMOTEIO, check the Fusion logs for cloud error fields: provider, error_code, provider_code, provider_http_status, and provider_request_id. See Fusion logs.

Error mapping

Fusion maps cloud provider errors and internal errors to errno status codes.

Cloud provider error mapping

Cloud provider errors are normalized and mapped to appropriate errno code:

Cloud error categoryerrno codeExamples
UnauthenticatedEACCESNo credentials provided
InvalidCredentialsEACCESWrong, malformed, or expired credentials
ForbiddenEACCESValid credentials, insufficient permissions
AccountErrorEACCESAccount disabled, suspended, or has billing issues
ResourceNotFoundENOENTS3 "NoSuchKey", Azure "BlobNotFound", GCS 404
ContainerNotFoundENOENTS3 "NoSuchBucket", Azure "ContainerNotFound", GCS 404 with bucket error
RateLimitedEBUSYRequest rate limits exceeded
BusyEBUSYService temporarily unavailable or overloaded
ResourceArchivedEBUSYResource in archived/transitional state (for example, Glacier)
ConflictEEXISTResource already exists or precondition failed
InvalidArgumentEINVALMalformed request or invalid parameters
QuotaExceededEREMOTEIOStorage quota or capacity limit reached
Unknown (cloud errors)EREMOTEIOUnclassified cloud provider errors

Internal error mapping

Internal errorerrno code
Not foundENOENT
Read-onlyEROFS
UnsupportedENOSYS
Context cancelledEINTR
Context deadline exceededETIMEDOUT
Other errorsEIO

Cloud provider error categories

Fusion normalizes errors from different cloud storage providers (S3, Azure Blob Storage, Google Cloud Storage) into consistent categories. When you see an error_code field in Fusion logs, it represents one of these categories:

CategoryDescriptionCommon provider codes
ResourceNotFoundRequested resource (object/file) does not existS3: "NoSuchKey", Azure: "BlobNotFound", GCS: HTTP 404
ContainerNotFoundStorage container (bucket) does not existS3: "NoSuchBucket", Azure: "ContainerNotFound", GCS: HTTP 404 with bucket error
UnauthenticatedNo credentials providedS3: "MissingSecurityHeader", GCS: HTTP 401 with no credentials
InvalidCredentialsCredentials provided but wrong, malformed, or expiredS3: "InvalidAccessKeyId", "ExpiredToken", Azure: "InvalidAuthenticationInfo", GCS: HTTP 401 with invalid credentials
ForbiddenValid credentials but insufficient permissionsS3: "AccessDenied", Azure: "AuthorizationPermissionMismatch", GCS: HTTP 403
AccountErrorAccount-level problems (disabled, suspended, billing issues)S3: "AccountProblem", Azure: "AccountIsDisabled", GCS: HTTP 403 with specific messages
ResourceArchivedResource exists but is in archived/transitional stateS3: "InvalidObjectState" (Glacier), Azure: "BlobArchived"
RateLimitedRequest rate limits exceededS3: "SlowDown", Azure: "TooManyRequests", GCS: HTTP 429
BusyService temporarily unavailable or overloadedS3: "ServiceUnavailable", "InternalError", Azure: "ServerBusy", GCS: HTTP 503
ConflictResource state conflict or precondition failureS3: "BucketAlreadyExists", Azure: "BlobAlreadyExists", "ConditionNotMet", GCS: HTTP 409/412
InvalidArgumentMalformed request or invalid parametersS3: "InvalidArgument", "InvalidRange", Azure: "InvalidQueryParameterValue", GCS: HTTP 400
QuotaExceededStorage quota or capacity limit reachedS3: "TooManyBuckets", Azure: "AccountLimitExceeded", GCS: HTTP 429 with quota message
UnknownUnclassified or unexpected errorVarious

Fatal error messages

These messages indicate Fusion terminated immediately with exit code 1. They occur during startup or critical failures:

MessageCause
configuring fusionFailed to configure Fusion (invalid config, missing environment variables)
building remote store optionsFailed to build remote store options
creating metadata storeFailed to create metadata store
creating data storeFailed to create data store connection
validating work pathWork path validation failed (empty prefix or connection error)
creating filesystemFailed to create FUSE filesystem
mounting filesystemFailed to mount FUSE filesystem
could not get current job attemptFailed to get job attempt from compute environment