Skip to content

Commit d2832de

Browse files
committed
improve
1 parent c0040fe commit d2832de

File tree

3 files changed

+40
-41
lines changed

3 files changed

+40
-41
lines changed

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirRenameOp.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,8 @@ private static Triple<Boolean, Optional<QuotaCounts>, Optional<QuotaCounts>> ver
8585
// Verify srcPath and dstPath without valid 'DirectoryWithQuotaFeature'
8686
// Note: In overwrite scenarios, quota calculation is still required because:
8787
// Overwrite operations delete existing content (affecting rootDir's quota)
88-
if (FSDirectory.verifyPathWithoutValidQuotaFeature(src, src.length() - 1)
89-
&& FSDirectory.verifyPathWithoutValidQuotaFeature(dst, dst.length() - 1)
90-
&& !overwrite) {
88+
if (!overwrite && FSDirectory.verifyPathWithoutValidQuotaFeature(src)
89+
&& FSDirectory.verifyPathWithoutValidQuotaFeature(dst)) {
9190
return Triple.of(false, srcDelta, dstDelta);
9291
}
9392

@@ -768,9 +767,9 @@ long removeSrc() throws IOException {
768767
throw new IOException(error);
769768
} else {
770769
// update the quota count if necessary
771-
Optional<QuotaCounts> countOp = sameStoragePolicy ?
772-
srcSubTreeCount : Optional.empty();
773770
if (updateQuota) {
771+
Optional<QuotaCounts> countOp = sameStoragePolicy ?
772+
srcSubTreeCount : Optional.empty();
774773
fsd.updateCountForDelete(srcChild, srcIIP, countOp);
775774
}
776775
srcIIP = INodesInPath.replace(srcIIP, srcIIP.length() - 1, null);
@@ -787,9 +786,9 @@ boolean removeSrc4OldRename() {
787786
return false;
788787
} else {
789788
// update the quota count if necessary
790-
Optional<QuotaCounts> countOp = sameStoragePolicy ?
791-
srcSubTreeCount : Optional.empty();
792789
if (updateQuota) {
790+
Optional<QuotaCounts> countOp = sameStoragePolicy ?
791+
srcSubTreeCount : Optional.empty();
793792
fsd.updateCountForDelete(srcChild, srcIIP, countOp);
794793
}
795794
srcIIP = INodesInPath.replace(srcIIP, srcIIP.length() - 1, null);

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,19 +1241,18 @@ static void verifyQuota(INodesInPath iip, int pos, QuotaCounts deltas,
12411241
}
12421242
}
12431243
}
1244-
1244+
12451245
/**
12461246
* Verifies that the path from the specified position to the root
12471247
* (excluding the root itself) does not contain any valid quota features.
12481248
*
12491249
* @param iip the INodesInPath containing all the ancestral INodes.
1250-
* @param pos Starting position in the path (0-based index).
12511250
* @return true if no valid quota features are found along the path (root excluded),
12521251
* false if any directory in the path has an active quota feature.
12531252
*/
1254-
static boolean verifyPathWithoutValidQuotaFeature(INodesInPath iip, int pos) {
1255-
// Does not include the root path
1256-
for (int i = Math.min(pos, iip.length()) - 1; i >= 1; i--) {
1253+
static boolean verifyPathWithoutValidQuotaFeature(INodesInPath iip) {
1254+
// Exclude the root inode
1255+
for (int i = iip.length() - 2; i >= 1; i--) {
12571256
final DirectoryWithQuotaFeature q =
12581257
iip.getINode(i).asDirectory().getDirectoryWithQuotaFeature();
12591258
if (q != null) {
@@ -1367,8 +1366,8 @@ private void copyINodeDefaultAcl(INode child, FsPermission modes) {
13671366
* @return an INodesInPath instance containing the new INode
13681367
*/
13691368
@VisibleForTesting
1370-
public INodesInPath addLastINode(INodesInPath existing, INode inode,
1371-
FsPermission modes, boolean checkQuota, Optional<QuotaCounts> quotaCount, boolean updateQuota)
1369+
public INodesInPath addLastINode(INodesInPath existing, INode inode, FsPermission modes,
1370+
boolean checkQuota, Optional<QuotaCounts> quotaCount, boolean updateQuota)
13721371
throws QuotaExceededException {
13731372
assert existing.getLastINode() != null &&
13741373
existing.getLastINode().isDirectory();
@@ -1400,9 +1399,8 @@ public INodesInPath addLastINode(INodesInPath existing, INode inode,
14001399
// always verify inode name
14011400
verifyINodeName(inode.getLocalNameBytes());
14021401

1403-
QuotaCounts counts;
14041402
if (updateQuota) {
1405-
counts = quotaCount.orElseGet(() -> inode.
1403+
QuotaCounts counts = quotaCount.orElseGet(() -> inode.
14061404
computeQuotaUsage(getBlockStoragePolicySuite(),
14071405
parent.getStoragePolicyID(), false,
14081406
Snapshot.CURRENT_STATE_ID));
@@ -1413,7 +1411,7 @@ public INodesInPath addLastINode(INodesInPath existing, INode inode,
14131411
final boolean added = parent.addChild(inode, true,
14141412
existing.getLatestSnapshotId());
14151413
if (!added && updateQuota) {
1416-
counts = quotaCount.orElseGet(() -> inode.
1414+
QuotaCounts counts = quotaCount.orElseGet(() -> inode.
14171415
computeQuotaUsage(getBlockStoragePolicySuite(),
14181416
parent.getStoragePolicyID(), false,
14191417
Snapshot.CURRENT_STATE_ID));

hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestCorrectnessOfQuotaAfterRenameOp.java

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ public void testQuotaUsageWhenRenameWithDifferStoragePolicy() throws Exception {
172172
public void testRenameWithoutValidQuotaFeature() throws Exception {
173173
final int fileLen = 1024;
174174
final short replication = 3;
175-
final Path root = new Path("/testRoot");
175+
final Path root = new Path("/testRename");
176176
assertTrue(dfs.mkdirs(root));
177177

178178
Path testParentDir1 = new Path(root, "testDir1");
@@ -189,36 +189,38 @@ public void testRenameWithoutValidQuotaFeature() throws Exception {
189189
}
190190

191191
// 1. Test rename1
192-
QuotaUsage quotaUsage1 = dfs.getQuotaUsage(new Path("/"));
193-
final Path dstDir1 = new Path(testParentDir2, "dst-dir");
194-
ContentSummary cs1 = dfs.getContentSummary(testParentDir1);
195-
196-
// srcDir=/testRoot/testDir1/src-dir
197-
// dstDir=/testRoot/testDir2/dst-dir dstDir1 not exist
198-
boolean rename = dfs.rename(srcDir, dstDir1);
199-
assertTrue(rename);
200-
ContentSummary cs2 = dfs.getContentSummary(testParentDir2);
201-
assertEquals(cs1, cs2);
202-
203-
QuotaUsage quotaUsage2 = dfs.getQuotaUsage(new Path("/"));
204-
assertEquals(quotaUsage1.getFileAndDirectoryCount(), quotaUsage2.getFileAndDirectoryCount());
192+
ContentSummary rootContentSummary1 = dfs.getContentSummary(new Path("/"));
193+
QuotaUsage rootQuotaUsage1 = dfs.getQuotaUsage(new Path("/"));
194+
ContentSummary contentSummary1 = dfs.getContentSummary(testParentDir1);
195+
// srcDir=/testRename/testDir1/src-dir
196+
// dstDir=/testRename/testDir2/dst-dir dstDir1 not exist
197+
final Path dstDir2 = new Path(testParentDir2, "dst-dir");
198+
assertTrue(dfs.rename(srcDir, dstDir2));
199+
ContentSummary contentSummary2 = dfs.getContentSummary(testParentDir2);
200+
assertEquals(contentSummary1, contentSummary2);
201+
QuotaUsage rootQuotaUsage2 = dfs.getQuotaUsage(new Path("/"));
202+
assertEquals(rootQuotaUsage1.getFileAndDirectoryCount(),
203+
rootQuotaUsage2.getFileAndDirectoryCount());
204+
// The return values of the getContentSummary() and getQuotaUsage() should be consistent
205+
assertEquals(rootContentSummary1.getFileAndDirectoryCount(),
206+
rootQuotaUsage2.getFileAndDirectoryCount());
205207

206208
// 2. Test rename2
207-
final Path dstDir2 = new Path(testParentDir3, "dst-dir");
208-
assertTrue(dfs.mkdirs(dstDir2));
209-
long originDstDir2Usage = dfs.getQuotaUsage(dstDir2).getFileAndDirectoryCount();
210-
// The usage for covering the root dir should not include dstDir2 usage
209+
final Path dstDir3 = new Path(testParentDir3, "dst-dir");
210+
assertTrue(dfs.mkdirs(dstDir3));
211+
long originDstDir2Usage = dfs.getQuotaUsage(dstDir3).getFileAndDirectoryCount();
212+
// Exclude dstDir2 usage
211213
long rootINodeCount1 =
212214
dfs.getQuotaUsage(new Path("/")).getFileAndDirectoryCount() - originDstDir2Usage;
213-
ContentSummary cs3 = dfs.getContentSummary(testParentDir2);
215+
ContentSummary contentSummary3 = dfs.getContentSummary(testParentDir2);
214216

215217
// Src and dst must be same (all file or all dir)
216-
// dstDir1=/testRoot/testDir3/dst-dir
217-
// dstDir2=/testRoot/testDir3/dst-dir
218-
dfs.rename(dstDir1, dstDir2, Options.Rename.OVERWRITE);
218+
// dstDir2=/testRename/testDir3/dst-dir
219+
// dstDir3=/testRename/testDir3/dst-dir
220+
dfs.rename(dstDir2, dstDir3, Options.Rename.OVERWRITE);
219221
long rootINodeCount2 = dfs.getQuotaUsage(new Path("/")).getFileAndDirectoryCount();
220222
assertEquals(rootINodeCount1, rootINodeCount2);
221-
ContentSummary cs4 = dfs.getContentSummary(testParentDir3);
222-
assertEquals(cs3, cs4);
223+
ContentSummary contentSummary4 = dfs.getContentSummary(testParentDir3);
224+
assertEquals(contentSummary3, contentSummary4);
223225
}
224226
}

0 commit comments

Comments
 (0)