HDFS-14957. INodeReference Space Consumed was not same in QuotaUsage and ContentSummary. Contributed by hemanthboyina.

This commit is contained in:
Surendra Singh Lilhore 2020-01-09 12:04:05 +05:30
parent 58db04ce15
commit 6304f94bc0
2 changed files with 65 additions and 3 deletions

View File

@ -873,8 +873,18 @@ public class INodeFile extends INodeWithAdditionalFields
counts.addContent(Content.FILE, 1);
final long fileLen = computeFileSize(snapshotId);
counts.addContent(Content.LENGTH, fileLen);
counts.addContent(Content.DISKSPACE, storagespaceConsumed(null)
.getStorageSpace());
FileWithSnapshotFeature sf = getFileWithSnapshotFeature();
if (sf == null) {
counts.addContent(Content.DISKSPACE,
storagespaceConsumed(null).getStorageSpace());
} else if (isStriped()) {
counts.addContent(Content.DISKSPACE,
storagespaceConsumedStriped().getStorageSpace());
} else {
long diskSpaceQuota = getDiskSpaceQuota(counts, sf, snapshotId);
counts.addContent(Content.DISKSPACE, diskSpaceQuota);
}
if (getStoragePolicyID() != BLOCK_STORAGE_POLICY_ID_UNSPECIFIED){
BlockStoragePolicy bsp = summary.getBlockStoragePolicySuite().
@ -890,6 +900,34 @@ public class INodeFile extends INodeWithAdditionalFields
return summary;
}
/**
* Compute disk space consumed by all the blocks in snapshots.
*/
private long getDiskSpaceQuota(ContentCounts counts,
FileWithSnapshotFeature sf, int lastSnapshotId) {
FileDiffList fileDiffList = sf.getDiffs();
int last = fileDiffList.getLastSnapshotId();
if (lastSnapshotId == Snapshot.CURRENT_STATE_ID
|| last == Snapshot.CURRENT_STATE_ID) {
return storagespaceConsumed(null).getStorageSpace();
}
final long ssDeltaNoReplication;
short replication;
if (last < lastSnapshotId) {
ssDeltaNoReplication = computeFileSize(true, false);
replication = getFileReplication();
} else {
int sid = fileDiffList.getSnapshotById(lastSnapshotId);
ssDeltaNoReplication = computeFileSize(sid);
replication = getFileReplication(sid);
}
return ssDeltaNoReplication * replication;
}
/** The same as computeFileSize(null). */
public final long computeFileSize() {
return computeFileSize(CURRENT_STATE_ID);

View File

@ -2474,4 +2474,28 @@ public class TestRenameWithSnapshots {
output.println(b);
return b;
}
/**
* Test getContentsummary and getQuotausage for an INodeReference.
*/
@Test(timeout = 300000)
public void testQuotaForRenameFileInSnapshot() throws Exception {
final Path snapshotDir = new Path("/testRenameWithSnapshot");
hdfs.mkdirs(snapshotDir, new FsPermission((short) 0777));
final Path file = new Path(snapshotDir, "file");
DFSTestUtil.createFile(hdfs, file, BLOCKSIZE, REPL, SEED);
hdfs.allowSnapshot(snapshotDir);
hdfs.createSnapshot(snapshotDir, "s0");
hdfs.mkdirs(new Path("/dir1"));
// Truncate a file which exists in snapshot , that is an
// INodeReference
hdfs.truncate(file, 10);
hdfs.rename(file, new Path("/dir1"));
assertEquals(hdfs.getContentSummary(new Path("/")).getSpaceConsumed(),
hdfs.getQuotaUsage(new Path("/")).getSpaceConsumed());
assertEquals(
hdfs.getContentSummary(new Path("/")).getFileAndDirectoryCount(),
hdfs.getQuotaUsage(new Path("/")).getFileAndDirectoryCount());
}
}