apache/iceberg · error · NotFoundException

Location does not exist: %s

Error message

Location does not exist: %s

What it means

When opening a range read on ADLS Gen2, an underlying BlobStorageException with BLOB_NOT_FOUND error code is converted into Iceberg's NotFoundException with the location in the message. This signals the file at the requested location does not exist in the storage account.

Source

Thrown at azure/src/main/java/org/apache/iceberg/azure/adlsv2/ADLSInputStream.java:241

    if (stream != null) {
      stream.close();
    }
  }

  @SuppressWarnings({"checkstyle:NoFinalizer", "Finalize", "deprecation"})
  @Override
  protected void finalize() throws Throwable {
    super.finalize();
    if (!closed) {
      close(); // releasing resources is more important than printing the warning
      String trace = Joiner.on("\n\t").join(Arrays.copyOfRange(createStack, 1, createStack.length));
      LOG.warn("Unclosed input stream created by:\n\t{}", trace);
    }
  }

  private static void throwNotFoundIfNotPresent(Throwable throwable, String location) {
    if (isFileNotFoundException(throwable)) {
      throw new NotFoundException(throwable, "Location does not exist: %s", location);
    }
  }

  private static boolean isFileNotFoundException(Throwable exception) {
    if (exception instanceof BlobStorageException blobStorageException) {
      return BlobErrorCode.BLOB_NOT_FOUND.equals(blobStorageException.getErrorCode());
    }
    if (exception instanceof DataLakeStorageException dataLakeStorageException) {
      return "PathNotFound".equals(dataLakeStorageException.getErrorCode());
    }
    return false;
  }
}

View on GitHub (pinned to 86d9c8fc54)

Solutions

  1. Verify the full ADLS location (account/container/path) exists and is spelled correctly.
  2. Re-plan the scan: the file was likely deleted by concurrent maintenance; refresh table metadata and retry.
  3. Check container name and filesystem existence in the storage account.
  4. Confirm credentials allow listing/reading so the real error is not masked (permissions usually yield a different code, but verify).
Defensive patterns

Strategy: try-catch

Try / catch

try { readData(); } catch (NotFoundException e) { log.warn("File {} was deleted concurrently, re-planning scan", e.getMessage()); refreshTableMetadata(); retryRead(); }

Prevention

When it happens

Trigger: ADLSInputStream.openRange encounters a PathNotFound/BlobNotFound error from the Azure SDK when reading the file; e.g. the file was deleted between planning and reading, or the path is wrong.

Common situations: Concurrent table compaction/expiry deleting the data file before a task reads it; mistyped storage path in table location; missing container; reading an orphaned file path.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of apache/iceberg@86d9c8fc54 (2026-09-12). Data as JSON: /api/errors/f1d3bb0246e6fa41. Report an issue: GitHub.