From ecffab63af630dac6e51fd2ccf225bf40d31b157 Mon Sep 17 00:00:00 2001 From: Suresh Srinivas Date: Fri, 19 Oct 2012 21:15:11 +0000 Subject: [PATCH] HDFS-4086. Add editlog opcodes to allow and disallow snapshots on a directory. Contributed by Brandon Li. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-2802@1400298 13f79535-47bb-0310-9956-ffa450edef68 --- .../hadoop-hdfs/CHANGES.HDFS-2802.txt | 3 + .../hdfs/server/namenode/FSEditLog.java | 14 +++ .../hdfs/server/namenode/FSEditLogOp.java | 110 +++++++++++++++++- .../server/namenode/FSEditLogOpCodes.java | 4 +- 4 files changed, 129 insertions(+), 2 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-2802.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-2802.txt index de167e09dc..01aac79aa2 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-2802.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.HDFS-2802.txt @@ -5,4 +5,7 @@ Branch-2802 Snapshot (Unreleased) HDFS-4082. Add editlog opcodes for snapshot create and delete operations. (suresh via szetszwo) + HDFS-4086. Add editlog opcodes to allow and disallow snapshots on a + directory. (Brandon Li via suresh) + 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 c64d85a121..f7ccb552d9 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 @@ -44,12 +44,14 @@ import org.apache.hadoop.hdfs.server.common.Storage.FormatConfirmable; import org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory; import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.AddOp; +import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.AllowSnapshotOp; 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.DisallowSnapshotOp; 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; @@ -877,6 +879,18 @@ void logDeleteSnapshot(String snapName, String snapRoot) { logEdit(op); } + void logAllowSnapshot(String snapName, String snapRoot) { + AllowSnapshotOp op = AllowSnapshotOp.getInstance(cache.get()) + .setSnapshotRoot(snapRoot); + logEdit(op); + } + + void logDisallowSnapshot(String snapName, String snapRoot) { + DisallowSnapshotOp op = DisallowSnapshotOp.getInstance(cache.get()) + .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 743cbf091e..d819543f7c 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 @@ -2281,7 +2281,115 @@ public String toString() { return builder.toString(); } } - + + /** + * Operation corresponding to allow creating snapshot on a directory + */ + static class AllowSnapshotOp extends FSEditLogOp { + String snapshotRoot; + + public AllowSnapshotOp() { + super(OP_ALLOW_SNAPSHOT); + } + + public AllowSnapshotOp(String snapRoot) { + super(OP_ALLOW_SNAPSHOT); + snapshotRoot = snapRoot; + } + + static AllowSnapshotOp getInstance(OpInstanceCache cache) { + return (AllowSnapshotOp) cache.get(OP_ALLOW_SNAPSHOT); + } + + public AllowSnapshotOp setSnapshotRoot(String snapRoot) { + snapshotRoot = snapRoot; + return this; + } + + @Override + void readFields(DataInputStream in, int logVersion) throws IOException { + snapshotRoot = FSImageSerialization.readString(in); + } + + @Override + public void writeFields(DataOutputStream out) throws IOException { + FSImageSerialization.writeString(snapshotRoot, out); + } + + @Override + protected void toXml(ContentHandler contentHandler) throws SAXException { + XMLUtils.addSaxString(contentHandler, "SNAPSHOTROOT", snapshotRoot); + } + + @Override + void fromXml(Stanza st) throws InvalidXmlException { + snapshotRoot = st.getValue("SNAPSHOTROOT"); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("AllowSnapshotOp [snapshotRoot="); + builder.append(snapshotRoot); + builder.append("]"); + return builder.toString(); + } + } + + /** + * Operation corresponding to disallow creating snapshot on a directory + */ + static class DisallowSnapshotOp extends FSEditLogOp { + String snapshotRoot; + + public DisallowSnapshotOp() { + super(OP_DISALLOW_SNAPSHOT); + } + + public DisallowSnapshotOp(String snapRoot) { + super(OP_DISALLOW_SNAPSHOT); + snapshotRoot = snapRoot; + } + + static DisallowSnapshotOp getInstance(OpInstanceCache cache) { + return (DisallowSnapshotOp) cache.get(OP_DISALLOW_SNAPSHOT); + } + + public DisallowSnapshotOp setSnapshotRoot(String snapRoot) { + snapshotRoot = snapRoot; + return this; + } + + @Override + void readFields(DataInputStream in, int logVersion) throws IOException { + snapshotRoot = FSImageSerialization.readString(in); + } + + @Override + public void writeFields(DataOutputStream out) throws IOException { + FSImageSerialization.writeString(snapshotRoot, out); + } + + @Override + protected void toXml(ContentHandler contentHandler) throws SAXException { + XMLUtils.addSaxString(contentHandler, "SNAPSHOTROOT", snapshotRoot); + } + + @Override + void fromXml(Stanza st) throws InvalidXmlException { + snapshotRoot = st.getValue("SNAPSHOTROOT"); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("DisallowSnapshotOp [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 8c218cdf16..e50b0876f0 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 @@ -58,7 +58,9 @@ public enum FSEditLogOpCodes { OP_START_LOG_SEGMENT ((byte) 24), OP_UPDATE_BLOCKS ((byte) 25), OP_CREATE_SNAPSHOT ((byte) 26), - OP_DELETE_SNAPSHOT ((byte) 27); + OP_DELETE_SNAPSHOT ((byte) 27), + OP_ALLOW_SNAPSHOT ((byte) 28), + OP_DISALLOW_SNAPSHOT ((byte) 29); private byte opCode;