Skip to content

Commit

Permalink
- lock SetCurrencyConversionExchange during an operation to prevent a…
Browse files Browse the repository at this point in the history
… race

- stop retryGetTicker when the ctx is done
  • Loading branch information
dreacot committed Jun 12, 2024
1 parent d30fa2c commit 59c0bb3
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 7 deletions.
2 changes: 2 additions & 0 deletions libwallet/assets_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ func (mgr *AssetsManager) GetCurrencyConversionExchange() string {

// SetCurrencyConversionExchange sets the currency conversion exchange.
func (mgr *AssetsManager) SetCurrencyConversionExchange(xc string) {
mgr.rateMutex.Lock()
defer mgr.rateMutex.Unlock()
mgr.saveAppConfigValue(sharedW.CurrencyConversionConfigKey, xc)
go func() {
err := mgr.RateSource.ToggleSource(xc)
Expand Down
1 change: 1 addition & 0 deletions libwallet/assets_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ type AssetsManager struct {
InstantSwap *instantswap.InstantSwap
ExternalService *ext.Service
RateSource ext.RateSource
rateMutex sync.Mutex

dexcMtx sync.RWMutex
dexcCtx context.Context
Expand Down
20 changes: 13 additions & 7 deletions libwallet/ext/rate_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -360,14 +360,20 @@ func (cs *CommonRateSource) retryGetTicker(market values.Market) (*Ticker, error
var err error
backoff := 1 * time.Second
for i := 0; i < 3; i++ {
newTicker, err = cs.getTicker(market)
if err == nil {
return newTicker, nil
select {
case <-cs.ctx.Done():
log.Errorf("fetching ticker canceled: %v", cs.ctx.Err())
return nil, cs.ctx.Err()
default:
newTicker, err = cs.getTicker(market)
if err == nil {
return newTicker, nil
}

log.Errorf("fetching ticker %d failed: %v. Retrying in %v\n", i+1, err, backoff)
time.Sleep(backoff)
backoff *= 2 // Exponential backoff
}

log.Errorf("fetching ticker %d failed: %v. Retrying in %v\n", i+1, err, backoff)
time.Sleep(backoff)
backoff *= 2 // Exponential backoff
}
if cs.disableConversionExchange != nil {
cs.disableConversionExchange()
Expand Down

0 comments on commit 59c0bb3

Please sign in to comment.