Skip to content

Commit

Permalink
start GRPCWebServer in goroutine
Browse files Browse the repository at this point in the history
so it don't block other code from executing.

Closes #9703

Update server/grpc/grpc_web.go

Co-authored-by: Aleksandr Bezobchuk <alexanderbez@users.noreply.github.com>

add changelog entry

Update server/grpc/grpc_web.go

Co-authored-by: Robert Zaremba <robert@zaremba.ch>

change server start time to 3 seconds

and refactored to share a constant variable
  • Loading branch information
yihuang committed Jul 16, 2021
1 parent 615f224 commit 4a04673
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 7 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (x/genutil) [\#9574](https://github.com/cosmos/cosmos-sdk/pull/9575) Actually use the `gentx` client tx flags (like `--keyring-dir`)
* (x/distribution) [\#9599](https://github.com/cosmos/cosmos-sdk/pull/9599) Withdraw rewards event now includes a value attribute even if there are 0 rewards (due to situations like 100% commission).
* (x/genutil) [\#9638](https://github.com/cosmos/cosmos-sdk/pull/9638) Added missing validator key save when recovering from mnemonic
* (server) [#9704](https://github.com/cosmos/cosmos-sdk/pull/9704) Start GRPCWebServer in goroutine, avoid blocking other services from starting.

## [v0.43.0-rc0](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.43.0-rc0) - 2021-06-25

Expand Down
17 changes: 15 additions & 2 deletions server/grpc/grpc_web.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package grpc

import (
"fmt"
"net/http"
"time"

"github.com/improbable-eng/grpc-web/go/grpcweb"
"google.golang.org/grpc"

"github.com/cosmos/cosmos-sdk/server/config"
"github.com/cosmos/cosmos-sdk/server/types"
)

// StartGRPCWeb starts a gRPC-Web server on the given address.
Expand All @@ -28,8 +31,18 @@ func StartGRPCWeb(grpcSrv *grpc.Server, config config.Config) (*http.Server, err
Addr: config.GRPCWeb.Address,
Handler: http.HandlerFunc(handler),
}
if err := grpcWebSrv.ListenAndServe(); err != nil {

errCh := make(chan error)
go func() {
if err := grpcWebSrv.ListenAndServe(); err != nil {
errCh <- fmt.Errorf("[grpc] failed to serve: %w", err)
}
}()

select {
case err := <-errCh:
return nil, err
case <-time.After(types.ServerStartTime): // assume server started successfully
return grpcWebSrv, nil
}
return grpcWebSrv, nil
}
2 changes: 1 addition & 1 deletion server/grpc/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ func StartGRPCServer(clientCtx client.Context, app types.Application, address st
select {
case err := <-errCh:
return nil, err
case <-time.After(5 * time.Second): // assume server started successfully
case <-time.After(types.ServerStartTime): // assume server started successfully
return grpcSrv, nil
}
}
4 changes: 2 additions & 2 deletions server/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App
select {
case err := <-errCh:
return err
case <-time.After(5 * time.Second): // assume server started successfully
case <-time.After(types.ServerStartTime): // assume server started successfully
}
}

Expand Down Expand Up @@ -366,7 +366,7 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App
select {
case err := <-errCh:
return err
case <-time.After(5 * time.Second): // assume server started successfully
case <-time.After(types.ServerStartTime): // assume server started successfully
}
}

Expand Down
5 changes: 5 additions & 0 deletions server/types/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package types
import (
"encoding/json"
"io"
"time"

"github.com/gogo/protobuf/grpc"
"github.com/spf13/cobra"
Expand All @@ -16,6 +17,10 @@ import (
"github.com/cosmos/cosmos-sdk/server/config"
)

// ServerStartTime defines the time duration that the server need to stay running after startup
// for the startup be considered successful
const ServerStartTime = 3 * time.Second

type (
// AppOptions defines an interface that is passed into an application
// constructor, typically used to set BaseApp options that are either supplied
Expand Down
5 changes: 3 additions & 2 deletions testutil/network/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (

"github.com/cosmos/cosmos-sdk/server/api"
servergrpc "github.com/cosmos/cosmos-sdk/server/grpc"
srvtypes "github.com/cosmos/cosmos-sdk/server/types"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
"github.com/cosmos/cosmos-sdk/x/genutil"
Expand Down Expand Up @@ -90,7 +91,7 @@ func startInProcess(cfg Config, val *Validator) error {
select {
case err := <-errCh:
return err
case <-time.After(5 * time.Second): // assume server started successfully
case <-time.After(srvtypes.ServerStartTime): // assume server started successfully
}

val.api = apiSrv
Expand All @@ -117,7 +118,7 @@ func startInProcess(cfg Config, val *Validator) error {
select {
case err := <-errCh1:
return err
case <-time.After(5 * time.Second): // assume server started successfully
case <-time.After(srvtypes.ServerStartTime): // assume server started successfully
}

}
Expand Down

0 comments on commit 4a04673

Please sign in to comment.