From 7217494f40dd99068a3f3b155261b1dac6c67828 Mon Sep 17 00:00:00 2001 From: Hanisha Koneru Date: Mon, 10 Jun 2019 13:43:56 -0700 Subject: [PATCH] HDFS-10659. Namenode crashes after Journalnode re-installation in an HA cluster due to missing paxos directory. Contributed by star, Hanisha Koneru. Signed-off-by: Wei-Chiu Chuang --- .../hdfs/qjournal/server/JNStorage.java | 30 +++++++++++-------- .../hadoop/hdfs/qjournal/server/Journal.java | 2 +- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JNStorage.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JNStorage.java index 612fd3d19f5..305f1e87ef9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JNStorage.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JNStorage.java @@ -82,7 +82,8 @@ class JNStorage extends Storage { } @Override - public boolean isPreUpgradableLayout(StorageDirectory sd) throws IOException { + public boolean isPreUpgradableLayout(StorageDirectory sd) + throws IOException { return false; } @@ -90,7 +91,8 @@ class JNStorage extends Storage { * Find an edits file spanning the given transaction ID range. * If no such file exists, an exception is thrown. */ - File findFinalizedEditsFile(long startTxId, long endTxId) throws IOException { + File findFinalizedEditsFile(long startTxId, long endTxId) + throws IOException { File ret = new File(sd.getCurrentDir(), NNStorage.getFinalizedEditsFileName(startTxId, endTxId)); if (!ret.exists()) { @@ -152,11 +154,18 @@ class JNStorage extends Storage { * paxos-like recovery process for the given log segment. */ File getPaxosFile(long segmentTxId) { - return new File(getPaxosDir(), String.valueOf(segmentTxId)); + return new File(getOrCreatePaxosDir(), String.valueOf(segmentTxId)); } - File getPaxosDir() { - return new File(sd.getCurrentDir(), "paxos"); + File getOrCreatePaxosDir() { + File paxosDir = new File(sd.getCurrentDir(), "paxos"); + if(!paxosDir.exists()) { + LOG.info("Creating paxos dir: {}", paxosDir.toPath()); + if(!paxosDir.mkdir()) { + LOG.error("Could not create paxos dir: {}", paxosDir.toPath()); + } + } + return paxosDir; } File getRoot() { @@ -170,7 +179,8 @@ class JNStorage extends Storage { void purgeDataOlderThan(long minTxIdToKeep) throws IOException { purgeMatching(sd.getCurrentDir(), CURRENT_DIR_PURGE_REGEXES, minTxIdToKeep); - purgeMatching(getPaxosDir(), PAXOS_DIR_PURGE_REGEXES, minTxIdToKeep); + purgeMatching(getOrCreatePaxosDir(), + PAXOS_DIR_PURGE_REGEXES, minTxIdToKeep); } /** @@ -221,16 +231,10 @@ class JNStorage extends Storage { unlockAll(); sd.clearDirectory(); writeProperties(sd); - createPaxosDir(); + getOrCreatePaxosDir(); analyzeStorage(); } - void createPaxosDir() throws IOException { - if (!getPaxosDir().mkdirs()) { - throw new IOException("Could not create paxos dir: " + getPaxosDir()); - } - } - void analyzeStorage() throws IOException { this.state = sd.analyzeStorage(StartupOption.REGULAR, this); if (state == StorageState.NORMAL) { diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/Journal.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/Journal.java index aa0099efb8e..17c09fee84e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/Journal.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/Journal.java @@ -1119,7 +1119,7 @@ public class Journal implements Closeable { + ".\n new LV = " + storage.getLayoutVersion() + "; new CTime = " + storage.getCTime()); storage.getJournalManager().doUpgrade(storage); - storage.createPaxosDir(); + storage.getOrCreatePaxosDir(); // Copy over the contents of the epoch data files to the new dir. File currentDir = storage.getSingularStorageDir().getCurrentDir();