void storeRemoved(@NotNull final StoreImpl store) { checkIsFinished(); super.storeRemoved(store); final int structureId = store.getStructureId(); final ITree tree = store.openImmutableTree(getMetaTree()); removedStores.put(structureId, new Pair<>(store.getName(), tree)); mutableTrees.remove(structureId); }
@NotNull public StoreImpl openStoreByStructureId(final int structureId) { checkIsFinished(); final EnvironmentImpl env = getEnvironment(); final String storeName = getMetaTree().getStoreNameByStructureId(structureId, env); return storeName == null ? new TemporaryEmptyStore(env) : env.openStoreImpl(storeName, StoreConfig.USE_EXISTING, this, getTreeMetaInfo(storeName)); }
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; }
@Override public void revert() { checkIsFinished(); if (isReadonly()) { throw new ExodusException("Attempt ot revert read-only transaction"); } final long oldRoot = getMetaTree().root; final boolean wasExclusive = isExclusive(); final EnvironmentImpl env = getEnvironment(); if (isIdempotent()) { env.holdNewestSnapshotBy(this, false); } else { doRevert(); if (wasExclusive || !env.shouldTransactionBeExclusive(this)) { env.holdNewestSnapshotBy(this, false); } else { env.releaseTransaction(this); setExclusive(true); env.holdNewestSnapshotBy(this); } } if (!env.isRegistered(this)) { throw new ExodusException("Transaction should remain registered after revert"); } if (!checkVersion(oldRoot)) { clearImmutableTrees(); env.runTransactionSafeTasks(); } setStarted(System.currentTimeMillis()); }