Fix: Add stagger delay and configurable reconnect interval for inactive-peer reconnects (issue #458) (#459)

This commit is contained in:
kp 2026-07-22 15:16:31 -07:00 committed by GitHub
parent c89206a1cd
commit be74fc8e74
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 10 additions and 1 deletions

View file

@ -71,6 +71,7 @@ class GUIForm(AutoFeesForm):
class LocalSettingsForm(GUIForm):
lnd_cleanPayments = forms.IntegerField(label='lnd_cleanPayments', required=False)
lnd_retentionDays = forms.IntegerField(label='lnd_retentionDays', required=False)
lnd_reconnectInterval = forms.IntegerField(label='lnd_reconnectInterval', required=False)
updates_channel_codes = [
(0, 'base_fee'),

View file

@ -2032,6 +2032,7 @@ def get_local_settings(*prefixes):
if 'LND-' in prefixes:
form.append({'unit': '', 'form_id': 'lnd_cleanPayments', 'value': 0, 'label': 'LND Clean Payments', 'id': 'LND-CleanPayments', 'title': 'Clean LND Payments (toggles failed payment clean-up routine)', 'min':0, 'max':1})
form.append({'unit': 'days', 'form_id': 'lnd_retentionDays', 'value': 30, 'label': 'LND Retention', 'id': 'LND-RetentionDays', 'title': 'LND Retention days for failed payment data', 'min':1, 'max':1000})
form.append({'unit': 'min', 'form_id': 'lnd_reconnectInterval', 'value': 3, 'label': 'LND Reconnect Interval', 'id': 'LND-ReconnectInterval', 'title': 'Minimum minutes between reconnect attempts per inactive peer. Default 3', 'min':1, 'max':1440})
for prefix in prefixes:
ar_settings = LocalSettings.objects.filter(key__contains=prefix).values('key', 'value').order_by('key')
@ -2074,6 +2075,7 @@ def update_settings(request):
#LND
{'form_id': 'lnd_cleanPayments', 'value': 0, 'parse': lambda x: int(x), 'id': 'LND-CleanPayments'},
{'form_id': 'lnd_retentionDays', 'value': 30, 'parse': lambda x: int(x), 'id': 'LND-RetentionDays'},
{'form_id': 'lnd_reconnectInterval', 'value': 3, 'parse': lambda x: int(x), 'id': 'LND-ReconnectInterval'},
]
form = LocalSettingsForm(request.POST)

View file

@ -1,4 +1,5 @@
import django
import random
from time import sleep
from django.db.models import Max, Sum, Avg, Count
from django.db.models.functions import TruncDay
@ -668,13 +669,18 @@ def update_closures(stub):
db_closure.save()
def reconnect_peers(stub):
if LocalSettings.objects.filter(key='LND-ReconnectInterval').exists():
reconnect_interval = int(LocalSettings.objects.filter(key='LND-ReconnectInterval')[0].value)
else:
LocalSettings(key='LND-ReconnectInterval', value='3').save()
reconnect_interval = 3
inactive_peers = Channels.objects.filter(is_open=True, is_active=False, private=False).values_list('remote_pubkey', flat=True).distinct()
if len(inactive_peers) > 0:
peers = Peers.objects.all()
for inactive_peer in inactive_peers:
if peers.filter(pubkey=inactive_peer).exists():
peer = peers.filter(pubkey=inactive_peer)[0]
if peer.last_reconnected == None or (int((datetime.now() - peer.last_reconnected).total_seconds() / 60) > 2):
if peer.last_reconnected is None or ((datetime.now() - peer.last_reconnected).total_seconds() >= (reconnect_interval + random.uniform(0, reconnect_interval)) * 60):
logger.info(f'Reconnecting peer {peer.alias} {peer.pubkey}, last reconnected at {peer.last_reconnected}')
if peer.connected == True:
logger.info(f'Inactive channel is still connected to peer, disconnecting peer {peer.alias} {inactive_peer}')