Search in sources :

Example 1 with INodeDirectoryAttributes

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

the class DirectoryWithSnapshotFeature method computeDiffBetweenSnapshots.

/**
   * Compute the difference between Snapshots.
   *
   * @param fromSnapshot Start point of the diff computation. Null indicates
   *          current tree.
   * @param toSnapshot End point of the diff computation. Null indicates current
   *          tree.
   * @param diff Used to capture the changes happening to the children. Note
   *          that the diff still represents (later_snapshot - earlier_snapshot)
   *          although toSnapshot can be before fromSnapshot.
   * @param currentINode The {@link INodeDirectory} this feature belongs to.
   * @return Whether changes happened between the startSnapshot and endSnaphsot.
   */
boolean computeDiffBetweenSnapshots(Snapshot fromSnapshot, Snapshot toSnapshot, ChildrenDiff diff, INodeDirectory currentINode) {
    int[] diffIndexPair = diffs.changedBetweenSnapshots(fromSnapshot, toSnapshot);
    if (diffIndexPair == null) {
        return false;
    }
    int earlierDiffIndex = diffIndexPair[0];
    int laterDiffIndex = diffIndexPair[1];
    boolean dirMetadataChanged = false;
    INodeDirectoryAttributes dirCopy = null;
    List<DirectoryDiff> difflist = diffs.asList();
    for (int i = earlierDiffIndex; i < laterDiffIndex; i++) {
        DirectoryDiff sdiff = difflist.get(i);
        diff.combinePosterior(sdiff.diff, null);
        if (!dirMetadataChanged && sdiff.snapshotINode != null) {
            if (dirCopy == null) {
                dirCopy = sdiff.snapshotINode;
            } else if (!dirCopy.metadataEquals(sdiff.snapshotINode)) {
                dirMetadataChanged = true;
            }
        }
    }
    if (!diff.isEmpty() || dirMetadataChanged) {
        return true;
    } else if (dirCopy != null) {
        for (int i = laterDiffIndex; i < difflist.size(); i++) {
            if (!dirCopy.metadataEquals(difflist.get(i).snapshotINode)) {
                return true;
            }
        }
        return !dirCopy.metadataEquals(currentINode);
    } else {
        return false;
    }
}
Also used : INodeDirectoryAttributes(org.apache.hadoop.hdfs.server.namenode.INodeDirectoryAttributes)

Example 2 with INodeDirectoryAttributes

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

the class SnapshotFSImageFormat method loadDirectoryDiff.

/**
   * Load {@link DirectoryDiff} from fsimage.
   * @param parent The directory that the SnapshotDiff belongs to.
   * @param in The {@link DataInput} instance to read.
   * @param loader The {@link Loader} instance that this loading procedure is 
   *               using.
   * @return A {@link DirectoryDiff}.
   */
private static DirectoryDiff loadDirectoryDiff(INodeDirectory parent, DataInput in, FSImageFormat.Loader loader) throws IOException {
    // 1. Read the full path of the Snapshot root to identify the Snapshot
    final Snapshot snapshot = loader.getSnapshot(in);
    // 2. Load DirectoryDiff#childrenSize
    int childrenSize = in.readInt();
    // 3. Load DirectoryDiff#snapshotINode 
    INodeDirectoryAttributes snapshotINode = loadSnapshotINodeInDirectoryDiff(snapshot, in, loader);
    // 4. Load the created list in SnapshotDiff#Diff
    List<INode> createdList = loadCreatedList(parent, in);
    // 5. Load the deleted list in SnapshotDiff#Diff
    List<INode> deletedList = loadDeletedList(parent, createdList, in, loader);
    // 6. Compose the SnapshotDiff
    List<DirectoryDiff> diffs = parent.getDiffs().asList();
    DirectoryDiff sdiff = new DirectoryDiff(snapshot.getId(), snapshotINode, diffs.isEmpty() ? null : diffs.get(0), childrenSize, createdList, deletedList, snapshotINode == snapshot.getRoot());
    return sdiff;
}
Also used : INodeDirectoryAttributes(org.apache.hadoop.hdfs.server.namenode.INodeDirectoryAttributes) INode(org.apache.hadoop.hdfs.server.namenode.INode) DirectoryDiff(org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature.DirectoryDiff)

Aggregations

INodeDirectoryAttributes (org.apache.hadoop.hdfs.server.namenode.INodeDirectoryAttributes)2 INode (org.apache.hadoop.hdfs.server.namenode.INode)1 DirectoryDiff (org.apache.hadoop.hdfs.server.namenode.snapshot.DirectoryWithSnapshotFeature.DirectoryDiff)1