forked from TrueCloudLab/neoneo-go
*: use CompareAndSwap instead of CAS for atomics
go.uber.org/atomic deprecated CAS methods in version 1.10 (that introduced CompareAndSwap), so we need to fix it. Signed-off-by: Roman Khimov <roman@nspcc.ru>
This commit is contained in:
parent
2567c4c672
commit
0a160ee93b
9 changed files with 22 additions and 22 deletions
|
@ -276,7 +276,7 @@ func (s *service) Name() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) Start() {
|
func (s *service) Start() {
|
||||||
if s.started.CAS(false, true) {
|
if s.started.CompareAndSwap(false, true) {
|
||||||
s.log.Info("starting consensus service")
|
s.log.Info("starting consensus service")
|
||||||
b, _ := s.Chain.GetBlock(s.Chain.CurrentBlockHash()) // Can't fail, we have some current block!
|
b, _ := s.Chain.GetBlock(s.Chain.CurrentBlockHash()) // Can't fail, we have some current block!
|
||||||
s.lastTimestamp = b.Timestamp
|
s.lastTimestamp = b.Timestamp
|
||||||
|
@ -288,7 +288,7 @@ func (s *service) Start() {
|
||||||
|
|
||||||
// Shutdown implements the Service interface.
|
// Shutdown implements the Service interface.
|
||||||
func (s *service) Shutdown() {
|
func (s *service) Shutdown() {
|
||||||
if s.started.CAS(true, false) {
|
if s.started.CompareAndSwap(true, false) {
|
||||||
s.log.Info("stopping consensus service")
|
s.log.Info("stopping consensus service")
|
||||||
close(s.quit)
|
close(s.quit)
|
||||||
<-s.finished
|
<-s.finished
|
||||||
|
|
|
@ -153,7 +153,7 @@ func (bq *Queue) LastQueued() (uint32, int) {
|
||||||
|
|
||||||
// Discard stops the queue and prevents it from accepting more blocks to enqueue.
|
// Discard stops the queue and prevents it from accepting more blocks to enqueue.
|
||||||
func (bq *Queue) Discard() {
|
func (bq *Queue) Discard() {
|
||||||
if bq.discarded.CAS(false, true) {
|
if bq.discarded.CompareAndSwap(false, true) {
|
||||||
bq.queueLock.Lock()
|
bq.queueLock.Lock()
|
||||||
close(bq.checkBlocks)
|
close(bq.checkBlocks)
|
||||||
// Technically we could bq.queue = nil, but this would cost
|
// Technically we could bq.queue = nil, but this would cost
|
||||||
|
|
|
@ -541,7 +541,7 @@ func (s *Server) tryStartServices() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.IsInSync() && s.syncReached.CAS(false, true) {
|
if s.IsInSync() && s.syncReached.CompareAndSwap(false, true) {
|
||||||
s.log.Info("node reached synchronized state, starting services")
|
s.log.Info("node reached synchronized state, starting services")
|
||||||
if s.chain.P2PSigExtensionsEnabled() {
|
if s.chain.P2PSigExtensionsEnabled() {
|
||||||
s.notaryRequestPool.RunSubscriptions() // WSClient is also a subscriber.
|
s.notaryRequestPool.RunSubscriptions() // WSClient is also a subscriber.
|
||||||
|
@ -1277,14 +1277,14 @@ func getRequestBlocksPayload(p Peer, currHeight uint32, lastRequestedHeight *ato
|
||||||
old := lastRequestedHeight.Load()
|
old := lastRequestedHeight.Load()
|
||||||
if old <= currHeight {
|
if old <= currHeight {
|
||||||
needHeight = currHeight + 1
|
needHeight = currHeight + 1
|
||||||
if !lastRequestedHeight.CAS(old, needHeight) {
|
if !lastRequestedHeight.CompareAndSwap(old, needHeight) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
} else if old < currHeight+(bqueue.CacheSize-payload.MaxHashesCount) {
|
} else if old < currHeight+(bqueue.CacheSize-payload.MaxHashesCount) {
|
||||||
needHeight = currHeight + 1
|
needHeight = currHeight + 1
|
||||||
if peerHeight > old+payload.MaxHashesCount {
|
if peerHeight > old+payload.MaxHashesCount {
|
||||||
needHeight = old + payload.MaxHashesCount
|
needHeight = old + payload.MaxHashesCount
|
||||||
if !lastRequestedHeight.CAS(old, needHeight) {
|
if !lastRequestedHeight.CompareAndSwap(old, needHeight) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -509,7 +509,7 @@ func NewWS(ctx context.Context, endpoint string, opts WSOptions) (*WSClient, err
|
||||||
// Close closes connection to the remote side rendering this client instance
|
// Close closes connection to the remote side rendering this client instance
|
||||||
// unusable.
|
// unusable.
|
||||||
func (c *WSClient) Close() {
|
func (c *WSClient) Close() {
|
||||||
if c.closeCalled.CAS(false, true) {
|
if c.closeCalled.CompareAndSwap(false, true) {
|
||||||
c.setCloseErr(errConnClosedByUser)
|
c.setCloseErr(errConnClosedByUser)
|
||||||
// Closing shutdown channel sends a signal to wsWriter to break out of the
|
// Closing shutdown channel sends a signal to wsWriter to break out of the
|
||||||
// loop. In doing so it does ws.Close() closing the network connection
|
// loop. In doing so it does ws.Close() closing the network connection
|
||||||
|
|
|
@ -35,7 +35,7 @@ func NewService(name string, httpServers []*http.Server, cfg config.BasicService
|
||||||
// Start runs http service with the exposed endpoint on the configured port.
|
// Start runs http service with the exposed endpoint on the configured port.
|
||||||
func (ms *Service) Start() error {
|
func (ms *Service) Start() error {
|
||||||
if ms.config.Enabled {
|
if ms.config.Enabled {
|
||||||
if !ms.started.CAS(false, true) {
|
if !ms.started.CompareAndSwap(false, true) {
|
||||||
ms.log.Info("service already started")
|
ms.log.Info("service already started")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ func (ms *Service) ShutDown() {
|
||||||
if !ms.config.Enabled {
|
if !ms.config.Enabled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !ms.started.CAS(true, false) {
|
if !ms.started.CompareAndSwap(true, false) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for _, srv := range ms.http {
|
for _, srv := range ms.http {
|
||||||
|
|
|
@ -171,7 +171,7 @@ func (n *Notary) Name() string {
|
||||||
// Start runs a Notary module in a separate goroutine.
|
// Start runs a Notary module in a separate goroutine.
|
||||||
// The Notary only starts once, subsequent calls to Start are no-op.
|
// The Notary only starts once, subsequent calls to Start are no-op.
|
||||||
func (n *Notary) Start() {
|
func (n *Notary) Start() {
|
||||||
if !n.started.CAS(false, true) {
|
if !n.started.CompareAndSwap(false, true) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
n.Config.Log.Info("starting notary service")
|
n.Config.Log.Info("starting notary service")
|
||||||
|
@ -221,7 +221,7 @@ drainLoop:
|
||||||
// to Shutdown on the same instance are no-op. The instance that was stopped can
|
// to Shutdown on the same instance are no-op. The instance that was stopped can
|
||||||
// not be started again by calling Start (use a new instance if needed).
|
// not be started again by calling Start (use a new instance if needed).
|
||||||
func (n *Notary) Shutdown() {
|
func (n *Notary) Shutdown() {
|
||||||
if !n.started.CAS(true, false) {
|
if !n.started.CompareAndSwap(true, false) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
n.Config.Log.Info("stopping notary service")
|
n.Config.Log.Info("stopping notary service")
|
||||||
|
|
|
@ -342,7 +342,7 @@ func (s *Server) Start() {
|
||||||
s.log.Info("RPC server is not enabled")
|
s.log.Info("RPC server is not enabled")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !s.started.CAS(false, true) {
|
if !s.started.CompareAndSwap(false, true) {
|
||||||
s.log.Info("RPC server already started")
|
s.log.Info("RPC server already started")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -397,7 +397,7 @@ func (s *Server) Start() {
|
||||||
// that was stopped can not be started again by calling Start (use a new
|
// that was stopped can not be started again by calling Start (use a new
|
||||||
// instance if needed).
|
// instance if needed).
|
||||||
func (s *Server) Shutdown() {
|
func (s *Server) Shutdown() {
|
||||||
if !s.started.CAS(true, false) {
|
if !s.started.CompareAndSwap(true, false) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Signal to websocket writer routines and handleSubEvents.
|
// Signal to websocket writer routines and handleSubEvents.
|
||||||
|
|
|
@ -156,7 +156,7 @@ func TestSubscriptions(t *testing.T) {
|
||||||
for _, id := range subIDs {
|
for _, id := range subIDs {
|
||||||
callUnsubscribe(t, c, respMsgs, id)
|
callUnsubscribe(t, c, respMsgs, id)
|
||||||
}
|
}
|
||||||
finishedFlag.CAS(false, true)
|
finishedFlag.CompareAndSwap(false, true)
|
||||||
c.Close()
|
c.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,7 +312,7 @@ func TestFilteredSubscriptions(t *testing.T) {
|
||||||
|
|
||||||
callUnsubscribe(t, c, respMsgs, subID)
|
callUnsubscribe(t, c, respMsgs, subID)
|
||||||
callUnsubscribe(t, c, respMsgs, blockSubID)
|
callUnsubscribe(t, c, respMsgs, blockSubID)
|
||||||
finishedFlag.CAS(false, true)
|
finishedFlag.CompareAndSwap(false, true)
|
||||||
c.Close()
|
c.Close()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -408,7 +408,7 @@ func TestFilteredNotaryRequestSubscriptions(t *testing.T) {
|
||||||
callUnsubscribe(t, c, respMsgs, subID)
|
callUnsubscribe(t, c, respMsgs, subID)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
finishedFlag.CAS(false, true)
|
finishedFlag.CompareAndSwap(false, true)
|
||||||
c.Close()
|
c.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,7 +448,7 @@ func TestFilteredBlockSubscriptions(t *testing.T) {
|
||||||
require.Equal(t, 3, int(primary))
|
require.Equal(t, 3, int(primary))
|
||||||
}
|
}
|
||||||
callUnsubscribe(t, c, respMsgs, blockSubID)
|
callUnsubscribe(t, c, respMsgs, blockSubID)
|
||||||
finishedFlag.CAS(false, true)
|
finishedFlag.CompareAndSwap(false, true)
|
||||||
c.Close()
|
c.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,7 +477,7 @@ func TestMaxSubscriptions(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
finishedFlag.CAS(false, true)
|
finishedFlag.CompareAndSwap(false, true)
|
||||||
c.Close()
|
c.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -519,7 +519,7 @@ func TestBadSubUnsub(t *testing.T) {
|
||||||
t.Run("subscribe", testF(t, subCases))
|
t.Run("subscribe", testF(t, subCases))
|
||||||
t.Run("unsubscribe", testF(t, unsubCases))
|
t.Run("unsubscribe", testF(t, unsubCases))
|
||||||
|
|
||||||
finishedFlag.CAS(false, true)
|
finishedFlag.CompareAndSwap(false, true)
|
||||||
c.Close()
|
c.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -614,6 +614,6 @@ func TestSubscriptionOverflow(t *testing.T) {
|
||||||
// `Missed` is the last event and there is nothing afterwards.
|
// `Missed` is the last event and there is nothing afterwards.
|
||||||
require.Equal(t, 0, len(respMsgs))
|
require.Equal(t, 0, len(respMsgs))
|
||||||
|
|
||||||
finishedFlag.CAS(false, true)
|
finishedFlag.CompareAndSwap(false, true)
|
||||||
c.Close()
|
c.Close()
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ func (s *service) Name() string {
|
||||||
// Start runs service instance in a separate goroutine.
|
// Start runs service instance in a separate goroutine.
|
||||||
// The service only starts once, subsequent calls to Start are no-op.
|
// The service only starts once, subsequent calls to Start are no-op.
|
||||||
func (s *service) Start() {
|
func (s *service) Start() {
|
||||||
if !s.started.CAS(false, true) {
|
if !s.started.CompareAndSwap(false, true) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
s.log.Info("starting state validation service")
|
s.log.Info("starting state validation service")
|
||||||
|
@ -68,7 +68,7 @@ drainloop:
|
||||||
// to Shutdown on the same instance are no-op. The instance that was stopped can
|
// to Shutdown on the same instance are no-op. The instance that was stopped can
|
||||||
// not be started again by calling Start (use a new instance if needed).
|
// not be started again by calling Start (use a new instance if needed).
|
||||||
func (s *service) Shutdown() {
|
func (s *service) Shutdown() {
|
||||||
if !s.started.CAS(true, false) {
|
if !s.started.CompareAndSwap(true, false) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
s.log.Info("stopping state validation service")
|
s.log.Info("stopping state validation service")
|
||||||
|
|
Loading…
Reference in a new issue