Search in sources :

Example 6 with DirectoryWithSnapshotFeature

use of org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature in project hadoop by apache.

the class INodeDirectory method undoRename4ScrParent.

/**
   * This method is usually called by the undo section of rename.
   * 
   * Before calling this function, in the rename operation, we replace the
   * original src node (of the rename operation) with a reference node (WithName
   * instance) in both the children list and a created list, delete the
   * reference node from the children list, and add it to the corresponding
   * deleted list.
   * 
   * To undo the above operations, we have the following steps in particular:
   * 
   * <pre>
   * 1) remove the WithName node from the deleted list (if it exists) 
   * 2) replace the WithName node in the created list with srcChild 
   * 3) add srcChild back as a child of srcParent. Note that we already add 
   * the node into the created list of a snapshot diff in step 2, we do not need
   * to add srcChild to the created list of the latest snapshot.
   * </pre>
   * 
   * We do not need to update quota usage because the old child is in the 
   * deleted list before. 
   * 
   * @param oldChild
   *          The reference node to be removed/replaced
   * @param newChild
   *          The node to be added back
   * @throws QuotaExceededException should not throw this exception
   */
public void undoRename4ScrParent(final INodeReference oldChild, final INode newChild) throws QuotaExceededException {
    DirectoryWithSnapshotFeature sf = getDirectoryWithSnapshotFeature();
    assert sf != null : "Directory does not have snapshot feature";
    sf.getDiffs().removeChild(ListType.DELETED, oldChild);
    sf.getDiffs().replaceChild(ListType.CREATED, oldChild, newChild);
    addChild(newChild, true, Snapshot.CURRENT_STATE_ID);
}
Also used : DirectoryWithSnapshotFeature(org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature)

Example 7 with DirectoryWithSnapshotFeature

use of org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature in project hadoop by apache.

the class INodeDirectory method addSnapshottableFeature.

/** add DirectorySnapshottableFeature */
public void addSnapshottableFeature() {
    Preconditions.checkState(!isSnapshottable(), "this is already snapshottable, this=%s", this);
    DirectoryWithSnapshotFeature s = this.getDirectoryWithSnapshotFeature();
    final DirectorySnapshottableFeature snapshottable = new DirectorySnapshottableFeature(s);
    if (s != null) {
        this.removeFeature(s);
    }
    this.addFeature(snapshottable);
}
Also used : DirectoryWithSnapshotFeature(org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature) DirectorySnapshottableFeature(org.apache.hadoop.hdfs.server.namenode.snapshot.DirectorySnapshottableFeature)

Example 8 with DirectoryWithSnapshotFeature

use of org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature in project hadoop by apache.

the class INodeDirectory method recordModification.

@Override
public void recordModification(int latestSnapshotId) {
    if (isInLatestSnapshot(latestSnapshotId) && !shouldRecordInSrcSnapshot(latestSnapshotId)) {
        // add snapshot feature if necessary
        DirectoryWithSnapshotFeature sf = getDirectoryWithSnapshotFeature();
        if (sf == null) {
            sf = addSnapshotFeature(null);
        }
        // record self in the diff list if necessary
        sf.getDiffs().saveSelf2Snapshot(latestSnapshotId, this, null);
    }
}
Also used : DirectoryWithSnapshotFeature(org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature)

Example 9 with DirectoryWithSnapshotFeature

use of org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature in project hadoop by apache.

the class INodeDirectory method replaceChild.

/** 
   * Replace the given child with a new child. Note that we no longer need to
   * replace an normal INodeDirectory or INodeFile into an
   * INodeDirectoryWithSnapshot or INodeFileUnderConstruction. The only cases
   * for child replacement is for reference nodes.
   */
public void replaceChild(INode oldChild, final INode newChild, final INodeMap inodeMap) {
    Preconditions.checkNotNull(children);
    final int i = searchChildren(newChild.getLocalNameBytes());
    Preconditions.checkState(i >= 0);
    Preconditions.checkState(oldChild == children.get(i) || oldChild == children.get(i).asReference().getReferredINode().asReference().getReferredINode());
    oldChild = children.get(i);
    if (oldChild.isReference() && newChild.isReference()) {
        // both are reference nodes, e.g., DstReference -> WithName
        final INodeReference.WithCount withCount = (WithCount) oldChild.asReference().getReferredINode();
        withCount.removeReference(oldChild.asReference());
    }
    children.set(i, newChild);
    // replace the instance in the created list of the diff list
    DirectoryWithSnapshotFeature sf = this.getDirectoryWithSnapshotFeature();
    if (sf != null) {
        sf.getDiffs().replaceChild(ListType.CREATED, oldChild, newChild);
    }
    // update the inodeMap
    if (inodeMap != null) {
        inodeMap.put(newChild);
    }
}
Also used : DirectoryWithSnapshotFeature(org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature) WithCount(org.apache.hadoop.hdfs.server.namenode.INodeReference.WithCount) WithCount(org.apache.hadoop.hdfs.server.namenode.INodeReference.WithCount)

Example 10 with DirectoryWithSnapshotFeature

use of org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature in project hadoop by apache.

the class INodeDirectory method getChild.

/**
   * @param name the name of the child
   * @param snapshotId
   *          if it is not {@link Snapshot#CURRENT_STATE_ID}, get the result
   *          from the corresponding snapshot; otherwise, get the result from
   *          the current directory.
   * @return the child inode.
   */
public INode getChild(byte[] name, int snapshotId) {
    DirectoryWithSnapshotFeature sf;
    if (snapshotId == Snapshot.CURRENT_STATE_ID || (sf = getDirectoryWithSnapshotFeature()) == null) {
        ReadOnlyList<INode> c = getCurrentChildrenList();
        final int i = ReadOnlyList.Util.binarySearch(c, name);
        return i < 0 ? null : c.get(i);
    }
    return sf.getChild(this, name, snapshotId);
}
Also used : DirectoryWithSnapshotFeature(org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature)

Aggregations

DirectoryWithSnapshotFeature (org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature)15 DirectorySnapshottableFeature (org.apache.hadoop.hdfs.server.namenode.snapshot.DirectorySnapshottableFeature)2 WithCount (org.apache.hadoop.hdfs.server.namenode.INodeReference.WithCount)1 Snapshot (org.apache.hadoop.hdfs.server.namenode.snapshot.Snapshot)1