blob: a0e35f6c2a71e423007d64dcd14eda27a1bcca74 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hdfs.protocol;
import java.util.Collections;
import java.util.List;
import org.apache.curator.shaded.com.google.common.base.Preconditions;
import org.apache.hadoop.hdfs.DFSUtilClient;
/**
* This class represents to the difference between two snapshots of
* the same directory, or the difference between a snapshot of the directory and
* its current state. This Class serves the purpose of collecting diff entries
* in 3 lists : created, deleted and modified list combined size of which is set
* by dfs.snapshotdiff-report.limit over one rpc call to the namenode.
*/
public class SnapshotDiffReportListing {
/**
* Representing the full path and diff type of a file/directory where changes
* have happened.
*/
public static class DiffReportListingEntry {
/**
* The type of the difference.
*/
private final long fileId;
private final long dirId;
private final boolean isReference;
/**
* The relative path (related to the snapshot root) of 1) the file/directory
* where changes have happened, or 2) the source file/dir of a rename op.
* or 3) target file/dir for a rename op.
*/
private final byte[][] sourcePath;
private final byte[][] targetPath;
public DiffReportListingEntry(long dirId, long fileId, byte[][] sourcePath,
boolean isReference, byte[][] targetPath) {
Preconditions.checkNotNull(sourcePath);
this.dirId = dirId;
this.fileId = fileId;
this.sourcePath = sourcePath;
this.isReference = isReference;
this.targetPath = targetPath;
}
public DiffReportListingEntry(long dirId, long fileId, byte[] sourcePath,
boolean isReference, byte[] targetpath) {
Preconditions.checkNotNull(sourcePath);
this.dirId = dirId;
this.fileId = fileId;
this.sourcePath = DFSUtilClient.bytes2byteArray(sourcePath);
this.isReference = isReference;
this.targetPath =
targetpath == null ? null : DFSUtilClient.bytes2byteArray(targetpath);
}
public long getDirId() {
return dirId;
}
public long getFileId() {
return fileId;
}
public byte[][] getSourcePath() {
return sourcePath;
}
public byte[][] getTargetPath() {
return targetPath;
}
public boolean isReference() {
return isReference;
}
}
/** store the starting path to process across RPC's for snapshot diff. */
private final byte[] lastPath;
private final int lastIndex;
private final boolean isFromEarlier;
/** list of diff. */
private final List<DiffReportListingEntry> modifyList;
private final List<DiffReportListingEntry> createList;
private final List<DiffReportListingEntry> deleteList;
public SnapshotDiffReportListing() {
this.modifyList = Collections.emptyList();
this.createList = Collections.emptyList();
this.deleteList = Collections.emptyList();
this.lastPath = DFSUtilClient.string2Bytes("");
this.lastIndex = -1;
this.isFromEarlier = false;
}
public SnapshotDiffReportListing(byte[] startPath,
List<DiffReportListingEntry> modifiedEntryList,
List<DiffReportListingEntry> createdEntryList,
List<DiffReportListingEntry> deletedEntryList, int index,
boolean isFromEarlier) {
this.modifyList = modifiedEntryList;
this.createList = createdEntryList;
this.deleteList = deletedEntryList;
this.lastPath =
startPath != null ? startPath : DFSUtilClient.string2Bytes("");
this.lastIndex = index;
this.isFromEarlier = isFromEarlier;
}
public List<DiffReportListingEntry> getModifyList() {
return modifyList;
}
public List<DiffReportListingEntry> getCreateList() {
return createList;
}
public List<DiffReportListingEntry> getDeleteList() {
return deleteList;
}
/**
* @return {@link #lastPath}
*/
public byte[] getLastPath() {
return lastPath;
}
public int getLastIndex() {
return lastIndex;
}
public boolean getIsFromEarlier() {
return isFromEarlier;
}
}