netann: add RequestAuto for restoring auto chan state management
If a channel was manually disabled, subsequent automatic / background requests to update that channel's state will be ignored. A RequestAuto call restores automatic / background state management and indicates that such requests should no longer be ignored.
This commit is contained in:
parent
e1709f20eb
commit
59bd617c97
@ -111,6 +111,10 @@ type ChanStatusManager struct {
|
|||||||
// primary event loop.
|
// primary event loop.
|
||||||
disableRequests chan statusRequest
|
disableRequests chan statusRequest
|
||||||
|
|
||||||
|
// autoRequests pipes external requests to restore automatic channel
|
||||||
|
// state management into the primary event loop.
|
||||||
|
autoRequests chan statusRequest
|
||||||
|
|
||||||
// statusSampleTicker fires at the interval prescribed by
|
// statusSampleTicker fires at the interval prescribed by
|
||||||
// ChanStatusSampleInterval to check if channels in chanStates have
|
// ChanStatusSampleInterval to check if channels in chanStates have
|
||||||
// become inactive.
|
// become inactive.
|
||||||
@ -154,6 +158,7 @@ func NewChanStatusManager(cfg *ChanStatusConfig) (*ChanStatusManager, error) {
|
|||||||
statusSampleTicker: time.NewTicker(cfg.ChanStatusSampleInterval),
|
statusSampleTicker: time.NewTicker(cfg.ChanStatusSampleInterval),
|
||||||
enableRequests: make(chan statusRequest),
|
enableRequests: make(chan statusRequest),
|
||||||
disableRequests: make(chan statusRequest),
|
disableRequests: make(chan statusRequest),
|
||||||
|
autoRequests: make(chan statusRequest),
|
||||||
quit: make(chan struct{}),
|
quit: make(chan struct{}),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
@ -263,6 +268,13 @@ func (m *ChanStatusManager) RequestDisable(outpoint wire.OutPoint,
|
|||||||
return m.submitRequest(m.disableRequests, outpoint, manual)
|
return m.submitRequest(m.disableRequests, outpoint, manual)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RequestAuto submits a request to restore automatic channel state management.
|
||||||
|
// If the channel is in the state ChanStatusManuallyDisabled, it will be moved
|
||||||
|
// back to the state ChanStatusDisabled. Otherwise, no action will be taken.
|
||||||
|
func (m *ChanStatusManager) RequestAuto(outpoint wire.OutPoint) error {
|
||||||
|
return m.submitRequest(m.autoRequests, outpoint, true)
|
||||||
|
}
|
||||||
|
|
||||||
// statusRequest is passed to the statusManager to request a change in status
|
// statusRequest is passed to the statusManager to request a change in status
|
||||||
// for a particular channel point. The exact action is governed by passing the
|
// for a particular channel point. The exact action is governed by passing the
|
||||||
// request through one of the enableRequests or disableRequests channels.
|
// request through one of the enableRequests or disableRequests channels.
|
||||||
@ -321,6 +333,10 @@ func (m *ChanStatusManager) statusManager() {
|
|||||||
case req := <-m.disableRequests:
|
case req := <-m.disableRequests:
|
||||||
req.errChan <- m.processDisableRequest(req.outpoint, req.manual)
|
req.errChan <- m.processDisableRequest(req.outpoint, req.manual)
|
||||||
|
|
||||||
|
// Process any requests to restore automatic channel state management.
|
||||||
|
case req := <-m.autoRequests:
|
||||||
|
req.errChan <- m.processAutoRequest(req.outpoint)
|
||||||
|
|
||||||
// Use long-polling to detect when channels become inactive.
|
// Use long-polling to detect when channels become inactive.
|
||||||
case <-m.statusSampleTicker.C:
|
case <-m.statusSampleTicker.C:
|
||||||
// First, do a sweep and mark any ChanStatusEnabled
|
// First, do a sweep and mark any ChanStatusEnabled
|
||||||
@ -444,6 +460,27 @@ func (m *ChanStatusManager) processDisableRequest(outpoint wire.OutPoint,
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// processAutoRequest attempts to restore automatic channel state management
|
||||||
|
// for the given outpoint. If the method returns nil, the state of the channel
|
||||||
|
// will no longer be ChanStatusManuallyDisabled (currently the only state in
|
||||||
|
// which automatic / background requests are ignored).
|
||||||
|
//
|
||||||
|
// No update will be sent on the network.
|
||||||
|
func (m *ChanStatusManager) processAutoRequest(outpoint wire.OutPoint) error {
|
||||||
|
curState, err := m.getOrInitChanStatus(outpoint)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if curState.Status == ChanStatusManuallyDisabled {
|
||||||
|
log.Debugf("Restoring automatic control for manually disabled "+
|
||||||
|
"channel(%v)", outpoint)
|
||||||
|
|
||||||
|
m.chanStates.markDisabled(outpoint)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// markPendingInactiveChannels performs a sweep of the database's active
|
// markPendingInactiveChannels performs a sweep of the database's active
|
||||||
// channels and determines which, if any, should have a disable announcement
|
// channels and determines which, if any, should have a disable announcement
|
||||||
// scheduled. Once an active channel is determined to be pending-inactive, one
|
// scheduled. Once an active channel is determined to be pending-inactive, one
|
||||||
|
Loading…
Reference in New Issue
Block a user