HDFS-5721. sharedEditsImage in Namenode#initializeSharedEdits() should be closed before method returns. Contributed by Ted Yu.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1561389 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Todd Lipcon 2014-01-25 20:21:58 +00:00
parent 7c7a4463fd
commit 6266273c61
4 changed files with 52 additions and 24 deletions

View File

@ -310,6 +310,9 @@ Release 2.4.0 - UNRELEASED
HDFS-5719. FSImage#doRollback() should close prevState before return HDFS-5719. FSImage#doRollback() should close prevState before return
(Ted Yu via todd) (Ted Yu via todd)
HDFS-5721. sharedEditsImage in Namenode#initializeSharedEdits() should be
closed before method returns (Ted Yu via todd)
BREAKDOWN OF HDFS-2832 SUBTASKS AND RELATED JIRAS BREAKDOWN OF HDFS-2832 SUBTASKS AND RELATED JIRAS
HDFS-4985. Add storage type to the protocol and expose it in block report HDFS-4985. Add storage type to the protocol and expose it in block report

View File

@ -604,8 +604,14 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
long loadStart = now(); long loadStart = now();
String nameserviceId = DFSUtil.getNamenodeNameServiceId(conf); String nameserviceId = DFSUtil.getNamenodeNameServiceId(conf);
namesystem.loadFSImage(startOpt, fsImage, try {
HAUtil.isHAEnabled(conf, nameserviceId)); namesystem.loadFSImage(startOpt, fsImage,
HAUtil.isHAEnabled(conf, nameserviceId));
} catch (IOException ioe) {
LOG.warn("Encountered exception loading fsimage", ioe);
fsImage.close();
throw ioe;
}
long timeTakenToLoadFSImage = now() - loadStart; long timeTakenToLoadFSImage = now() - loadStart;
LOG.info("Finished loading FSImage in " + timeTakenToLoadFSImage + " msecs"); LOG.info("Finished loading FSImage in " + timeTakenToLoadFSImage + " msecs");
NameNodeMetrics nnMetrics = NameNode.getNameNodeMetrics(); NameNodeMetrics nnMetrics = NameNode.getNameNodeMetrics();

View File

@ -818,14 +818,20 @@ public class NameNode implements NameNodeStatusMXBean {
System.out.println("Formatting using clusterid: " + clusterId); System.out.println("Formatting using clusterid: " + clusterId);
FSImage fsImage = new FSImage(conf, nameDirsToFormat, editDirsToFormat); FSImage fsImage = new FSImage(conf, nameDirsToFormat, editDirsToFormat);
FSNamesystem fsn = new FSNamesystem(conf, fsImage); try {
fsImage.getEditLog().initJournalsForWrite(); FSNamesystem fsn = new FSNamesystem(conf, fsImage);
fsImage.getEditLog().initJournalsForWrite();
if (!fsImage.confirmFormat(force, isInteractive)) {
return true; // aborted if (!fsImage.confirmFormat(force, isInteractive)) {
return true; // aborted
}
fsImage.format(fsn, clusterId);
} catch (IOException ioe) {
LOG.warn("Encountered exception during format: ", ioe);
fsImage.close();
throw ioe;
} }
fsImage.format(fsn, clusterId);
return false; return false;
} }
@ -899,6 +905,7 @@ public class NameNode implements NameNodeStatusMXBean {
} }
NNStorage existingStorage = null; NNStorage existingStorage = null;
FSImage sharedEditsImage = null;
try { try {
FSNamesystem fsns = FSNamesystem fsns =
FSNamesystem.loadFromDisk(getConfigurationWithoutSharedEdits(conf)); FSNamesystem.loadFromDisk(getConfigurationWithoutSharedEdits(conf));
@ -908,7 +915,7 @@ public class NameNode implements NameNodeStatusMXBean {
List<URI> sharedEditsDirs = FSNamesystem.getSharedEditsDirs(conf); List<URI> sharedEditsDirs = FSNamesystem.getSharedEditsDirs(conf);
FSImage sharedEditsImage = new FSImage(conf, sharedEditsImage = new FSImage(conf,
Lists.<URI>newArrayList(), Lists.<URI>newArrayList(),
sharedEditsDirs); sharedEditsDirs);
sharedEditsImage.getEditLog().initJournalsForWrite(); sharedEditsImage.getEditLog().initJournalsForWrite();
@ -936,6 +943,13 @@ public class NameNode implements NameNodeStatusMXBean {
LOG.error("Could not initialize shared edits dir", ioe); LOG.error("Could not initialize shared edits dir", ioe);
return true; // aborted return true; // aborted
} finally { } finally {
if (sharedEditsImage != null) {
try {
sharedEditsImage.close();
} catch (IOException ioe) {
LOG.warn("Could not close sharedEditsImage", ioe);
}
}
// Have to unlock storage explicitly for the case when we're running in a // Have to unlock storage explicitly for the case when we're running in a
// unit test, which runs in the same JVM as NNs. // unit test, which runs in the same JVM as NNs.
if (existingStorage != null) { if (existingStorage != null) {

View File

@ -190,24 +190,29 @@ public class BootstrapStandby implements Tool, Configurable {
// Load the newly formatted image, using all of the directories (including shared // Load the newly formatted image, using all of the directories (including shared
// edits) // edits)
FSImage image = new FSImage(conf); FSImage image = new FSImage(conf);
image.getStorage().setStorageInfo(storage); try {
image.initEditLog(); image.getStorage().setStorageInfo(storage);
assert image.getEditLog().isOpenForRead() : image.initEditLog();
assert image.getEditLog().isOpenForRead() :
"Expected edit log to be open for read"; "Expected edit log to be open for read";
// Ensure that we have enough edits already in the shared directory to
// start up from the last checkpoint on the active.
if (!checkLogsAvailableForRead(image, imageTxId, curTxId)) {
return ERR_CODE_LOGS_UNAVAILABLE;
}
image.getStorage().writeTransactionIdFileToStorage(curTxId);
// Download that checkpoint into our storage directories. // Ensure that we have enough edits already in the shared directory to
MD5Hash hash = TransferFsImage.downloadImageToStorage( // start up from the last checkpoint on the active.
if (!checkLogsAvailableForRead(image, imageTxId, curTxId)) {
return ERR_CODE_LOGS_UNAVAILABLE;
}
image.getStorage().writeTransactionIdFileToStorage(curTxId);
// Download that checkpoint into our storage directories.
MD5Hash hash = TransferFsImage.downloadImageToStorage(
otherHttpAddr, imageTxId, otherHttpAddr, imageTxId,
storage, true); storage, true);
image.saveDigestAndRenameCheckpointImage(imageTxId, hash); image.saveDigestAndRenameCheckpointImage(imageTxId, hash);
} catch (IOException ioe) {
image.close();
throw ioe;
}
return 0; return 0;
} }