diff --git hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java index 33220c6..c37a791 100644 --- hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java +++ hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java @@ -474,17 +474,23 @@ private void startStore(Path recoveryRoot) throws IOException { try { stateDb = JniDBFactory.factory.open(dbfile, options); } catch (NativeDB.DBException e) { - if (e.isNotFound() || e.getMessage().contains(" does not exist ")) { - LOG.info("Creating state database at " + dbfile); - options.createIfMissing(true); + Path currentPath = new Path(dbPath, "CURRENT"); + File current = new File(currentPath.toString()); + if (current.exists()) { + LOG.error("Open LevelDB error, delete file CURRENT ", e); try { - stateDb = JniDBFactory.factory.open(dbfile, options); - storeVersion(); - } catch (DBException dbExc) { - throw new IOException("Unable to create state store", dbExc); + current.delete(); + } catch (SecurityException delEx) { + LOG.warn("Delete file error ", delEx); } - } else { - throw e; + } + LOG.info("Creating state database at " + dbfile); + options.createIfMissing(true); + try { + stateDb = JniDBFactory.factory.open(dbfile, options); + storeVersion(); + } catch (DBException dbExc) { + throw new IOException("Unable to create state store", dbExc); } } checkVersion(); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/recovery/NMLeveldbStateStoreService.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/recovery/NMLeveldbStateStoreService.java index 9d54688..003a69c 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/recovery/NMLeveldbStateStoreService.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/recovery/NMLeveldbStateStoreService.java @@ -863,19 +863,25 @@ protected void initStorage(Configuration conf) try { db = JniDBFactory.factory.open(dbfile, options); } catch (NativeDB.DBException e) { - if (e.isNotFound() || e.getMessage().contains(" does not exist ")) { - LOG.info("Creating state database at " + dbfile); - isNewlyCreated = true; - options.createIfMissing(true); + Path currentPath = new Path(storeRoot, "CURRENT"); + File current = new File(currentPath.toString()); + if (current.exists()) { + LOG.error("Open LevelDB error, delete file CURRENT ", e); try { - db = JniDBFactory.factory.open(dbfile, options); - // store version - storeVersion(); - } catch (DBException dbErr) { - throw new IOException(dbErr.getMessage(), dbErr); + current.delete(); + } catch (SecurityException delEx) { + LOG.warn("Delete file error ", delEx); } - } else { - throw e; + } + LOG.info("Creating state database at " + dbfile); + isNewlyCreated = true; + options.createIfMissing(true); + try { + db = JniDBFactory.factory.open(dbfile, options); + // store version + storeVersion(); + } catch (DBException dbErr) { + throw new IOException(dbErr.getMessage(), dbErr); } } checkVersion();