HDFS-9534. Add CLI command to clear storage policy from a path. (Contributed by Xiaobing Zhou)
This commit is contained in:
parent
700b0e4019
commit
27941a1811
|
@ -2658,6 +2658,16 @@ public abstract class FileSystem extends Configured implements Closeable {
|
||||||
+ " doesn't support setStoragePolicy");
|
+ " doesn't support setStoragePolicy");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unset the storage policy set for a given file or directory.
|
||||||
|
* @param src file or directory path.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void unsetStoragePolicy(Path src) throws IOException {
|
||||||
|
throw new UnsupportedOperationException(getClass().getSimpleName()
|
||||||
|
+ " doesn't support unsetStoragePolicy");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query the effective storage policy ID for the given file or directory.
|
* Query the effective storage policy ID for the given file or directory.
|
||||||
*
|
*
|
||||||
|
|
|
@ -632,6 +632,11 @@ public class FilterFileSystem extends FileSystem {
|
||||||
fs.setStoragePolicy(src, policyName);
|
fs.setStoragePolicy(src, policyName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unsetStoragePolicy(Path src) throws IOException {
|
||||||
|
fs.unsetStoragePolicy(src);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockStoragePolicySpi getStoragePolicy(final Path src)
|
public BlockStoragePolicySpi getStoragePolicy(final Path src)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
|
@ -210,6 +210,8 @@ public class TestHarFileSystem {
|
||||||
public void setStoragePolicy(Path src, String policyName)
|
public void setStoragePolicy(Path src, String policyName)
|
||||||
throws IOException;
|
throws IOException;
|
||||||
|
|
||||||
|
public void unsetStoragePolicy(Path src) throws IOException;
|
||||||
|
|
||||||
public BlockStoragePolicySpi getStoragePolicy(final Path src)
|
public BlockStoragePolicySpi getStoragePolicy(final Path src)
|
||||||
throws IOException;
|
throws IOException;
|
||||||
|
|
||||||
|
|
|
@ -1430,6 +1430,24 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unset storage policy set for a given file/directory.
|
||||||
|
* @param src file/directory name
|
||||||
|
*/
|
||||||
|
public void unsetStoragePolicy(String src) throws IOException {
|
||||||
|
checkOpen();
|
||||||
|
try (TraceScope ignored = newPathTraceScope("unsetStoragePolicy", src)) {
|
||||||
|
namenode.unsetStoragePolicy(src);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
throw e.unwrapRemoteException(AccessControlException.class,
|
||||||
|
FileNotFoundException.class,
|
||||||
|
SafeModeException.class,
|
||||||
|
NSQuotaExceededException.class,
|
||||||
|
UnresolvedPathException.class,
|
||||||
|
SnapshotAccessControlException.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param path file/directory name
|
* @param path file/directory name
|
||||||
* @return Get the storage policy for specified path
|
* @return Get the storage policy for specified path
|
||||||
|
|
|
@ -513,6 +513,31 @@ public class DistributedFileSystem extends FileSystem {
|
||||||
}.resolve(this, absF);
|
}.resolve(this, absF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unsetStoragePolicy(final Path src)
|
||||||
|
throws IOException {
|
||||||
|
statistics.incrementWriteOps(1);
|
||||||
|
Path absF = fixRelativePart(src);
|
||||||
|
new FileSystemLinkResolver<Void>() {
|
||||||
|
@Override
|
||||||
|
public Void doCall(final Path p) throws IOException {
|
||||||
|
dfs.unsetStoragePolicy(getPathName(p));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public Void next(final FileSystem fs, final Path p) throws IOException {
|
||||||
|
if (fs instanceof DistributedFileSystem) {
|
||||||
|
((DistributedFileSystem) fs).unsetStoragePolicy(p);
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"Cannot perform unsetStoragePolicy on a "
|
||||||
|
+ "non-DistributedFileSystem: " + src + " -> " + p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.resolve(this, absF);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockStoragePolicySpi getStoragePolicy(Path path) throws IOException {
|
public BlockStoragePolicySpi getStoragePolicy(Path path) throws IOException {
|
||||||
statistics.incrementReadOps(1);
|
statistics.incrementReadOps(1);
|
||||||
|
|
|
@ -281,6 +281,19 @@ public interface ClientProtocol {
|
||||||
void setStoragePolicy(String src, String policyName)
|
void setStoragePolicy(String src, String policyName)
|
||||||
throws IOException;
|
throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unset the storage policy set for a given file or directory.
|
||||||
|
* @param src Path of an existing file/directory.
|
||||||
|
* @throws SnapshotAccessControlException If access is denied
|
||||||
|
* @throws org.apache.hadoop.fs.UnresolvedLinkException if <code>src</code>
|
||||||
|
* contains a symlink
|
||||||
|
* @throws java.io.FileNotFoundException If file/dir <code>src</code> is not
|
||||||
|
* found
|
||||||
|
* @throws QuotaExceededException If changes violate the quota restriction
|
||||||
|
*/
|
||||||
|
@Idempotent
|
||||||
|
void unsetStoragePolicy(String src) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the storage policy for a file/directory.
|
* Get the storage policy for a file/directory.
|
||||||
* @param path
|
* @param path
|
||||||
|
|
|
@ -134,6 +134,7 @@ import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.Recove
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RefreshNodesRequestProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RefreshNodesRequestProto;
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCacheDirectiveRequestProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCacheDirectiveRequestProto;
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCachePoolRequestProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCachePoolRequestProto;
|
||||||
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.UnsetStoragePolicyRequestProto;
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.Rename2RequestProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.Rename2RequestProto;
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RenameRequestProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RenameRequestProto;
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RenameSnapshotRequestProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RenameSnapshotRequestProto;
|
||||||
|
@ -1466,6 +1467,17 @@ public class ClientNamenodeProtocolTranslatorPB implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unsetStoragePolicy(String src) throws IOException {
|
||||||
|
UnsetStoragePolicyRequestProto req = UnsetStoragePolicyRequestProto
|
||||||
|
.newBuilder().setSrc(src).build();
|
||||||
|
try {
|
||||||
|
rpcProxy.unsetStoragePolicy(null, req);
|
||||||
|
} catch (ServiceException e) {
|
||||||
|
throw ProtobufHelper.getRemoteException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockStoragePolicy getStoragePolicy(String path) throws IOException {
|
public BlockStoragePolicy getStoragePolicy(String path) throws IOException {
|
||||||
GetStoragePolicyRequestProto request = GetStoragePolicyRequestProto
|
GetStoragePolicyRequestProto request = GetStoragePolicyRequestProto
|
||||||
|
|
|
@ -113,6 +113,13 @@ message SetStoragePolicyRequestProto {
|
||||||
message SetStoragePolicyResponseProto { // void response
|
message SetStoragePolicyResponseProto { // void response
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message UnsetStoragePolicyRequestProto {
|
||||||
|
required string src = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message UnsetStoragePolicyResponseProto {
|
||||||
|
}
|
||||||
|
|
||||||
message GetStoragePolicyRequestProto {
|
message GetStoragePolicyRequestProto {
|
||||||
required string path = 1;
|
required string path = 1;
|
||||||
}
|
}
|
||||||
|
@ -745,6 +752,8 @@ service ClientNamenodeProtocol {
|
||||||
returns(SetReplicationResponseProto);
|
returns(SetReplicationResponseProto);
|
||||||
rpc setStoragePolicy(SetStoragePolicyRequestProto)
|
rpc setStoragePolicy(SetStoragePolicyRequestProto)
|
||||||
returns(SetStoragePolicyResponseProto);
|
returns(SetStoragePolicyResponseProto);
|
||||||
|
rpc unsetStoragePolicy(UnsetStoragePolicyRequestProto)
|
||||||
|
returns(UnsetStoragePolicyResponseProto);
|
||||||
rpc getStoragePolicy(GetStoragePolicyRequestProto)
|
rpc getStoragePolicy(GetStoragePolicyRequestProto)
|
||||||
returns(GetStoragePolicyResponseProto);
|
returns(GetStoragePolicyResponseProto);
|
||||||
rpc getStoragePolicies(GetStoragePoliciesRequestProto)
|
rpc getStoragePolicies(GetStoragePoliciesRequestProto)
|
||||||
|
|
|
@ -1047,6 +1047,9 @@ Release 2.9.0 - UNRELEASED
|
||||||
|
|
||||||
HDFS-7964. Add support for async edit logging. (Daryn Sharp)
|
HDFS-7964. Add support for async edit logging. (Daryn Sharp)
|
||||||
|
|
||||||
|
HDFS-9534. Add CLI command to clear storage policy from a path.
|
||||||
|
(Xiaobing Zhou via Arpit Agarwal)
|
||||||
|
|
||||||
OPTIMIZATIONS
|
OPTIMIZATIONS
|
||||||
|
|
||||||
BUG FIXES
|
BUG FIXES
|
||||||
|
|
|
@ -157,6 +157,8 @@ import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.Remove
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCacheDirectiveResponseProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCacheDirectiveResponseProto;
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCachePoolRequestProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCachePoolRequestProto;
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCachePoolResponseProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RemoveCachePoolResponseProto;
|
||||||
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.UnsetStoragePolicyRequestProto;
|
||||||
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.UnsetStoragePolicyResponseProto;
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.Rename2RequestProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.Rename2RequestProto;
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.Rename2ResponseProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.Rename2ResponseProto;
|
||||||
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RenameRequestProto;
|
import org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos.RenameRequestProto;
|
||||||
|
@ -262,6 +264,9 @@ public class ClientNamenodeProtocolServerSideTranslatorPB implements
|
||||||
GetSnapshottableDirListingResponseProto.newBuilder().build();
|
GetSnapshottableDirListingResponseProto.newBuilder().build();
|
||||||
static final SetStoragePolicyResponseProto VOID_SET_STORAGE_POLICY_RESPONSE =
|
static final SetStoragePolicyResponseProto VOID_SET_STORAGE_POLICY_RESPONSE =
|
||||||
SetStoragePolicyResponseProto.newBuilder().build();
|
SetStoragePolicyResponseProto.newBuilder().build();
|
||||||
|
static final UnsetStoragePolicyResponseProto
|
||||||
|
VOID_UNSET_STORAGE_POLICY_RESPONSE =
|
||||||
|
UnsetStoragePolicyResponseProto.newBuilder().build();
|
||||||
|
|
||||||
private static final CreateResponseProto VOID_CREATE_RESPONSE =
|
private static final CreateResponseProto VOID_CREATE_RESPONSE =
|
||||||
CreateResponseProto.newBuilder().build();
|
CreateResponseProto.newBuilder().build();
|
||||||
|
@ -1485,6 +1490,18 @@ public class ClientNamenodeProtocolServerSideTranslatorPB implements
|
||||||
return VOID_SET_STORAGE_POLICY_RESPONSE;
|
return VOID_SET_STORAGE_POLICY_RESPONSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UnsetStoragePolicyResponseProto unsetStoragePolicy(
|
||||||
|
RpcController controller, UnsetStoragePolicyRequestProto request)
|
||||||
|
throws ServiceException {
|
||||||
|
try {
|
||||||
|
server.unsetStoragePolicy(request.getSrc());
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new ServiceException(e);
|
||||||
|
}
|
||||||
|
return VOID_UNSET_STORAGE_POLICY_RESPONSE;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GetStoragePolicyResponseProto getStoragePolicy(
|
public GetStoragePolicyResponseProto getStoragePolicy(
|
||||||
RpcController controller, GetStoragePolicyRequestProto request)
|
RpcController controller, GetStoragePolicyRequestProto request)
|
||||||
|
|
|
@ -37,6 +37,8 @@ import org.apache.hadoop.hdfs.server.blockmanagement.BlockStoragePolicySuite;
|
||||||
import org.apache.hadoop.hdfs.util.EnumCounters;
|
import org.apache.hadoop.hdfs.util.EnumCounters;
|
||||||
import org.apache.hadoop.security.AccessControlException;
|
import org.apache.hadoop.security.AccessControlException;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -158,13 +160,31 @@ public class FSDirAttrOp {
|
||||||
return isFile;
|
return isFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HdfsFileStatus setStoragePolicy(
|
static HdfsFileStatus unsetStoragePolicy(FSDirectory fsd, BlockManager bm,
|
||||||
FSDirectory fsd, BlockManager bm, String src, final String policyName)
|
String src) throws IOException {
|
||||||
|
return setStoragePolicy(fsd, bm, src,
|
||||||
|
HdfsConstants.BLOCK_STORAGE_POLICY_ID_UNSPECIFIED, "unset");
|
||||||
|
}
|
||||||
|
|
||||||
|
static HdfsFileStatus setStoragePolicy(FSDirectory fsd, BlockManager bm,
|
||||||
|
String src, final String policyName) throws IOException {
|
||||||
|
// get the corresponding policy and make sure the policy name is valid
|
||||||
|
BlockStoragePolicy policy = bm.getStoragePolicy(policyName);
|
||||||
|
if (policy == null) {
|
||||||
|
throw new HadoopIllegalArgumentException(
|
||||||
|
"Cannot find a block policy with the name " + policyName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return setStoragePolicy(fsd, bm, src, policy.getId(), "set");
|
||||||
|
}
|
||||||
|
|
||||||
|
static HdfsFileStatus setStoragePolicy(FSDirectory fsd, BlockManager bm,
|
||||||
|
String src, final byte policyId, final String operation)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
if (!fsd.isStoragePolicyEnabled()) {
|
if (!fsd.isStoragePolicyEnabled()) {
|
||||||
throw new IOException(
|
throw new IOException(String.format(
|
||||||
"Failed to set storage policy since "
|
"Failed to %s storage policy since %s is set to false.", operation,
|
||||||
+ DFS_STORAGE_POLICY_ENABLED_KEY + " is set to false.");
|
DFS_STORAGE_POLICY_ENABLED_KEY));
|
||||||
}
|
}
|
||||||
FSPermissionChecker pc = fsd.getPermissionChecker();
|
FSPermissionChecker pc = fsd.getPermissionChecker();
|
||||||
byte[][] pathComponents = FSDirectory.getPathComponentsForReservedPath(src);
|
byte[][] pathComponents = FSDirectory.getPathComponentsForReservedPath(src);
|
||||||
|
@ -178,14 +198,8 @@ public class FSDirAttrOp {
|
||||||
fsd.checkPathAccess(pc, iip, FsAction.WRITE);
|
fsd.checkPathAccess(pc, iip, FsAction.WRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the corresponding policy and make sure the policy name is valid
|
unprotectedSetStoragePolicy(fsd, bm, iip, policyId);
|
||||||
BlockStoragePolicy policy = bm.getStoragePolicy(policyName);
|
fsd.getEditLog().logSetStoragePolicy(src, policyId);
|
||||||
if (policy == null) {
|
|
||||||
throw new HadoopIllegalArgumentException(
|
|
||||||
"Cannot find a block policy with the name " + policyName);
|
|
||||||
}
|
|
||||||
unprotectedSetStoragePolicy(fsd, bm, iip, policy.getId());
|
|
||||||
fsd.getEditLog().logSetStoragePolicy(src, policy.getId());
|
|
||||||
} finally {
|
} finally {
|
||||||
fsd.writeUnlock();
|
fsd.writeUnlock();
|
||||||
}
|
}
|
||||||
|
@ -446,8 +460,8 @@ public class FSDirAttrOp {
|
||||||
return file.getBlocks();
|
return file.getBlocks();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unprotectedSetStoragePolicy(
|
static void unprotectedSetStoragePolicy(FSDirectory fsd, BlockManager bm,
|
||||||
FSDirectory fsd, BlockManager bm, INodesInPath iip, byte policyId)
|
INodesInPath iip, final byte policyId)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
assert fsd.hasWriteLock();
|
assert fsd.hasWriteLock();
|
||||||
final INode inode = iip.getLastINode();
|
final INode inode = iip.getLastINode();
|
||||||
|
@ -457,10 +471,12 @@ public class FSDirAttrOp {
|
||||||
}
|
}
|
||||||
final int snapshotId = iip.getLatestSnapshotId();
|
final int snapshotId = iip.getLatestSnapshotId();
|
||||||
if (inode.isFile()) {
|
if (inode.isFile()) {
|
||||||
BlockStoragePolicy newPolicy = bm.getStoragePolicy(policyId);
|
if (policyId != HdfsConstants.BLOCK_STORAGE_POLICY_ID_UNSPECIFIED) {
|
||||||
if (newPolicy.isCopyOnCreateFile()) {
|
BlockStoragePolicy newPolicy = bm.getStoragePolicy(policyId);
|
||||||
throw new HadoopIllegalArgumentException(
|
if (newPolicy.isCopyOnCreateFile()) {
|
||||||
"Policy " + newPolicy + " cannot be set after file creation.");
|
throw new HadoopIllegalArgumentException("Policy " + newPolicy
|
||||||
|
+ " cannot be set after file creation.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockStoragePolicy currentPolicy =
|
BlockStoragePolicy currentPolicy =
|
||||||
|
@ -473,7 +489,8 @@ public class FSDirAttrOp {
|
||||||
}
|
}
|
||||||
inode.asFile().setStoragePolicyID(policyId, snapshotId);
|
inode.asFile().setStoragePolicyID(policyId, snapshotId);
|
||||||
} else if (inode.isDirectory()) {
|
} else if (inode.isDirectory()) {
|
||||||
setDirStoragePolicy(fsd, inode.asDirectory(), policyId, snapshotId);
|
setDirStoragePolicy(fsd, inode.asDirectory(), policyId,
|
||||||
|
snapshotId);
|
||||||
} else {
|
} else {
|
||||||
throw new FileNotFoundException(iip.getPath()
|
throw new FileNotFoundException(iip.getPath()
|
||||||
+ " is not a file or directory");
|
+ " is not a file or directory");
|
||||||
|
@ -485,11 +502,18 @@ public class FSDirAttrOp {
|
||||||
int latestSnapshotId) throws IOException {
|
int latestSnapshotId) throws IOException {
|
||||||
List<XAttr> existingXAttrs = XAttrStorage.readINodeXAttrs(inode);
|
List<XAttr> existingXAttrs = XAttrStorage.readINodeXAttrs(inode);
|
||||||
XAttr xAttr = BlockStoragePolicySuite.buildXAttr(policyId);
|
XAttr xAttr = BlockStoragePolicySuite.buildXAttr(policyId);
|
||||||
List<XAttr> newXAttrs = FSDirXAttrOp.setINodeXAttrs(fsd, existingXAttrs,
|
List<XAttr> newXAttrs = null;
|
||||||
Arrays.asList(xAttr),
|
if (policyId == HdfsConstants.BLOCK_STORAGE_POLICY_ID_UNSPECIFIED) {
|
||||||
EnumSet.of(
|
List<XAttr> toRemove = Lists.newArrayList();
|
||||||
XAttrSetFlag.CREATE,
|
toRemove.add(xAttr);
|
||||||
XAttrSetFlag.REPLACE));
|
List<XAttr> removed = Lists.newArrayList();
|
||||||
|
newXAttrs = FSDirXAttrOp.filterINodeXAttrs(existingXAttrs, toRemove,
|
||||||
|
removed);
|
||||||
|
} else {
|
||||||
|
newXAttrs = FSDirXAttrOp.setINodeXAttrs(fsd, existingXAttrs,
|
||||||
|
Arrays.asList(xAttr),
|
||||||
|
EnumSet.of(XAttrSetFlag.CREATE, XAttrSetFlag.REPLACE));
|
||||||
|
}
|
||||||
XAttrStorage.updateINodeXAttrs(inode, newXAttrs, latestSnapshotId);
|
XAttrStorage.updateINodeXAttrs(inode, newXAttrs, latestSnapshotId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1960,6 +1960,28 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
||||||
logAuditEvent(true, "setStoragePolicy", src, null, auditStat);
|
logAuditEvent(true, "setStoragePolicy", src, null, auditStat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unset storage policy set for a given file or a directory.
|
||||||
|
*
|
||||||
|
* @param src file/directory path
|
||||||
|
*/
|
||||||
|
void unsetStoragePolicy(String src) throws IOException {
|
||||||
|
HdfsFileStatus auditStat;
|
||||||
|
checkOperation(OperationCategory.WRITE);
|
||||||
|
writeLock();
|
||||||
|
try {
|
||||||
|
checkOperation(OperationCategory.WRITE);
|
||||||
|
checkNameNodeSafeMode("Cannot unset storage policy for " + src);
|
||||||
|
auditStat = FSDirAttrOp.unsetStoragePolicy(dir, blockManager, src);
|
||||||
|
} catch (AccessControlException e) {
|
||||||
|
logAuditEvent(false, "unsetStoragePolicy", src);
|
||||||
|
throw e;
|
||||||
|
} finally {
|
||||||
|
writeUnlock();
|
||||||
|
}
|
||||||
|
getEditLog().logSync();
|
||||||
|
logAuditEvent(true, "unsetStoragePolicy", src, null, auditStat);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Get the storage policy for a file or a directory.
|
* Get the storage policy for a file or a directory.
|
||||||
*
|
*
|
||||||
|
|
|
@ -770,6 +770,13 @@ class NameNodeRpcServer implements NamenodeProtocols {
|
||||||
return namesystem.setReplication(src, replication);
|
return namesystem.setReplication(src, replication);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unsetStoragePolicy(String src)
|
||||||
|
throws IOException {
|
||||||
|
checkNNStartup();
|
||||||
|
namesystem.unsetStoragePolicy(src);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setStoragePolicy(String src, String policyName)
|
public void setStoragePolicy(String src, String policyName)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
|
@ -224,9 +224,55 @@ public class StoragePolicyAdmin extends Configured implements Tool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Command to unset the storage policy set for a file/directory */
|
||||||
|
private static class UnsetStoragePolicyCommand
|
||||||
|
implements AdminHelper.Command {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "-unsetStoragePolicy";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getShortUsage() {
|
||||||
|
return "[" + getName() + " -path <path>]\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLongUsage() {
|
||||||
|
TableListing listing = AdminHelper.getOptionDescriptionListing();
|
||||||
|
listing.addRow("<path>", "The path of the file/directory "
|
||||||
|
+ "from which the storage policy will be unset.");
|
||||||
|
return getShortUsage() + "\n"
|
||||||
|
+ "Unset the storage policy set for a file/directory.\n\n"
|
||||||
|
+ listing.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int run(Configuration conf, List<String> args) throws IOException {
|
||||||
|
final String path = StringUtils.popOptionWithArgument("-path", args);
|
||||||
|
if (path == null) {
|
||||||
|
System.err.println("Please specify the path from which "
|
||||||
|
+ "the storage policy will be unsetd.\nUsage: " + getLongUsage());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
final DistributedFileSystem dfs = AdminHelper.getDFS(conf);
|
||||||
|
try {
|
||||||
|
dfs.unsetStoragePolicy(new Path(path));
|
||||||
|
System.out.println("Unset storage policy from " + path);
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println(AdminHelper.prettifyException(e));
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static final AdminHelper.Command[] COMMANDS = {
|
private static final AdminHelper.Command[] COMMANDS = {
|
||||||
new ListStoragePoliciesCommand(),
|
new ListStoragePoliciesCommand(),
|
||||||
new SetStoragePolicyCommand(),
|
new SetStoragePolicyCommand(),
|
||||||
new GetStoragePolicyCommand()
|
new GetStoragePolicyCommand(),
|
||||||
|
new UnsetStoragePolicyCommand()
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -26,6 +26,7 @@ Archival Storage, SSD & Memory
|
||||||
* [Storage Policy Commands](#Storage_Policy_Commands)
|
* [Storage Policy Commands](#Storage_Policy_Commands)
|
||||||
* [List Storage Policies](#List_Storage_Policies)
|
* [List Storage Policies](#List_Storage_Policies)
|
||||||
* [Set Storage Policy](#Set_Storage_Policy)
|
* [Set Storage Policy](#Set_Storage_Policy)
|
||||||
|
* [Unset Storage Policy](#Unset_Storage_Policy)
|
||||||
* [Get Storage Policy](#Get_Storage_Policy)
|
* [Get Storage Policy](#Get_Storage_Policy)
|
||||||
|
|
||||||
Introduction
|
Introduction
|
||||||
|
@ -150,6 +151,20 @@ Set a storage policy to a file or a directory.
|
||||||
| `-path <path>` | The path referring to either a directory or a file. |
|
| `-path <path>` | The path referring to either a directory or a file. |
|
||||||
| `-policy <policy>` | The name of the storage policy. |
|
| `-policy <policy>` | The name of the storage policy. |
|
||||||
|
|
||||||
|
### Unset Storage Policy
|
||||||
|
|
||||||
|
Unset a storage policy to a file or a directory. After the unset command the storage policy of the nearest ancestor will apply, and if there is no policy on any ancestor then the default storage policy will apply.
|
||||||
|
|
||||||
|
* Command:
|
||||||
|
|
||||||
|
hdfs storagepolicies -unsetStoragePolicy -path <path>
|
||||||
|
|
||||||
|
* Arguments:
|
||||||
|
|
||||||
|
| | |
|
||||||
|
|:---- |:---- |
|
||||||
|
| `-path <path>` | The path referring to either a directory or a file. |
|
||||||
|
|
||||||
### Get Storage Policy
|
### Get Storage Policy
|
||||||
|
|
||||||
Get the storage policy of a file or a directory.
|
Get the storage policy of a file or a directory.
|
||||||
|
|
|
@ -0,0 +1,268 @@
|
||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.hadoop.hdfs;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
|
import org.apache.hadoop.hdfs.protocol.BlockStoragePolicy;
|
||||||
|
import org.apache.hadoop.hdfs.server.blockmanagement.BlockStoragePolicySuite;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TestApplyingStoragePolicy {
|
||||||
|
private static final short REPL = 1;
|
||||||
|
private static final int SIZE = 128;
|
||||||
|
|
||||||
|
private static Configuration conf;
|
||||||
|
private static MiniDFSCluster cluster;
|
||||||
|
private static DistributedFileSystem fs;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void clusterSetUp() throws IOException {
|
||||||
|
conf = new HdfsConfiguration();
|
||||||
|
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(REPL).build();
|
||||||
|
cluster.waitActive();
|
||||||
|
fs = cluster.getFileSystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void clusterShutdown() throws IOException{
|
||||||
|
if(fs != null) {
|
||||||
|
fs.close();
|
||||||
|
fs = null;
|
||||||
|
}
|
||||||
|
if(cluster != null) {
|
||||||
|
cluster.shutdown();
|
||||||
|
cluster = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStoragePolicyByDefault() throws Exception {
|
||||||
|
final Path foo = new Path("/foo");
|
||||||
|
final Path bar = new Path(foo, "bar");
|
||||||
|
final Path wow = new Path(bar, "wow");
|
||||||
|
final Path fooz = new Path(bar, "/fooz");
|
||||||
|
DFSTestUtil.createFile(fs, wow, SIZE, REPL, 0);
|
||||||
|
|
||||||
|
final BlockStoragePolicySuite suite = BlockStoragePolicySuite
|
||||||
|
.createDefaultSuite();
|
||||||
|
final BlockStoragePolicy hot = suite.getPolicy("HOT");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: storage policy is HOT by default or inherited from nearest
|
||||||
|
* ancestor, if not explicitly specified for newly created dir/file.
|
||||||
|
*/
|
||||||
|
assertEquals(fs.getStoragePolicy(foo), hot);
|
||||||
|
assertEquals(fs.getStoragePolicy(bar), hot);
|
||||||
|
assertEquals(fs.getStoragePolicy(wow), hot);
|
||||||
|
try {
|
||||||
|
fs.getStoragePolicy(fooz);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetAndUnsetStoragePolicy() throws Exception {
|
||||||
|
final Path foo = new Path("/foo");
|
||||||
|
final Path bar = new Path(foo, "bar");
|
||||||
|
final Path wow = new Path(bar, "wow");
|
||||||
|
final Path fooz = new Path(bar, "/fooz");
|
||||||
|
DFSTestUtil.createFile(fs, wow, SIZE, REPL, 0);
|
||||||
|
|
||||||
|
final BlockStoragePolicySuite suite = BlockStoragePolicySuite
|
||||||
|
.createDefaultSuite();
|
||||||
|
final BlockStoragePolicy warm = suite.getPolicy("WARM");
|
||||||
|
final BlockStoragePolicy cold = suite.getPolicy("COLD");
|
||||||
|
final BlockStoragePolicy hot = suite.getPolicy("HOT");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: set storage policy
|
||||||
|
*/
|
||||||
|
fs.setStoragePolicy(foo, warm.getName());
|
||||||
|
fs.setStoragePolicy(bar, cold.getName());
|
||||||
|
fs.setStoragePolicy(wow, hot.getName());
|
||||||
|
try {
|
||||||
|
fs.setStoragePolicy(fooz, warm.getName());
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: get storage policy after set
|
||||||
|
*/
|
||||||
|
assertEquals(fs.getStoragePolicy(foo), warm);
|
||||||
|
assertEquals(fs.getStoragePolicy(bar), cold);
|
||||||
|
assertEquals(fs.getStoragePolicy(wow), hot);
|
||||||
|
try {
|
||||||
|
fs.getStoragePolicy(fooz);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: unset storage policy
|
||||||
|
*/
|
||||||
|
fs.unsetStoragePolicy(foo);
|
||||||
|
fs.unsetStoragePolicy(bar);
|
||||||
|
fs.unsetStoragePolicy(wow);
|
||||||
|
try {
|
||||||
|
fs.unsetStoragePolicy(fooz);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: get storage policy after unset
|
||||||
|
*/
|
||||||
|
assertEquals(fs.getStoragePolicy(foo), hot);
|
||||||
|
assertEquals(fs.getStoragePolicy(bar), hot);
|
||||||
|
assertEquals(fs.getStoragePolicy(wow), hot);
|
||||||
|
try {
|
||||||
|
fs.getStoragePolicy(fooz);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNestedStoragePolicy() throws Exception {
|
||||||
|
final Path foo = new Path("/foo");
|
||||||
|
final Path bar = new Path(foo, "bar");
|
||||||
|
final Path wow = new Path(bar, "wow");
|
||||||
|
final Path fooz = new Path("/foos");
|
||||||
|
DFSTestUtil.createFile(fs, wow, SIZE, REPL, 0);
|
||||||
|
|
||||||
|
final BlockStoragePolicySuite suite = BlockStoragePolicySuite
|
||||||
|
.createDefaultSuite();
|
||||||
|
final BlockStoragePolicy warm = suite.getPolicy("WARM");
|
||||||
|
final BlockStoragePolicy cold = suite.getPolicy("COLD");
|
||||||
|
final BlockStoragePolicy hot = suite.getPolicy("HOT");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: set storage policy
|
||||||
|
*/
|
||||||
|
fs.setStoragePolicy(foo, warm.getName());
|
||||||
|
fs.setStoragePolicy(bar, cold.getName());
|
||||||
|
fs.setStoragePolicy(wow, hot.getName());
|
||||||
|
try {
|
||||||
|
fs.setStoragePolicy(fooz, warm.getName());
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: get storage policy after set
|
||||||
|
*/
|
||||||
|
assertEquals(fs.getStoragePolicy(foo), warm);
|
||||||
|
assertEquals(fs.getStoragePolicy(bar), cold);
|
||||||
|
assertEquals(fs.getStoragePolicy(wow), hot);
|
||||||
|
try {
|
||||||
|
fs.getStoragePolicy(fooz);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: unset storage policy in the case of being nested
|
||||||
|
*/
|
||||||
|
// unset wow
|
||||||
|
fs.unsetStoragePolicy(wow);
|
||||||
|
// inherit storage policy from wow's nearest ancestor
|
||||||
|
assertEquals(fs.getStoragePolicy(wow), cold);
|
||||||
|
// unset bar
|
||||||
|
fs.unsetStoragePolicy(bar);
|
||||||
|
// inherit storage policy from bar's nearest ancestor
|
||||||
|
assertEquals(fs.getStoragePolicy(bar), warm);
|
||||||
|
// unset foo
|
||||||
|
fs.unsetStoragePolicy(foo);
|
||||||
|
// default storage policy is applied, since no more available ancestors
|
||||||
|
assertEquals(fs.getStoragePolicy(foo), hot);
|
||||||
|
// unset fooz
|
||||||
|
try {
|
||||||
|
fs.unsetStoragePolicy(fooz);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: default storage policy is applied, since no explicit policies from
|
||||||
|
* ancestors are available
|
||||||
|
*/
|
||||||
|
assertEquals(fs.getStoragePolicy(foo), hot);
|
||||||
|
assertEquals(fs.getStoragePolicy(bar), hot);
|
||||||
|
assertEquals(fs.getStoragePolicy(wow), hot);
|
||||||
|
try {
|
||||||
|
fs.getStoragePolicy(fooz);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetAndGetStoragePolicy() throws IOException {
|
||||||
|
final Path foo = new Path("/foo");
|
||||||
|
final Path bar = new Path(foo, "bar");
|
||||||
|
final Path fooz = new Path("/fooz");
|
||||||
|
DFSTestUtil.createFile(fs, bar, SIZE, REPL, 0);
|
||||||
|
|
||||||
|
final BlockStoragePolicySuite suite = BlockStoragePolicySuite
|
||||||
|
.createDefaultSuite();
|
||||||
|
final BlockStoragePolicy warm = suite.getPolicy("WARM");
|
||||||
|
final BlockStoragePolicy cold = suite.getPolicy("COLD");
|
||||||
|
final BlockStoragePolicy hot = suite.getPolicy("HOT");
|
||||||
|
|
||||||
|
assertEquals(fs.getStoragePolicy(foo), hot);
|
||||||
|
assertEquals(fs.getStoragePolicy(bar), hot);
|
||||||
|
try {
|
||||||
|
fs.getStoragePolicy(fooz);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: set storage policy
|
||||||
|
*/
|
||||||
|
fs.setStoragePolicy(foo, warm.getName());
|
||||||
|
fs.setStoragePolicy(bar, cold.getName());
|
||||||
|
try {
|
||||||
|
fs.setStoragePolicy(fooz, warm.getName());
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: get storage policy after set
|
||||||
|
*/
|
||||||
|
assertEquals(fs.getStoragePolicy(foo), warm);
|
||||||
|
assertEquals(fs.getStoragePolicy(bar), cold);
|
||||||
|
try {
|
||||||
|
fs.getStoragePolicy(fooz);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertTrue(e instanceof FileNotFoundException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -62,6 +62,69 @@ public class TestStoragePolicyCommands {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetAndUnsetStoragePolicy() throws Exception {
|
||||||
|
final Path foo = new Path("/foo");
|
||||||
|
final Path bar = new Path(foo, "bar");
|
||||||
|
final Path wow = new Path(bar, "wow");
|
||||||
|
DFSTestUtil.createFile(fs, wow, SIZE, REPL, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: set storage policy
|
||||||
|
*/
|
||||||
|
final StoragePolicyAdmin admin = new StoragePolicyAdmin(conf);
|
||||||
|
DFSTestUtil.toolRun(admin, "-setStoragePolicy -path /foo -policy WARM", 0,
|
||||||
|
"Set storage policy WARM on " + foo.toString());
|
||||||
|
DFSTestUtil.toolRun(admin, "-setStoragePolicy -path /foo/bar -policy COLD",
|
||||||
|
0, "Set storage policy COLD on " + bar.toString());
|
||||||
|
DFSTestUtil.toolRun(admin, "-setStoragePolicy -path /foo/bar/wow -policy HOT",
|
||||||
|
0, "Set storage policy HOT on " + wow.toString());
|
||||||
|
DFSTestUtil.toolRun(admin, "-setStoragePolicy -path /fooz -policy WARM",
|
||||||
|
2, "File/Directory does not exist: /fooz");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: get storage policy after set
|
||||||
|
*/
|
||||||
|
final BlockStoragePolicySuite suite = BlockStoragePolicySuite
|
||||||
|
.createDefaultSuite();
|
||||||
|
final BlockStoragePolicy warm = suite.getPolicy("WARM");
|
||||||
|
final BlockStoragePolicy cold = suite.getPolicy("COLD");
|
||||||
|
final BlockStoragePolicy hot = suite.getPolicy("HOT");
|
||||||
|
DFSTestUtil.toolRun(admin, "-getStoragePolicy -path /foo", 0,
|
||||||
|
"The storage policy of " + foo.toString() + ":\n" + warm);
|
||||||
|
DFSTestUtil.toolRun(admin, "-getStoragePolicy -path /foo/bar", 0,
|
||||||
|
"The storage policy of " + bar.toString() + ":\n" + cold);
|
||||||
|
DFSTestUtil.toolRun(admin, "-getStoragePolicy -path /foo/bar/wow", 0,
|
||||||
|
"The storage policy of " + wow.toString() + ":\n" + hot);
|
||||||
|
DFSTestUtil.toolRun(admin, "-getStoragePolicy -path /fooz", 2,
|
||||||
|
"File/Directory does not exist: /fooz");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: unset storage policy
|
||||||
|
*/
|
||||||
|
DFSTestUtil.toolRun(admin, "-unsetStoragePolicy -path /foo", 0,
|
||||||
|
"Unset storage policy from " + foo.toString());
|
||||||
|
DFSTestUtil.toolRun(admin, "-unsetStoragePolicy -path /foo/bar", 0,
|
||||||
|
"Unset storage policy from " + bar.toString());
|
||||||
|
DFSTestUtil.toolRun(admin, "-unsetStoragePolicy -path /foo/bar/wow", 0,
|
||||||
|
"Unset storage policy from " + wow.toString());
|
||||||
|
DFSTestUtil.toolRun(admin, "-unsetStoragePolicy -path /fooz", 2,
|
||||||
|
"File/Directory does not exist: /fooz");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* test: get storage policy after unset
|
||||||
|
*/
|
||||||
|
DFSTestUtil.toolRun(admin, "-getStoragePolicy -path /foo", 0,
|
||||||
|
"The storage policy of " + foo.toString() + " is unspecified");
|
||||||
|
DFSTestUtil.toolRun(admin, "-getStoragePolicy -path /foo/bar", 0,
|
||||||
|
"The storage policy of " + bar.toString() + " is unspecified");
|
||||||
|
DFSTestUtil.toolRun(admin, "-getStoragePolicy -path /foo/bar/wow", 0,
|
||||||
|
"The storage policy of " + wow.toString() + " is unspecified");
|
||||||
|
DFSTestUtil.toolRun(admin, "-getStoragePolicy -path /fooz", 2,
|
||||||
|
"File/Directory does not exist: /fooz");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetAndGetStoragePolicy() throws Exception {
|
public void testSetAndGetStoragePolicy() throws Exception {
|
||||||
final Path foo = new Path("/foo");
|
final Path foo = new Path("/foo");
|
||||||
|
|
Loading…
Reference in New Issue