use of com.hedera.mirror.common.domain.entity.EntityId in project hedera-mirror-node by hashgraph.
the class AddressBookServiceImpl method retrieveNodeAddressesFromAddressBook.
/**
* Extracts a collection of AddressBookEntry domain objects from NodeAddressBook proto. Sets provided
* consensusTimestamp as the consensusTimestamp of each address book entry to ensure mapping to a single
* AddressBook
*
* @param nodeAddressBook node address book proto
* @param consensusTimestamp transaction consensusTimestamp
* @return
*/
private static Collection<AddressBookEntry> retrieveNodeAddressesFromAddressBook(NodeAddressBook nodeAddressBook, long consensusTimestamp) throws UnknownHostException {
// node id to entry
Map<Long, AddressBookEntry> addressBookEntries = new LinkedHashMap<>();
for (NodeAddress nodeAddressProto : nodeAddressBook.getNodeAddressList()) {
Pair<Long, EntityId> nodeIds = getNodeIds(nodeAddressProto);
AddressBookEntry addressBookEntry = addressBookEntries.computeIfAbsent(nodeIds.getLeft(), k -> getAddressBookEntry(nodeAddressProto, consensusTimestamp, nodeIds));
Set<AddressBookServiceEndpoint> updatedList = new HashSet<>(addressBookEntry.getServiceEndpoints());
updatedList.addAll(getAddressBookServiceEndpoints(nodeAddressProto, consensusTimestamp));
addressBookEntry.setServiceEndpoints(updatedList);
}
return addressBookEntries.values();
}
use of com.hedera.mirror.common.domain.entity.EntityId in project hedera-mirror-node by hashgraph.
the class AddressBookRepositoryTest method findLatestTimestamp.
@Test
void findLatestTimestamp() {
EntityId fileId = EntityId.of(101L, EntityType.FILE);
assertThat(addressBookRepository.findLatestTimestamp(fileId.getId())).isEmpty();
domainBuilder.addressBook().customize(a -> a.fileId(EntityId.of(999L, EntityType.FILE))).persist();
assertThat(addressBookRepository.findLatestTimestamp(fileId.getId())).isEmpty();
AddressBook addressBook2 = domainBuilder.addressBook().customize(a -> a.fileId(fileId)).persist();
assertThat(addressBookRepository.findLatestTimestamp(fileId.getId())).get().isEqualTo(addressBook2.getStartConsensusTimestamp());
AddressBook addressBook3 = domainBuilder.addressBook().customize(a -> a.fileId(fileId)).persist();
assertThat(addressBookRepository.findLatestTimestamp(fileId.getId())).get().isEqualTo(addressBook3.getStartConsensusTimestamp());
}
use of com.hedera.mirror.common.domain.entity.EntityId in project hedera-mirror-node by hashgraph.
the class Downloader method downloadAndParseSigFiles.
/**
* Download and parse all signature files with a timestamp later than the last valid file. Put signature files into
* a multi-map sorted and grouped by the timestamp.
*
* @param addressBook the current address book
* @return a multi-map of signature file objects from different nodes, grouped by filename
*/
private Multimap<String, FileStreamSignature> downloadAndParseSigFiles(AddressBook addressBook) throws InterruptedException {
String startAfterFilename = getStartAfterFilename();
Multimap<String, FileStreamSignature> sigFilesMap = Multimaps.synchronizedSortedSetMultimap(TreeMultimap.create());
Set<EntityId> nodeAccountIds = addressBook.getNodeSet();
List<Callable<Object>> tasks = new ArrayList<>(nodeAccountIds.size());
AtomicInteger totalDownloads = new AtomicInteger();
log.info("Downloading signature files created after file: {}", startAfterFilename);
/*
* For each node, create a thread that will make S3 ListObject requests as many times as necessary to
* start maxDownloads download operations.
*/
for (EntityId nodeAccountId : nodeAccountIds) {
tasks.add(Executors.callable(() -> {
String nodeAccountIdStr = nodeAccountId.entityIdToString();
Stopwatch stopwatch = Stopwatch.createStarted();
try {
List<S3Object> s3Objects = listFiles(startAfterFilename, nodeAccountIdStr);
List<PendingDownload> pendingDownloads = downloadSignatureFiles(nodeAccountIdStr, s3Objects);
AtomicInteger count = new AtomicInteger();
pendingDownloads.forEach(pendingDownload -> {
try {
parseSignatureFile(pendingDownload, nodeAccountId).ifPresent(fileStreamSignature -> {
sigFilesMap.put(fileStreamSignature.getFilename(), fileStreamSignature);
count.incrementAndGet();
totalDownloads.incrementAndGet();
});
} catch (InterruptedException ex) {
log.warn("Failed downloading {} in {}", pendingDownload.getS3key(), pendingDownload.getStopwatch(), ex);
Thread.currentThread().interrupt();
} catch (Exception ex) {
log.warn("Failed to parse signature file {}: {}", pendingDownload.getS3key(), ex);
}
});
if (count.get() > 0) {
log.info("Downloaded {} signatures for node {} in {}", count.get(), nodeAccountIdStr, stopwatch);
}
} catch (InterruptedException e) {
log.error("Error downloading signature files for node {} after {}", nodeAccountIdStr, stopwatch, e);
Thread.currentThread().interrupt();
} catch (Exception e) {
log.error("Error downloading signature files for node {} after {}", nodeAccountIdStr, stopwatch, e);
}
}));
}
// Wait for all tasks to complete.
// invokeAll() does return Futures, but it waits for all to complete (so they're returned in a completed state).
Stopwatch stopwatch = Stopwatch.createStarted();
signatureDownloadThreadPool.invokeAll(tasks);
if (totalDownloads.get() > 0) {
var rate = (int) (1000000.0 * totalDownloads.get() / stopwatch.elapsed(TimeUnit.MICROSECONDS));
log.info("Downloaded {} signatures in {} ({}/s)", totalDownloads, stopwatch, rate);
}
return sigFilesMap;
}
use of com.hedera.mirror.common.domain.entity.EntityId in project hedera-mirror-node by hashgraph.
the class ContractResultServiceImpl method getCreatedContractIds.
@SuppressWarnings("deprecation")
private List<Long> getCreatedContractIds(ContractFunctionResult functionResult, RecordItem recordItem, EntityId parentEntityContractId) {
List<Long> createdContractIds = new ArrayList<>();
boolean persist = shouldPersistCreatedContractIDs(recordItem);
for (ContractID createdContractId : functionResult.getCreatedContractIDsList()) {
EntityId contractId = entityIdService.lookup(createdContractId);
if (!EntityId.isEmpty(contractId)) {
createdContractIds.add(contractId.getId());
// The parent contract ID can also sometimes appear in the created contract IDs list, so exclude it
if (persist && !contractId.equals(parentEntityContractId)) {
processCreatedContractEntity(recordItem, contractId);
}
}
}
return createdContractIds;
}
use of com.hedera.mirror.common.domain.entity.EntityId in project hedera-mirror-node by hashgraph.
the class TopicMessage method toResponse.
private ConsensusTopicResponse toResponse() {
var consensusTopicResponseBuilder = ConsensusTopicResponse.newBuilder().setConsensusTimestamp(ProtoUtil.toTimestamp(getConsensusTimestampInstant())).setMessage(ProtoUtil.toByteString(message)).setRunningHash(ProtoUtil.toByteString(runningHash)).setRunningHashVersion(runningHashVersion).setSequenceNumber(sequenceNumber);
if (getChunkNum() != null) {
ConsensusMessageChunkInfo.Builder chunkBuilder = ConsensusMessageChunkInfo.newBuilder().setNumber(getChunkNum()).setTotal(getChunkTotal());
TransactionID transactionID = parseTransactionID(initialTransactionId);
EntityId payerAccountEntity = EntityId.of(payerAccountId, EntityType.ACCOUNT);
Instant validStartInstant = LongToInstantConverter.INSTANCE.convert(validStartTimestamp);
if (transactionID != null) {
chunkBuilder.setInitialTransactionID(transactionID);
} else if (payerAccountEntity != null && validStartInstant != null) {
chunkBuilder.setInitialTransactionID(TransactionID.newBuilder().setAccountID(ProtoUtil.toAccountID(payerAccountEntity)).setTransactionValidStart(ProtoUtil.toTimestamp(validStartInstant)).build());
}
consensusTopicResponseBuilder.setChunkInfo(chunkBuilder.build());
}
return consensusTopicResponseBuilder.build();
}
Aggregations