Skip to content

Commit 294c26d

Browse files
committed
fix: respect max_retries and subscription_timeout
- fixed evm-reader `Run`. It was not respecting CARTESI_BLOCKCHAIN_SUBSCRIPTION_TIMEOUT and CARTESI_BLOCKCHAIN_HTTP_MAX_RETRIES options. - make the context and cancel functions mandatory for service. This simplifies the logic inside service.Create. - route the same context and cancelation in the node to all services such that any individual service is able to stop the application. - renamed ctx and cancel on the commands to initCTX and initCancel to make it clear this is only used for initialization. Other operations will inherit the `context.WithTimeout` maybe unnoticed incurring in bugs. - fixed the type of CARTESI_BLOCKCHAIN_SUBSCRIPTION_TIMEOUT to Duration.
1 parent 2a98382 commit 294c26d

File tree

12 files changed

+103
-56
lines changed

12 files changed

+103
-56
lines changed

cmd/cartesi-rollups-advancer/root/root.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,15 @@ func init() {
8686
}
8787

8888
func run(cmd *cobra.Command, args []string) {
89-
ctx, cancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
90-
defer cancel()
89+
initCTX, initCancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
90+
defer initCancel()
9191

92+
ctx, cancel := context.WithCancel(context.Background())
9293
createInfo := advancer.CreateInfo{
9394
CreateInfo: service.CreateInfo{
9495
Name: serviceName,
96+
Context: ctx,
97+
Cancel: cancel,
9598
LogLevel: cfg.LogLevel,
9699
LogColor: cfg.LogColor,
97100
EnableSignalHandling: true,
@@ -102,11 +105,11 @@ func run(cmd *cobra.Command, args []string) {
102105
Config: *cfg,
103106
}
104107
var err error
105-
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(ctx, cfg.DatabaseConnection.String())
108+
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(initCTX, cfg.DatabaseConnection.String())
106109
cobra.CheckErr(err)
107110
defer createInfo.Repository.Close()
108111

109-
advancerService, err := advancer.Create(ctx, &createInfo)
112+
advancerService, err := advancer.Create(initCTX, &createInfo)
110113
cobra.CheckErr(err)
111114

112115
cobra.CheckErr(advancerService.Serve())

cmd/cartesi-rollups-claimer/root/root.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,15 @@ func init() {
8989
}
9090

9191
func run(cmd *cobra.Command, args []string) {
92-
ctx, cancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
93-
defer cancel()
92+
initCTX, initCancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
93+
defer initCancel()
9494

95+
ctx, cancel := context.WithCancel(context.Background())
9596
createInfo := claimer.CreateInfo{
9697
CreateInfo: service.CreateInfo{
9798
Name: serviceName,
99+
Context: ctx,
100+
Cancel: cancel,
98101
LogLevel: cfg.LogLevel,
99102
LogColor: cfg.LogColor,
100103
EnableSignalHandling: true,
@@ -121,15 +124,15 @@ func run(cmd *cobra.Command, args []string) {
121124
clientOptions = append(clientOptions, authOpt)
122125
}
123126

124-
rpcClient, err := rpc.DialOptions(ctx, cfg.BlockchainHttpEndpoint.String(), clientOptions...)
127+
rpcClient, err := rpc.DialOptions(initCTX, cfg.BlockchainHttpEndpoint.String(), clientOptions...)
125128
cobra.CheckErr(err)
126129
createInfo.EthConn = ethclient.NewClient(rpcClient)
127130

128-
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(ctx, cfg.DatabaseConnection.String())
131+
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(initCTX, cfg.DatabaseConnection.String())
129132
cobra.CheckErr(err)
130133
defer createInfo.Repository.Close()
131134

132-
claimerService, err := claimer.Create(ctx, &createInfo)
135+
claimerService, err := claimer.Create(initCTX, &createInfo)
133136
cobra.CheckErr(err)
134137

135138
err = claimerService.Serve()

cmd/cartesi-rollups-evm-reader/root/root.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,15 @@ func createEthClient(ctx context.Context, endpoint string, logger *slog.Logger)
115115
}
116116

117117
func run(cmd *cobra.Command, args []string) {
118-
ctx, cancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
119-
defer cancel()
118+
initCTX, initCancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
119+
defer initCancel()
120120

121+
ctx, cancel := context.WithCancel(context.Background())
121122
createInfo := evmreader.CreateInfo{
122123
CreateInfo: service.CreateInfo{
123124
Name: serviceName,
125+
Context: ctx,
126+
Cancel: cancel,
124127
LogLevel: cfg.LogLevel,
125128
LogColor: cfg.LogColor,
126129
EnableSignalHandling: true,
@@ -132,17 +135,17 @@ func run(cmd *cobra.Command, args []string) {
132135

133136
var err error
134137
logger := service.NewLogger(cfg.LogLevel, cfg.LogColor).With("service", serviceName)
135-
createInfo.EthClient, err = createEthClient(ctx, cfg.BlockchainHttpEndpoint.String(), logger)
138+
createInfo.EthClient, err = createEthClient(initCTX, cfg.BlockchainHttpEndpoint.String(), logger)
136139
cobra.CheckErr(err)
137140

138-
createInfo.EthWsClient, err = ethclient.DialContext(ctx, cfg.BlockchainWsEndpoint.String())
141+
createInfo.EthWsClient, err = ethclient.DialContext(initCTX, cfg.BlockchainWsEndpoint.String())
139142
cobra.CheckErr(err)
140143

141-
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(ctx, cfg.DatabaseConnection.String())
144+
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(initCTX, cfg.DatabaseConnection.String())
142145
cobra.CheckErr(err)
143146
defer createInfo.Repository.Close()
144147

145-
readerService, err := evmreader.Create(ctx, &createInfo)
148+
readerService, err := evmreader.Create(initCTX, &createInfo)
146149
cobra.CheckErr(err)
147150

148151
cobra.CheckErr(readerService.Serve())

cmd/cartesi-rollups-jsonrpc-api/root/root.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,15 @@ func init() {
6868
}
6969

7070
func run(cmd *cobra.Command, args []string) {
71-
ctx, cancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
72-
defer cancel()
71+
initCTX, initCancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
72+
defer initCancel()
7373

74+
ctx, cancel := context.WithCancel(context.Background())
7475
createInfo := jsonrpc.CreateInfo{
7576
CreateInfo: service.CreateInfo{
7677
Name: serviceName,
78+
Context: ctx,
79+
Cancel: cancel,
7780
LogLevel: cfg.LogLevel,
7881
LogColor: cfg.LogColor,
7982
EnableSignalHandling: false,
@@ -83,11 +86,11 @@ func run(cmd *cobra.Command, args []string) {
8386
Config: *cfg,
8487
}
8588
var err error
86-
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(ctx, cfg.DatabaseConnection.String())
89+
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(initCTX, cfg.DatabaseConnection.String())
8790
cobra.CheckErr(err)
8891
defer createInfo.Repository.Close()
8992

90-
jsonrpcService, err := jsonrpc.Create(ctx, &createInfo)
93+
jsonrpcService, err := jsonrpc.Create(initCTX, &createInfo)
9194
cobra.CheckErr(err)
9295

9396
cobra.CheckErr(jsonrpcService.Serve())

cmd/cartesi-rollups-node/root/root.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -157,12 +157,16 @@ func createEthClient(ctx context.Context, endpoint string, logger *slog.Logger)
157157
}
158158

159159
func run(cmd *cobra.Command, args []string) {
160-
ctx, cancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
161-
defer cancel()
160+
initCTX, initCancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
161+
defer initCancel()
162162

163+
// shared context propagates cancelation across services
164+
ctx, cancel := context.WithCancel(context.Background())
163165
createInfo := node.CreateInfo{
164166
CreateInfo: service.CreateInfo{
165167
Name: serviceName,
168+
Context: ctx,
169+
Cancel: cancel,
166170
LogLevel: cfg.LogLevel,
167171
LogColor: cfg.LogColor,
168172
EnableSignalHandling: true,
@@ -174,25 +178,25 @@ func run(cmd *cobra.Command, args []string) {
174178

175179
var err error
176180
logger := service.NewLogger(cfg.LogLevel, cfg.LogColor).With("service", "evm-reader")
177-
createInfo.ReaderClient, err = createEthClient(ctx, cfg.BlockchainHttpEndpoint.String(), logger)
181+
createInfo.ReaderClient, err = createEthClient(initCTX, cfg.BlockchainHttpEndpoint.String(), logger)
178182
cobra.CheckErr(err)
179183

180-
createInfo.ReaderWSClient, err = ethclient.DialContext(ctx, cfg.BlockchainWsEndpoint.String())
184+
createInfo.ReaderWSClient, err = ethclient.DialContext(initCTX, cfg.BlockchainWsEndpoint.String())
181185
cobra.CheckErr(err)
182186

183187
logger = service.NewLogger(cfg.LogLevel, cfg.LogColor).With("service", "claimer")
184-
createInfo.ClaimerClient, err = createEthClient(ctx, cfg.BlockchainHttpEndpoint.String(), logger)
188+
createInfo.ClaimerClient, err = createEthClient(initCTX, cfg.BlockchainHttpEndpoint.String(), logger)
185189
cobra.CheckErr(err)
186190

187191
logger = service.NewLogger(cfg.LogLevel, cfg.LogColor).With("service", "prt")
188-
createInfo.PrtClient, err = createEthClient(ctx, cfg.BlockchainHttpEndpoint.String(), logger)
192+
createInfo.PrtClient, err = createEthClient(initCTX, cfg.BlockchainHttpEndpoint.String(), logger)
189193
cobra.CheckErr(err)
190194

191-
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(ctx, cfg.DatabaseConnection.String())
195+
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(initCTX, cfg.DatabaseConnection.String())
192196
cobra.CheckErr(err)
193197
defer createInfo.Repository.Close()
194198

195-
nodeService, err := node.Create(ctx, &createInfo)
199+
nodeService, err := node.Create(initCTX, &createInfo)
196200
cobra.CheckErr(err)
197201

198202
cobra.CheckErr(nodeService.Serve())

cmd/cartesi-rollups-prt/root/root.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,15 @@ func createEthClient(ctx context.Context, endpoint string, logger *slog.Logger)
9797
}
9898

9999
func run(cmd *cobra.Command, args []string) {
100-
ctx, cancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
101-
defer cancel()
100+
initCTX, initCancel := context.WithTimeout(context.Background(), cfg.MaxStartupTime)
101+
defer initCancel()
102102

103+
ctx, cancel := context.WithCancel(context.Background())
103104
createInfo := prt.CreateInfo{
104105
CreateInfo: service.CreateInfo{
105106
Name: serviceName,
107+
Context: ctx,
108+
Cancel: cancel,
106109
LogLevel: cfg.LogLevel,
107110
LogColor: cfg.LogColor,
108111
EnableSignalHandling: true,
@@ -115,14 +118,14 @@ func run(cmd *cobra.Command, args []string) {
115118

116119
var err error
117120
logger := service.NewLogger(cfg.LogLevel, cfg.LogColor).With("service", serviceName)
118-
createInfo.EthClient, err = createEthClient(ctx, cfg.BlockchainHttpEndpoint.String(), logger)
121+
createInfo.EthClient, err = createEthClient(initCTX, cfg.BlockchainHttpEndpoint.String(), logger)
119122
cobra.CheckErr(err)
120123

121-
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(ctx, cfg.DatabaseConnection.String())
124+
createInfo.Repository, err = factory.NewRepositoryFromConnectionString(initCTX, cfg.DatabaseConnection.String())
122125
cobra.CheckErr(err)
123126
defer createInfo.Repository.Close()
124127

125-
validatorService, err := prt.Create(ctx, &createInfo)
128+
validatorService, err := prt.Create(initCTX, &createInfo)
126129
cobra.CheckErr(err)
127130

128131
cobra.CheckErr(validatorService.Serve())

internal/config/generate/Config.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ used-by = ["evmreader", "claimer", "node", "prt"]
152152

153153
[blockchain.CARTESI_BLOCKCHAIN_SUBSCRIPTION_TIMEOUT]
154154
default = "60"
155-
go-type = "uint64"
155+
go-type = "Duration"
156156
description = """
157157
Block subscription timeout in seconds."""
158158
used-by = ["evmreader", "node"]

internal/config/generated.go

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/evmreader/evmreader.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/ethereum/go-ethereum/ethclient"
1616
"github.com/ethereum/go-ethereum/rpc"
1717

18+
"github.com/cartesi/rollups-node/internal/config"
1819
. "github.com/cartesi/rollups-node/internal/model"
1920
"github.com/cartesi/rollups-node/internal/repository"
2021
"github.com/cartesi/rollups-node/pkg/ethutil"
@@ -72,16 +73,27 @@ type appContracts struct {
7273
}
7374

7475
func (r *Service) Run(ctx context.Context, ready chan struct{}) error {
75-
for {
76-
err := r.watchForNewBlocks(ctx, ready)
77-
// If the error is a SubscriptionError, re run watchForNewBlocks
78-
// that it will restart the websocket subscription
79-
if _, ok := err.(*SubscriptionError); !ok {
80-
return err
81-
}
76+
retries, err := config.GetBlockchainHttpMaxRetries()
77+
if err != nil {
78+
return err
79+
}
80+
81+
subscriptionTimeout, err := config.GetBlockchainSubscriptionTimeout()
82+
if err != nil {
83+
return err
84+
}
85+
86+
for try := uint64(1); try <= retries; try++ {
87+
err = r.watchForNewBlocks(ctx, ready)
8288
r.Logger.Error(err.Error())
83-
r.Logger.Info("Restarting subscription")
89+
r.Logger.Info("Restarting subscription",
90+
"try", try,
91+
"retries", retries,
92+
"max_wait", subscriptionTimeout,
93+
)
94+
time.Sleep(subscriptionTimeout)
8495
}
96+
return err
8597
}
8698

8799
func getAllRunningApplications(ctx context.Context, er EvmReaderRepository) ([]*Application, uint64, error) {

internal/evmreader/service.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,10 @@ func (s *Service) Tick() []error {
140140

141141
func (s *Service) Serve() error {
142142
ready := make(chan struct{}, 1)
143-
go s.Run(s.Context, ready)
143+
go func() {
144+
s.Run(s.Context, ready)
145+
s.Cancel()
146+
}()
144147
return s.Service.Serve()
145148
}
146149

0 commit comments

Comments
 (0)