Beispiel #1
0
            /// <exception cref="Org.Apache.Hadoop.Hdfs.Protocol.QuotaExceededException"/>
            internal virtual void UpdateMtimeAndLease(long timestamp)
            {
                srcParent.UpdateModificationTime(timestamp, srcIIP.GetLatestSnapshotId());
                INode dstParent = dstParentIIP.GetLastINode();

                dstParent.UpdateModificationTime(timestamp, dstIIP.GetLatestSnapshotId());
                // update moved lease with new filename
                fsd.GetFSNamesystem().UnprotectedChangeLease(src, dst);
            }
Beispiel #2
0
        /// <summary>
        /// Delete a path from the name space
        /// Update the count at each ancestor directory with quota
        /// </summary>
        /// <param name="iip">the inodes resolved from the path</param>
        /// <param name="collectedBlocks">blocks collected from the deleted path</param>
        /// <param name="removedINodes">inodes that should be removed from inodeMap</param>
        /// <param name="mtime">the time the inode is removed</param>
        /// <returns>the number of inodes deleted; 0 if no inodes are deleted.</returns>
        private static long UnprotectedDelete(FSDirectory fsd, INodesInPath iip, INode.BlocksMapUpdateInfo
                                              collectedBlocks, IList <INode> removedINodes, long mtime)
        {
            System.Diagnostics.Debug.Assert(fsd.HasWriteLock());
            // check if target node exists
            INode targetNode = iip.GetLastINode();

            if (targetNode == null)
            {
                return(-1);
            }
            // record modification
            int latestSnapshot = iip.GetLatestSnapshotId();

            targetNode.RecordModification(latestSnapshot);
            // Remove the node from the namespace
            long removed = fsd.RemoveLastINode(iip);

            if (removed == -1)
            {
                return(-1);
            }
            // set the parent's modification time
            INodeDirectory parent = targetNode.GetParent();

            parent.UpdateModificationTime(mtime, latestSnapshot);
            fsd.UpdateCountForDelete(targetNode, iip);
            if (removed == 0)
            {
                return(0);
            }
            // collect block and update quota
            if (!targetNode.IsInLatestSnapshot(latestSnapshot))
            {
                targetNode.DestroyAndCollectBlocks(fsd.GetBlockStoragePolicySuite(), collectedBlocks
                                                   , removedINodes);
            }
            else
            {
                QuotaCounts counts = targetNode.CleanSubtree(fsd.GetBlockStoragePolicySuite(), Org.Apache.Hadoop.Hdfs.Server.Namenode.Snapshot.Snapshot
                                                             .CurrentStateId, latestSnapshot, collectedBlocks, removedINodes);
                removed = counts.GetNameSpace();
                fsd.UpdateCountNoQuotaCheck(iip, iip.Length() - 1, counts.Negation());
            }
            if (NameNode.stateChangeLog.IsDebugEnabled())
            {
                NameNode.stateChangeLog.Debug("DIR* FSDirectory.unprotectedDelete: " + iip.GetPath
                                                  () + " is removed");
            }
            return(removed);
        }
Beispiel #3
0
        /// <summary>Concat all the blocks from srcs to trg and delete the srcs files</summary>
        /// <param name="fsd">FSDirectory</param>
        /// <exception cref="System.IO.IOException"/>
        internal static void UnprotectedConcat(FSDirectory fsd, INodesInPath targetIIP, INodeFile
                                               [] srcList, long timestamp)
        {
            System.Diagnostics.Debug.Assert(fsd.HasWriteLock());
            if (NameNode.stateChangeLog.IsDebugEnabled())
            {
                NameNode.stateChangeLog.Debug("DIR* FSNamesystem.concat to " + targetIIP.GetPath(
                                                  ));
            }
            INodeFile   trgInode = targetIIP.GetLastINode().AsFile();
            QuotaCounts deltas   = ComputeQuotaDeltas(fsd, trgInode, srcList);

            VerifyQuota(fsd, targetIIP, deltas);
            // the target file can be included in a snapshot
            trgInode.RecordModification(targetIIP.GetLatestSnapshotId());
            INodeDirectory trgParent = targetIIP.GetINode(-2).AsDirectory();

            trgInode.ConcatBlocks(srcList);
            // since we are in the same dir - we can use same parent to remove files
            int count = 0;

            foreach (INodeFile nodeToRemove in srcList)
            {
                if (nodeToRemove != null)
                {
                    nodeToRemove.SetBlocks(null);
                    nodeToRemove.GetParent().RemoveChild(nodeToRemove);
                    fsd.GetINodeMap().Remove(nodeToRemove);
                    count++;
                }
            }
            trgInode.SetModificationTime(timestamp, targetIIP.GetLatestSnapshotId());
            trgParent.UpdateModificationTime(timestamp, targetIIP.GetLatestSnapshotId());
            // update quota on the parent directory with deltas
            FSDirectory.UnprotectedUpdateCount(targetIIP, targetIIP.Length() - 1, deltas);
        }