Beispiel #1
0
            /// <exception cref="Org.Apache.Hadoop.Hdfs.Protocol.QuotaExceededException"/>
            internal RenameOperation(FSDirectory fsd, string src, string dst, INodesInPath srcIIP
                                     , INodesInPath dstIIP)
            {
                this.fsd          = fsd;
                this.src          = src;
                this.dst          = dst;
                this.srcIIP       = srcIIP;
                this.dstIIP       = dstIIP;
                this.srcParentIIP = srcIIP.GetParentINodesInPath();
                this.dstParentIIP = dstIIP.GetParentINodesInPath();
                BlockStoragePolicySuite bsps = fsd.GetBlockStoragePolicySuite();

                srcChild     = this.srcIIP.GetLastINode();
                srcChildName = srcChild.GetLocalNameBytes();
                int srcLatestSnapshotId = srcIIP.GetLatestSnapshotId();

                isSrcInSnapshot     = srcChild.IsInLatestSnapshot(srcLatestSnapshotId);
                srcChildIsReference = srcChild.IsReference();
                srcParent           = this.srcIIP.GetINode(-2).AsDirectory();
                // Record the snapshot on srcChild. After the rename, before any new
                // snapshot is taken on the dst tree, changes will be recorded in the
                // latest snapshot of the src tree.
                if (isSrcInSnapshot)
                {
                    srcChild.RecordModification(srcLatestSnapshotId);
                }
                // check srcChild for reference
                srcRefDstSnapshot = srcChildIsReference ? srcChild.AsReference().GetDstSnapshotId
                                        () : Org.Apache.Hadoop.Hdfs.Server.Namenode.Snapshot.Snapshot.CurrentStateId;
                oldSrcCounts = new QuotaCounts.Builder().Build();
                if (isSrcInSnapshot)
                {
                    INodeReference.WithName withName = srcParent.ReplaceChild4ReferenceWithName(srcChild
                                                                                                , srcLatestSnapshotId);
                    withCount   = (INodeReference.WithCount)withName.GetReferredINode();
                    srcChild    = withName;
                    this.srcIIP = INodesInPath.Replace(srcIIP, srcIIP.Length() - 1, srcChild);
                    // get the counts before rename
                    withCount.GetReferredINode().ComputeQuotaUsage(bsps, oldSrcCounts, true);
                }
                else
                {
                    if (srcChildIsReference)
                    {
                        // srcChild is reference but srcChild is not in latest snapshot
                        withCount = (INodeReference.WithCount)srcChild.AsReference().GetReferredINode();
                    }
                    else
                    {
                        withCount = null;
                    }
                }
            }
Beispiel #2
0
 /// <summary>Increment and then return the reference count.</summary>
 public virtual void AddReference(INodeReference @ref)
 {
     if (@ref is INodeReference.WithName)
     {
         INodeReference.WithName refWithName = (INodeReference.WithName)@ref;
         int i = Sharpen.Collections.BinarySearch(withNameList, refWithName, WithnameComparator
                                                  );
         Preconditions.CheckState(i < 0);
         withNameList.Add(-i - 1, refWithName);
     }
     else
     {
         if (@ref is INodeReference.DstReference)
         {
             SetParentReference(@ref);
         }
     }
 }
Beispiel #3
0
            internal virtual INodeReference.WithName GetPriorWithName(INodeReference.WithName
                                                                      post)
            {
                int i = Sharpen.Collections.BinarySearch(withNameList, post, WithnameComparator);

                if (i > 0)
                {
                    return(withNameList[i - 1]);
                }
                else
                {
                    if (i == 0 || i == -1)
                    {
                        return(null);
                    }
                    else
                    {
                        return(withNameList[-i - 2]);
                    }
                }
            }
Beispiel #4
0
 /// <summary>
 /// When destroying a reference node (WithName or DstReference), we call this
 /// method to identify the snapshot which is the latest snapshot before the
 /// reference node's creation.
 /// </summary>
 internal static int GetPriorSnapshot(Org.Apache.Hadoop.Hdfs.Server.Namenode.INodeReference
                                      @ref)
 {
     INodeReference.WithCount wc = (INodeReference.WithCount)@ref.GetReferredINode();
     INodeReference.WithName  wn = null;
     if (@ref is INodeReference.DstReference)
     {
         wn = wc.GetLastWithName();
     }
     else
     {
         if (@ref is INodeReference.WithName)
         {
             wn = wc.GetPriorWithName((INodeReference.WithName)@ref);
         }
     }
     if (wn != null)
     {
         INode referred = wc.GetReferredINode();
         if (referred.IsFile() && referred.AsFile().IsWithSnapshot())
         {
             return(referred.AsFile().GetDiffs().GetPrior(wn.lastSnapshotId));
         }
         else
         {
             if (referred.IsDirectory())
             {
                 DirectoryWithSnapshotFeature sf = referred.AsDirectory().GetDirectoryWithSnapshotFeature
                                                       ();
                 if (sf != null)
                 {
                     return(sf.GetDiffs().GetPrior(wn.lastSnapshotId));
                 }
             }
         }
     }
     return(Org.Apache.Hadoop.Hdfs.Server.Namenode.Snapshot.Snapshot.NoSnapshotId);
 }
Beispiel #5
0
 internal virtual INodeReference.WithName ReplaceChild4ReferenceWithName(INode oldChild
                                                                         , int latestSnapshotId)
 {
     Preconditions.CheckArgument(latestSnapshotId != Org.Apache.Hadoop.Hdfs.Server.Namenode.Snapshot.Snapshot
                                 .CurrentStateId);
     if (oldChild is INodeReference.WithName)
     {
         return((INodeReference.WithName)oldChild);
     }
     INodeReference.WithCount withCount;
     if (oldChild.IsReference())
     {
         Preconditions.CheckState(oldChild is INodeReference.DstReference);
         withCount = (INodeReference.WithCount)oldChild.AsReference().GetReferredINode();
     }
     else
     {
         withCount = new INodeReference.WithCount(null, oldChild);
     }
     INodeReference.WithName @ref = new INodeReference.WithName(this, withCount, oldChild
                                                                .GetLocalNameBytes(), latestSnapshotId);
     ReplaceChild(oldChild, @ref, null);
     return(@ref);
 }