Iterable<ExpiredLoggableInfo>[] doCommit(@NotNull final MetaTreeImpl.Proto[] out) { final Set<Map.Entry<Integer, ITreeMutable>> entries = mutableTrees.entrySet(); final Set<Map.Entry<Long, Pair<String, ITree>>> removedEntries = removedStores.entrySet(); final int size = entries.size() + removedEntries.size(); //noinspection unchecked final Iterable<ExpiredLoggableInfo>[] expiredLoggables = new Iterable[size + 1]; int i = 0; final ITreeMutable metaTreeMutable = getMetaTree().tree.getMutableCopy(); for (final Map.Entry<Long, Pair<String, ITree>> entry : removedEntries) { final Pair<String, ITree> value = entry.getValue(); MetaTreeImpl.removeStore(metaTreeMutable, value.getFirst(), entry.getKey()); expiredLoggables[i++] = TreeMetaInfo.getTreeLoggables(value.getSecond()); } removedStores.clear(); for (final Map.Entry<String, TreeMetaInfo> entry : createdStores.entrySet()) { MetaTreeImpl.addStore(metaTreeMutable, entry.getKey(), entry.getValue()); } createdStores.clear(); final Collection<ExpiredLoggableInfo> last; for (final Map.Entry<Integer, ITreeMutable> entry : entries) { final ITreeMutable treeMutable = entry.getValue(); expiredLoggables[i++] = treeMutable.getExpiredLoggables(); MetaTreeImpl.saveTree(metaTreeMutable, treeMutable); } clearImmutableTrees(); mutableTrees.clear(); expiredLoggables[i] = last = metaTreeMutable.getExpiredLoggables(); out[0] = MetaTreeImpl.saveMetaTree(metaTreeMutable, getEnvironment(), last); return expiredLoggables; }