From f2ece3c4449af9f0790fad24a2f0199958bf1f02 Mon Sep 17 00:00:00 2001 From: Mateusz Czeladka Date: Tue, 12 Sep 2023 10:31:32 +0200 Subject: [PATCH] Feature: improved rollback handler. --- .../foundation/voting/config/YaciConfig.java | 31 +++++++------------ .../voting/domain/ProtocolMagic.java | 4 --- .../WellKnownPointWithProtocolMagic.java | 9 ++++++ .../voting/service/yaci/RollbackHandler.java | 29 ++++++++++------- .../voting/handlers/MetadataEventHandler.java | 2 -- 5 files changed, 38 insertions(+), 37 deletions(-) delete mode 100644 backend-services/voting-app/src/main/java/org/cardano/foundation/voting/domain/ProtocolMagic.java create mode 100644 backend-services/voting-app/src/main/java/org/cardano/foundation/voting/domain/WellKnownPointWithProtocolMagic.java diff --git a/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/config/YaciConfig.java b/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/config/YaciConfig.java index 48edc1ccd..2710c85b9 100644 --- a/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/config/YaciConfig.java +++ b/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/config/YaciConfig.java @@ -1,36 +1,27 @@ package org.cardano.foundation.voting.config; -import com.bloxbean.cardano.yaci.core.common.Constants; -import com.bloxbean.cardano.yaci.core.protocol.chainsync.messages.Point; import org.cardano.foundation.voting.domain.CardanoNetwork; -import org.cardano.foundation.voting.domain.ProtocolMagic; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.cardano.foundation.voting.domain.WellKnownPointWithProtocolMagic; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import javax.annotation.Nullable; +import java.util.Optional; + +import static com.bloxbean.cardano.yaci.core.common.Constants.*; import static com.bloxbean.cardano.yaci.core.common.NetworkType.*; @Configuration -@ConditionalOnProperty(name = "rollback.handling.enabled", havingValue = "true") public class YaciConfig { @Bean - public Point wellKnownPointForNetwork(CardanoNetwork cardanoNetwork) { - return switch(cardanoNetwork) { - case MAIN -> Constants.WELL_KNOWN_MAINNET_POINT; - case PREPROD -> Constants.WELL_KNOWN_PREPROD_POINT; - case PREVIEW -> Constants.WELL_KNOWN_PREVIEW_POINT; - case DEV -> null; - }; - } - - @Bean - public ProtocolMagic protocolMagic(CardanoNetwork cardanoNetwork) { + @Nullable + public WellKnownPointWithProtocolMagic wellKnownPointForNetwork(CardanoNetwork cardanoNetwork) { return switch(cardanoNetwork) { - case MAIN -> new ProtocolMagic(MAINNET.getProtocolMagic()); - case PREPROD -> new ProtocolMagic(PREPROD.getProtocolMagic()); - case PREVIEW -> new ProtocolMagic(PREVIEW.getProtocolMagic()); - case DEV -> new ProtocolMagic(42); + case MAIN -> new WellKnownPointWithProtocolMagic(Optional.of(WELL_KNOWN_MAINNET_POINT), MAINNET.getProtocolMagic()); + case PREPROD -> new WellKnownPointWithProtocolMagic(Optional.of(WELL_KNOWN_PREPROD_POINT), PREPROD.getProtocolMagic()); + case PREVIEW -> new WellKnownPointWithProtocolMagic(Optional.of(WELL_KNOWN_PREVIEW_POINT), PREVIEW.getProtocolMagic()); + case DEV -> new WellKnownPointWithProtocolMagic(Optional.empty(), 42); }; } diff --git a/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/domain/ProtocolMagic.java b/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/domain/ProtocolMagic.java deleted file mode 100644 index fb566382f..000000000 --- a/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/domain/ProtocolMagic.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.cardano.foundation.voting.domain; - -public record ProtocolMagic(long magic) { -} diff --git a/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/domain/WellKnownPointWithProtocolMagic.java b/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/domain/WellKnownPointWithProtocolMagic.java new file mode 100644 index 000000000..f16eb2014 --- /dev/null +++ b/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/domain/WellKnownPointWithProtocolMagic.java @@ -0,0 +1,9 @@ +package org.cardano.foundation.voting.domain; + +import com.bloxbean.cardano.yaci.core.protocol.chainsync.messages.Point; + +import java.util.Optional; + +public record WellKnownPointWithProtocolMagic(Optional wellKnownPointForNetwork, + long protocolMagic) { +} diff --git a/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/service/yaci/RollbackHandler.java b/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/service/yaci/RollbackHandler.java index c5e47be1d..1d8601882 100644 --- a/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/service/yaci/RollbackHandler.java +++ b/backend-services/voting-app/src/main/java/org/cardano/foundation/voting/service/yaci/RollbackHandler.java @@ -8,18 +8,16 @@ import jakarta.annotation.PreDestroy; import lombok.extern.slf4j.Slf4j; import org.cardano.foundation.voting.domain.CardanoNetwork; -import org.cardano.foundation.voting.domain.ProtocolMagic; +import org.cardano.foundation.voting.domain.WellKnownPointWithProtocolMagic; import org.cardano.foundation.voting.service.merkle_tree.VoteMerkleProofService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import java.util.Optional; @Component @Slf4j -@ConditionalOnProperty(name = "rollback.handling.enabled", havingValue = "true") public class RollbackHandler { @Value("${cardano.node.ip}") @@ -35,10 +33,7 @@ public class RollbackHandler { private VoteMerkleProofService voteMerkleProofService; @Autowired - private ProtocolMagic protocolMagic; - - @Autowired - private Point wellKnownPoint; + private WellKnownPointWithProtocolMagic wellKnownPointWithProtocolMagic; private Optional blockSync = Optional.empty(); @@ -46,8 +41,21 @@ public class RollbackHandler { public void init() { log.info("Starting cardano block sync on network: {}...", cardanoNetwork); - var networkMagic = protocolMagic.magic(); - var blockSync = new BlockSync(cardanoNodeIp, cardanoNodePort, networkMagic, wellKnownPoint); + if (wellKnownPointWithProtocolMagic.wellKnownPointForNetwork().isEmpty()) { + log.warn("Well known point is not known. Skipping rollback handler / sync..."); + return; + } + + var wellKnownPoint = wellKnownPointWithProtocolMagic.wellKnownPointForNetwork().orElseThrow(); + + var protocolMagic = wellKnownPointWithProtocolMagic.protocolMagic(); + var blockSync = startBlockSync(protocolMagic, wellKnownPoint); + + this.blockSync = Optional.of(blockSync); + } + + private BlockSync startBlockSync(long protocolMagic, Point wellKnownPoint) { + var blockSync = new BlockSync(cardanoNodeIp, cardanoNodePort, protocolMagic, wellKnownPoint); blockSync.startSyncFromTip(new BlockChainDataListener() { @Override @@ -63,8 +71,7 @@ public void onRollback(Point point) { } }); - - this.blockSync = Optional.of(blockSync); + return blockSync; } @PreDestroy diff --git a/backend-services/voting-ledger-follower-app/src/main/java/org/cardano/foundation/voting/handlers/MetadataEventHandler.java b/backend-services/voting-ledger-follower-app/src/main/java/org/cardano/foundation/voting/handlers/MetadataEventHandler.java index a0945e9d4..994e5e8aa 100644 --- a/backend-services/voting-ledger-follower-app/src/main/java/org/cardano/foundation/voting/handlers/MetadataEventHandler.java +++ b/backend-services/voting-ledger-follower-app/src/main/java/org/cardano/foundation/voting/handlers/MetadataEventHandler.java @@ -1,14 +1,12 @@ package org.cardano.foundation.voting.handlers; import com.bloxbean.cardano.yaci.store.metadata.domain.TxMetadataEvent; -import com.bloxbean.cardano.yaci.store.metadata.domain.TxMetadataLabel; import lombok.extern.slf4j.Slf4j; import org.cardano.foundation.voting.service.metadata.CustomMetadataProcessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; -import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.stereotype.Service; @Service