apache/hadoop · error · UnsupportedActionException

Cannot request to satisfy storage policy when storage policy

Error message

Cannot request to satisfy storage policy when storage policy satisfier feature has been disabled by admin. Seek for an admin help to enable it or use Mover tool.

What it means

satisfyStoragePolicy calls validateStoragePolicySatisfy first. If blockManager.getSPSManager() is null — the StoragePolicySatisfier was never instantiated because dfs.storage.policy.satisfier.mode is unset or 'none' — the request dies with UnsupportedActionException pointing to admin enablement or the Mover tool.

Source

Thrown at hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java:2624

            dir, blockManager, src, logRetryCache);
      } finally {
        writeUnlock(RwLockMode.FS, operationName,
            getLockReportInfoSupplier(src, null, auditStat));
      }
    } catch (AccessControlException e) {
      logAuditEvent(false, operationName, src);
      throw e;
    }
    getEditLog().logSync();
    logAuditEvent(true, operationName, src, null, auditStat);
  }

  private void validateStoragePolicySatisfy()
      throws UnsupportedActionException, IOException {
    // checks sps status
    boolean disabled = (blockManager.getSPSManager() == null);
    if (disabled) {
      throw new UnsupportedActionException(
          "Cannot request to satisfy storage policy "
              + "when storage policy satisfier feature has been disabled"
              + " by admin. Seek for an admin help to enable it "
              + "or use Mover tool.");
    }
    // checks SPS Q has many outstanding requests. It will throw IOException if
    // the limit exceeds.
    blockManager.getSPSManager().verifyOutstandingPathQLimit();
  }

  /**
   * unset storage policy set for a given file or a directory.
   *
   * @param src file/directory path
   * @throws  IOException
   */
  void unsetStoragePolicy(String src) throws IOException {
    final String operationName = "unsetStoragePolicy";

View on GitHub (pinned to 2add963021)

Solutions

  1. Enable the satisfier: set dfs.storage.policy.satisfier.mode=external (or internal) in the NameNode's hdfs-site.xml, restart NameNodes, and for external mode deploy the external SPS service
  2. Keep SPS off and move blocks per policy with `hdfs mover -p <path>` instead
  3. Also confirm dfs.storage.policy.enabled=true, otherwise the earlier checkStoragePolicyEnabled check rejects the call first

Example fix

# before
hdfs dfsadmin -satisfyStoragePolicy -path /data    # UnsupportedActionException
# after: hdfs-site.xml on NameNodes: dfs.storage.policy.satisfier.mode=external, restart NNs, deploy external SPS
# immediate fallback without SPS:
hdfs mover -p /data
Defensive patterns

Strategy: validation

Validate before calling

String mode = conf.get("dfs.storage.policy.satisfier.mode", "none");
if ("none".equals(mode) || mode == null) { useMoverInstead(path); }

Try / catch

catch (UnsupportedActionException e) { if (e.getMessage() != null && e.getMessage().contains("storage policy satisfier")) useMoverInstead(path); else throw e; }

Prevention

When it happens

Trigger: `hdfs dfsadmin -satisfyStoragePolicy -path <p>` (ClientProtocol.satisfyStoragePolicy) on a NameNode where dfs.storage.policy.satisfier.mode is not set to 'internal' or 'external'.

Common situations: SPS ships disabled/experimental by default; operators follow satisfyStoragePolicy docs without enabling the mode; external-mode clusters where the external SPS service was never deployed; storage.policy.enabled=true but satisfier mode left empty.

Related errors


AI-assisted analysis of apache/hadoop@2add963021 (2026-08-22). Data as JSON: /api/errors/7dbbb36e84900801. Report an issue: GitHub.