Skip to content

Commit f8c768c

Browse files
committed
Fix race in Start*Server funcs.
1 parent deb15ec commit f8c768c

File tree

1 file changed

+65
-20
lines changed

1 file changed

+65
-20
lines changed

internal/rpc/rpcserver/server.go

Lines changed: 65 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
"fmt"
2424
"net"
2525
"sort"
26-
"sync/atomic"
26+
"sync"
2727
"time"
2828

2929
"google.golang.org/grpc"
@@ -168,7 +168,9 @@ type versionServer struct {
168168
type walletServer struct {
169169
// ready indicates this service has been provided with all of its
170170
// dependencies and is ready to service requests.
171-
ready atomic.Bool
171+
ready bool
172+
readyMtx sync.RWMutex
173+
172174
wallet *wallet.Wallet
173175
pb.UnimplementedWalletServiceServer
174176
}
@@ -193,7 +195,9 @@ type seedServer struct {
193195
type accountMixerServer struct {
194196
// ready indicates this service has been provided with all of its
195197
// dependencies and is ready to service requests.
196-
ready atomic.Bool
198+
ready bool
199+
readyMtx sync.RWMutex
200+
197201
wallet *wallet.Wallet
198202
pb.UnimplementedAccountMixerServiceServer
199203
}
@@ -203,7 +207,9 @@ type accountMixerServer struct {
203207
type ticketbuyerServer struct {
204208
// ready indicates this service has been provided with all of its
205209
// dependencies and is ready to service requests.
206-
ready atomic.Bool
210+
ready bool
211+
readyMtx sync.RWMutex
212+
207213
wallet *wallet.Wallet
208214
pb.UnimplementedTicketBuyerServiceServer
209215
}
@@ -216,7 +222,9 @@ type agendaServer struct {
216222
type votingServer struct {
217223
// ready indicates this service has been provided with all of its
218224
// dependencies and is ready to service requests.
219-
ready atomic.Bool
225+
ready bool
226+
readyMtx sync.RWMutex
227+
220228
wallet *wallet.Wallet
221229
pb.UnimplementedVotingServiceServer
222230
}
@@ -238,7 +246,9 @@ type decodeMessageServer struct {
238246
type networkServer struct {
239247
// ready indicates this service has been provided with all of its
240248
// dependencies and is ready to service requests.
241-
ready atomic.Bool
249+
ready bool
250+
readyMtx sync.RWMutex
251+
242252
wallet *wallet.Wallet
243253
pb.UnimplementedNetworkServiceServer
244254
}
@@ -320,14 +330,21 @@ func (*versionServer) Version(ctx context.Context, req *pb.VersionRequest) (*pb.
320330

321331
// StartWalletService starts the WalletService.
322332
func StartWalletService(wallet *wallet.Wallet) {
323-
if walletService.ready.Swap(true) {
333+
walletService.readyMtx.Lock()
334+
defer walletService.readyMtx.Unlock()
335+
336+
if walletService.ready {
324337
panic("service already started")
325338
}
339+
340+
walletService.ready = true
326341
walletService.wallet = wallet
327342
}
328343

329344
func (s *walletServer) checkReady() bool {
330-
return s.ready.Load()
345+
s.readyMtx.RLock()
346+
defer s.readyMtx.RUnlock()
347+
return s.ready
331348
}
332349

333350
// requireNetworkBackend checks whether the wallet has been associated with the
@@ -2510,10 +2527,15 @@ func StartWalletLoaderService(loader *loader.Loader, activeNet *netparams.Params
25102527

25112528
// StartAccountMixerService starts the AccountMixerService.
25122529
func StartAccountMixerService(wallet *wallet.Wallet) {
2513-
accountMixerService.wallet = wallet
2514-
if accountMixerService.ready.Swap(true) {
2530+
accountMixerService.readyMtx.Lock()
2531+
defer accountMixerService.readyMtx.Unlock()
2532+
2533+
if accountMixerService.ready {
25152534
panic("service already started")
25162535
}
2536+
2537+
accountMixerService.ready = true
2538+
accountMixerService.wallet = wallet
25172539
}
25182540

25192541
// RunAccountMixer starts the automatic account mixer for the service.
@@ -2555,15 +2577,22 @@ func (t *accountMixerServer) RunAccountMixer(req *pb.RunAccountMixerRequest, svr
25552577
}
25562578

25572579
func (t *accountMixerServer) checkReady() bool {
2558-
return t.ready.Load()
2580+
t.readyMtx.RLock()
2581+
defer t.readyMtx.RUnlock()
2582+
return t.ready
25592583
}
25602584

25612585
// StartTicketBuyerService starts the TicketBuyerService.
25622586
func StartTicketBuyerService(wallet *wallet.Wallet) {
2563-
ticketBuyerService.wallet = wallet
2564-
if ticketBuyerService.ready.Swap(true) {
2587+
ticketBuyerService.readyMtx.Lock()
2588+
defer ticketBuyerService.readyMtx.Unlock()
2589+
2590+
if ticketBuyerService.ready {
25652591
panic("service already started")
25662592
}
2593+
2594+
ticketBuyerService.ready = true
2595+
ticketBuyerService.wallet = wallet
25672596
}
25682597

25692598
// RunTicketBuyer starts the automatic ticket buyer.
@@ -2668,7 +2697,9 @@ func (t *ticketbuyerServer) RunTicketBuyer(req *pb.RunTicketBuyerRequest, svr pb
26682697
}
26692698

26702699
func (t *ticketbuyerServer) checkReady() bool {
2671-
return t.ready.Load()
2700+
t.readyMtx.RLock()
2701+
defer t.readyMtx.RUnlock()
2702+
return t.ready
26722703
}
26732704

26742705
func (s *loaderServer) CreateWallet(ctx context.Context, req *pb.CreateWalletRequest) (
@@ -3208,14 +3239,21 @@ func (s *agendaServer) Agendas(ctx context.Context, req *pb.AgendasRequest) (*pb
32083239

32093240
// StartVotingService starts the VotingService.
32103241
func StartVotingService(wallet *wallet.Wallet) {
3211-
votingService.wallet = wallet
3212-
if votingService.ready.Swap(true) {
3242+
votingService.readyMtx.Lock()
3243+
defer votingService.readyMtx.Unlock()
3244+
3245+
if votingService.ready {
32133246
panic("service already started")
32143247
}
3248+
3249+
votingService.ready = true
3250+
votingService.wallet = wallet
32153251
}
32163252

32173253
func (s *votingServer) checkReady() bool {
3218-
return s.ready.Load()
3254+
s.readyMtx.RLock()
3255+
defer s.readyMtx.RUnlock()
3256+
return s.ready
32193257
}
32203258

32213259
func (s *votingServer) VoteChoices(ctx context.Context, req *pb.VoteChoicesRequest) (*pb.VoteChoicesResponse, error) {
@@ -3748,14 +3786,21 @@ func (s *walletServer) AbandonTransaction(ctx context.Context, req *pb.AbandonTr
37483786

37493787
// StartNetworkService starts the NetworkService.
37503788
func StartNetworkService(wallet *wallet.Wallet) {
3751-
networkService.wallet = wallet
3752-
if networkService.ready.Swap(true) {
3789+
networkService.readyMtx.Lock()
3790+
defer networkService.readyMtx.Unlock()
3791+
3792+
if networkService.ready {
37533793
panic("service already started")
37543794
}
3795+
3796+
networkService.ready = true
3797+
networkService.wallet = wallet
37553798
}
37563799

37573800
func (s *networkServer) checkReady() bool {
3758-
return s.ready.Load()
3801+
s.readyMtx.RLock()
3802+
defer s.readyMtx.RUnlock()
3803+
return s.ready
37593804
}
37603805

37613806
func (s *networkServer) GetRawBlock(ctx context.Context, req *pb.GetRawBlockRequest) (*pb.GetRawBlockResponse, error) {

0 commit comments

Comments
 (0)