diff --git a/api/config.go b/api/config.go index d6800498fb..c98dfb538e 100644 --- a/api/config.go +++ b/api/config.go @@ -6,6 +6,8 @@ package api import ( + "time" + "github.com/iotexproject/iotex-core/v2/gasstation" "github.com/iotexproject/iotex-core/v2/pkg/tracer" ) @@ -27,6 +29,8 @@ type Config struct { WebsocketRateLimit int `yaml:"websocketRateLimit"` // ListenerLimit is the maximum number of listeners. ListenerLimit int `yaml:"listenerLimit"` + // ReadyDuration is the duration to wait for the server to be ready. + ReadyDuration time.Duration `yaml:"readyDuration"` } // DefaultConfig is the default config @@ -41,4 +45,5 @@ var DefaultConfig = Config{ BatchRequestLimit: _defaultBatchRequestLimit, WebsocketRateLimit: 5, ListenerLimit: 5000, + ReadyDuration: time.Second * 30, } diff --git a/server/itx/server.go b/server/itx/server.go index 013fe1010c..166a254986 100644 --- a/server/itx/server.go +++ b/server/itx/server.go @@ -12,6 +12,7 @@ import ( "net/http/pprof" "runtime" "sync" + "time" "github.com/pkg/errors" "go.uber.org/zap" @@ -231,9 +232,18 @@ func StartServer(ctx context.Context, svr *Server, probeSvr *probe.Server, cfg c log.L().Panic("Failed to stop server.", zap.Error(err)) } }() + if _, isGateway := cfg.Plugins[config.GatewayPlugin]; isGateway && cfg.API.ReadyDuration > 0 { + // wait for a while to make sure the server is ready + // The original intention was to ensure that all transactions that were not received during the restart were included in block, thereby avoiding inconsistencies in the state of the API node. + log.L().Info("Waiting for server to be ready.", zap.Duration("duration", cfg.API.ReadyDuration)) + readyTimer := time.NewTimer(cfg.API.ReadyDuration) + <-readyTimer.C + readyTimer.Stop() + } if err := probeSvr.TurnOn(); err != nil { log.L().Panic("Failed to turn on probe server.", zap.Error(err)) } + log.L().Info("Server is ready.") if cfg.System.HeartbeatInterval > 0 { task := routine.NewRecurringTask(NewHeartbeatHandler(svr, cfg.Network).Log, cfg.System.HeartbeatInterval)