htlcswitch/circuit_map: relax circuit deletion
Previously, we would only allow deletion of circuits if all circuit keys were found in the pending map. In this commit, we relax this to allow for deletion of any circuits that are found pending, and ignore those that are not found. This is a preliminary step to cleaning up duplicate forwards that get caught by the switch. It also allows us to gracefully handle any nodes that are still afflicted by the split mailbox issue.
This commit is contained in:
parent
0372bf9319
commit
c2055d4a9e
@ -770,10 +770,12 @@ func (cm *circuitMap) CloseCircuit(outKey CircuitKey) (*PaymentCircuit, error) {
|
||||
return circuit, nil
|
||||
}
|
||||
|
||||
// DeleteCircuits destroys the target circuit by removing it from the circuit map,
|
||||
// additionally removing the circuit's keystone if the HTLC was forwarded
|
||||
// through an outgoing link. The circuit should be identified by its incoming
|
||||
// circuit key.
|
||||
// DeleteCircuits destroys the target circuits by removing them from the circuit
|
||||
// map, additionally removing the circuits' keystones if any HTLCs were
|
||||
// forwarded through an outgoing link. The circuits should be identified by its
|
||||
// incoming circuit key. If a given circuit is not found in the circuit map, it
|
||||
// will be ignored from the query. This would typically indicate that the
|
||||
// circuit was already cleaned up at a different point in time.
|
||||
func (cm *circuitMap) DeleteCircuits(inKeys ...CircuitKey) error {
|
||||
|
||||
log.Tracef("Deleting resolved circuits: %v", newLogClosure(func() string {
|
||||
@ -786,22 +788,15 @@ func (cm *circuitMap) DeleteCircuits(inKeys ...CircuitKey) error {
|
||||
)
|
||||
|
||||
cm.mtx.Lock()
|
||||
// First check that all provided keys are still known to the circuit
|
||||
// map.
|
||||
// Remove any references to the circuits from memory, keeping track of
|
||||
// which circuits were removed, and which ones had been marked closed.
|
||||
// This can be used to restore these entries later if the persistent
|
||||
// removal fails.
|
||||
for _, inKey := range inKeys {
|
||||
if _, ok := cm.pending[inKey]; !ok {
|
||||
cm.mtx.Unlock()
|
||||
return ErrUnknownCircuit
|
||||
circuit, ok := cm.pending[inKey]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// If no offenders were found, remove any references to the circuit from
|
||||
// memory, keeping track of which circuits were removed, and which ones
|
||||
// had been marked closed. This can be used to restore these entries
|
||||
// later if the persistent removal fails.
|
||||
for _, inKey := range inKeys {
|
||||
circuit := cm.pending[inKey]
|
||||
|
||||
delete(cm.pending, inKey)
|
||||
|
||||
if _, ok := cm.closed[inKey]; ok {
|
||||
|
Loading…
Reference in New Issue
Block a user