use of com.radixdlt.identifiers.REAddr in project radixdlt by radixdlt.
the class InMemoryEngineStore method transaction.
@Override
public <R> R transaction(TransactionEngineStoreConsumer<M, R> consumer) throws RadixEngineException {
return consumer.start(new EngineStoreInTransaction<>() {
@Override
public void storeTxn(REProcessedTxn txn) {
synchronized (lock) {
txn.stateUpdates().forEach(update -> {
store.storedState.put(update.getId(), update);
// FIXME: Superhack
if (update.isBootUp()) {
if (update.getParsed() instanceof TokenResource) {
var tokenDef = (TokenResource) update.getParsed();
store.resources.put(tokenDef.addr(), update::getStateBuf);
} else if (update.getParsed() instanceof VirtualParent) {
var p = (VirtualParent) update.getParsed();
var typeByte = p.data()[0];
var mapKey = SystemMapKey.ofSystem(typeByte);
store.maps.put(mapKey, update.getRawSubstateBytes());
} else if (update.getParsed() instanceof ValidatorData) {
var data = (ValidatorData) update.getParsed();
var mapKey = SystemMapKey.ofSystem(update.typeByte(), data.validatorKey().getCompressedBytes());
store.maps.put(mapKey, update.getRawSubstateBytes());
} else if (update.getParsed() instanceof SystemData) {
var mapKey = SystemMapKey.ofSystem(update.typeByte());
store.maps.put(mapKey, update.getRawSubstateBytes());
}
} else if (update.isShutDown()) {
if (update.getParsed() instanceof ValidatorData) {
var data = (ValidatorData) update.getParsed();
var mapKey = SystemMapKey.ofSystem(update.typeByte(), data.validatorKey().getCompressedBytes());
store.maps.remove(mapKey);
} else if (update.getParsed() instanceof SystemData) {
var mapKey = SystemMapKey.ofSystem(update.typeByte());
store.maps.remove(mapKey);
}
}
});
}
}
@Override
public void storeMetadata(M metadata) {
store.metadata = metadata;
}
@Override
public ByteBuffer verifyVirtualSubstate(SubstateId substateId) throws VirtualSubstateAlreadyDownException, VirtualParentStateDoesNotExist {
synchronized (lock) {
var parent = substateId.getVirtualParent().orElseThrow();
var update = store.storedState.get(parent);
if (update == null || !(update.getParsed() instanceof VirtualParent)) {
throw new VirtualParentStateDoesNotExist(parent);
}
var inst = store.storedState.get(substateId);
if (inst != null && inst.isShutDown()) {
throw new VirtualSubstateAlreadyDownException(substateId);
}
return update.getStateBuf();
}
}
@Override
public Optional<ByteBuffer> loadSubstate(SubstateId substateId) {
synchronized (lock) {
var inst = store.storedState.get(substateId);
if (inst == null || !inst.isBootUp()) {
return Optional.empty();
}
return Optional.of(inst.getStateBuf());
}
}
@Override
public CloseableCursor<RawSubstateBytes> openIndexedCursor(SubstateIndex<?> index) {
return InMemoryEngineStore.this.openIndexedCursor(index);
}
@Override
public Optional<ByteBuffer> loadResource(REAddr addr) {
synchronized (lock) {
var supplier = store.resources.get(addr);
return supplier == null ? Optional.empty() : Optional.of(supplier.get());
}
}
});
}
use of com.radixdlt.identifiers.REAddr in project radixdlt by radixdlt.
the class EntityHandler method handleRequest.
@Override
public EntityResponse handleRequest(EntityRequest request) throws CoreApiException {
modelMapper.verifyNetwork(request.getNetworkIdentifier());
var entity = modelMapper.entity(request.getEntityIdentifier());
var keyQueries = entity.getKeyQueries();
var resourceQueries = entity.getResourceQueries();
// This must be read atomically
return radixEngine.read(reader -> {
Function<REAddr, String> addressToSymbol = addr -> {
var mapKey = SystemMapKey.ofResourceData(addr, SubstateTypeId.TOKEN_RESOURCE_METADATA.id());
var substate = reader.get(mapKey).orElseThrow();
var tokenResource = (TokenResourceMetadata) substate;
return tokenResource.symbol();
};
var proof = reader.getMetadata().getProof();
var response = new EntityResponse().stateIdentifier(modelMapper.stateIdentifier(proof.getAccumulatorState()));
for (var resourceQuery : resourceQueries) {
resourceQuery.fold((index, bucketPredicate) -> reader.reduceResources(index, ResourceInBucket::bucket, bucketPredicate).entrySet().stream().map(e -> modelMapper.resourceOperation(e.getKey(), e.getValue(), addressToSymbol)), systemMapKey -> reader.get(systemMapKey).map(ResourceInBucket.class::cast).stream().map(b -> modelMapper.resourceOperation(b, true, addressToSymbol))).forEach(response::addBalancesItem);
}
for (var keyQuery : keyQueries) {
var substate = keyQuery.get(reader);
substate.flatMap(modelMapper::dataObject).ifPresent(response::addDataObjectsItem);
}
return response;
});
}
use of com.radixdlt.identifiers.REAddr in project radixdlt by radixdlt.
the class BerkeleyLedgerEntryStore method transaction.
@Override
public <R> R transaction(TransactionEngineStoreConsumer<LedgerAndBFTProof, R> consumer) throws RadixEngineException {
var dbTxn = createTransaction();
try {
var result = consumer.start(new EngineStoreInTransaction<>() {
@Override
public void storeTxn(REProcessedTxn txn) {
BerkeleyLedgerEntryStore.this.storeTxn(dbTxn, txn);
}
@Override
public void storeMetadata(LedgerAndBFTProof metadata) {
BerkeleyLedgerEntryStore.this.storeMetadata(dbTxn, metadata);
}
@Override
public ByteBuffer verifyVirtualSubstate(SubstateId substateId) throws VirtualSubstateAlreadyDownException, VirtualParentStateDoesNotExist {
var parent = substateId.getVirtualParent().orElseThrow();
var parentState = BerkeleyLedgerEntryStore.this.loadSubstate(dbTxn, parent);
if (parentState.isEmpty()) {
throw new VirtualParentStateDoesNotExist(parent);
}
var buf = parentState.get();
if (buf.get() != SubstateTypeId.VIRTUAL_PARENT.id()) {
throw new VirtualParentStateDoesNotExist(parent);
}
buf.position(buf.position() - 1);
if (BerkeleyLedgerEntryStore.this.isVirtualDown(dbTxn, substateId)) {
throw new VirtualSubstateAlreadyDownException(substateId);
}
return buf;
}
@Override
public Optional<ByteBuffer> loadSubstate(SubstateId substateId) {
return BerkeleyLedgerEntryStore.this.loadSubstate(dbTxn, substateId);
}
@Override
public CloseableCursor<RawSubstateBytes> openIndexedCursor(SubstateIndex<?> index) {
return BerkeleyLedgerEntryStore.this.openIndexedCursor(dbTxn, index);
}
@Override
public Optional<ByteBuffer> loadResource(REAddr addr) {
return BerkeleyLedgerEntryStore.this.loadAddr(dbTxn, addr);
}
});
dbTxn.commit();
return result;
} catch (Exception e) {
dbTxn.abort();
throw e;
}
}
Aggregations