static Pair create()

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);
    }