in environment/src/main/java/jetbrains/exodus/env/MetaTreeImpl.java [47:105]
static Pair<MetaTreeImpl, Integer> create(@NotNull final EnvironmentImpl env,
@NotNull ExpiredLoggableCollection expired) {
final Log log = env.getLog();
final long highAddress = log.getHighAddress();
if (highAddress > EMPTY_LOG_BOUND) {
Loggable rootLoggable;
final long rootAddress = log.getStartUpDbRoot();
if (rootAddress >= 0) {
rootLoggable = log.read(rootAddress);
} else {
rootLoggable = null;
}
if (rootLoggable != null) {
final long root = rootLoggable.getAddress();
DatabaseRoot dbRoot = null;
try {
dbRoot = new DatabaseRoot(rootLoggable);
} catch (ExodusException e) {
EnvironmentImpl.loggerError("Failed to load database root at " + rootLoggable.getAddress(), e);
}
if (dbRoot != null && dbRoot.isValid()) {
try {
final BTree metaTree = env.loadMetaTree(dbRoot.getRootAddress());
if (metaTree != null) {
return new Pair<>(new MetaTreeImpl(metaTree, root),
dbRoot.getLastStructureId());
}
} catch (ExodusException e) {
EnvironmentImpl.loggerError("Failed to recover to valid root" +
LogUtil.getWrongAddressErrorMessage(dbRoot.getAddress(),
env.getEnvironmentConfig().getLogFileSize() << 10), e);
}
}
}
try {
DataCorruptionException.raise("No valid root has found in the database", log, rootAddress);
} finally {
log.close();
}
}
// no roots found: the database is empty
EnvironmentImpl.loggerDebug("No roots found: the database is empty");
final ITree resultTree = getEmptyMetaTree(env);
final long root;
log.beginWrite();
try {
final long rootAddress = resultTree.getMutableCopy().save();
root = log.write(DatabaseRoot.DATABASE_ROOT_TYPE, Loggable.NO_STRUCTURE_ID,
DatabaseRoot.asByteIterable(rootAddress, EnvironmentImpl.META_TREE_ID), expired);
log.flush();
log.endWrite();
} catch (Throwable t) {
throw new ExodusException("Can't init meta tree in log", t);
}
return new Pair<>(new MetaTreeImpl(resultTree, root),
EnvironmentImpl.META_TREE_ID);
}