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:
parent
5c1a7b9d5d
commit
e75424544f
|
@ -6,6 +6,9 @@ Branch-2802 Snapshot (Unreleased)
|
||||||
|
|
||||||
HDFS-4076. Support snapshot of single files. (szetszwo)
|
HDFS-4076. Support snapshot of single files. (szetszwo)
|
||||||
|
|
||||||
|
HDFS-4082. Add editlog opcodes for snapshot create and delete operations.
|
||||||
|
(suresh via szetszwo)
|
||||||
|
|
||||||
Trunk (Unreleased)
|
Trunk (Unreleased)
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -94,7 +94,8 @@ public class LayoutVersion {
|
||||||
"Use LongWritable and ShortWritable directly instead of ArrayWritable of UTF8"),
|
"Use LongWritable and ShortWritable directly instead of ArrayWritable of UTF8"),
|
||||||
OPTIMIZE_PERSIST_BLOCKS(-40,
|
OPTIMIZE_PERSIST_BLOCKS(-40,
|
||||||
"Serialize block lists with delta-encoded variable length ints, " +
|
"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 lv;
|
||||||
final int ancestorLV;
|
final int ancestorLV;
|
||||||
|
|
|
@ -47,7 +47,9 @@ import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.AddOp;
|
||||||
import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.CancelDelegationTokenOp;
|
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.CloseOp;
|
||||||
import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.ConcatDeleteOp;
|
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.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.GetDelegationTokenOp;
|
||||||
import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.LogSegmentOp;
|
import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.LogSegmentOp;
|
||||||
import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.MkdirOp;
|
import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp.MkdirOp;
|
||||||
|
@ -863,6 +865,18 @@ public class FSEditLog implements LogsPurgeable {
|
||||||
logEdit(op);
|
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.
|
* Get all the journals this edit log is currently operating on.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2160,6 +2160,128 @@ public abstract class FSEditLogOp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 {
|
static private short readShort(DataInputStream in) throws IOException {
|
||||||
return Short.parseShort(FSImageSerialization.readString(in));
|
return Short.parseShort(FSImageSerialization.readString(in));
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,9 @@ public enum FSEditLogOpCodes {
|
||||||
OP_REASSIGN_LEASE ((byte) 22),
|
OP_REASSIGN_LEASE ((byte) 22),
|
||||||
OP_END_LOG_SEGMENT ((byte) 23),
|
OP_END_LOG_SEGMENT ((byte) 23),
|
||||||
OP_START_LOG_SEGMENT ((byte) 24),
|
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;
|
private byte opCode;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue