apache/iceberg · error · NoSuchNamespaceException

Namespace %s(%s) properties object is absent

Error message

Namespace %s(%s) properties object is absent

What it means

Failure in EcsCatalog.loadNamespaceMetadata: the namespace exists as a listing entry but its ECS properties object (the marker object holding namespace properties) is absent, so metadata cannot be loaded. This indicates an incomplete or externally-created namespace layout in the ECS bucket.

Source

Thrown at dell/src/main/java/org/apache/iceberg/dell/ecs/EcsCatalog.java:325

  private Namespace parseNamespace(Namespace parent, EcsURI prefix, S3Object s3Object) {
    String key = s3Object.getKey();
    Preconditions.checkArgument(
        key.startsWith(prefix.name()), "List result should have same prefix", key, prefix);

    String namespaceName =
        key.substring(prefix.name().length(), key.length() - NAMESPACE_OBJECT_SUFFIX.length());
    String[] namespace = Arrays.copyOf(parent.levels(), parent.levels().length + 1);
    namespace[namespace.length - 1] = namespaceName;
    return Namespace.of(namespace);
  }

  /** Load namespace properties. */
  @Override
  public Map<String, String> loadNamespaceMetadata(Namespace namespace)
      throws NoSuchNamespaceException {
    EcsURI namespaceObject = namespaceURI(namespace);
    if (!objectMetadata(namespaceObject).isPresent()) {
      throw new NoSuchNamespaceException(
          "Namespace %s(%s) properties object is absent", namespace, namespaceObject);
    }

    Map<String, String> result = loadProperties(namespaceObject).content();

    LOG.debug("Loaded metadata for namespace {} found {}", namespace, result);
    return result;
  }

  @Override
  public boolean dropNamespace(Namespace namespace) throws NamespaceNotEmptyException {
    if (!namespace.isEmpty() && !namespaceExists(namespace)) {
      throw new NoSuchNamespaceException("Namespace %s does not exist", namespace);
    }

    if (!listNamespaces(namespace).isEmpty() || !listTables(namespace).isEmpty()) {
      throw new NamespaceNotEmptyException("Namespace %s is not empty", namespace);
    }

View on GitHub (pinned to 86d9c8fc54)

Solutions

  1. Confirm the namespace exists with namespaceExists before loading metadata
  2. Recreate the namespace with createNamespace if it was deleted
  3. Verify the catalog's warehouse/ECS prefix configuration matches where namespaces were created

Example fix

// before
Map<String,String> props = catalog.loadNamespaceMetadata(ns);
// after
if (catalog.namespaceExists(ns)) {
  Map<String,String> props = catalog.loadNamespaceMetadata(ns);
}
Defensive patterns

Strategy: try-catch

Validate before calling

boolean exists = catalog.namespaceExists(namespace);

Try / catch

try { return catalog.loadNamespaceMetadata(ns); } catch (NoSuchNamespaceException e) { return Collections.emptyMap(); }

Prevention

When it happens

Trigger: Calling loadNamespaceMetadata(namespace) when no namespace properties object exists at the computed namespaceURI, e.g. namespace never created or its marker object deleted out of band.

Common situations: Loading a namespace after someone deleted the marker object directly in ECS, wrong catalog warehouse prefix configuration, case/typo differences in namespace names.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


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