INodeSymlink (Apache Hadoop HDFS 3.5.0 API)
Description: declaration: package: org.apache.hadoop.hdfs.server.namenode, class: INodeSymlink

Package org.apache.hadoop.hdfs.server.namenode

# Class INodeSymlink

java.lang.Object
org.apache.hadoop.hdfs.server.namenode.INode
org.apache.hadoop.hdfs.server.namenode.INodeWithAdditionalFields
org.apache.hadoop.hdfs.server.namenode.INodeSymlink

All Implemented Interfaces:
  `Comparable<byte[]>`, `INodeAttributes`, `Diff.Element<byte[]>`, `org.apache.hadoop.util.LightWeightGSet.LinkedElement`

@Private public class INodeSymlink extends INodeWithAdditionalFields
An `INode` representing a symbolic link.

- ## Nested Class Summary

  ## Nested classes/interfaces inherited from class org.apache.hadoop.hdfs.server.namenode.INode

  `INode.BlocksMapUpdateInfo, INode.Feature, INode.QuotaDelta, INode.ReclaimContext`

  ## Nested classes/interfaces inherited from interface org.apache.hadoop.hdfs.server.namenode.INodeAttributes

  `INodeAttributes.SnapshotCopy`

- ## Field Summary

  ### Fields inherited from class org.apache.hadoop.hdfs.server.namenode.INodeWithAdditionalFields

  `features`

  ### Fields inherited from class org.apache.hadoop.hdfs.server.namenode.INode

  `LOG`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `accept(NamespaceVisitor visitor, int snapshot)`
  Accept a visitor to visit this `INode`.
  `void`
  `addAclFeature(AclFeature f)`
  `void`
  `addXAttrFeature(XAttrFeature f)`
  `INodeSymlink`
  `asSymlink()`
  Cast this inode to an `INodeSymlink`.
  `void`
  `cleanSubtree(INode.ReclaimContext reclaimContext, int snapshotId, int priorSnapshotId)`
  Clean the subtree under this inode and collect the blocks from the descents for further block deletion/update.
  `ContentSummaryComputationContext`
  `computeContentSummary(int snapshotId, ContentSummaryComputationContext summary)`
  Count subtree content summary with a `ContentCounts`.
  `QuotaCounts`
  `computeQuotaUsage(BlockStoragePolicySuite bsps, byte blockStoragePolicyId, boolean useCache, int lastSnapshotId)`
  Count subtree `Quota.NAMESPACE` and `Quota.STORAGESPACE` usages.
  `void`
  `destroyAndCollectBlocks(INode.ReclaimContext reclaimContext)`
  Destroy self and clear everything!
  `void`
  `dumpTreeRecursively(PrintWriter out, StringBuilder prefix, int snapshot)`
  Dump tree recursively.
  `byte`
  `getLocalStoragePolicyID()`
  `byte`
  `getStoragePolicyID()`
  `byte[]`
  `getSymlink()`
  `String`
  `getSymlinkString()`
  `boolean`
  `isSymlink()`
  Check whether it's a symlink
  `void`
  `removeAclFeature()`
  `void`
  `removeXAttrFeature()`

  ### Methods inherited from class org.apache.hadoop.hdfs.server.namenode.INodeWithAdditionalFields

  `addFeature, getAclFeature, getFeature, getFeatures, getFsPermissionShort, getId, getLocalNameBytes, getNext, getPermissionLong, getPermissionStatus, removeFeature, setAccessTime, setLocalName, setModificationTime, setNext, updateModificationTime`

  ### Methods inherited from class org.apache.hadoop.hdfs.server.namenode.INode

  `addSpaceConsumed, asDirectory, asFile, asReference, clear, compareTo, computeAndConvertContentSummary, computeContentSummary, computeQuotaUsage, computeQuotaUsage, dumpINode, dumpParentINodes, dumpTreeRecursively, dumpTreeRecursively, equals, getAccessTime, getAclFeature, getFsPermission, getFullPathAndObjectString, getFullPathName, getGroupName, getKey, getLocalName, getModificationTime, getObjectString, getParent, getParentReference, getParentString, getPathComponents, getPathComponents, getPathNames, getQuotaCounts, getSnapshotINode, getStoragePolicyIDForQuota, getUserName, getXAttrFeature, hashCode, isAncestorDirectory, isDeleted, isDirectory, isFile, isInCurrentState, isInLatestSnapshot, isLastReference, isQuotaSet, isReference, isSetStoragePolicy, setAccessTime, setModificationTime, setParent, setParentReference, shouldRecordInSrcSnapshot, toDetailString, toString`

  ### Methods inherited from class java.lang.Object

  `clone, finalize, getClass, notify, notifyAll, wait, wait, wait`

- ## Method Details

  - ### isSymlink

    public boolean isSymlink()
    Description copied from class: `INode`
    Check whether it's a symlink
    Overrides:
      `isSymlink` in class `INode`
    Returns:
      true unconditionally.

  - ### asSymlink

    public INodeSymlink asSymlink()
    Description copied from class: `INode`
    Cast this inode to an `INodeSymlink`.
    Overrides:
      `asSymlink` in class `INode`
    Returns:
      this object.

  - ### getSymlinkString

    public String getSymlinkString()

  - ### getSymlink

    public byte[] getSymlink()

  - ### cleanSubtree

    public void cleanSubtree(INode.ReclaimContext reclaimContext, int snapshotId, int priorSnapshotId)
    Description copied from class: `INode`
    Clean the subtree under this inode and collect the blocks from the descents for further block deletion/update. The current inode can either resides in the current tree or be stored as a snapshot copy.

         In general, we have the following rules.
         1. When deleting a file/directory in the current tree, we have different
         actions according to the type of the node to delete.

         1.1 The current inode (this) is an INodeFile.
         1.1.1 If prior is null, there is no snapshot taken on ancestors
         before. Thus we simply destroy (i.e., to delete completely, no need to save
         snapshot copy) the current INode and collect its blocks for further
         cleansing.
         1.1.2 Else do nothing since the current INode will be stored as a snapshot
         copy.

         1.2 The current inode is an INodeDirectory.
         1.2.1 If prior is null, there is no snapshot taken on ancestors
         before. Similarly, we destroy the whole subtree and collect blocks.
         1.2.2 Else do nothing with the current INode. Recursively clean its
         children.

         1.3 The current inode is a file with snapshot.
         Call recordModification(..) to capture the current states.
         Mark the INode as deleted.

         1.4 The current inode is an INodeDirectory with snapshot feature.
         Call recordModification(..) to capture the current states.
         Destroy files/directories created after the latest snapshot
         (i.e., the inodes stored in the created list of the latest snapshot).
         Recursively clean remaining children.

         2. When deleting a snapshot.
         2.1 To clean INodeFile: do nothing.
         2.2 To clean INodeDirectory: recursively clean its children.
         2.3 To clean INodeFile with snapshot: delete the corresponding snapshot in
         its diff list.
         2.4 To clean INodeDirectory with snapshot: delete the corresponding
         snapshot in its diff list. Recursively clean its children.

    Specified by:
      `cleanSubtree` in class `INode`
    Parameters:
      `reclaimContext` - Record blocks and inodes that need to be reclaimed.
      `snapshotId` - The id of the snapshot to delete. `Snapshot.CURRENT_STATE_ID` means to delete the current file/directory.
      `priorSnapshotId` - The id of the latest snapshot before the to-be-deleted snapshot. When deleting a current inode, this parameter captures the latest snapshot.

  - ### destroyAndCollectBlocks

    public void destroyAndCollectBlocks(INode.ReclaimContext reclaimContext)
    Description copied from class: `INode`
    Destroy self and clear everything! If the INode is a file, this method collects its blocks for further block deletion. If the INode is a directory, the method goes down the subtree and collects blocks from the descents, and clears its parent/children references as well. The method also clears the diff list if the INode contains snapshot diff list.
    Specified by:
      `destroyAndCollectBlocks` in class `INode`
    Parameters:
      `reclaimContext` - Record blocks and inodes that need to be reclaimed.

  - ### computeQuotaUsage

    public QuotaCounts computeQuotaUsage(BlockStoragePolicySuite bsps, byte blockStoragePolicyId, boolean useCache, int lastSnapshotId)
    Description copied from class: `INode`
    Count subtree `Quota.NAMESPACE` and `Quota.STORAGESPACE` usages. With the existence of `INodeReference`, the same inode and its subtree may be referred by multiple `INodeReference.WithName` nodes and a `INodeReference.DstReference` node. To avoid circles while quota usage computation, we have the following rules:

         1. For a INodeReference.DstReference node, since the node must be in the current
         tree (or has been deleted as the end point of a series of rename
         operations), we compute the quota usage of the referred node (and its
         subtree) in the regular manner, i.e., including every inode in the current
         tree and in snapshot copies, as well as the size of diff list.

         2. For a INodeReference.WithName node, since the node must be in a snapshot, we
         only count the quota usage for those nodes that still existed at the
         creation time of the snapshot associated with the INodeReference.WithName node.
         We do not count in the size of the diff list.

    Specified by:
      `computeQuotaUsage` in class `INode`
    Parameters:
      `bsps` - Block storage policy suite to calculate intended storage type usage
      `blockStoragePolicyId` - block storage policy id of the current INode
      `useCache` - Whether to use cached quota usage. Note that `INodeReference.WithName` node never uses cache for its subtree.
      `lastSnapshotId` - `Snapshot.CURRENT_STATE_ID` indicates the computation is in the current tree. Otherwise the id indicates the computation range for a `INodeReference.WithName` node.
    Returns:
      The subtree quota counts.

  - ### computeContentSummary

    public ContentSummaryComputationContext computeContentSummary(int snapshotId, ContentSummaryComputationContext summary)
    Description copied from class: `INode`
    Count subtree content summary with a `ContentCounts`.
    Specified by:
      `computeContentSummary` in class `INode`
    Parameters:
      `snapshotId` - Specify the time range for the calculation. If this parameter equals to `Snapshot.CURRENT_STATE_ID`, the result covers both the current states and all the snapshots. Otherwise the result only covers all the files/directories contained in the specific snapshot.
      `summary` - the context object holding counts for the subtree.
    Returns:
      The same objects as summary.

  - ### dumpTreeRecursively

    public void dumpTreeRecursively(PrintWriter out, StringBuilder prefix, int snapshot)
    Description copied from class: `INode`
    Dump tree recursively.
    Overrides:
      `dumpTreeRecursively` in class `INode`
      `prefix` - The prefix string that each line should print.

  - ### accept

    public void accept(NamespaceVisitor visitor, int snapshot)
    Description copied from class: `INode`
    Accept a visitor to visit this `INode`.
    Overrides:
      `accept` in class `INode`

  - ### removeAclFeature

    public void removeAclFeature()
    Overrides:
      `removeAclFeature` in class `INodeWithAdditionalFields`

  - ### addAclFeature

    public void addAclFeature(AclFeature f)
    Overrides:
      `addAclFeature` in class `INodeWithAdditionalFields`

  - ### removeXAttrFeature

    public void removeXAttrFeature()
    Overrides:
      `removeXAttrFeature` in class `INodeWithAdditionalFields`

  - ### addXAttrFeature

    public void addXAttrFeature(XAttrFeature f)
    Overrides:
      `addXAttrFeature` in class `INodeWithAdditionalFields`

  - ### getStoragePolicyID

    public byte getStoragePolicyID()
    Specified by:
      `getStoragePolicyID` in class `INode`
    Returns:
      the latest block storage policy id of the INode. Specifically, if a storage policy is directly specified on the INode then return the ID of that policy. Otherwise follow the latest parental path and return the ID of the first specified storage policy.

  - ### getLocalStoragePolicyID

    public byte getLocalStoragePolicyID()
    Specified by:
      `getLocalStoragePolicyID` in class `INode`
    Returns:
      the storage policy directly specified on the INode. Return `HdfsConstants.BLOCK_STORAGE_POLICY_ID_UNSPECIFIED` if no policy has been specified.