11/*
2- * Copyright 2020 IEXEC BLOCKCHAIN TECH
2+ * Copyright 2020-2025 IEXEC BLOCKCHAIN TECH
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
1717package com .iexec .core .configuration ;
1818
1919import com .iexec .core .chain .ChainConfig ;
20+ import com .iexec .core .chain .event .LatestBlockEvent ;
21+ import lombok .extern .slf4j .Slf4j ;
22+ import org .springframework .boot .CommandLineRunner ;
23+ import org .springframework .context .event .EventListener ;
2024import org .springframework .stereotype .Service ;
2125
2226import java .math .BigInteger ;
27+ import java .time .Instant ;
28+ import java .time .temporal .ChronoUnit ;
2329
30+ @ Slf4j
2431@ Service
25- public class ConfigurationService {
32+ public class ConfigurationService implements CommandLineRunner {
2633
2734 private final ConfigurationRepository configurationRepository ;
2835 private final ReplayConfigurationRepository replayConfigurationRepository ;
2936 private final ChainConfig chainConfig ;
3037
38+ private Configuration configuration ;
39+ private ReplayConfiguration replayConfiguration ;
40+
3141 public ConfigurationService (ConfigurationRepository configurationRepository ,
3242 ReplayConfigurationRepository replayConfigurationRepository ,
3343 ChainConfig chainConfig ) {
@@ -36,46 +46,84 @@ public ConfigurationService(ConfigurationRepository configurationRepository,
3646 this .chainConfig = chainConfig ;
3747 }
3848
39- private Configuration getConfiguration () {
40- if (configurationRepository .count () > 0 )
41- return configurationRepository .findAll ().get (0 );
42-
43- return configurationRepository .save (
44- Configuration
45- .builder ()
46- .lastSeenBlockWithDeal (BigInteger .valueOf (chainConfig .getStartBlockNumber ()))
47- .build ());
49+ /**
50+ * Update last scanned block in configuration.
51+ *
52+ * @param event Event containing last block number
53+ */
54+ @ EventListener
55+ void setLastScannedBlock (final LatestBlockEvent event ) {
56+ final Instant now = Instant .now ();
57+ if (now .isAfter (configuration .getLastUpdate ().plus (1L , ChronoUnit .HOURS ))) {
58+ updateConfiguration (BigInteger .valueOf (event .getBlockNumber ()));
59+ }
4860 }
4961
5062 public BigInteger getLastSeenBlockWithDeal () {
51- return this . getConfiguration () .getLastSeenBlockWithDeal ();
63+ return configuration .getLastSeenBlockWithDeal ();
5264 }
5365
54- public void setLastSeenBlockWithDeal (BigInteger lastBlockNumber ) {
55- Configuration configuration = this .getConfiguration ();
56- configuration .setLastSeenBlockWithDeal (lastBlockNumber );
57- configurationRepository .save (configuration );
66+ public void setLastSeenBlockWithDeal (final BigInteger lastBlockNumber ) {
67+ updateConfiguration (lastBlockNumber );
5868 }
5969
60- private ReplayConfiguration getReplayConfiguration () {
61- if (replayConfigurationRepository .count () > 0 )
62- return replayConfigurationRepository .findAll ().get (0 );
63-
64- return replayConfigurationRepository .save (
65- ReplayConfiguration
66- .builder ()
67- .fromBlockNumber (BigInteger .valueOf (chainConfig .getStartBlockNumber ()))
68- .build ());
70+ private synchronized void updateConfiguration (final BigInteger lastBlockNumber ) {
71+ configuration .setLastSeenBlockWithDeal (lastBlockNumber );
72+ configuration .setLastUpdate (Instant .now ());
73+ configuration = configurationRepository .save (configuration );
6974 }
7075
7176 public BigInteger getFromReplay () {
72- return this . getReplayConfiguration () .getFromBlockNumber ();
77+ return replayConfiguration .getFromBlockNumber ();
7378 }
7479
7580 public void setFromReplay (BigInteger fromReplay ) {
76- ReplayConfiguration replayConfiguration = this .getReplayConfiguration ();
7781 replayConfiguration .setFromBlockNumber (fromReplay );
78- replayConfigurationRepository .save (replayConfiguration );
82+ replayConfiguration = replayConfigurationRepository .save (replayConfiguration );
83+ }
84+
85+ @ Override
86+ public void run (String ... args ) throws Exception {
87+ final String messageDetails = String .format ("[start:block:%s]" , chainConfig .getStartBlockNumber ());
88+ final Instant now = Instant .now ();
89+ if (configurationRepository .count () == 0 ) {
90+ log .info ("Creating configuration {}" , messageDetails );
91+ configuration = configurationRepository .save (
92+ Configuration
93+ .builder ()
94+ .lastSeenBlockWithDeal (BigInteger .valueOf (chainConfig .getStartBlockNumber ()))
95+ .lastUpdate (now )
96+ .build ());
97+ } else {
98+ configuration = configurationRepository .findAll ().get (0 );
99+ if (chainConfig .getStartBlockNumber () > configuration .getLastSeenBlockWithDeal ().longValue ()) {
100+ log .info ("Updating configuration {}" , messageDetails );
101+ configuration .setLastSeenBlockWithDeal (BigInteger .valueOf (chainConfig .getStartBlockNumber ()));
102+ configuration .setLastUpdate (now );
103+ configuration = configurationRepository .save (configuration );
104+ } else {
105+ log .info ("Keeping current configuration [start-block:{}]" , configuration .getLastSeenBlockWithDeal ());
106+ }
107+ }
108+ if (replayConfigurationRepository .count () == 0 ) {
109+ log .info ("Creating replay configuration {}" , messageDetails );
110+ replayConfiguration = replayConfigurationRepository .save (
111+ ReplayConfiguration
112+ .builder ()
113+ .fromBlockNumber (BigInteger .valueOf (chainConfig .getStartBlockNumber ()))
114+ .lastUpdate (now )
115+ .build ());
116+ } else {
117+ replayConfiguration = replayConfigurationRepository .findAll ().get (0 );
118+ if (chainConfig .getStartBlockNumber () > replayConfiguration .getFromBlockNumber ().longValue ()) {
119+ log .info ("Updating replay configuration {}" , messageDetails );
120+ replayConfiguration .setFromBlockNumber (BigInteger .valueOf (chainConfig .getStartBlockNumber ()));
121+ replayConfiguration .setLastUpdate (now );
122+ replayConfiguration = replayConfigurationRepository .save (replayConfiguration );
123+ } else {
124+ log .info ("Keeping current replay configuration [start-block:{}]" , replayConfiguration .getFromBlockNumber ());
125+ }
126+ }
79127 }
80128
81129}
0 commit comments