Skip to content

Commit 9708928

Browse files
committed
Enable max connection age for API server.
1 parent 8f6858b commit 9708928

File tree

4 files changed

+57
-9
lines changed

4 files changed

+57
-9
lines changed

disperser/apiserver/server_v2.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import (
88
"sync/atomic"
99
"time"
1010

11-
"github.com/prometheus/client_golang/prometheus"
12-
1311
"github.com/Layr-Labs/eigenda/api"
1412
pbcommon "github.com/Layr-Labs/eigenda/api/grpc/common"
1513
pbv1 "github.com/Layr-Labs/eigenda/api/grpc/disperser"
@@ -23,7 +21,9 @@ import (
2321
"github.com/Layr-Labs/eigenda/encoding"
2422
"github.com/Layr-Labs/eigensdk-go/logging"
2523
gethcommon "github.com/ethereum/go-ethereum/common"
24+
"github.com/prometheus/client_golang/prometheus"
2625
"google.golang.org/grpc"
26+
"google.golang.org/grpc/keepalive"
2727
"google.golang.org/grpc/reflection"
2828
)
2929

@@ -136,6 +136,12 @@ func (s *DispersalServerV2) Start(ctx context.Context) error {
136136
}
137137

138138
// Serve grpc requests
139+
keepAliveConfig := grpc.KeepaliveParams(keepalive.ServerParameters{
140+
MaxConnectionIdle: s.serverConfig.MaxIdleConnectionAge,
141+
MaxConnectionAge: s.serverConfig.MaxConnectionAge,
142+
MaxConnectionAgeGrace: s.serverConfig.MaxConnectionAgeGrace,
143+
})
144+
139145
addr := fmt.Sprintf("%s:%s", disperser.Localhost, s.serverConfig.GrpcPort)
140146
listener, err := net.Listen("tcp", addr)
141147
if err != nil {
@@ -146,7 +152,7 @@ func (s *DispersalServerV2) Start(ctx context.Context) error {
146152
gs := grpc.NewServer(
147153
grpc.ChainUnaryInterceptor(
148154
s.metrics.grpcMetrics.UnaryServerInterceptor(),
149-
), opt)
155+
), opt, keepAliveConfig)
150156
reflection.Register(gs)
151157
pb.RegisterDisperserServer(gs, s)
152158

disperser/cmd/apiserver/flags/flags.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,33 @@ var (
4646
EnvVar: common.PrefixEnvVar(envVarPrefix, "GRPC_STREAM_TIMEOUT"),
4747
Value: time.Second * 10,
4848
}
49+
MaxConnectionAgeFlag = cli.DurationFlag{
50+
Name: common.PrefixFlag(FlagPrefix, "max-connection-age"),
51+
Usage: "Maximum age of a gRPC connection before it is closed. " +
52+
"If zero, then the server will not close connections based on age.",
53+
Required: false,
54+
EnvVar: common.PrefixEnvVar(envVarPrefix, "MAX_CONNECTION_AGE_SECONDS"),
55+
Value: 5 * time.Minute,
56+
}
57+
MaxConnectionAgeGraceFlag = cli.DurationFlag{
58+
Name: common.PrefixFlag(FlagPrefix, "max-connection-age-grace"),
59+
Usage: "Grace period after MaxConnectionAge before the connection is forcibly closed.",
60+
Required: false,
61+
EnvVar: common.PrefixEnvVar(envVarPrefix, "MAX_CONNECTION_AGE_GRACE_SECONDS"),
62+
Value: 30 * time.Second,
63+
}
64+
MaxIdleConnectionAgeFlag = cli.DurationFlag{
65+
Name: common.PrefixFlag(FlagPrefix, "max-idle-connection-age"),
66+
Usage: "Maximum time a connection can be idle before it is closed.",
67+
Required: false,
68+
EnvVar: common.PrefixEnvVar(envVarPrefix, "MAX_IDLE_CONNECTION_AGE_SECONDS"),
69+
Value: time.Minute,
70+
}
4971
BlsOperatorStateRetrieverFlag = cli.StringFlag{
5072
Name: common.PrefixFlag(FlagPrefix, "bls-operator-state-retriever"),
5173
Usage: "[Deprecated: use EigenDADirectory instead] Address of the BLS operator state Retriever",
5274
Required: false,
53-
EnvVar: common.PrefixEnvVar(envVarPrefix, "BLS_OPERATOR_STATE_RETRIVER"),
75+
EnvVar: common.PrefixEnvVar(envVarPrefix, "BLS_OPERATOR_STATE_RETRIVER"), // sigh
5476
}
5577
EigenDAServiceManagerFlag = cli.StringFlag{
5678
Name: common.PrefixFlag(FlagPrefix, "eigenda-service-manager"),
@@ -272,6 +294,9 @@ var optionalFlags = []cli.Flag{
272294
EnablePaymentMeterer,
273295
BucketStoreSize,
274296
GrpcTimeoutFlag,
297+
MaxConnectionAgeFlag,
298+
MaxConnectionAgeGraceFlag,
299+
MaxIdleConnectionAgeFlag,
275300
MaxBlobSize,
276301
ReservationsTableName,
277302
OnDemandTableName,

disperser/cmd/apiserver/lib/config.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,13 @@ func NewConfig(ctx *cli.Context) (Config, error) {
9898
DisperserVersion: DisperserVersion(version),
9999
AwsClientConfig: aws.ReadClientConfig(ctx, flags.FlagPrefix),
100100
ServerConfig: disperser.ServerConfig{
101-
GrpcPort: ctx.GlobalString(flags.GrpcPortFlag.Name),
102-
GrpcTimeout: ctx.GlobalDuration(flags.GrpcTimeoutFlag.Name),
103-
PprofHttpPort: ctx.GlobalString(flags.PprofHttpPort.Name),
104-
EnablePprof: ctx.GlobalBool(flags.EnablePprof.Name),
101+
GrpcPort: ctx.GlobalString(flags.GrpcPortFlag.Name),
102+
GrpcTimeout: ctx.GlobalDuration(flags.GrpcTimeoutFlag.Name),
103+
MaxConnectionAge: ctx.GlobalDuration(flags.MaxConnectionAgeFlag.Name),
104+
MaxConnectionAgeGrace: ctx.GlobalDuration(flags.MaxConnectionAgeGraceFlag.Name),
105+
MaxIdleConnectionAge: ctx.GlobalDuration(flags.MaxIdleConnectionAgeFlag.Name),
106+
PprofHttpPort: ctx.GlobalString(flags.PprofHttpPort.Name),
107+
EnablePprof: ctx.GlobalBool(flags.EnablePprof.Name),
105108
},
106109
BlobstoreConfig: blobstore.Config{
107110
BucketName: ctx.GlobalString(flags.S3BucketNameFlag.Name),

disperser/server_config.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,23 @@ const (
77
)
88

99
type ServerConfig struct {
10-
GrpcPort string
10+
GrpcPort string
11+
12+
// This timeout is used control the maximum age of a DisperseBlobAuthenticated() RPC call
13+
// (via a context with a timeout).
1114
GrpcTimeout time.Duration
1215

16+
// The maximum permissible age of a GRPC connection before it is closed. If zero, then the server will not close
17+
// connections based on age.
18+
MaxConnectionAge time.Duration
19+
20+
// When the server closes a connection due to MaxConnectionAgeSeconds, it will wait for this grace period before
21+
// forcibly closing the connection. This allows in-flight requests to complete.
22+
MaxConnectionAgeGrace time.Duration
23+
24+
// MaxIdleConnectionAge is the maximum time a connection can be idle before it is closed.
25+
MaxIdleConnectionAge time.Duration
26+
1327
PprofHttpPort string
1428
EnablePprof bool
1529
}

0 commit comments

Comments
 (0)