@Override protected void startInternal() throws Exception { Path storeRoot = createStorageDir(); Options options = new Options(); options.createIfMissing(false); options.logger(new LeveldbLogger()); LOG.info("Using state database at " + storeRoot + " for recovery"); File dbfile = new File(storeRoot.toString()); 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); options.createIfMissing(true); try { db = JniDBFactory.factory.open(dbfile, options); // store version storeVersion(); } catch (DBException dbErr) { throw new IOException(dbErr.getMessage(), dbErr); } } else { throw e; } } }
// Allows tests to have more control over when directories are cleaned up. @VisibleForTesting ExternalShuffleBlockResolver( TransportConf conf, File registeredExecutorFile, Executor directoryCleaner) throws IOException { this.conf = conf; this.registeredExecutorFile = registeredExecutorFile; if (registeredExecutorFile != null) { Options options = new Options(); options.createIfMissing(false); options.logger(new LevelDBLogger()); DB tmpDb; try { tmpDb = JniDBFactory.factory.open(registeredExecutorFile, options); } catch (NativeDB.DBException e) { if (e.isNotFound() || e.getMessage().contains(" does not exist ")) { logger.info("Creating state database at " + registeredExecutorFile); options.createIfMissing(true); try { tmpDb = JniDBFactory.factory.open(registeredExecutorFile, options); } catch (NativeDB.DBException dbExc) { throw new IOException("Unable to create state store", dbExc); } } else { // the leveldb file seems to be corrupt somehow. Lets just blow it away and create a new // one, so we can keep processing new apps logger.error( "error opening leveldb file {}. Creating new file, will not be able to " + "recover state for existing applications", registeredExecutorFile, e); if (registeredExecutorFile.isDirectory()) { for (File f : registeredExecutorFile.listFiles()) { if (!f.delete()) { logger.warn("error deleting {}", f.getPath()); } } } if (!registeredExecutorFile.delete()) { logger.warn("error deleting {}", registeredExecutorFile.getPath()); } options.createIfMissing(true); try { tmpDb = JniDBFactory.factory.open(registeredExecutorFile, options); } catch (NativeDB.DBException dbExc) { throw new IOException("Unable to create state store", dbExc); } } } // if there is a version mismatch, we throw an exception, which means the service is unusable checkVersion(tmpDb); executors = reloadRegisteredExecutors(tmpDb); db = tmpDb; } else { db = null; executors = Maps.newConcurrentMap(); } this.directoryCleaner = directoryCleaner; }