HDFS-15624. fix the function of setting quota by storage type (#2377)
1. puts NVDIMM to the end of storage type enum to make sure compatibility. 2. adds check to make sure the software layout version is satisfied Co-authored-by: su xu <kevinbrandon@163.com> Co-authored-by: huangtianhua <huangtianhua223@gmail.com> Signed-off-by: Mingliang Liu <liuml07@apache.org> Signed-off-by: Ayush Saxena <ayushsaxena@apache.org> Signed-off-by: Vinayakumar B <vinayakumarb@apache.org>
This commit is contained in:
parent
6fc26ad539
commit
394b9f7a5c
|
@ -34,13 +34,12 @@ import org.apache.hadoop.util.StringUtils;
|
|||
@InterfaceAudience.Public
|
||||
@InterfaceStability.Unstable
|
||||
public enum StorageType {
|
||||
// sorted by the speed of the storage types, from fast to slow
|
||||
RAM_DISK(true, true),
|
||||
NVDIMM(false, true),
|
||||
SSD(false, false),
|
||||
DISK(false, false),
|
||||
ARCHIVE(false, false),
|
||||
PROVIDED(false, false);
|
||||
PROVIDED(false, false),
|
||||
NVDIMM(false, true);
|
||||
|
||||
private final boolean isTransient;
|
||||
private final boolean isRAM;
|
||||
|
@ -122,4 +121,4 @@ public enum StorageType {
|
|||
StorageType t, String name) {
|
||||
return conf.get(CONF_KEY_HEADER + t.toString() + "." + name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -283,10 +283,10 @@ public class TestCount {
|
|||
count.processOptions(options);
|
||||
String withStorageTypeHeader =
|
||||
// <----13---> <-------17------> <----13-----> <------17------->
|
||||
" NVDIMM_QUOTA REM_NVDIMM_QUOTA " +
|
||||
" SSD_QUOTA REM_SSD_QUOTA DISK_QUOTA REM_DISK_QUOTA " +
|
||||
// <----13---> <-------17------>
|
||||
"ARCHIVE_QUOTA REM_ARCHIVE_QUOTA PROVIDED_QUOTA REM_PROVIDED_QUOTA " +
|
||||
" NVDIMM_QUOTA REM_NVDIMM_QUOTA " +
|
||||
"PATHNAME";
|
||||
verify(out).println(withStorageTypeHeader);
|
||||
verifyNoMoreInteractions(out);
|
||||
|
@ -338,11 +338,11 @@ public class TestCount {
|
|||
count.processOptions(options);
|
||||
String withStorageTypeHeader =
|
||||
// <----13---> <-------17------>
|
||||
" NVDIMM_QUOTA REM_NVDIMM_QUOTA " +
|
||||
" SSD_QUOTA REM_SSD_QUOTA " +
|
||||
" DISK_QUOTA REM_DISK_QUOTA " +
|
||||
"ARCHIVE_QUOTA REM_ARCHIVE_QUOTA " +
|
||||
"PROVIDED_QUOTA REM_PROVIDED_QUOTA " +
|
||||
" NVDIMM_QUOTA REM_NVDIMM_QUOTA " +
|
||||
"PATHNAME";
|
||||
verify(out).println(withStorageTypeHeader);
|
||||
verifyNoMoreInteractions(out);
|
||||
|
|
|
@ -414,13 +414,13 @@ public class TestRouterQuota {
|
|||
QuotaUsage usage = client.getQuotaUsage("/type0");
|
||||
assertEquals(HdfsConstants.QUOTA_RESET, usage.getQuota());
|
||||
assertEquals(HdfsConstants.QUOTA_RESET, usage.getSpaceQuota());
|
||||
verifyTypeQuotaAndConsume(new long[] {-1, -1, -1, ssQuota * 2, -1, -1}, null,
|
||||
usage);
|
||||
verifyTypeQuotaAndConsume(new long[] {-1, -1, ssQuota * 2, -1, -1, -1},
|
||||
null, usage);
|
||||
// Verify /type1 quota on NN1.
|
||||
usage = client.getQuotaUsage("/type1");
|
||||
assertEquals(HdfsConstants.QUOTA_RESET, usage.getQuota());
|
||||
assertEquals(HdfsConstants.QUOTA_RESET, usage.getSpaceQuota());
|
||||
verifyTypeQuotaAndConsume(new long[] {-1, -1, -1, ssQuota, -1, -1}, null,
|
||||
verifyTypeQuotaAndConsume(new long[] {-1, -1, ssQuota, -1, -1, -1}, null,
|
||||
usage);
|
||||
|
||||
FileSystem routerFs = routerContext.getFileSystem();
|
||||
|
@ -431,15 +431,15 @@ public class TestRouterQuota {
|
|||
assertEquals(2, u1.getFileAndDirectoryCount());
|
||||
assertEquals(HdfsConstants.QUOTA_RESET, u1.getSpaceQuota());
|
||||
assertEquals(fileSize * 3, u1.getSpaceConsumed());
|
||||
verifyTypeQuotaAndConsume(new long[] {-1, -1, -1, ssQuota, -1, -1},
|
||||
new long[] {0, 0, 0, fileSize * 3, 0, 0}, u1);
|
||||
verifyTypeQuotaAndConsume(new long[] {-1, -1, ssQuota, -1, -1, -1},
|
||||
new long[] {0, 0, fileSize * 3, 0, 0, 0}, u1);
|
||||
// Verify /type0 storage type quota usage on Router.
|
||||
assertEquals(HdfsConstants.QUOTA_RESET, u0.getQuota());
|
||||
assertEquals(4, u0.getFileAndDirectoryCount());
|
||||
assertEquals(HdfsConstants.QUOTA_RESET, u0.getSpaceQuota());
|
||||
assertEquals(fileSize * 3 * 2, u0.getSpaceConsumed());
|
||||
verifyTypeQuotaAndConsume(new long[] {-1, -1, -1, ssQuota * 2, -1, -1},
|
||||
new long[] {0, 0, 0, fileSize * 3 * 2, 0, 0}, u0);
|
||||
verifyTypeQuotaAndConsume(new long[] {-1, -1, ssQuota * 2, -1, -1, -1},
|
||||
new long[] {0, 0, fileSize * 3 * 2, 0, 0, 0}, u0);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -2431,6 +2431,10 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|||
* @throws IOException
|
||||
*/
|
||||
void setStoragePolicy(String src, String policyName) throws IOException {
|
||||
if (policyName.equalsIgnoreCase(
|
||||
HdfsConstants.ALLNVDIMM_STORAGE_POLICY_NAME)) {
|
||||
requireEffectiveLayoutVersionForFeature(Feature.NVDIMM_SUPPORT);
|
||||
}
|
||||
final String operationName = "setStoragePolicy";
|
||||
checkOperation(OperationCategory.WRITE);
|
||||
checkStoragePolicyEnabled("set storage policy", true);
|
||||
|
@ -3571,6 +3575,9 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|||
if (type != null) {
|
||||
requireEffectiveLayoutVersionForFeature(Feature.QUOTA_BY_STORAGE_TYPE);
|
||||
}
|
||||
if (type == StorageType.NVDIMM) {
|
||||
requireEffectiveLayoutVersionForFeature(Feature.NVDIMM_SUPPORT);
|
||||
}
|
||||
checkOperation(OperationCategory.WRITE);
|
||||
final String operationName = getQuotaCommand(nsQuota, ssQuota);
|
||||
final FSPermissionChecker pc = getPermissionChecker();
|
||||
|
|
|
@ -89,7 +89,8 @@ public class NameNodeLayoutVersion {
|
|||
APPEND_NEW_BLOCK(-62, -61, "Support appending to new block"),
|
||||
QUOTA_BY_STORAGE_TYPE(-63, -61, "Support quota for specific storage types"),
|
||||
ERASURE_CODING(-64, -61, "Support erasure coding"),
|
||||
EXPANDED_STRING_TABLE(-65, -61, "Support expanded string table in fsimage");
|
||||
EXPANDED_STRING_TABLE(-65, -61, "Support expanded string table in fsimage"),
|
||||
NVDIMM_SUPPORT(-66, -61, "Support NVDIMM storage type");
|
||||
|
||||
private final FeatureInfo info;
|
||||
|
||||
|
|
|
@ -1421,29 +1421,29 @@ public class TestBlockStoragePolicy {
|
|||
final EnumMap<StorageType, Integer> map = new EnumMap<>(StorageType.class);
|
||||
|
||||
//put storage type is reversed order
|
||||
map.put(StorageType.NVDIMM, 1);
|
||||
map.put(StorageType.ARCHIVE, 1);
|
||||
map.put(StorageType.DISK, 1);
|
||||
map.put(StorageType.SSD, 1);
|
||||
map.put(StorageType.RAM_DISK, 1);
|
||||
map.put(StorageType.NVDIMM, 1);
|
||||
|
||||
{
|
||||
final Iterator<StorageType> i = map.keySet().iterator();
|
||||
Assert.assertEquals(StorageType.RAM_DISK, i.next());
|
||||
Assert.assertEquals(StorageType.NVDIMM, i.next());
|
||||
Assert.assertEquals(StorageType.SSD, i.next());
|
||||
Assert.assertEquals(StorageType.DISK, i.next());
|
||||
Assert.assertEquals(StorageType.ARCHIVE, i.next());
|
||||
Assert.assertEquals(StorageType.NVDIMM, i.next());
|
||||
}
|
||||
|
||||
{
|
||||
final Iterator<Map.Entry<StorageType, Integer>> i
|
||||
= map.entrySet().iterator();
|
||||
Assert.assertEquals(StorageType.RAM_DISK, i.next().getKey());
|
||||
Assert.assertEquals(StorageType.NVDIMM, i.next().getKey());
|
||||
Assert.assertEquals(StorageType.SSD, i.next().getKey());
|
||||
Assert.assertEquals(StorageType.DISK, i.next().getKey());
|
||||
Assert.assertEquals(StorageType.ARCHIVE, i.next().getKey());
|
||||
Assert.assertEquals(StorageType.NVDIMM, i.next().getKey());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -128,7 +128,8 @@ public class TestLayoutVersion {
|
|||
NameNodeLayoutVersion.Feature.APPEND_NEW_BLOCK,
|
||||
NameNodeLayoutVersion.Feature.QUOTA_BY_STORAGE_TYPE,
|
||||
NameNodeLayoutVersion.Feature.ERASURE_CODING,
|
||||
NameNodeLayoutVersion.Feature.EXPANDED_STRING_TABLE);
|
||||
NameNodeLayoutVersion.Feature.EXPANDED_STRING_TABLE,
|
||||
NameNodeLayoutVersion.Feature.NVDIMM_SUPPORT);
|
||||
for (LayoutFeature f : compatibleFeatures) {
|
||||
assertEquals(String.format("Expected minimum compatible layout version " +
|
||||
"%d for feature %s.", baseLV, f), baseLV,
|
||||
|
|
Loading…
Reference in New Issue