HDFS-4082. Add editlog opcodes for snapshot create and delete operations. Contributed by suresh

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-2802@1400247 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Tsz-wo Sze 2012-10-19 19:38:48 +00:00
parent 5c1a7b9d5d
commit e75424544f
5 changed files with 144 additions and 2 deletions

View File

@ -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

View File

@ -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;

View File

@ -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.
*/

View File

@ -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));
}

View File

@ -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;