/// <exception cref="System.Exception"/>
        public virtual void TestSetQuota()
        {
            Path dir = new Path("/TestSnapshot");

            hdfs.Mkdirs(dir);
            // allow snapshot on dir and create snapshot s1
            SnapshotTestHelper.CreateSnapshot(hdfs, dir, "s1");
            Path sub = new Path(dir, "sub");

            hdfs.Mkdirs(sub);
            Path fileInSub = new Path(sub, "file");

            DFSTestUtil.CreateFile(hdfs, fileInSub, Blocksize, Replication, seed);
            INodeDirectory subNode = INodeDirectory.ValueOf(fsdir.GetINode(sub.ToString()), sub
                                                            );

            // subNode should be a INodeDirectory, but not an INodeDirectoryWithSnapshot
            NUnit.Framework.Assert.IsFalse(subNode.IsWithSnapshot());
            hdfs.SetQuota(sub, long.MaxValue - 1, long.MaxValue - 1);
            subNode = INodeDirectory.ValueOf(fsdir.GetINode(sub.ToString()), sub);
            NUnit.Framework.Assert.IsTrue(subNode.IsQuotaSet());
            NUnit.Framework.Assert.IsFalse(subNode.IsWithSnapshot());
        }
Пример #2
0
        public virtual QuotaCounts CleanDirectory(BlockStoragePolicySuite bsps, INodeDirectory
                                                  currentINode, int snapshot, int prior, INode.BlocksMapUpdateInfo collectedBlocks
                                                  , IList <INode> removedINodes)
        {
            QuotaCounts counts = new QuotaCounts.Builder().Build();
            IDictionary <INode, INode> priorCreated = null;
            IDictionary <INode, INode> priorDeleted = null;

            if (snapshot == Org.Apache.Hadoop.Hdfs.Server.Namenode.Snapshot.Snapshot.CurrentStateId)
            {
                // delete the current directory
                currentINode.RecordModification(prior);
                // delete everything in created list
                DirectoryWithSnapshotFeature.DirectoryDiff lastDiff = diffs.GetLast();
                if (lastDiff != null)
                {
                    counts.Add(lastDiff.diff.DestroyCreatedList(bsps, currentINode, collectedBlocks,
                                                                removedINodes));
                }
                counts.Add(currentINode.CleanSubtreeRecursively(bsps, snapshot, prior, collectedBlocks
                                                                , removedINodes, priorDeleted));
            }
            else
            {
                // update prior
                prior = GetDiffs().UpdatePrior(snapshot, prior);
                // if there is a snapshot diff associated with prior, we need to record
                // its original created and deleted list before deleting post
                if (prior != Org.Apache.Hadoop.Hdfs.Server.Namenode.Snapshot.Snapshot.NoSnapshotId)
                {
                    DirectoryWithSnapshotFeature.DirectoryDiff priorDiff = this.GetDiffs().GetDiffById
                                                                               (prior);
                    if (priorDiff != null && priorDiff.GetSnapshotId() == prior)
                    {
                        IList <INode> cList = priorDiff.diff.GetList(Diff.ListType.Created);
                        IList <INode> dList = priorDiff.diff.GetList(Diff.ListType.Deleted);
                        priorCreated = CloneDiffList(cList);
                        priorDeleted = CloneDiffList(dList);
                    }
                }
                counts.Add(GetDiffs().DeleteSnapshotDiff(bsps, snapshot, prior, currentINode, collectedBlocks
                                                         , removedINodes));
                counts.Add(currentINode.CleanSubtreeRecursively(bsps, snapshot, prior, collectedBlocks
                                                                , removedINodes, priorDeleted));
                // check priorDiff again since it may be created during the diff deletion
                if (prior != Org.Apache.Hadoop.Hdfs.Server.Namenode.Snapshot.Snapshot.NoSnapshotId)
                {
                    DirectoryWithSnapshotFeature.DirectoryDiff priorDiff = this.GetDiffs().GetDiffById
                                                                               (prior);
                    if (priorDiff != null && priorDiff.GetSnapshotId() == prior)
                    {
                        // For files/directories created between "prior" and "snapshot",
                        // we need to clear snapshot copies for "snapshot". Note that we must
                        // use null as prior in the cleanSubtree call. Files/directories that
                        // were created before "prior" will be covered by the later
                        // cleanSubtreeRecursively call.
                        if (priorCreated != null)
                        {
                            // we only check the node originally in prior's created list
                            foreach (INode cNode in priorDiff.GetChildrenDiff().GetList(Diff.ListType.Created
                                                                                        ))
                            {
                                if (priorCreated.Contains(cNode))
                                {
                                    counts.Add(cNode.CleanSubtree(bsps, snapshot, Org.Apache.Hadoop.Hdfs.Server.Namenode.Snapshot.Snapshot
                                                                  .NoSnapshotId, collectedBlocks, removedINodes));
                                }
                            }
                        }
                        // When a directory is moved from the deleted list of the posterior
                        // diff to the deleted list of this diff, we need to destroy its
                        // descendants that were 1) created after taking this diff and 2)
                        // deleted after taking posterior diff.
                        // For files moved from posterior's deleted list, we also need to
                        // delete its snapshot copy associated with the posterior snapshot.
                        foreach (INode dNode in priorDiff.GetChildrenDiff().GetList(Diff.ListType.Deleted
                                                                                    ))
                        {
                            if (priorDeleted == null || !priorDeleted.Contains(dNode))
                            {
                                counts.Add(CleanDeletedINode(bsps, dNode, snapshot, prior, collectedBlocks, removedINodes
                                                             ));
                            }
                        }
                    }
                }
            }
            if (currentINode.IsQuotaSet())
            {
                currentINode.GetDirectoryWithQuotaFeature().AddSpaceConsumed2Cache(counts.Negation
                                                                                       ());
            }
            return(counts);
        }