Skip to content

Commit ac541ec

Browse files
committed
multi: create gRPC servers at init time
To make sure we always have the same reference to the gRPC servers we use, we create them earlier and keep them for the whole lifetime of the outer `server` struct (which is used by litd). Because we need the config before starting (but don't have the config ready in litd when we create the server struct), we add a new UpdateConfig method to all servers.
1 parent 0da1bd6 commit ac541ec

File tree

5 files changed

+44
-40
lines changed

5 files changed

+44
-40
lines changed

authmailbox/client_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ func (h *serverHarness) start(t *testing.T) {
8282
}
8383
h.grpcServer = grpc.NewServer(serverOpts...)
8484

85-
h.srv = NewServer(h.cfg)
85+
h.srv = NewServer()
86+
require.NoError(t, h.srv.Start(h.cfg))
8687
mboxrpc.RegisterMailboxServer(h.grpcServer, h.srv)
8788

8889
cleanup, err := test.StartMockGRPCServerWithAddr(

authmailbox/server.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,8 @@ type Server struct {
8080
}
8181

8282
// NewServer creates a new mailbox server with the given configuration.
83-
func NewServer(cfg *ServerConfig) *Server {
83+
func NewServer() *Server {
8484
return &Server{
85-
cfg: cfg,
8685
msgEventsSubs: make(
8786
map[uint64]*fn.EventReceiver[[]*Message],
8887
),
@@ -92,12 +91,21 @@ func NewServer(cfg *ServerConfig) *Server {
9291
}
9392

9493
// Start signals that the RPC server starts accepting requests.
95-
func (s *Server) Start() error {
94+
func (s *Server) Start(cfg *ServerConfig) error {
95+
var startErr error
9696
s.startOnce.Do(func() {
9797
log.Infof("Starting authmailbox RPC Server")
98+
99+
if cfg == nil {
100+
startErr = fmt.Errorf("authmailbox server config not " +
101+
"provided in Start")
102+
return
103+
}
104+
105+
s.cfg = cfg
98106
})
99107

100-
return nil
108+
return startErr
101109
}
102110

103111
// RegisterWithGrpcServer registers the rpcServer with the passed root gRPC

rpcserver.go

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import (
3939
"github.com/lightninglabs/taproot-assets/rfq"
4040
"github.com/lightninglabs/taproot-assets/rfqmath"
4141
"github.com/lightninglabs/taproot-assets/rfqmsg"
42-
"github.com/lightninglabs/taproot-assets/rpcperms"
4342
"github.com/lightninglabs/taproot-assets/rpcutils"
4443
"github.com/lightninglabs/taproot-assets/tapchannel"
4544
"github.com/lightninglabs/taproot-assets/tapdb"
@@ -176,8 +175,6 @@ type rpcServer struct {
176175

177176
interceptor signal.Interceptor
178177

179-
interceptorChain *rpcperms.InterceptorChain
180-
181178
cfg *Config
182179

183180
proofQueryRateLimiter *rate.Limiter
@@ -186,30 +183,31 @@ type rpcServer struct {
186183
wg sync.WaitGroup
187184
}
188185

189-
// newRPCServer creates a new RPC sever from the set of input dependencies.
190-
func newRPCServer(interceptor signal.Interceptor,
191-
interceptorChain *rpcperms.InterceptorChain,
192-
cfg *Config) (*rpcServer, error) {
193-
186+
// newRPCServer creates a new RPC sever.
187+
func newRPCServer() *rpcServer {
194188
return &rpcServer{
195-
interceptor: interceptor,
196-
interceptorChain: interceptorChain,
197-
quit: make(chan struct{}),
198-
proofQueryRateLimiter: rate.NewLimiter(
199-
cfg.UniverseQueriesPerSecond, cfg.UniverseQueriesBurst,
200-
),
201-
cfg: cfg,
202-
}, nil
189+
quit: make(chan struct{}),
190+
}
203191
}
204192

205193
// TODO(roasbeef): build in batching for asset creation?
206194

207195
// Start signals that the RPC server starts accepting requests.
208-
func (r *rpcServer) Start() error {
196+
func (r *rpcServer) Start(cfg *Config) error {
209197
if atomic.AddInt32(&r.started, 1) != 1 {
210198
return nil
211199
}
212200

201+
if cfg == nil {
202+
return fmt.Errorf("RPC server config not provided in Start")
203+
}
204+
205+
r.interceptor = cfg.SignalInterceptor
206+
r.cfg = cfg
207+
r.proofQueryRateLimiter = rate.NewLimiter(
208+
r.cfg.UniverseQueriesPerSecond, r.cfg.UniverseQueriesBurst,
209+
)
210+
213211
rpcsLog.Infof("Starting RPC Server")
214212

215213
return nil

server.go

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,12 @@ type Server struct {
7272
wg sync.WaitGroup
7373
}
7474

75-
// NewServer creates a new server given the passed config.
76-
func NewServer(chainParams *address.ChainParams, cfg *Config) *Server {
75+
// NewServer creates a new server.
76+
func NewServer(chainParams *address.ChainParams) *Server {
7777
return &Server{
78+
rpcServer: newRPCServer(),
79+
mboxServer: authmailbox.NewServer(),
7880
chainParams: chainParams,
79-
cfg: cfg,
8081
ready: make(chan bool),
8182
quit: make(chan struct{}, 1),
8283
}
@@ -105,6 +106,11 @@ func (s *Server) initialize(interceptorChain *rpcperms.InterceptorChain) error {
105106
}
106107
}()
107108

109+
if s.cfg == nil {
110+
return fmt.Errorf("main server config not set before calling " +
111+
"initialize")
112+
}
113+
108114
// Show version at startup.
109115
srvrLog.Infof("Version: %s, build=%s, logging=%s, "+
110116
"debuglevel=%s, active_network=%v", Version(), build.Deployment,
@@ -171,18 +177,6 @@ func (s *Server) initialize(interceptorChain *rpcperms.InterceptorChain) error {
171177
}
172178
}
173179

174-
// Initialize, and register our implementation of the gRPC interface
175-
// exported by the rpcServer.
176-
var err error
177-
s.rpcServer, err = newRPCServer(
178-
s.cfg.SignalInterceptor, interceptorChain, s.cfg,
179-
)
180-
if err != nil {
181-
return fmt.Errorf("unable to create rpc server: %w", err)
182-
}
183-
184-
s.mboxServer = authmailbox.NewServer(&s.cfg.MboxServerConfig)
185-
186180
// First, we'll start the main batched asset minter.
187181
if err := s.cfg.AssetMinter.Start(); err != nil {
188182
return fmt.Errorf("unable to start asset minter: %w", err)
@@ -253,13 +247,13 @@ func (s *Server) initialize(interceptorChain *rpcperms.InterceptorChain) error {
253247

254248
// Now we have created all dependencies necessary to populate and
255249
// start the RPC server.
256-
if err := s.rpcServer.Start(); err != nil {
250+
if err := s.rpcServer.Start(s.cfg); err != nil {
257251
return fmt.Errorf("unable to start RPC server: %w", err)
258252
}
259253

260254
shutdownFuncs["rpcServer"] = s.rpcServer.Stop
261255

262-
if err := s.mboxServer.Start(); err != nil {
256+
if err := s.mboxServer.Start(&s.cfg.MboxServerConfig); err != nil {
263257
return fmt.Errorf("unable to start auth mailbox server: %w",
264258
err)
265259
}

tapcfg/server.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,10 @@ func CreateServerFromConfig(cfg *Config, cfgLogger btclog.Logger,
771771
LetsEncryptDomain: cfg.RpcConf.LetsEncryptDomain,
772772
}
773773

774-
return tap.NewServer(&serverCfg.ChainParams, serverCfg), nil
774+
srv := tap.NewServer(&serverCfg.ChainParams)
775+
srv.UpdateConfig(serverCfg)
776+
777+
return srv, nil
775778
}
776779

777780
// ConfigureSubServer updates a Taproot Asset server with the given CLI config.

0 commit comments

Comments
 (0)