MetaTreeImpl getClone() { return new MetaTreeImpl(cloneTree(tree), root, logTip); }
void setHighAddress(final long highAddress) { synchronized (commitLock) { log.setHighAddress(log.getTip(), highAddress); final Pair<MetaTreeImpl, Integer> meta = MetaTreeImpl.create(this); metaWriteLock.lock(); try { metaTree = meta.getFirst(); } finally { metaWriteLock.unlock(); } } }
public long getAllStoreCount() { metaReadLock.lock(); try { return metaTree.getAllStoreCount(); } finally { metaReadLock.unlock(); } }
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; }
final BTree metaTree = env.loadMetaTree(dbRoot.getRootAddress(), updatedTip); if (metaTree != null) { cloneTree(metaTree); // try to traverse meta tree return new Pair<>(new MetaTreeImpl(metaTree, root, updatedTip), dbRoot.getLastStructureId()); final ITree resultTree = getEmptyMetaTree(env); final long root; log.beginWrite(); throw new ExodusException("Can't init meta tree in log", t); return new Pair<>(new MetaTreeImpl(resultTree, root, createdTip), EnvironmentImpl.META_TREE_ID);
@Nullable TreeMetaInfo getTreeMetaInfo(@NotNull final String name) { checkIsFinished(); return metaTree.getMetaInfo(name, env); }
@NotNull List<String> getAllStoreNames() { checkIsFinished(); return getMetaTree().getAllStoreNames(); }
static MetaTreeImpl create(@NotNull final EnvironmentImpl env, @NotNull final LogTip logTip, @NotNull final MetaTreePrototype prototype) { return new MetaTreeImpl( env.loadMetaTree(prototype.treeAddress(), logTip), prototype.rootAddress(), logTip ); }
@Override public void run() { final MetaTreeImpl currentMetaTree = env.getMetaTreeInternal(); setMetaTree(cloneMeta ? currentMetaTree.getClone() : currentMetaTree); env.registerTransaction(ReadWriteTransaction.this); if (beginHook != null) { beginHook.run(); } } };
ITree openImmutableTree(@NotNull final MetaTreeImpl metaTree) { final int structureId = getStructureId(); final long upToDateRootAddress = metaTree.getRootAddress(structureId); final boolean hasDuplicates = metaInfo.hasDuplicates(); final boolean treeIsEmpty = upToDateRootAddress == Loggable.NULL_ADDRESS; final Log log = environment.getLog(); final ITree result; if (!metaInfo.isKeyPrefixing()) { final BTreeBalancePolicy balancePolicy = environment.getBTreeBalancePolicy(); result = treeIsEmpty ? new BTreeEmpty(log, balancePolicy, hasDuplicates, structureId) : new BTree(log, balancePolicy, upToDateRootAddress, hasDuplicates, structureId); } else { if (treeIsEmpty) { result = new PatriciaTreeEmpty(log, structureId, hasDuplicates); } else { result = hasDuplicates ? new PatriciaTreeWithDuplicates(log, upToDateRootAddress, structureId) : new PatriciaTree(log, upToDateRootAddress, structureId); } } return result; }
invalidateStoreGetCache(); throwableOnCommit = null; final Pair<MetaTreeImpl, Integer> meta = MetaTreeImpl.create(this); metaTree = meta.getFirst(); structureId.set(meta.getSecond());
meta = MetaTreeImpl.create(this);
writeConfirmed = true; resultingHighAddress = updatedTip.approvedHighAddress; txn.setMetaTree(metaTree = MetaTreeImpl.create(this, updatedTip, proto)); txn.executeCommitHook(); } finally {