You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-commits@hadoop.apache.org by el...@apache.org on 2012/04/05 02:03:59 UTC
svn commit: r1309630 [1/2] - in
/hadoop/common/branches/branch-2/hadoop-hdfs-project: ./ dev-support/
hadoop-hdfs/ hadoop-hdfs/src/main/java/
hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/
hadoop-hdfs/src/main/java/org/apache/hadoop/...
Author: eli
Date: Thu Apr 5 00:03:58 2012
New Revision: 1309630
URL: http://svn.apache.org/viewvc?rev=1309630&view=rev
Log:
HDFS-3050. svn merge -c 1309629 from trunk
Added:
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsBinaryLoader.java
- copied unchanged from r1309629, hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsBinaryLoader.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsLoader.java
- copied unchanged from r1309629, hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsLoader.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsVisitor.java
- copied unchanged from r1309629, hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsVisitor.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsVisitorFactory.java
- copied unchanged from r1309629, hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsVisitorFactory.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsXmlLoader.java
- copied unchanged from r1309629, hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsXmlLoader.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/TeeOutputStream.java
- copied unchanged from r1309629, hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/TeeOutputStream.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/XMLUtils.java
- copied unchanged from r1309629, hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/XMLUtils.java
Removed:
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/BinaryTokenizer.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsElement.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsLoader.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsLoaderCurrent.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsVisitor.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/EditsVisitorFactory.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/TextEditsVisitor.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/Tokenizer.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/TokenizerFactory.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/XmlTokenizer.java
Modified:
hadoop/common/branches/branch-2/hadoop-hdfs-project/ (props changed)
hadoop/common/branches/branch-2/hadoop-hdfs-project/dev-support/test-patch.properties
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/ (props changed)
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/ (props changed)
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileInputStream.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileOutputStream.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOp.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/BinaryEditsVisitor.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsViewer.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/StatisticsEditsVisitor.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/XmlEditsVisitor.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/native/ (props changed)
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/datanode/ (props changed)
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/ (props changed)
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/secondary/ (props changed)
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/hdfs/ (props changed)
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/TestOfflineEditsViewer.java
hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/editsStored.xml
Propchange: hadoop/common/branches/branch-2/hadoop-hdfs-project/
------------------------------------------------------------------------------
Merged /hadoop/common/trunk/hadoop-hdfs-project:r1309629
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/dev-support/test-patch.properties
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/dev-support/test-patch.properties?rev=1309630&r1=1309629&r2=1309630&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/dev-support/test-patch.properties (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/dev-support/test-patch.properties Thu Apr 5 00:03:58 2012
@@ -18,4 +18,4 @@
OK_RELEASEAUDIT_WARNINGS=0
OK_FINDBUGS_WARNINGS=0
-OK_JAVADOC_WARNINGS=0
+OK_JAVADOC_WARNINGS=8
Propchange: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/
------------------------------------------------------------------------------
Merged /hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs:r1309629
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1309630&r1=1309629&r2=1309630&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Thu Apr 5 00:03:58 2012
@@ -216,6 +216,9 @@ Release 2.0.0 - UNRELEASED
HDFS-3084. FenceMethod.tryFence() and ShellCommandFencer should pass
namenodeId as well as host:port (todd)
+ HDFS-3050. rework OEV to share more code with the NameNode.
+ (Colin Patrick McCabe via eli)
+
OPTIMIZATIONS
HDFS-2477. Optimize computing the diff between a block report and the
Propchange: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/
------------------------------------------------------------------------------
Merged /hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java:r1309629
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileInputStream.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileInputStream.java?rev=1309630&r1=1309629&r2=1309630&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileInputStream.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileInputStream.java Thu Apr 5 00:03:58 2012
@@ -35,7 +35,7 @@ import com.google.common.annotations.Vis
* An implementation of the abstract class {@link EditLogInputStream}, which
* reads edits from a local file.
*/
-class EditLogFileInputStream extends EditLogInputStream {
+public class EditLogFileInputStream extends EditLogInputStream {
private final File file;
private final FileInputStream fStream;
final private long firstTxId;
@@ -69,7 +69,7 @@ class EditLogFileInputStream extends Edi
* @throws IOException if an actual IO error occurs while reading the
* header
*/
- EditLogFileInputStream(File name, long firstTxId, long lastTxId,
+ public EditLogFileInputStream(File name, long firstTxId, long lastTxId,
boolean isInProgress)
throws LogHeaderCorruptException, IOException {
file = name;
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileOutputStream.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileOutputStream.java?rev=1309630&r1=1309629&r2=1309630&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileOutputStream.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EditLogFileOutputStream.java Thu Apr 5 00:03:58 2012
@@ -64,7 +64,7 @@ public class EditLogFileOutputStream ext
* Size of flush buffer
* @throws IOException
*/
- EditLogFileOutputStream(File name, int size) throws IOException {
+ public EditLogFileOutputStream(File name, int size) throws IOException {
super();
file = name;
doubleBuf = new EditsDoubleBuffer(size);
@@ -174,7 +174,7 @@ public class EditLogFileOutputStream ext
* accumulates new log records while readyBuffer will be flushed and synced.
*/
@Override
- protected void flushAndSync() throws IOException {
+ public void flushAndSync() throws IOException {
if (fp == null) {
throw new IOException("Trying to use aborted output stream");
}
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOp.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOp.java?rev=1309630&r1=1309629&r2=1309630&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOp.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSEditLogOp.java Thu Apr 5 00:03:58 2012
@@ -21,7 +21,10 @@ import java.util.zip.CheckedInputStream;
import java.util.zip.Checksum;
import java.util.Arrays;
import java.util.EnumMap;
+import java.util.List;
+import org.apache.commons.codec.DecoderException;
+import org.apache.commons.codec.binary.Hex;
import org.apache.hadoop.fs.ChecksumException;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
@@ -39,10 +42,17 @@ import org.apache.hadoop.security.token.
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.DataOutputBuffer;
import org.apache.hadoop.io.ArrayWritable;
+import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableFactories;
import org.apache.hadoop.io.WritableFactory;
+import org.apache.hadoop.hdfs.util.XMLUtils;
+import org.apache.hadoop.hdfs.util.XMLUtils.InvalidXmlException;
+import org.apache.hadoop.hdfs.util.XMLUtils.Stanza;
import org.apache.hadoop.hdfs.DeprecatedUTF8;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
import java.io.DataInput;
import java.io.DataOutput;
@@ -59,7 +69,7 @@ import java.io.EOFException;
@InterfaceAudience.Private
@InterfaceStability.Unstable
public abstract class FSEditLogOp {
- final FSEditLogOpCodes opCode;
+ public final FSEditLogOpCodes opCode;
long txid;
@@ -121,7 +131,7 @@ public abstract class FSEditLogOp {
abstract void readFields(DataInputStream in, int logVersion)
throws IOException;
- abstract void writeFields(DataOutputStream out)
+ public abstract void writeFields(DataOutputStream out)
throws IOException;
static interface BlockListUpdatingOp {
@@ -201,7 +211,8 @@ public abstract class FSEditLogOp {
return (T)this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(path, out);
FSImageSerialization.writeShort(replication, out);
@@ -312,6 +323,49 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "LENGTH",
+ Integer.valueOf(length).toString());
+ XMLUtils.addSaxString(contentHandler, "PATH", path);
+ XMLUtils.addSaxString(contentHandler, "REPLICATION",
+ Short.valueOf(replication).toString());
+ XMLUtils.addSaxString(contentHandler, "MTIME",
+ Long.valueOf(mtime).toString());
+ XMLUtils.addSaxString(contentHandler, "ATIME",
+ Long.valueOf(atime).toString());
+ XMLUtils.addSaxString(contentHandler, "BLOCKSIZE",
+ Long.valueOf(blockSize).toString());
+ XMLUtils.addSaxString(contentHandler, "CLIENT_NAME", clientName);
+ XMLUtils.addSaxString(contentHandler, "CLIENT_MACHINE", clientMachine);
+ for (Block b : blocks) {
+ FSEditLogOp.blockToXml(contentHandler, b);
+ }
+ FSEditLogOp.permissionStatusToXml(contentHandler, permissions);
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.length = Integer.valueOf(st.getValue("LENGTH"));
+ this.path = st.getValue("PATH");
+ this.replication = Short.valueOf(st.getValue("REPLICATION"));
+ this.mtime = Long.valueOf(st.getValue("MTIME"));
+ this.atime = Long.valueOf(st.getValue("ATIME"));
+ this.blockSize = Long.valueOf(st.getValue("BLOCKSIZE"));
+ this.clientName = st.getValue("CLIENT_NAME");
+ this.clientMachine = st.getValue("CLIENT_MACHINE");
+ if (st.hasChildren("BLOCK")) {
+ List<Stanza> blocks = st.getChildren("BLOCK");
+ this.blocks = new Block[blocks.size()];
+ for (int i = 0; i < blocks.size(); i++) {
+ this.blocks[i] = FSEditLogOp.blockFromXml(blocks.get(i));
+ }
+ } else {
+ this.blocks = new Block[0];
+ }
+ this.permissions =
+ permissionStatusFromXml(st.getChildren("PERMISSION_STATUS").get(0));
+ }
}
static class AddOp extends AddCloseOp {
@@ -391,6 +445,7 @@ public abstract class FSEditLogOp {
}
@Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(path, out);
FSImageSerialization.writeCompactBlockArray(blocks, out);
@@ -418,6 +473,23 @@ public abstract class FSEditLogOp {
.append("]");
return sb.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "PATH", path);
+ for (Block b : blocks) {
+ FSEditLogOp.blockToXml(contentHandler, b);
+ }
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.path = st.getValue("PATH");
+ List<Stanza> blocks = st.getChildren("BLOCK");
+ this.blocks = new Block[blocks.size()];
+ for (int i = 0; i < blocks.size(); i++) {
+ this.blocks[i] = FSEditLogOp.blockFromXml(blocks.get(i));
+ }
+ }
}
static class SetReplicationOp extends FSEditLogOp {
@@ -443,7 +515,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(path, out);
FSImageSerialization.writeShort(replication, out);
@@ -474,6 +547,18 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "PATH", path);
+ XMLUtils.addSaxString(contentHandler, "REPLICATION",
+ Short.valueOf(replication).toString());
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.path = st.getValue("PATH");
+ this.replication = Short.valueOf(st.getValue("REPLICATION"));
+ }
}
static class ConcatDeleteOp extends FSEditLogOp {
@@ -506,7 +591,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(trg, out);
@@ -567,6 +653,38 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "LENGTH",
+ Integer.valueOf(length).toString());
+ XMLUtils.addSaxString(contentHandler, "TRG", trg);
+ XMLUtils.addSaxString(contentHandler, "TIMESTAMP",
+ Long.valueOf(timestamp).toString());
+ contentHandler.startElement("", "", "SOURCES", new AttributesImpl());
+ for (int i = 0; i < srcs.length; ++i) {
+ XMLUtils.addSaxString(contentHandler,
+ "SOURCE" + (i + 1), srcs[i]);
+ }
+ contentHandler.endElement("", "", "SOURCES");
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.length = Integer.valueOf(st.getValue("LENGTH"));
+ this.trg = st.getValue("TRG");
+ this.timestamp = Long.valueOf(st.getValue("TIMESTAMP"));
+ List<Stanza> sources = st.getChildren("SOURCES");
+ int i = 0;
+ while (true) {
+ if (!sources.get(0).hasChildren("SOURCE" + (i + 1)))
+ break;
+ i++;
+ }
+ srcs = new String[i];
+ for (i = 0; i < srcs.length; i++) {
+ srcs[i] = sources.get(0).getValue("SOURCE" + (i + 1));
+ }
+ }
}
static class RenameOldOp extends FSEditLogOp {
@@ -599,7 +717,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(src, out);
FSImageSerialization.writeString(dst, out);
@@ -643,6 +762,23 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "LENGTH",
+ Integer.valueOf(length).toString());
+ XMLUtils.addSaxString(contentHandler, "SRC", src);
+ XMLUtils.addSaxString(contentHandler, "DST", dst);
+ XMLUtils.addSaxString(contentHandler, "TIMESTAMP",
+ Long.valueOf(timestamp).toString());
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.length = Integer.valueOf(st.getValue("LENGTH"));
+ this.src = st.getValue("SRC");
+ this.dst = st.getValue("DST");
+ this.timestamp = Long.valueOf(st.getValue("TIMESTAMP"));
+ }
}
static class DeleteOp extends FSEditLogOp {
@@ -669,7 +805,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(path, out);
FSImageSerialization.writeLong(timestamp, out);
@@ -708,8 +845,23 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "LENGTH",
+ Integer.valueOf(length).toString());
+ XMLUtils.addSaxString(contentHandler, "PATH", path);
+ XMLUtils.addSaxString(contentHandler, "TIMESTAMP",
+ Long.valueOf(timestamp).toString());
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.length = Integer.valueOf(st.getValue("LENGTH"));
+ this.path = st.getValue("PATH");
+ this.timestamp = Long.valueOf(st.getValue("TIMESTAMP"));
+ }
}
-
+
static class MkdirOp extends FSEditLogOp {
int length;
String path;
@@ -740,7 +892,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(path, out);
FSImageSerialization.writeLong(timestamp, out); // mtime
@@ -797,6 +950,24 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "LENGTH",
+ Integer.valueOf(length).toString());
+ XMLUtils.addSaxString(contentHandler, "PATH", path);
+ XMLUtils.addSaxString(contentHandler, "TIMESTAMP",
+ Long.valueOf(timestamp).toString());
+ FSEditLogOp.permissionStatusToXml(contentHandler, permissions);
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.length = Integer.valueOf(st.getValue("LENGTH"));
+ this.path = st.getValue("PATH");
+ this.timestamp = Long.valueOf(st.getValue("TIMESTAMP"));
+ this.permissions =
+ permissionStatusFromXml(st.getChildren("PERMISSION_STATUS").get(0));
+ }
}
static class SetGenstampOp extends FSEditLogOp {
@@ -816,7 +987,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeLong(genStamp, out);
}
@@ -839,6 +1011,16 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "GENSTAMP",
+ Long.valueOf(genStamp).toString());
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.genStamp = Long.valueOf(st.getValue("GENSTAMP"));
+ }
}
static class SetPermissionsOp extends FSEditLogOp {
@@ -864,7 +1046,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(src, out);
permissions.write(out);
@@ -891,6 +1074,19 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "SRC", src);
+ XMLUtils.addSaxString(contentHandler, "MODE",
+ Short.valueOf(permissions.toShort()).toString());
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.src = st.getValue("SRC");
+ this.permissions = new FsPermission(
+ Short.valueOf(st.getValue("MODE")));
+ }
}
static class SetOwnerOp extends FSEditLogOp {
@@ -922,7 +1118,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(src, out);
FSImageSerialization.writeString(username == null ? "" : username, out);
@@ -953,6 +1150,25 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "SRC", src);
+ XMLUtils.addSaxString(contentHandler, "USERNAME", username);
+ if (groupname != null) {
+ XMLUtils.addSaxString(contentHandler, "GROUPNAME", groupname);
+ }
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.src = st.getValue("SRC");
+ this.username = st.getValue("USERNAME");
+ if (st.hasChildren("GROUPNAME")) {
+ this.groupname = st.getValue("GROUPNAME");
+ } else {
+ this.groupname = null;
+ }
+ }
}
static class SetNSQuotaOp extends FSEditLogOp {
@@ -968,7 +1184,8 @@ public abstract class FSEditLogOp {
.get(OP_SET_NS_QUOTA);
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
throw new IOException("Deprecated");
}
@@ -994,6 +1211,18 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "SRC", src);
+ XMLUtils.addSaxString(contentHandler, "NSQUOTA",
+ Long.valueOf(nsQuota).toString());
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.src = st.getValue("SRC");
+ this.nsQuota = Long.valueOf(st.getValue("NSQUOTA"));
+ }
}
static class ClearNSQuotaOp extends FSEditLogOp {
@@ -1008,7 +1237,8 @@ public abstract class FSEditLogOp {
.get(OP_CLEAR_NS_QUOTA);
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
throw new IOException("Deprecated");
}
@@ -1031,6 +1261,15 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "SRC", src);
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.src = st.getValue("SRC");
+ }
}
static class SetQuotaOp extends FSEditLogOp {
@@ -1062,7 +1301,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(src, out);
FSImageSerialization.writeLong(nsQuota, out);
@@ -1093,6 +1333,21 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "SRC", src);
+ XMLUtils.addSaxString(contentHandler, "NSQUOTA",
+ Long.valueOf(nsQuota).toString());
+ XMLUtils.addSaxString(contentHandler, "DSQUOTA",
+ Long.valueOf(dsQuota).toString());
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.src = st.getValue("SRC");
+ this.nsQuota = Long.valueOf(st.getValue("NSQUOTA"));
+ this.dsQuota = Long.valueOf(st.getValue("DSQUOTA"));
+ }
}
static class TimesOp extends FSEditLogOp {
@@ -1125,7 +1380,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(path, out);
FSImageSerialization.writeLong(mtime, out);
@@ -1170,6 +1426,24 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "LENGTH",
+ Integer.valueOf(length).toString());
+ XMLUtils.addSaxString(contentHandler, "PATH", path);
+ XMLUtils.addSaxString(contentHandler, "MTIME",
+ Long.valueOf(mtime).toString());
+ XMLUtils.addSaxString(contentHandler, "ATIME",
+ Long.valueOf(atime).toString());
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.length = Integer.valueOf(st.getValue("LENGTH"));
+ this.path = st.getValue("PATH");
+ this.mtime = Long.valueOf(st.getValue("MTIME"));
+ this.atime = Long.valueOf(st.getValue("ATIME"));
+ }
}
static class SymlinkOp extends FSEditLogOp {
@@ -1214,7 +1488,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(path, out);
FSImageSerialization.writeString(value, out);
@@ -1268,6 +1543,29 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "LENGTH",
+ Integer.valueOf(length).toString());
+ XMLUtils.addSaxString(contentHandler, "PATH", path);
+ XMLUtils.addSaxString(contentHandler, "VALUE", value);
+ XMLUtils.addSaxString(contentHandler, "MTIME",
+ Long.valueOf(mtime).toString());
+ XMLUtils.addSaxString(contentHandler, "ATIME",
+ Long.valueOf(atime).toString());
+ FSEditLogOp.permissionStatusToXml(contentHandler, permissionStatus);
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.length = Integer.valueOf(st.getValue("LENGTH"));
+ this.path = st.getValue("PATH");
+ this.value = st.getValue("VALUE");
+ this.mtime = Long.valueOf(st.getValue("MTIME"));
+ this.atime = Long.valueOf(st.getValue("ATIME"));
+ this.permissionStatus =
+ permissionStatusFromXml(st.getChildren("PERMISSION_STATUS").get(0));
+ }
}
static class RenameOp extends FSEditLogOp {
@@ -1306,7 +1604,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(src, out);
FSImageSerialization.writeString(dst, out);
@@ -1375,6 +1674,44 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "LENGTH",
+ Integer.valueOf(length).toString());
+ XMLUtils.addSaxString(contentHandler, "SRC", src);
+ XMLUtils.addSaxString(contentHandler, "DST", dst);
+ XMLUtils.addSaxString(contentHandler, "TIMESTAMP",
+ Long.valueOf(timestamp).toString());
+ StringBuilder bld = new StringBuilder();
+ String prefix = "";
+ for (Rename r : options) {
+ bld.append(prefix).append(r.toString());
+ prefix = "|";
+ }
+ XMLUtils.addSaxString(contentHandler, "OPTIONS", bld.toString());
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.length = Integer.valueOf(st.getValue("LENGTH"));
+ this.src = st.getValue("SRC");
+ this.dst = st.getValue("DST");
+ this.timestamp = Long.valueOf(st.getValue("TIMESTAMP"));
+ String opts = st.getValue("OPTIONS");
+ String o[] = opts.split("\\|");
+ this.options = new Rename[o.length];
+ for (int i = 0; i < o.length; i++) {
+ if (o[i].equals(""))
+ continue;
+ try {
+ this.options[i] = Rename.valueOf(o[i]);
+ } finally {
+ if (this.options[i] == null) {
+ System.err.println("error parsing Rename value: \"" + o[i] + "\"");
+ }
+ }
+ }
+ }
}
static class ReassignLeaseOp extends FSEditLogOp {
@@ -1406,7 +1743,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
FSImageSerialization.writeString(leaseHolder, out);
FSImageSerialization.writeString(path, out);
@@ -1437,6 +1775,19 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ XMLUtils.addSaxString(contentHandler, "LEASEHOLDER", leaseHolder);
+ XMLUtils.addSaxString(contentHandler, "PATH", path);
+ XMLUtils.addSaxString(contentHandler, "NEWHOLDER", newHolder);
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.leaseHolder = st.getValue("LEASEHOLDER");
+ this.path = st.getValue("PATH");
+ this.newHolder = st.getValue("NEWHOLDER");
+ }
}
static class GetDelegationTokenOp extends FSEditLogOp {
@@ -1463,7 +1814,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
token.write(out);
FSImageSerialization.writeLong(expiryTime, out);
@@ -1495,6 +1847,19 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ FSEditLogOp.delegationTokenToXml(contentHandler, token);
+ XMLUtils.addSaxString(contentHandler, "EXPIRY_TIME",
+ Long.valueOf(expiryTime).toString());
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.token = delegationTokenFromXml(st.getChildren(
+ "DELEGATION_TOKEN_IDENTIFIER").get(0));
+ this.expiryTime = Long.valueOf(st.getValue("EXPIRY_TIME"));
+ }
}
static class RenewDelegationTokenOp extends FSEditLogOp {
@@ -1521,7 +1886,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
token.write(out);
FSImageSerialization.writeLong(expiryTime, out);
@@ -1553,6 +1919,19 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ FSEditLogOp.delegationTokenToXml(contentHandler, token);
+ XMLUtils.addSaxString(contentHandler, "EXPIRY_TIME",
+ Long.valueOf(expiryTime).toString());
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.token = delegationTokenFromXml(st.getChildren(
+ "DELEGATION_TOKEN_IDENTIFIER").get(0));
+ this.expiryTime = Long.valueOf(st.getValue("EXPIRY_TIME"));
+ }
}
static class CancelDelegationTokenOp extends FSEditLogOp {
@@ -1573,7 +1952,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
token.write(out);
}
@@ -1597,6 +1977,16 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ FSEditLogOp.delegationTokenToXml(contentHandler, token);
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.token = delegationTokenFromXml(st.getChildren(
+ "DELEGATION_TOKEN_IDENTIFIER").get(0));
+ }
}
static class UpdateMasterKeyOp extends FSEditLogOp {
@@ -1616,7 +2006,8 @@ public abstract class FSEditLogOp {
return this;
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
key.write(out);
}
@@ -1640,6 +2031,16 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ FSEditLogOp.delegationKeyToXml(contentHandler, key);
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ this.key = delegationKeyFromXml(st.getChildren(
+ "DELEGATION_KEY").get(0));
+ }
}
static class LogSegmentOp extends FSEditLogOp {
@@ -1659,6 +2060,7 @@ public abstract class FSEditLogOp {
}
@Override
+ public
void writeFields(DataOutputStream out) throws IOException {
// no data stored
}
@@ -1673,6 +2075,15 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ // no data stored
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ // do nothing
+ }
}
static class InvalidOp extends FSEditLogOp {
@@ -1684,7 +2095,8 @@ public abstract class FSEditLogOp {
return (InvalidOp)opInstances.get().get(OP_INVALID);
}
- @Override
+ @Override
+ public
void writeFields(DataOutputStream out) throws IOException {
}
@@ -1704,6 +2116,14 @@ public abstract class FSEditLogOp {
builder.append("]");
return builder.toString();
}
+ @Override
+ protected void toXml(ContentHandler contentHandler) throws SAXException {
+ // no data stored
+ }
+
+ @Override void fromXml(Stanza st) throws InvalidXmlException {
+ // do nothing
+ }
}
static private short readShort(DataInputStream in) throws IOException {
@@ -1874,4 +2294,140 @@ public abstract class FSEditLogOp {
}
}
}
+
+ public void outputToXml(ContentHandler contentHandler) throws SAXException {
+ contentHandler.startElement("", "", "RECORD", new AttributesImpl());
+ XMLUtils.addSaxString(contentHandler, "OPCODE", opCode.toString());
+ contentHandler.startElement("", "", "DATA", new AttributesImpl());
+ XMLUtils.addSaxString(contentHandler, "TXID", "" + txid);
+ toXml(contentHandler);
+ contentHandler.endElement("", "", "DATA");
+ contentHandler.endElement("", "", "RECORD");
+ }
+
+ protected abstract void toXml(ContentHandler contentHandler)
+ throws SAXException;
+
+ abstract void fromXml(Stanza st) throws InvalidXmlException;
+
+ public void decodeXml(Stanza st) throws InvalidXmlException {
+ this.txid = Long.valueOf(st.getValue("TXID"));
+ fromXml(st);
+ }
+
+ public static void blockToXml(ContentHandler contentHandler, Block block)
+ throws SAXException {
+ contentHandler.startElement("", "", "BLOCK", new AttributesImpl());
+ XMLUtils.addSaxString(contentHandler, "BLOCK_ID",
+ Long.valueOf(block.getBlockId()).toString());
+ XMLUtils.addSaxString(contentHandler, "NUM_BYTES",
+ Long.valueOf(block.getNumBytes()).toString());
+ XMLUtils.addSaxString(contentHandler, "GENERATION_STAMP",
+ Long.valueOf(block.getGenerationStamp()).toString());
+ contentHandler.endElement("", "", "BLOCK");
+ }
+
+ public static Block blockFromXml(Stanza st)
+ throws InvalidXmlException {
+ long blockId = Long.valueOf(st.getValue("BLOCK_ID"));
+ long numBytes = Long.valueOf(st.getValue("NUM_BYTES"));
+ long generationStamp = Long.valueOf(st.getValue("GENERATION_STAMP"));
+ return new Block(blockId, numBytes, generationStamp);
+ }
+
+ public static void delegationTokenToXml(ContentHandler contentHandler,
+ DelegationTokenIdentifier token) throws SAXException {
+ contentHandler.startElement("", "", "DELEGATION_TOKEN_IDENTIFIER", new AttributesImpl());
+ XMLUtils.addSaxString(contentHandler, "KIND", token.getKind().toString());
+ XMLUtils.addSaxString(contentHandler, "SEQUENCE_NUMBER",
+ Integer.valueOf(token.getSequenceNumber()).toString());
+ XMLUtils.addSaxString(contentHandler, "OWNER",
+ token.getOwner().toString());
+ XMLUtils.addSaxString(contentHandler, "RENEWER",
+ token.getRenewer().toString());
+ XMLUtils.addSaxString(contentHandler, "REALUSER",
+ token.getRealUser().toString());
+ XMLUtils.addSaxString(contentHandler, "ISSUE_DATE",
+ Long.valueOf(token.getIssueDate()).toString());
+ XMLUtils.addSaxString(contentHandler, "MAX_DATE",
+ Long.valueOf(token.getMaxDate()).toString());
+ XMLUtils.addSaxString(contentHandler, "MASTER_KEY_ID",
+ Integer.valueOf(token.getMasterKeyId()).toString());
+ contentHandler.endElement("", "", "DELEGATION_TOKEN_IDENTIFIER");
+ }
+
+ public static DelegationTokenIdentifier delegationTokenFromXml(Stanza st)
+ throws InvalidXmlException {
+ String kind = st.getValue("KIND");
+ if (!kind.equals(DelegationTokenIdentifier.
+ HDFS_DELEGATION_KIND.toString())) {
+ throw new InvalidXmlException("can't understand " +
+ "DelegationTokenIdentifier KIND " + kind);
+ }
+ int seqNum = Integer.valueOf(st.getValue("SEQUENCE_NUMBER"));
+ String owner = st.getValue("OWNER");
+ String renewer = st.getValue("RENEWER");
+ String realuser = st.getValue("REALUSER");
+ long issueDate = Long.valueOf(st.getValue("ISSUE_DATE"));
+ long maxDate = Long.valueOf(st.getValue("MAX_DATE"));
+ int masterKeyId = Integer.valueOf(st.getValue("MASTER_KEY_ID"));
+ DelegationTokenIdentifier token =
+ new DelegationTokenIdentifier(new Text(owner),
+ new Text(renewer), new Text(realuser));
+ token.setSequenceNumber(seqNum);
+ token.setIssueDate(issueDate);
+ token.setMaxDate(maxDate);
+ token.setMasterKeyId(masterKeyId);
+ return token;
+ }
+
+ public static void delegationKeyToXml(ContentHandler contentHandler,
+ DelegationKey key) throws SAXException {
+ contentHandler.startElement("", "", "DELEGATION_KEY", new AttributesImpl());
+ XMLUtils.addSaxString(contentHandler, "KEY_ID",
+ Integer.valueOf(key.getKeyId()).toString());
+ XMLUtils.addSaxString(contentHandler, "EXPIRY_DATE",
+ Long.valueOf(key.getExpiryDate()).toString());
+ if (key.getEncodedKey() != null) {
+ XMLUtils.addSaxString(contentHandler, "KEY",
+ Hex.encodeHexString(key.getEncodedKey()));
+ }
+ contentHandler.endElement("", "", "DELEGATION_KEY");
+ }
+
+ public static DelegationKey delegationKeyFromXml(Stanza st)
+ throws InvalidXmlException {
+ int keyId = Integer.valueOf(st.getValue("KEY_ID"));
+ long expiryDate = Long.valueOf(st.getValue("EXPIRY_DATE"));
+ byte key[] = null;
+ try {
+ key = Hex.decodeHex(st.getValue("KEY").toCharArray());
+ } catch (DecoderException e) {
+ throw new InvalidXmlException(e.toString());
+ } catch (InvalidXmlException e) {
+ }
+ return new DelegationKey(keyId, expiryDate, key);
+ }
+
+ public static void permissionStatusToXml(ContentHandler contentHandler,
+ PermissionStatus perm) throws SAXException {
+ contentHandler.startElement("", "", "PERMISSION_STATUS", new AttributesImpl());
+ XMLUtils.addSaxString(contentHandler, "USERNAME", perm.getUserName());
+ XMLUtils.addSaxString(contentHandler, "GROUPNAME", perm.getGroupName());
+ XMLUtils.addSaxString(contentHandler, "MODE",
+ Short.valueOf(perm.getPermission().toShort()).toString());
+ contentHandler.endElement("", "", "PERMISSION_STATUS");
+ }
+
+ public static PermissionStatus permissionStatusFromXml(Stanza st)
+ throws InvalidXmlException {
+ String username = st.getValue("USERNAME");
+ String groupname = st.getValue("GROUPNAME");
+ short mode = Short.valueOf(st.getValue("MODE"));
+ return new PermissionStatus(username, groupname, new FsPermission(mode));
+ }
+
+ public static FSEditLogOp getOpInstance(FSEditLogOpCodes opCode) {
+ return opInstances.get().get(opCode);
+ }
}
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/BinaryEditsVisitor.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/BinaryEditsVisitor.java?rev=1309630&r1=1309629&r2=1309630&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/BinaryEditsVisitor.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/BinaryEditsVisitor.java Thu Apr 5 00:03:58 2012
@@ -17,104 +17,51 @@
*/
package org.apache.hadoop.hdfs.tools.offlineEditsViewer;
-import java.io.FileOutputStream;
-import java.io.DataOutputStream;
+import java.io.File;
import java.io.IOException;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
+import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp;
+import org.apache.hadoop.hdfs.server.namenode.EditLogFileOutputStream;
/**
* BinaryEditsVisitor implements a binary EditsVisitor
*/
@InterfaceAudience.Private
@InterfaceStability.Unstable
-public class BinaryEditsVisitor extends EditsVisitor {
- final private DataOutputStream out;
+public class BinaryEditsVisitor implements OfflineEditsVisitor {
+ final private EditLogFileOutputStream elfos;
/**
- * Create a processor that writes to a given file and
- * reads using a given Tokenizer
+ * Create a processor that writes to a given file
*
* @param filename Name of file to write output to
- * @param tokenizer Input tokenizer
*/
- public BinaryEditsVisitor(String filename, Tokenizer tokenizer)
- throws IOException {
-
- this(filename, tokenizer, false);
- }
-
- /**
- * Create a processor that writes to a given file and reads using
- * a given Tokenizer, may also print to screen
- *
- * @param filename Name of file to write output to
- * @param tokenizer Input tokenizer
- * @param printToScreen Mirror output to screen? (ignored for binary)
- */
- public BinaryEditsVisitor(String filename,
- Tokenizer tokenizer,
- boolean printToScreen) throws IOException {
-
- super(tokenizer);
- out = new DataOutputStream(new FileOutputStream(filename));
+ public BinaryEditsVisitor(String outputName) throws IOException {
+ this.elfos = new EditLogFileOutputStream(new File(outputName), 0);
+ elfos.create();
}
/**
* Start the visitor (initialization)
*/
@Override
- void start() throws IOException {
- // nothing to do for binary format
+ public void start(int version) throws IOException {
}
/**
* Finish the visitor
*/
@Override
- void finish() throws IOException {
- close();
- }
-
- /**
- * Finish the visitor and indicate an error
- */
- @Override
- void finishAbnormally() throws IOException {
- System.err.println("Error processing EditLog file. Exiting.");
- close();
- }
-
- /**
- * Close output stream and prevent further writing
- */
- private void close() throws IOException {
- out.close();
- }
-
- /**
- * Visit a enclosing element (element that has other elements in it)
- */
- @Override
- void visitEnclosingElement(Tokenizer.Token value) throws IOException {
- // nothing to do for binary format
+ public void close(Throwable error) throws IOException {
+ elfos.setReadyToFlush();
+ elfos.flushAndSync();
+ elfos.close();
}
- /**
- * End of eclosing element
- */
- @Override
- void leaveEnclosingElement() throws IOException {
- // nothing to do for binary format
- }
-
- /**
- * Visit a Token
- */
@Override
- Tokenizer.Token visit(Tokenizer.Token value) throws IOException {
- value.toBinary(out);
- return value;
+ public void visitOp(FSEditLogOp op) throws IOException {
+ elfos.write(op);
}
-}
+}
\ No newline at end of file
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsViewer.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsViewer.java?rev=1309630&r1=1309629&r2=1309630&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsViewer.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/OfflineEditsViewer.java Thu Apr 5 00:03:58 2012
@@ -18,12 +18,16 @@
package org.apache.hadoop.hdfs.tools.offlineEditsViewer;
import java.io.EOFException;
+import java.io.File;
import java.io.IOException;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.conf.Configured;
+import org.apache.hadoop.hdfs.server.namenode.EditLogFileInputStream;
+import org.apache.hadoop.hdfs.server.namenode.EditLogInputStream;
+import org.apache.hadoop.hdfs.tools.offlineEditsViewer.OfflineEditsLoader.OfflineEditsLoaderFactory;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
@@ -33,6 +37,7 @@ import org.apache.commons.cli.OptionBuil
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
+import org.xml.sax.SAXParseException;
/**
* This class implements an offline edits viewer, tool that
@@ -42,29 +47,9 @@ import org.apache.commons.cli.PosixParse
@InterfaceStability.Unstable
public class OfflineEditsViewer extends Configured implements Tool {
- private EditsLoader editsLoader;
private final static String defaultProcessor = "xml";
/**
- * Set editsLoader
- *
- * @param editsLoader EditsLoader
- */
- private void setEditsLoader(EditsLoader editsLoader) {
- this.editsLoader = editsLoader;
- }
-
- /**
- * Process EditLog file.
- *
- * @param visitor use this visitor to process the file
- */
- public void go(EditsVisitor visitor) throws IOException {
- setEditsLoader(EditsLoader.LoaderFactory.getLoader(visitor));
- editsLoader.loadEdits();
- }
-
- /**
* Print help.
*/
private void printHelp() {
@@ -90,6 +75,9 @@ public class OfflineEditsViewer extends
" format), stats (prints statistics about\n" +
" edits file)\n" +
"-h,--help Display usage information and exit\n" +
+ "-f,--fix-txids Renumber the transaction IDs in the input,\n" +
+ " so that there are no gaps or invalid " +
+ " transaction IDs.\n" +
"-v,--verbose More verbose output, prints the input and\n" +
" output filenames, for processors that write\n" +
" to a file, also output to screen. On large\n" +
@@ -124,11 +112,48 @@ public class OfflineEditsViewer extends
options.addOption("p", "processor", true, "");
options.addOption("v", "verbose", false, "");
+ options.addOption("f", "fix-txids", false, "");
options.addOption("h", "help", false, "");
return options;
}
+ /** Process an edit log using the chosen processor or visitor.
+ *
+ * @param inputFilename The file to process
+ * @param outputFilename The output file name
+ * @param processor If visitor is null, the processor to use
+ * @param visitor If non-null, the visitor to use.
+ *
+ * @return 0 on success; error code otherwise
+ */
+ public int go(String inputFileName, String outputFileName, String processor,
+ boolean printToScreen, boolean fixTxIds, OfflineEditsVisitor visitor)
+ {
+ if (printToScreen) {
+ System.out.println("input [" + inputFileName + "]");
+ System.out.println("output [" + outputFileName + "]");
+ }
+ try {
+ if (visitor == null) {
+ visitor = OfflineEditsVisitorFactory.getEditsVisitor(
+ outputFileName, processor, printToScreen);
+ }
+ boolean xmlInput = inputFileName.endsWith(".xml");
+ OfflineEditsLoader loader = OfflineEditsLoaderFactory.
+ createLoader(visitor, inputFileName, xmlInput);
+ if (fixTxIds) {
+ loader.setFixTxIds();
+ }
+ loader.loadEdits();
+ } catch(Exception e) {
+ System.err.println("Encountered exception. Exiting: " + e.getMessage());
+ e.printStackTrace(System.err);
+ return -1;
+ }
+ return 0;
+ }
+
/**
* Main entry point for ToolRunner (see ToolRunner docs)
*
@@ -137,17 +162,13 @@ public class OfflineEditsViewer extends
*/
@Override
public int run(String[] argv) throws Exception {
- int exitCode = 0;
-
Options options = buildOptions();
if(argv.length == 0) {
printHelp();
return -1;
}
-
CommandLineParser parser = new PosixParser();
CommandLine cmd;
-
try {
cmd = parser.parse(options, argv);
} catch (ParseException e) {
@@ -156,37 +177,20 @@ public class OfflineEditsViewer extends
printHelp();
return -1;
}
-
if(cmd.hasOption("h")) { // print help and exit
printHelp();
return -1;
}
-
- boolean printToScreen = false;
- String inputFilenameArg = cmd.getOptionValue("i");
- String outputFilenameArg = cmd.getOptionValue("o");
- String processor = cmd.getOptionValue("p");
- if(processor == null) { processor = defaultProcessor; }
-
- if(cmd.hasOption("v")) { // print output to screen too
- printToScreen = true;
- System.out.println("input [" + inputFilenameArg + "]");
- System.out.println("output [" + outputFilenameArg + "]");
+ String inputFileName = cmd.getOptionValue("i");
+ String outputFileName = cmd.getOptionValue("o");
+ String processor = cmd.getOptionValue("p");
+ if(processor == null) {
+ processor = defaultProcessor;
}
-
- try {
- go(EditsVisitorFactory.getEditsVisitor(
- outputFilenameArg,
- processor,
- TokenizerFactory.getTokenizer(inputFilenameArg),
- printToScreen));
- } catch (EOFException e) {
- System.err.println("Input file ended unexpectedly. Exiting");
- } catch(IOException e) {
- System.err.println("Encountered exception. Exiting: " + e.getMessage());
- }
-
- return exitCode;
+ boolean printToScreen = cmd.hasOption("v");
+ boolean fixTxIds = cmd.hasOption("f");
+ return go(inputFileName, outputFileName, processor,
+ printToScreen, fixTxIds, null);
}
/**
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/StatisticsEditsVisitor.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/StatisticsEditsVisitor.java?rev=1309630&r1=1309629&r2=1309630&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/StatisticsEditsVisitor.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/StatisticsEditsVisitor.java Thu Apr 5 00:03:58 2012
@@ -19,12 +19,15 @@ package org.apache.hadoop.hdfs.tools.off
import java.io.FileWriter;
import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
import java.util.Map;
import java.util.HashMap;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
+import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp;
import org.apache.hadoop.hdfs.server.namenode.FSEditLogOpCodes;
/**
@@ -34,26 +37,14 @@ import org.apache.hadoop.hdfs.server.nam
*/
@InterfaceAudience.Private
@InterfaceStability.Unstable
-public class StatisticsEditsVisitor extends EditsVisitor {
- private boolean printToScreen = false;
- private boolean okToWrite = false;
- final private FileWriter fw;
+public class StatisticsEditsVisitor implements OfflineEditsVisitor {
+ final private PrintStream out;
- public final Map<FSEditLogOpCodes, Long> opCodeCount =
+ private int version = -1;
+ private final Map<FSEditLogOpCodes, Long> opCodeCount =
new HashMap<FSEditLogOpCodes, Long>();
/**
- * Create a processor that writes to the file named.
- *
- * @param filename Name of file to write output to
- */
- public StatisticsEditsVisitor(String filename, Tokenizer tokenizer)
- throws IOException {
-
- this(filename, tokenizer, false);
- }
-
- /**
* Create a processor that writes to the file named and may or may not
* also output to the screen, as specified.
*
@@ -61,103 +52,29 @@ public class StatisticsEditsVisitor exte
* @param tokenizer Input tokenizer
* @param printToScreen Mirror output to screen?
*/
- public StatisticsEditsVisitor(String filename,
- Tokenizer tokenizer,
- boolean printToScreen) throws IOException {
-
- super(tokenizer);
- this.printToScreen = printToScreen;
- fw = new FileWriter(filename);
- okToWrite = true;
+ public StatisticsEditsVisitor(OutputStream out) throws IOException {
+ this.out = new PrintStream(out);
}
- /**
- * Start the visitor (initialization)
- */
+ /** Start the visitor */
@Override
- void start() throws IOException {
- // nothing to do
+ public void start(int version) throws IOException {
+ this.version = version;
}
- /* (non-Javadoc)
- * @see org.apache.hadoop.hdfs.tools.offlineEditsViewer.EditsVisitor#finish()
- */
- @Override
- void finish() throws IOException {
- write(getStatisticsString());
- close();
- }
-
- /* (non-Javadoc)
- * @see org.apache.hadoop.hdfs.tools.offlineEditsViewer.EditsVisitor#finishAbnormally()
- */
- @Override
- void finishAbnormally() throws IOException {
- close();
- }
-
- /**
- * Close output stream and prevent further writing
- */
- private void close() throws IOException {
- fw.close();
- okToWrite = false;
- }
-
- /**
- * Visit a enclosing element (element that has other elements in it)
- */
- @Override
- void visitEnclosingElement(Tokenizer.Token value) throws IOException {
- // nothing to do
- }
-
- /**
- * End of eclosing element
- */
+ /** Close the visitor */
@Override
- void leaveEnclosingElement() throws IOException {
- // nothing to do
- }
-
- /**
- * Visit a Token, calculate statistics
- *
- * @param value a Token to visit
- */
- @Override
- Tokenizer.Token visit(Tokenizer.Token value) throws IOException {
- // count the opCodes
- if(value.getEditsElement() == EditsElement.OPCODE) {
- if(value instanceof Tokenizer.ByteToken) {
- incrementOpCodeCount(
- FSEditLogOpCodes.fromByte(((Tokenizer.ByteToken)value).value));
- } else {
- throw new IOException("Token for EditsElement.OPCODE should be " +
- "of type Tokenizer.ByteToken, not " + value.getClass());
- }
+ public void close(Throwable error) throws IOException {
+ out.print(getStatisticsString());
+ if (error != null) {
+ out.print("EXITING ON ERROR: " + error.toString() + "\n");
}
- return value;
+ out.close();
}
- /**
- * Write parameter to output file (and possibly screen).
- *
- * @param toWrite Text to write to file
- */
- protected void write(String toWrite) throws IOException {
- if(!okToWrite)
- throw new IOException("file not open for writing.");
-
- if(printToScreen)
- System.out.print(toWrite);
-
- try {
- fw.write(toWrite);
- } catch (IOException e) {
- okToWrite = false;
- throw e;
- }
+ @Override
+ public void visitOp(FSEditLogOp op) throws IOException {
+ incrementOpCodeCount(op.opCode);
}
/**
@@ -189,13 +106,16 @@ public class StatisticsEditsVisitor exte
*/
public String getStatisticsString() {
StringBuffer sb = new StringBuffer();
+ sb.append(String.format(
+ " %-30.30s : %d%n",
+ "VERSION", version));
for(FSEditLogOpCodes opCode : FSEditLogOpCodes.values()) {
sb.append(String.format(
" %-30.30s (%3d): %d%n",
- opCode,
+ opCode.toString(),
opCode.getOpCode(),
opCodeCount.get(opCode)));
}
return sb.toString();
}
-}
+}
\ No newline at end of file
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/XmlEditsVisitor.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/XmlEditsVisitor.java?rev=1309630&r1=1309629&r2=1309630&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/XmlEditsVisitor.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/XmlEditsVisitor.java Thu Apr 5 00:03:58 2012
@@ -18,12 +18,19 @@
package org.apache.hadoop.hdfs.tools.offlineEditsViewer;
import java.io.IOException;
-import java.util.LinkedList;
+import java.io.OutputStream;
-import org.apache.hadoop.hdfs.tools.offlineImageViewer.DepthCounter;
+import org.apache.hadoop.hdfs.util.XMLUtils;
+import org.apache.hadoop.hdfs.server.namenode.FSEditLogOp;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+import com.sun.org.apache.xml.internal.serialize.OutputFormat;
+import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
/**
* An XmlEditsVisitor walks over an EditLog structure and writes out
@@ -31,140 +38,85 @@ import org.apache.hadoop.classification.
*/
@InterfaceAudience.Private
@InterfaceStability.Unstable
-public class XmlEditsVisitor extends TextEditsVisitor {
- final private LinkedList<EditsElement> tagQ =
- new LinkedList<EditsElement>();
-
- final private DepthCounter depthCounter = new DepthCounter();
+public class XmlEditsVisitor implements OfflineEditsVisitor {
+ private OutputStream out;
+ private ContentHandler contentHandler;
/**
* Create a processor that writes to the file named and may or may not
* also output to the screen, as specified.
*
* @param filename Name of file to write output to
- * @param tokenizer Input tokenizer
+ * @param printToScreen Mirror output to screen?
*/
- public XmlEditsVisitor(String filename, Tokenizer tokenizer)
- throws IOException {
-
- super(filename, tokenizer, false);
- }
-
- /**
- * Create a processor that writes to the file named and may or may not
- * also output to the screen, as specified.
- *
- * @param filename Name of file to write output to
- * @param tokenizer Input tokenizer
- * @param printToScreen Mirror output to screen? (ignored for binary)
- */
- public XmlEditsVisitor(String filename,
- Tokenizer tokenizer,
- boolean printToScreen) throws IOException {
-
- super(filename, tokenizer, printToScreen);
+ public XmlEditsVisitor(OutputStream out)
+ throws IOException {
+ this.out = out;
+ OutputFormat outFormat = new OutputFormat("XML", "UTF-8", true);
+ outFormat.setIndenting(true);
+ outFormat.setIndent(2);
+ outFormat.setDoctype(null, null);
+ XMLSerializer serializer = new XMLSerializer(out, outFormat);
+ contentHandler = serializer.asContentHandler();
+ try {
+ contentHandler.startDocument();
+ contentHandler.startElement("", "", "EDITS", new AttributesImpl());
+ } catch (SAXException e) {
+ throw new IOException("SAX error: " + e.getMessage());
+ }
}
/**
* Start visitor (initialization)
*/
@Override
- void start() throws IOException {
- write("<?xml version=\"1.0\"?>\n");
- }
-
- /**
- * Finish visitor
- */
- @Override
- void finish() throws IOException {
- super.finish();
- }
-
- /**
- * Finish with error
- */
- @Override
- void finishAbnormally() throws IOException {
- write("\n<!-- Error processing EditLog file. Exiting -->\n");
- super.finishAbnormally();
- }
-
- /**
- * Visit a Token
- *
- * @param value a Token to visit
- */
- @Override
- Tokenizer.Token visit(Tokenizer.Token value) throws IOException {
- writeTag(value.getEditsElement().toString(), value.toString());
- return value;
+ public void start(int version) throws IOException {
+ try {
+ contentHandler.startElement("", "", "EDITS_VERSION", new AttributesImpl());
+ StringBuilder bld = new StringBuilder();
+ bld.append(version);
+ addString(bld.toString());
+ contentHandler.endElement("", "", "EDITS_VERSION");
+ }
+ catch (SAXException e) {
+ throw new IOException("SAX error: " + e.getMessage());
+ }
}
- /**
- * Visit an enclosing element (element that cntains other elements)
- *
- * @param value a Token to visit
- */
- @Override
- void visitEnclosingElement(Tokenizer.Token value) throws IOException {
- printIndents();
- write("<" + value.getEditsElement().toString() + ">\n");
- tagQ.push(value.getEditsElement());
- depthCounter.incLevel();
+ public void addString(String str) throws SAXException {
+ int slen = str.length();
+ char arr[] = new char[slen];
+ str.getChars(0, slen, arr, 0);
+ contentHandler.characters(arr, 0, slen);
}
-
+
/**
- * Leave enclosing element
+ * Finish visitor
*/
@Override
- void leaveEnclosingElement() throws IOException {
- depthCounter.decLevel();
- if(tagQ.size() == 0)
- throw new IOException("Tried to exit non-existent enclosing element " +
- "in EditLog file");
-
- EditsElement element = tagQ.pop();
- printIndents();
- write("</" + element.toString() + ">\n");
- }
-
- /**
- * Write an XML tag
- *
- * @param tag a tag name
- * @param value a tag value
- */
- private void writeTag(String tag, String value) throws IOException {
- printIndents();
- if(value.length() > 0) {
- write("<" + tag + ">" + value + "</" + tag + ">\n");
- } else {
- write("<" + tag + "/>\n");
+ public void close(Throwable error) throws IOException {
+ try {
+ contentHandler.endElement("", "", "EDITS");
+ if (error != null) {
+ String msg = error.getMessage();
+ XMLUtils.addSaxString(contentHandler, "ERROR",
+ (msg == null) ? "null" : msg);
+ }
+ contentHandler.endDocument();
}
+ catch (SAXException e) {
+ throw new IOException("SAX error: " + e.getMessage());
+ }
+ out.close();
}
- // prepared values that printIndents is likely to use
- final private static String [] indents = {
- "",
- " ",
- " ",
- " ",
- " ",
- " ",
- " " };
-
- /**
- * Prints the leading spaces based on depth level
- */
- private void printIndents() throws IOException {
+ @Override
+ public void visitOp(FSEditLogOp op) throws IOException {
try {
- write(indents[depthCounter.getLevel()]);
- } catch (IndexOutOfBoundsException e) {
- // unlikely needed so can be slow
- for(int i = 0; i < depthCounter.getLevel(); i++)
- write(" ");
+ op.outputToXml(contentHandler);
+ }
+ catch (SAXException e) {
+ throw new IOException("SAX error: " + e.getMessage());
}
-
}
}
Propchange: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/native/
------------------------------------------------------------------------------
Merged /hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/native:r1309629
Propchange: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/datanode/
------------------------------------------------------------------------------
Merged /hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/datanode:r1309629
Propchange: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs/
------------------------------------------------------------------------------
Merged /hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/hdfs:r1309629
Propchange: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/secondary/
------------------------------------------------------------------------------
Merged /hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/webapps/secondary:r1309629
Propchange: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/hdfs/
------------------------------------------------------------------------------
Merged /hadoop/common/trunk/hadoop-hdfs-project/hadoop-hdfs/src/test/hdfs:r1309629
Modified: hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/TestOfflineEditsViewer.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/TestOfflineEditsViewer.java?rev=1309630&r1=1309629&r2=1309630&view=diff
==============================================================================
--- hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/TestOfflineEditsViewer.java (original)
+++ hadoop/common/branches/branch-2/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/offlineEditsViewer/TestOfflineEditsViewer.java Thu Apr 5 00:03:58 2012
@@ -18,6 +18,7 @@
package org.apache.hadoop.hdfs.tools.offlineEditsViewer;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.File;
import java.nio.ByteBuffer;
@@ -33,8 +34,6 @@ import org.apache.commons.logging.LogFac
import org.apache.hadoop.hdfs.server.namenode.FSEditLogOpCodes;
import org.apache.hadoop.hdfs.tools.offlineEditsViewer.OfflineEditsViewer;
-import org.apache.hadoop.hdfs.tools.offlineEditsViewer.TokenizerFactory;
-import org.apache.hadoop.hdfs.tools.offlineEditsViewer.EditsVisitorFactory;
import org.apache.hadoop.hdfs.DFSTestUtil;
import org.apache.hadoop.hdfs.server.namenode.OfflineEditsViewerHelper;
@@ -158,11 +157,8 @@ public class TestOfflineEditsViewer {
LOG.info("Running oev [" + inFilename + "] [" + outFilename + "]");
OfflineEditsViewer oev = new OfflineEditsViewer();
- oev.go( EditsVisitorFactory.getEditsVisitor(
- outFilename,
- processor,
- TokenizerFactory.getTokenizer(inFilename),
- false));
+ if (oev.go(inFilename, outFilename, processor, true, false, null) != 0)
+ throw new RuntimeException("oev failed");
}
/**
@@ -173,14 +169,11 @@ public class TestOfflineEditsViewer {
*/
private boolean hasAllOpCodes(String inFilename) throws IOException {
String outFilename = inFilename + ".stats";
- StatisticsEditsVisitor visitor =
- (StatisticsEditsVisitor)EditsVisitorFactory.getEditsVisitor(
- outFilename,
- "stats",
- TokenizerFactory.getTokenizer(inFilename),
- false);
+ FileOutputStream fout = new FileOutputStream(outFilename);
+ StatisticsEditsVisitor visitor = new StatisticsEditsVisitor(fout);
OfflineEditsViewer oev = new OfflineEditsViewer();
- oev.go(visitor);
+ if (oev.go(inFilename, outFilename, "stats", false, false, visitor) != 0)
+ return false;
LOG.info("Statistics for " + inFilename + "\n" +
visitor.getStatisticsString());
@@ -190,6 +183,8 @@ public class TestOfflineEditsViewer {
if(obsoleteOpCodes.containsKey(opCode)) {
continue;
}
+ if (opCode == FSEditLogOpCodes.OP_INVALID)
+ continue;
Long count = visitor.getStatistics().get(opCode);
if((count == null) || (count == 0)) {
hasAllOpCodes = false;