HDFS-3487. offlineimageviewer should give byte offset information when it encounters an exception. Contributed by Colin Patrick McCabe
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1344973 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a2b4ce9286
commit
1586941a3a
|
@ -141,6 +141,9 @@ Release 2.0.1-alpha - UNRELEASED
|
||||||
HDFS-3486. offlineimageviewer can't read fsimage files that contain
|
HDFS-3486. offlineimageviewer can't read fsimage files that contain
|
||||||
persistent delegation tokens. (Colin Patrick McCabe via eli)
|
persistent delegation tokens. (Colin Patrick McCabe via eli)
|
||||||
|
|
||||||
|
HDFS-3487. offlineimageviewer should give byte offset information
|
||||||
|
when it encounters an exception. (Colin Patrick McCabe via eli)
|
||||||
|
|
||||||
Release 2.0.0-alpha - UNRELEASED
|
Release 2.0.0-alpha - UNRELEASED
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -145,6 +145,7 @@ class ImageLoaderCurrent implements ImageLoader {
|
||||||
@Override
|
@Override
|
||||||
public void loadImage(DataInputStream in, ImageVisitor v,
|
public void loadImage(DataInputStream in, ImageVisitor v,
|
||||||
boolean skipBlocks) throws IOException {
|
boolean skipBlocks) throws IOException {
|
||||||
|
boolean done = false;
|
||||||
try {
|
try {
|
||||||
v.start();
|
v.start();
|
||||||
v.visitEnclosingElement(ImageElement.FS_IMAGE);
|
v.visitEnclosingElement(ImageElement.FS_IMAGE);
|
||||||
|
@ -189,11 +190,13 @@ class ImageLoaderCurrent implements ImageLoader {
|
||||||
}
|
}
|
||||||
|
|
||||||
v.leaveEnclosingElement(); // FSImage
|
v.leaveEnclosingElement(); // FSImage
|
||||||
v.finish();
|
done = true;
|
||||||
} catch(IOException e) {
|
} finally {
|
||||||
// Tell the visitor to clean up, then re-throw the exception
|
if (done) {
|
||||||
v.finishAbnormally();
|
v.finish();
|
||||||
throw e;
|
} else {
|
||||||
|
v.finishAbnormally();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,8 +30,12 @@ import org.apache.commons.cli.OptionBuilder;
|
||||||
import org.apache.commons.cli.Options;
|
import org.apache.commons.cli.Options;
|
||||||
import org.apache.commons.cli.ParseException;
|
import org.apache.commons.cli.ParseException;
|
||||||
import org.apache.commons.cli.PosixParser;
|
import org.apache.commons.cli.PosixParser;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
|
import org.apache.hadoop.io.IOUtils;
|
||||||
|
import org.apache.hadoop.hdfs.server.namenode.FSEditLogLoader.PositionTrackingInputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* OfflineImageViewer to dump the contents of an Hadoop image file to XML
|
* OfflineImageViewer to dump the contents of an Hadoop image file to XML
|
||||||
|
@ -40,6 +44,8 @@ import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
*/
|
*/
|
||||||
@InterfaceAudience.Private
|
@InterfaceAudience.Private
|
||||||
public class OfflineImageViewer {
|
public class OfflineImageViewer {
|
||||||
|
public static final Log LOG = LogFactory.getLog(OfflineImageViewer.class);
|
||||||
|
|
||||||
private final static String usage =
|
private final static String usage =
|
||||||
"Usage: bin/hdfs oiv [OPTIONS] -i INPUTFILE -o OUTPUTFILE\n" +
|
"Usage: bin/hdfs oiv [OPTIONS] -i INPUTFILE -o OUTPUTFILE\n" +
|
||||||
"Offline Image Viewer\n" +
|
"Offline Image Viewer\n" +
|
||||||
|
@ -112,24 +118,28 @@ public class OfflineImageViewer {
|
||||||
*/
|
*/
|
||||||
public void go() throws IOException {
|
public void go() throws IOException {
|
||||||
DataInputStream in = null;
|
DataInputStream in = null;
|
||||||
|
PositionTrackingInputStream tracker = null;
|
||||||
|
ImageLoader fsip = null;
|
||||||
|
boolean done = false;
|
||||||
try {
|
try {
|
||||||
in = new DataInputStream(new BufferedInputStream(
|
tracker = new PositionTrackingInputStream(new BufferedInputStream(
|
||||||
new FileInputStream(new File(inputFile))));
|
new FileInputStream(new File(inputFile))));
|
||||||
|
in = new DataInputStream(tracker);
|
||||||
|
|
||||||
int imageVersionFile = findImageVersion(in);
|
int imageVersionFile = findImageVersion(in);
|
||||||
|
|
||||||
ImageLoader fsip =
|
fsip = ImageLoader.LoaderFactory.getLoader(imageVersionFile);
|
||||||
ImageLoader.LoaderFactory.getLoader(imageVersionFile);
|
|
||||||
|
|
||||||
if(fsip == null)
|
if(fsip == null)
|
||||||
throw new IOException("No image processor to read version " +
|
throw new IOException("No image processor to read version " +
|
||||||
imageVersionFile + " is available.");
|
imageVersionFile + " is available.");
|
||||||
|
|
||||||
fsip.loadImage(in, processor, skipBlocks);
|
fsip.loadImage(in, processor, skipBlocks);
|
||||||
|
done = true;
|
||||||
} finally {
|
} finally {
|
||||||
if(in != null) in.close();
|
if (!done) {
|
||||||
|
LOG.error("image loading failed at offset " + tracker.getPos());
|
||||||
|
}
|
||||||
|
IOUtils.cleanup(LOG, in, tracker);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue