|
@@ -27,7 +27,6 @@ import org.apache.hadoop.hdfs.server.namenode.FsImageProto.INodeSection.INodeSym
|
|
|
import java.io.IOException;
|
|
|
import java.io.PrintStream;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
-import java.util.Date;
|
|
|
|
|
|
/**
|
|
|
* A PBImageDelimitedTextWriter generates a text representation of the PB fsimage,
|
|
@@ -44,80 +43,108 @@ import java.util.Date;
|
|
|
* constructor.
|
|
|
*/
|
|
|
public class PBImageDelimitedTextWriter extends PBImageTextWriter {
|
|
|
- private static final String DATE_FORMAT="yyyy-MM-dd HH:mm";
|
|
|
- private final SimpleDateFormat dateFormatter =
|
|
|
- new SimpleDateFormat(DATE_FORMAT);
|
|
|
+ private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm";
|
|
|
+
|
|
|
+ static class OutputEntryBuilder {
|
|
|
+ private final SimpleDateFormat dateFormatter =
|
|
|
+ new SimpleDateFormat(DATE_FORMAT);
|
|
|
+
|
|
|
+ private PBImageDelimitedTextWriter writer;
|
|
|
+ private Path path;
|
|
|
+ private int replication = 0;
|
|
|
+ private long modificationTime;
|
|
|
+ private long accessTime = 0;
|
|
|
+ private long preferredBlockSize = 0;
|
|
|
+ private int blocksCount = 0;
|
|
|
+ private long fileSize = 0;
|
|
|
+ private long nsQuota = 0;
|
|
|
+ private long dsQuota = 0;
|
|
|
+
|
|
|
+ private String dirPermission = "-";
|
|
|
+ private PermissionStatus permissionStatus;
|
|
|
+ private String aclPermission = "";
|
|
|
+
|
|
|
+ OutputEntryBuilder(PBImageDelimitedTextWriter writer, INode inode) {
|
|
|
+ this.writer = writer;
|
|
|
+ switch (inode.getType()) {
|
|
|
+ case FILE:
|
|
|
+ INodeFile file = inode.getFile();
|
|
|
+ replication = file.getReplication();
|
|
|
+ modificationTime = file.getModificationTime();
|
|
|
+ accessTime = file.getAccessTime();
|
|
|
+ preferredBlockSize = file.getPreferredBlockSize();
|
|
|
+ blocksCount = file.getBlocksCount();
|
|
|
+ fileSize = FSImageLoader.getFileSize(file);
|
|
|
+ permissionStatus = writer.getPermission(file.getPermission());
|
|
|
+ if (file.hasAcl() && file.getAcl().getEntriesCount() > 0){
|
|
|
+ aclPermission = "+";
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DIRECTORY:
|
|
|
+ INodeDirectory dir = inode.getDirectory();
|
|
|
+ modificationTime = dir.getModificationTime();
|
|
|
+ nsQuota = dir.getNsQuota();
|
|
|
+ dsQuota = dir.getDsQuota();
|
|
|
+ dirPermission = "d";
|
|
|
+ permissionStatus = writer.getPermission(dir.getPermission());
|
|
|
+ if (dir.hasAcl() && dir.getAcl().getEntriesCount() > 0){
|
|
|
+ aclPermission = "+";
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case SYMLINK:
|
|
|
+ INodeSymlink s = inode.getSymlink();
|
|
|
+ modificationTime = s.getModificationTime();
|
|
|
+ accessTime = s.getAccessTime();
|
|
|
+ permissionStatus = writer.getPermission(s.getPermission());
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void setPath(Path path) {
|
|
|
+ this.path = path;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String build() {
|
|
|
+ assert permissionStatus != null : "The PermissionStatus is null!";
|
|
|
+ assert permissionStatus.getUserName() != null : "User name is null!";
|
|
|
+ assert permissionStatus.getGroupName() != null : "Group name is null!";
|
|
|
+
|
|
|
+ StringBuffer buffer = new StringBuffer();
|
|
|
+ writer.append(buffer, path.toString());
|
|
|
+ writer.append(buffer, replication);
|
|
|
+ writer.append(buffer, dateFormatter.format(modificationTime));
|
|
|
+ writer.append(buffer, dateFormatter.format(accessTime));
|
|
|
+ writer.append(buffer, preferredBlockSize);
|
|
|
+ writer.append(buffer, blocksCount);
|
|
|
+ writer.append(buffer, fileSize);
|
|
|
+ writer.append(buffer, nsQuota);
|
|
|
+ writer.append(buffer, dsQuota);
|
|
|
+ writer.append(buffer, dirPermission +
|
|
|
+ permissionStatus.getPermission().toString() + aclPermission);
|
|
|
+ writer.append(buffer, permissionStatus.getUserName());
|
|
|
+ writer.append(buffer, permissionStatus.getGroupName());
|
|
|
+ return buffer.substring(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
PBImageDelimitedTextWriter(PrintStream out, String delimiter, String tempPath)
|
|
|
throws IOException {
|
|
|
super(out, delimiter, tempPath);
|
|
|
}
|
|
|
|
|
|
- private String formatDate(long date) {
|
|
|
- return dateFormatter.format(new Date(date));
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public String getEntry(String parent, INode inode) {
|
|
|
- StringBuffer buffer = new StringBuffer();
|
|
|
+ OutputEntryBuilder entryBuilder =
|
|
|
+ new OutputEntryBuilder(this, inode);
|
|
|
+
|
|
|
String inodeName = inode.getName().toStringUtf8();
|
|
|
Path path = new Path(parent.isEmpty() ? "/" : parent,
|
|
|
inodeName.isEmpty() ? "/" : inodeName);
|
|
|
- append(buffer, path.toString());
|
|
|
- PermissionStatus p = null;
|
|
|
- boolean isDir = false;
|
|
|
- boolean hasAcl = false;
|
|
|
-
|
|
|
- switch (inode.getType()) {
|
|
|
- case FILE:
|
|
|
- INodeFile file = inode.getFile();
|
|
|
- p = getPermission(file.getPermission());
|
|
|
- hasAcl = file.hasAcl() && file.getAcl().getEntriesCount() > 0;
|
|
|
- append(buffer, file.getReplication());
|
|
|
- append(buffer, formatDate(file.getModificationTime()));
|
|
|
- append(buffer, formatDate(file.getAccessTime()));
|
|
|
- append(buffer, file.getPreferredBlockSize());
|
|
|
- append(buffer, file.getBlocksCount());
|
|
|
- append(buffer, FSImageLoader.getFileSize(file));
|
|
|
- append(buffer, 0); // NS_QUOTA
|
|
|
- append(buffer, 0); // DS_QUOTA
|
|
|
- break;
|
|
|
- case DIRECTORY:
|
|
|
- INodeDirectory dir = inode.getDirectory();
|
|
|
- p = getPermission(dir.getPermission());
|
|
|
- hasAcl = dir.hasAcl() && dir.getAcl().getEntriesCount() > 0;
|
|
|
- append(buffer, 0); // Replication
|
|
|
- append(buffer, formatDate(dir.getModificationTime()));
|
|
|
- append(buffer, formatDate(0)); // Access time.
|
|
|
- append(buffer, 0); // Block size.
|
|
|
- append(buffer, 0); // Num blocks.
|
|
|
- append(buffer, 0); // Num bytes.
|
|
|
- append(buffer, dir.getNsQuota());
|
|
|
- append(buffer, dir.getDsQuota());
|
|
|
- isDir = true;
|
|
|
- break;
|
|
|
- case SYMLINK:
|
|
|
- INodeSymlink s = inode.getSymlink();
|
|
|
- p = getPermission(s.getPermission());
|
|
|
- append(buffer, 0); // Replication
|
|
|
- append(buffer, formatDate(s.getModificationTime()));
|
|
|
- append(buffer, formatDate(s.getAccessTime()));
|
|
|
- append(buffer, 0); // Block size.
|
|
|
- append(buffer, 0); // Num blocks.
|
|
|
- append(buffer, 0); // Num bytes.
|
|
|
- append(buffer, 0); // NS_QUOTA
|
|
|
- append(buffer, 0); // DS_QUOTA
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- assert p != null;
|
|
|
- String dirString = isDir ? "d" : "-";
|
|
|
- String aclString = hasAcl ? "+" : "";
|
|
|
- append(buffer, dirString + p.getPermission().toString() + aclString);
|
|
|
- append(buffer, p.getUserName());
|
|
|
- append(buffer, p.getGroupName());
|
|
|
- return buffer.substring(1);
|
|
|
+ entryBuilder.setPath(path);
|
|
|
+
|
|
|
+ return entryBuilder.build();
|
|
|
}
|
|
|
|
|
|
@Override
|