/** Test if the quota can be correctly updated for append */ @Test(timeout = 60000) public void testUpdateQuotaForAppend() throws Exception { final Path foo = new Path(dir, "foo"); final Path bar = new Path(foo, "bar"); long currentFileLen = BLOCKSIZE; DFSTestUtil.createFile(dfs, bar, currentFileLen, REPLICATION, seed); dfs.setQuota(foo, Long.MAX_VALUE - 1, Long.MAX_VALUE - 1); // append half of the block data, the previous file length is at block // boundary DFSTestUtil.appendFile(dfs, bar, BLOCKSIZE / 2); currentFileLen += (BLOCKSIZE / 2); INodeDirectory fooNode = fsdir.getINode4Write(foo.toString()).asDirectory(); assertTrue(fooNode.isQuotaSet()); QuotaCounts quota = fooNode.getDirectoryWithQuotaFeature().getSpaceConsumed(); long ns = quota.getNameSpace(); long ds = quota.getStorageSpace(); assertEquals(2, ns); // foo and bar assertEquals(currentFileLen * REPLICATION, ds); ContentSummary c = dfs.getContentSummary(foo); assertEquals(c.getSpaceConsumed(), ds); // append another block, the previous file length is not at block boundary DFSTestUtil.appendFile(dfs, bar, BLOCKSIZE); currentFileLen += BLOCKSIZE; quota = fooNode.getDirectoryWithQuotaFeature().getSpaceConsumed(); ns = quota.getNameSpace(); ds = quota.getStorageSpace(); assertEquals(2, ns); // foo and bar assertEquals(currentFileLen * REPLICATION, ds); c = dfs.getContentSummary(foo); assertEquals(c.getSpaceConsumed(), ds); // append several blocks DFSTestUtil.appendFile(dfs, bar, BLOCKSIZE * 3 + BLOCKSIZE / 8); currentFileLen += (BLOCKSIZE * 3 + BLOCKSIZE / 8); quota = fooNode.getDirectoryWithQuotaFeature().getSpaceConsumed(); ns = quota.getNameSpace(); ds = quota.getStorageSpace(); assertEquals(2, ns); // foo and bar assertEquals(currentFileLen * REPLICATION, ds); c = dfs.getContentSummary(foo); assertEquals(c.getSpaceConsumed(), ds); }
private void scanDirsWithQuota( INodeDirectory dir, HashMap<String, Long> nsMap, HashMap<String, Long> dsMap, boolean verify) { if (dir.isQuotaSet()) { // get the current consumption QuotaCounts q = dir.getDirectoryWithQuotaFeature().getSpaceConsumed(); String name = dir.getFullPathName(); if (verify) { assertEquals(nsMap.get(name).longValue(), q.getNameSpace()); assertEquals(dsMap.get(name).longValue(), q.getStorageSpace()); } else { nsMap.put(name, Long.valueOf(q.getNameSpace())); dsMap.put(name, Long.valueOf(q.getStorageSpace())); } } for (INode child : dir.getChildrenList(Snapshot.CURRENT_STATE_ID)) { if (child instanceof INodeDirectory) { scanDirsWithQuota((INodeDirectory) child, nsMap, dsMap, verify); } } }