diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index c66450433c..3fe7c9c5cb 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -6,6 +6,9 @@ Branch-2802 Snapshot (Unreleased) HDFS-4076. Support snapshot of single files. (szetszwo) + HDFS-4082. Add editlog opcodes for snapshot create and delete operations. + (suresh via szetszwo) + Trunk (Unreleased) INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/LayoutVersion.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/LayoutVersion.java index 3680ee54aa..06f6cd41c3 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/LayoutVersion.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/LayoutVersion.java @@ -94,7 +94,8 @@ public static enum Feature { "Use LongWritable and ShortWritable directly instead of ArrayWritable of UTF8"), OPTIMIZE_PERSIST_BLOCKS(-40, "Serialize block lists with delta-encoded variable length ints, " + - "add OP_UPDATE_BLOCKS"); + "add OP_UPDATE_BLOCKS"), + SNAPSHOT(-41, "Support for snapshot feature"); final int lv; final int ancestorLV; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java index db8a08509e..c64d85a121 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLog.java @@ -47,7 +47,9 @@ import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.CancelDelegationTokenOp; import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.CloseOp; import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.ConcatDeleteOp; +import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.CreateSnapshotOp; import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.DeleteOp; +import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.DeleteSnapshotOp; import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.GetDelegationTokenOp; import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.LogSegmentOp; import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.MkdirOp; @@ -863,6 +865,18 @@ void logReassignLease(String leaseHolder, String src, String newHolder) { logEdit(op); } + void logCreateSnapshot(String snapName, String snapRoot) { + CreateSnapshotOp op = CreateSnapshotOp.getInstance(cache.get()) + .setSnapshotName(snapName).setSnapshotRoot(snapRoot); + logEdit(op); + } + + void logDeleteSnapshot(String snapName, String snapRoot) { + DeleteSnapshotOp op = DeleteSnapshotOp.getInstance(cache.get()) + .setSnapshotName(snapName).setSnapshotRoot(snapRoot); + logEdit(op); + } + /** * Get all the journals this edit log is currently operating on. */ diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOp.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOp.java index 7dac687fc6..743cbf091e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOp.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOp.java @@ -2160,6 +2160,128 @@ protected void toXml(ContentHandler contentHandler) throws SAXException { } } + /** + * Operation corresponding to creating a snapshot + */ + static class CreateSnapshotOp extends FSEditLogOp { + String snapshotName; + String snapshotRoot; + + public CreateSnapshotOp() { + super(OP_CREATE_SNAPSHOT); + } + + static CreateSnapshotOp getInstance(OpInstanceCache cache) { + return (CreateSnapshotOp)cache.get(OP_CREATE_SNAPSHOT); + } + + CreateSnapshotOp setSnapshotName(String snapName) { + this.snapshotName = snapName; + return this; + } + + public CreateSnapshotOp setSnapshotRoot(String snapRoot) { + snapshotRoot = snapRoot; + return this; + } + + @Override + void readFields(DataInputStream in, int logVersion) throws IOException { + snapshotName = FSImageSerialization.readString(in); + snapshotRoot = FSImageSerialization.readString(in); + } + + @Override + public void writeFields(DataOutputStream out) throws IOException { + FSImageSerialization.writeString(snapshotName, out); + FSImageSerialization.writeString(snapshotRoot, out); + } + + @Override + protected void toXml(ContentHandler contentHandler) throws SAXException { + XMLUtils.addSaxString(contentHandler, "SNAPSHOTNAME", snapshotName); + XMLUtils.addSaxString(contentHandler, "SNAPSHOTROOT", snapshotRoot); + } + + @Override + void fromXml(Stanza st) throws InvalidXmlException { + snapshotName = st.getValue("SNAPSHOTNAME"); + snapshotRoot = st.getValue("SNAPSHOTROOT"); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("CreateSnapshotOp [snapshotName="); + builder.append(snapshotName); + builder.append(", snapshotRoot="); + builder.append(snapshotRoot); + builder.append("]"); + return builder.toString(); + } + } + + /** + * Operation corresponding to delete a snapshot + */ + static class DeleteSnapshotOp extends FSEditLogOp { + String snapshotName; + String snapshotRoot; + + DeleteSnapshotOp() { + super(OP_DELETE_SNAPSHOT); + } + + static DeleteSnapshotOp getInstance(OpInstanceCache cache) { + return (DeleteSnapshotOp)cache.get(OP_DELETE_SNAPSHOT); + } + + DeleteSnapshotOp setSnapshotName(String snapName) { + this.snapshotName = snapName; + return this; + } + + DeleteSnapshotOp setSnapshotRoot(String snapRoot) { + snapshotRoot = snapRoot; + return this; + } + + @Override + void readFields(DataInputStream in, int logVersion) throws IOException { + snapshotName = FSImageSerialization.readString(in); + snapshotRoot = FSImageSerialization.readString(in); + } + + @Override + public void writeFields(DataOutputStream out) throws IOException { + FSImageSerialization.writeString(snapshotName, out); + FSImageSerialization.writeString(snapshotRoot, out); + } + + @Override + protected void toXml(ContentHandler contentHandler) throws SAXException { + XMLUtils.addSaxString(contentHandler, "SNAPSHOTNAME", snapshotName); + XMLUtils.addSaxString(contentHandler, "SNAPSHOTROOT", snapshotRoot); + } + + @Override + void fromXml(Stanza st) throws InvalidXmlException { + snapshotName = st.getValue("SNAPSHOTNAME"); + snapshotRoot = st.getValue("SNAPSHOTROOT"); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("DeleteSnapshotOp [snapshotName="); + builder.append(snapshotName); + builder.append(", snapshotRoot="); + builder.append(snapshotRoot); + builder.append("]"); + return builder.toString(); + } + } + static private short readShort(DataInputStream in) throws IOException { return Short.parseShort(FSImageSerialization.readString(in)); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOpCodes.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOpCodes.java index c08a5a92a9..8c218cdf16 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOpCodes.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOpCodes.java @@ -56,7 +56,9 @@ public enum FSEditLogOpCodes { OP_REASSIGN_LEASE ((byte) 22), OP_END_LOG_SEGMENT ((byte) 23), OP_START_LOG_SEGMENT ((byte) 24), - OP_UPDATE_BLOCKS ((byte) 25); + OP_UPDATE_BLOCKS ((byte) 25), + OP_CREATE_SNAPSHOT ((byte) 26), + OP_DELETE_SNAPSHOT ((byte) 27); private byte opCode;