{"record":{"id":"7dbbb36e84900801","repo":"apache/hadoop","slug":"cannot-request-to-satisfy-storage-policy-when-stor","errorCode":null,"errorMessage":"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.","messagePattern":"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\\.","errorType":"exception","errorClass":"UnsupportedActionException","httpStatus":null,"severity":"error","filePath":"hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java","lineNumber":2624,"sourceCode":"            dir, blockManager, src, logRetryCache);\n      } finally {\n        writeUnlock(RwLockMode.FS, operationName,\n            getLockReportInfoSupplier(src, null, auditStat));\n      }\n    } catch (AccessControlException e) {\n      logAuditEvent(false, operationName, src);\n      throw e;\n    }\n    getEditLog().logSync();\n    logAuditEvent(true, operationName, src, null, auditStat);\n  }\n\n  private void validateStoragePolicySatisfy()\n      throws UnsupportedActionException, IOException {\n    // checks sps status\n    boolean disabled = (blockManager.getSPSManager() == null);\n    if (disabled) {\n      throw new UnsupportedActionException(\n          \"Cannot request to satisfy storage policy \"\n              + \"when storage policy satisfier feature has been disabled\"\n              + \" by admin. Seek for an admin help to enable it \"\n              + \"or use Mover tool.\");\n    }\n    // checks SPS Q has many outstanding requests. It will throw IOException if\n    // the limit exceeds.\n    blockManager.getSPSManager().verifyOutstandingPathQLimit();\n  }\n\n  /**\n   * unset storage policy set for a given file or a directory.\n   *\n   * @param src file/directory path\n   * @throws  IOException\n   */\n  void unsetStoragePolicy(String src) throws IOException {\n    final String operationName = \"unsetStoragePolicy\";","sourceCodeStart":2606,"sourceCodeEnd":2642,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java#L2606-L2642","documentation":"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.","triggerScenarios":"`hdfs dfsadmin -satisfyStoragePolicy -path <p>` (ClientProtocol.satisfyStoragePolicy) on a NameNode where dfs.storage.policy.satisfier.mode is not set to 'internal' or 'external'.","commonSituations":"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.","solutions":["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","Keep SPS off and move blocks per policy with `hdfs mover -p <path>` instead","Also confirm dfs.storage.policy.enabled=true, otherwise the earlier checkStoragePolicyEnabled check rejects the call first"],"exampleFix":"# before\nhdfs dfsadmin -satisfyStoragePolicy -path /data    # UnsupportedActionException\n# after: hdfs-site.xml on NameNodes: dfs.storage.policy.satisfier.mode=external, restart NNs, deploy external SPS\n# immediate fallback without SPS:\nhdfs mover -p /data","handlingStrategy":"validation","validationCode":"String mode = conf.get(\"dfs.storage.policy.satisfier.mode\", \"none\");\nif (\"none\".equals(mode) || mode == null) { useMoverInstead(path); }","typeGuard":null,"tryCatchPattern":"catch (UnsupportedActionException e) { if (e.getMessage() != null && e.getMessage().contains(\"storage policy satisfier\")) useMoverInstead(path); else throw e; }","preventionTips":["Treat satisfyStoragePolicy as opt-in: verify the satisfier mode before calling","Keep a Mover-based fallback for tiering when SPS is not deployed"],"tags":["hdfs","storage-policy-satisfier","sps","mover","configuration"],"backgroundTag":"feature-disabled-by-config","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}