juicedata/juicefs · error · IOException

No matching attributes found for remove operation

Error message

No matching attributes found for remove operation

What it means

Raised in removeXAttr when the C library returns ENOATTR or ENODATA, i.e. the named extended attribute does not exist on the file at the time of removal. It mirrors POSIX behavior where removing a missing xattr is an error rather than a no-op.

Solutions

  1. List existing xattrs (getXAttrs) and only remove names that are present
  2. Catch the exception and treat it as success when idempotent removal is desired
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at sdk/java/src/main/java/io/juicefs/JuiceFileSystemImpl.java:2093 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06). Data as JSON: /api/errors/368ef4475804bc0c. Report an issue: GitHub.

Appendix: source

Thrown at sdk/java/src/main/java/io/juicefs/JuiceFileSystemImpl.java:2093

        byte[] arr = new byte[off - last];
        buf.get(last, arr, 0, arr.length);
        result.add(new String(arr));
        last = off + 1;
      }
      off++;
    }
    return result;
  }

  @Override
  public void removeXAttr(Path path, String name) throws IOException {
    if (needCheckPermission() && !checkPathAccess(path, FsAction.WRITE, "removeXAttr")) {
      superGroupFileSystem.removeXAttr(path, name);
      return;
    }
    int r = lib.jfs_removeXattr(Thread.currentThread().getId(), handle, normalizePath(path), name);
    if (r == ENOATTR || r == ENODATA) {
      throw new IOException("No matching attributes found for remove operation");
    }
    if (r < 0)
      throw error(r, path);
  }

  @Override
  public void modifyAclEntries(Path path, List<AclEntry> aclSpec) throws IOException {
    if (needCheckPermission() && !checkOwner(path, "modifyAclEntries")) {
      superGroupFileSystem.modifyAclEntries(path, aclSpec);
      return;
    }
    List<AclEntry> existingEntries = getAllAclEntries(path);
    List<AclEntry> newAcl = AclTransformation.mergeAclEntries(existingEntries, aclSpec);
    setAclInternal(path, newAcl);
  }

  @Override
  public void removeAclEntries(Path path, List<AclEntry> aclSpec) throws IOException {

View on GitHub (pinned to c9a67b23e8)