From 8b79cf09a51413c23cb733b42a404d0244b3747e Mon Sep 17 00:00:00 2001 From: Steven Sheehy <17552371+steven-sheehy@users.noreply.github.com> Date: Fri, 4 Feb 2022 21:16:10 -0600 Subject: [PATCH] Handle invalid entity ID in GCP Pub/Sub (#3257) Signed-off-by: Steven Sheehy Signed-off-by: Matheus DallRosa --- .../pubsub/PubSubRecordItemListener.java | 19 +++++++++----- .../pubsub/PubSubRecordItemListenerTest.java | 25 +++++++++++++++++-- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/hedera-mirror-importer/src/main/java/com/hedera/mirror/importer/parser/record/pubsub/PubSubRecordItemListener.java b/hedera-mirror-importer/src/main/java/com/hedera/mirror/importer/parser/record/pubsub/PubSubRecordItemListener.java index 53e11a363e2..ab8382ddfff 100644 --- a/hedera-mirror-importer/src/main/java/com/hedera/mirror/importer/parser/record/pubsub/PubSubRecordItemListener.java +++ b/hedera-mirror-importer/src/main/java/com/hedera/mirror/importer/parser/record/pubsub/PubSubRecordItemListener.java @@ -20,8 +20,6 @@ * ‍ */ -import com.hedera.mirror.common.util.DomainUtils; - import com.hederahashgraph.api.proto.java.AccountAmount; import com.hederahashgraph.api.proto.java.FileID; import com.hederahashgraph.api.proto.java.TransactionBody; @@ -37,6 +35,8 @@ import com.hedera.mirror.common.domain.file.FileData; import com.hedera.mirror.common.domain.transaction.RecordItem; import com.hedera.mirror.common.domain.transaction.TransactionType; +import com.hedera.mirror.common.exception.InvalidEntityException; +import com.hedera.mirror.common.util.DomainUtils; import com.hedera.mirror.importer.addressbook.AddressBookService; import com.hedera.mirror.importer.exception.ImporterException; import com.hedera.mirror.importer.exception.ParserException; @@ -69,8 +69,16 @@ public void onItem(RecordItem recordItem) throws ImporterException { TransactionHandler transactionHandler = transactionHandlerFactory.get(transactionType); log.trace("Storing transaction body: {}", () -> Utility.printProtoMessage(body)); long consensusTimestamp = DomainUtils.timeStampInNanos(txRecord.getConsensusTimestamp()); - EntityId entity = transactionHandler.getEntity(recordItem); - PubSubMessage pubSubMessage = buildPubSubMessage(consensusTimestamp, entity, recordItem); + + EntityId entityId; + try { + entityId = transactionHandler.getEntity(recordItem); + } catch (InvalidEntityException e) { // transaction can have invalid topic/contract/file id + log.warn("Invalid entity encountered for consensusTimestamp {} : {}", consensusTimestamp, e.getMessage()); + entityId = null; + } + + PubSubMessage pubSubMessage = buildPubSubMessage(consensusTimestamp, entityId, recordItem); try { sendPubSubMessage(pubSubMessage); } catch (Exception e) { @@ -81,7 +89,7 @@ public void onItem(RecordItem recordItem) throws ImporterException { } log.debug("Published transaction : {}", consensusTimestamp); - if (addressBookService.isAddressBook(entity)) { + if (addressBookService.isAddressBook(entityId)) { FileID fileID = null; byte[] fileBytes = null; @@ -137,4 +145,3 @@ private Iterable addNonFeeTransfers(TransactionBody body, Transac return nonFeeTransfers; } } - diff --git a/hedera-mirror-importer/src/test/java/com/hedera/mirror/importer/parser/record/pubsub/PubSubRecordItemListenerTest.java b/hedera-mirror-importer/src/test/java/com/hedera/mirror/importer/parser/record/pubsub/PubSubRecordItemListenerTest.java index a4c0ffde6be..9878f5b67b1 100644 --- a/hedera-mirror-importer/src/test/java/com/hedera/mirror/importer/parser/record/pubsub/PubSubRecordItemListenerTest.java +++ b/hedera-mirror-importer/src/test/java/com/hedera/mirror/importer/parser/record/pubsub/PubSubRecordItemListenerTest.java @@ -65,11 +65,11 @@ import com.hedera.mirror.common.domain.entity.EntityId; import com.hedera.mirror.common.domain.file.FileData; -import com.hedera.mirror.importer.addressbook.AddressBookService; +import com.hedera.mirror.common.domain.transaction.RecordItem; import com.hedera.mirror.common.domain.transaction.TransactionType; +import com.hedera.mirror.importer.addressbook.AddressBookService; import com.hedera.mirror.importer.exception.ParserException; import com.hedera.mirror.importer.parser.domain.PubSubMessage; -import com.hedera.mirror.common.domain.transaction.RecordItem; import com.hedera.mirror.importer.parser.record.NonFeeTransferExtractionStrategy; import com.hedera.mirror.importer.parser.record.NonFeeTransferExtractionStrategyImpl; import com.hedera.mirror.importer.parser.record.transactionhandler.TransactionHandler; @@ -170,6 +170,27 @@ void testPubSubMessage() throws Exception { assertThat(pubSubMessage.getNonFeeTransfers()).isNull(); } + @Test + void testPubSubMessageNullEntityId() throws Exception { + // given + byte[] message = new byte[] {'a', 'b', 'c'}; + TopicID topicID = TopicID.newBuilder().setTopicNum(10L).build(); + EntityId topicIdEntity = EntityId.of(topicID); + ConsensusSubmitMessageTransactionBody submitMessage = ConsensusSubmitMessageTransactionBody.newBuilder() + .setMessage(ByteString.copyFrom(message)) + .setTopicID(topicID) + .build(); + Transaction transaction = buildTransaction(builder -> builder.setConsensusSubmitMessage(submitMessage)); + // when + doReturn(null).when(transactionHandler).getEntity(any()); + pubSubRecordItemListener.onItem(new RecordItem(transaction.toByteArray(), DEFAULT_RECORD_BYTES)); + + // then + var pubSubMessage = assertPubSubMessage(buildPubSubTransaction(transaction), 1); + assertThat(pubSubMessage.getEntity()).isEqualTo(null); + assertThat(pubSubMessage.getNonFeeTransfers()).isNull(); + } + @Test void testPubSubMessageWithNonFeeTransferAndNullEntityId() throws Exception { // given