diff --git a/cmd/config.go b/cmd/config.go index 26e77aa..ef50799 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -98,15 +98,16 @@ type RPCEndpointConfig struct { // rpc client-side configuration } type ServerAppConfig struct { - LogMask []string `yaml:"log-mask"` - LogFile string `yaml:"log-file"` - LogMaxSize int64 `yaml:"log-max-size"` - LogRotate int `yaml:"log-rotate"` - MaxPeers int `yaml:"max-peer-conns"` // maximum number of connections from peers - MaxRpcConns int `yaml:"max-rpc-conns"` // maximum number of rpc connections - PtyUser string `yaml:"pty-user"` - PtyShell string `yaml:"pty-shell"` - XtermHtmlFile string `yaml:"xterm-html-file"` + LogMask []string `yaml:"log-mask"` + LogFile string `yaml:"log-file"` + LogMaxSize int64 `yaml:"log-max-size"` + LogRotate int `yaml:"log-rotate"` + MaxPeers int `yaml:"max-peer-conns"` // maximum number of connections from peers + MaxRpcConns int `yaml:"max-rpc-conns"` // maximum number of rpc connections + MinRpcPingIntvl time.Duration `yaml:"min-rpc-ping-interval"` + PtyUser string `yaml:"pty-user"` + PtyShell string `yaml:"pty-shell"` + XtermHtmlFile string `yaml:"xterm-html-file"` } type ClientAppConfig struct { diff --git a/cmd/main.go b/cmd/main.go index d56aea2..dba9890 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -149,6 +149,7 @@ func server_main(ctl_addrs []string, rpc_addrs []string, rpx_addrs[] string, pxy config.CtlPrefix = cfg.CTL.Service.Prefix config.RpcMaxConns = cfg.APP.MaxRpcConns + config.RpcMinPingIntvl = cfg.APP.MinRpcPingIntvl config.MaxPeers = cfg.APP.MaxPeers pty_user = cfg.APP.PtyUser diff --git a/server.go b/server.go index 99c1876..3026d89 100644 --- a/server.go +++ b/server.go @@ -23,6 +23,7 @@ import "unsafe" import "golang.org/x/net/websocket" import "google.golang.org/grpc" import "google.golang.org/grpc/credentials" +import "google.golang.org/grpc/keepalive" import "google.golang.org/grpc/peer" import "google.golang.org/grpc/stats" import "github.com/prometheus/client_golang/prometheus" @@ -61,6 +62,7 @@ type ServerConfig struct { RpcAddrs []string RpcTls *tls.Config RpcMaxConns int + RpcMinPingIntvl time.Duration MaxPeers int CtlAddrs []string @@ -1729,6 +1731,14 @@ func NewServer(ctx context.Context, name string, logger Logger, cfg *ServerConfi s.wpx_addrs = list.New() opts = append(opts, grpc.StatsHandler(&ConnCatcher{server: &s})) + if s.Cfg.RpcMinPingIntvl > 0 { + // https://pkg.go.dev/google.golang.org/grpc/keepalive + // grpc library default is 5 minutes if this option is not added. + opts = append(opts, grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{ + MinTime: s.Cfg.RpcMinPingIntvl, + PermitWithoutStream: true, + })) + } if s.Cfg.RpcTls != nil { opts = append(opts, grpc.Creds(credentials.NewTLS(s.Cfg.RpcTls))) } //opts = append(opts, grpc.UnaryInterceptor(unaryInterceptor)) //opts = append(opts, grpc.StreamInterceptor(streamInterceptor))