@@ -3,6 +3,7 @@ package server
3
3
// DONTCOVER
4
4
5
5
import (
6
+ "context"
6
7
"errors"
7
8
"fmt"
8
9
"net"
@@ -141,14 +142,14 @@ is performed. Note, when enabled, gRPC will also be automatically enabled.
141
142
withTM , _ := cmd .Flags ().GetBool (flagWithTendermint )
142
143
if ! withTM {
143
144
serverCtx .Logger .Info ("starting ABCI without Tendermint" )
144
- return wrapCPUProfile (serverCtx , func () error {
145
- return startStandAlone (serverCtx , appCreator )
145
+ return wrapCPUProfile (cmd . Context (), serverCtx , func () error {
146
+ return startStandAlone (cmd . Context (), serverCtx , appCreator )
146
147
})
147
148
}
148
149
149
150
// amino is needed here for backwards compatibility of REST routes
150
- err = wrapCPUProfile (serverCtx , func () error {
151
- return startInProcess (serverCtx , clientCtx , appCreator )
151
+ err = wrapCPUProfile (cmd . Context (), serverCtx , func () error {
152
+ return startInProcess (cmd . Context (), serverCtx , clientCtx , appCreator )
152
153
})
153
154
errCode , ok := err .(ErrorCode )
154
155
if ! ok {
@@ -206,7 +207,7 @@ is performed. Note, when enabled, gRPC will also be automatically enabled.
206
207
return cmd
207
208
}
208
209
209
- func startStandAlone (ctx * Context , appCreator types.AppCreator ) error {
210
+ func startStandAlone (parentCtx context. Context , ctx * Context , appCreator types.AppCreator ) error {
210
211
addr := ctx .Viper .GetString (flagAddress )
211
212
transport := ctx .Viper .GetString (flagTransport )
212
213
home := ctx .Viper .GetString (flags .FlagHome )
@@ -260,10 +261,10 @@ func startStandAlone(ctx *Context, appCreator types.AppCreator) error {
260
261
}()
261
262
262
263
// Wait for SIGINT or SIGTERM signal
263
- return WaitForQuitSignals ()
264
+ return WaitForQuitSignals (parentCtx )
264
265
}
265
266
266
- func startInProcess (ctx * Context , clientCtx client.Context , appCreator types.AppCreator ) error {
267
+ func startInProcess (parentCtx context. Context , ctx * Context , clientCtx client.Context , appCreator types.AppCreator ) error {
267
268
cfg := ctx .Config
268
269
home := cfg .RootDir
269
270
@@ -354,6 +355,32 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App
354
355
return err
355
356
}
356
357
358
+ var (
359
+ grpcSrv * grpc.Server
360
+ grpcSrvAddr net.Addr
361
+ grpcWebSrv * http.Server
362
+ )
363
+
364
+ if config .GRPC .Enable {
365
+ grpcSrv , grpcSrvAddr , err = servergrpc .StartGRPCServer (clientCtx , app , config .GRPC )
366
+ if err != nil {
367
+ return err
368
+ }
369
+ defer grpcSrv .Stop ()
370
+ if config .GRPCWeb .Enable {
371
+ grpcWebSrv , err = servergrpc .StartGRPCWeb (grpcSrv , config )
372
+ if err != nil {
373
+ ctx .Logger .Error ("failed to start grpc-web http server: " , err )
374
+ return err
375
+ }
376
+ defer func () {
377
+ if err := grpcWebSrv .Close (); err != nil {
378
+ ctx .Logger .Error ("failed to close grpc-web http server: " , err )
379
+ }
380
+ }()
381
+ }
382
+ }
383
+
357
384
var apiSrv * api.Server
358
385
if config .API .Enable {
359
386
genDoc , err := genDocProvider ()
@@ -364,11 +391,6 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App
364
391
clientCtx := clientCtx .WithHomeDir (home ).WithChainID (genDoc .ChainID )
365
392
366
393
if config .GRPC .Enable {
367
- _ , port , err := net .SplitHostPort (config .GRPC .Address )
368
- if err != nil {
369
- return err
370
- }
371
-
372
394
maxSendMsgSize := config .GRPC .MaxSendMsgSize
373
395
if maxSendMsgSize == 0 {
374
396
maxSendMsgSize = serverconfig .DefaultGRPCMaxSendMsgSize
@@ -379,11 +401,10 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App
379
401
maxRecvMsgSize = serverconfig .DefaultGRPCMaxRecvMsgSize
380
402
}
381
403
382
- grpcAddress := fmt .Sprintf ("127.0.0.1:%s" , port )
383
-
404
+ grpcSrvAddrString := fmt .Sprintf ("%s://%s" , grpcSrvAddr .Network (), grpcSrvAddr .String ())
384
405
// If grpc is enabled, configure grpc client for grpc gateway.
385
406
grpcClient , err := grpc .Dial (
386
- grpcAddress ,
407
+ grpcSrvAddrString ,
387
408
grpc .WithTransportCredentials (insecure .NewCredentials ()),
388
409
grpc .WithDefaultCallOptions (
389
410
grpc .ForceCodec (codec .NewProtoCodec (clientCtx .InterfaceRegistry ).GRPCCodec ()),
@@ -396,7 +417,7 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App
396
417
}
397
418
398
419
clientCtx = clientCtx .WithGRPCClient (grpcClient )
399
- ctx .Logger .Debug ("grpc client assigned to client context" , "target" , grpcAddress )
420
+ ctx .Logger .Debug ("grpc client assigned to client context" , "target" , grpcSrvAddrString )
400
421
}
401
422
402
423
apiSrv = api .New (clientCtx , ctx .Logger .With ("module" , "api-server" ))
@@ -416,40 +437,30 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App
416
437
case err := <- errCh :
417
438
return err
418
439
419
- case <- time .After (types .ServerStartTime ): // assume server started successfully
420
- }
421
- }
422
-
423
- var (
424
- grpcSrv * grpc.Server
425
- grpcWebSrv * http.Server
426
- )
427
-
428
- if config .GRPC .Enable {
429
- grpcSrv , err = servergrpc .StartGRPCServer (clientCtx , app , config .GRPC )
430
- if err != nil {
431
- return err
432
- }
433
- defer grpcSrv .Stop ()
434
- if config .GRPCWeb .Enable {
435
- grpcWebSrv , err = servergrpc .StartGRPCWeb (grpcSrv , config )
436
- if err != nil {
437
- ctx .Logger .Error ("failed to start grpc-web http server: " , err )
438
- return err
439
- }
440
- defer func () {
441
- if err := grpcWebSrv .Close (); err != nil {
442
- ctx .Logger .Error ("failed to close grpc-web http server: " , err )
443
- }
444
- }()
440
+ case <- time .After (time .Duration (types .ServerStartTime .Load ())): // assume server started successfully
445
441
}
446
442
}
447
443
448
444
// At this point it is safe to block the process if we're in gRPC only mode as
449
445
// we do not need to start Rosetta or handle any Tendermint related processes.
450
446
if gRPCOnly {
447
+ // Fix application shutdown
448
+ defer func () {
449
+ _ = app .Close ()
450
+
451
+ if traceWriterCleanup != nil {
452
+ traceWriterCleanup ()
453
+ }
454
+
455
+ if apiSrv != nil {
456
+ _ = apiSrv .Close ()
457
+ }
458
+
459
+ ctx .Logger .Info ("exiting..." )
460
+ }()
461
+
451
462
// wait for signal capture and gracefully return
452
- return WaitForQuitSignals ()
463
+ return WaitForQuitSignals (parentCtx )
453
464
}
454
465
455
466
var rosettaSrv crgserver.Server
@@ -498,7 +509,7 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App
498
509
case err := <- errCh :
499
510
return err
500
511
501
- case <- time .After (types .ServerStartTime ): // assume server started successfully
512
+ case <- time .After (time . Duration ( types .ServerStartTime . Load ()) ): // assume server started successfully
502
513
}
503
514
}
504
515
@@ -520,7 +531,7 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App
520
531
}()
521
532
522
533
// wait for signal capture and gracefully return
523
- return WaitForQuitSignals ()
534
+ return WaitForQuitSignals (parentCtx )
524
535
}
525
536
526
537
func startTelemetry (cfg serverconfig.Config ) (* telemetry.Metrics , error ) {
@@ -531,7 +542,7 @@ func startTelemetry(cfg serverconfig.Config) (*telemetry.Metrics, error) {
531
542
}
532
543
533
544
// wrapCPUProfile runs callback in a goroutine, then wait for quit signals.
534
- func wrapCPUProfile (ctx * Context , callback func () error ) error {
545
+ func wrapCPUProfile (parentCtx context. Context , ctx * Context , callback func () error ) error {
535
546
if cpuProfile := ctx .Viper .GetString (flagCPUProfile ); cpuProfile != "" {
536
547
f , err := os .Create (cpuProfile )
537
548
if err != nil {
@@ -561,8 +572,8 @@ func wrapCPUProfile(ctx *Context, callback func() error) error {
561
572
case err := <- errCh :
562
573
return err
563
574
564
- case <- time .After (types .ServerStartTime ):
575
+ case <- time .After (time . Duration ( types .ServerStartTime . Load ()) ):
565
576
}
566
577
567
- return WaitForQuitSignals ()
578
+ return WaitForQuitSignals (parentCtx )
568
579
}
0 commit comments