clboss/Boss
Ken Sedgwick 7500a2344b
Some checks are pending
Code Base Sanity Check / tests (push) Waiting to run
Code Base Sanity Check / coverage (push) Waiting to run
Code Base Sanity Check / build-clang (push) Waiting to run
XMoveFunds: never disable_node our own node on a NODE-level failure
In a circular rebalance the destination is ourselves, so a NODE-level onion
failure (failcode & 0x2000) at the closing hop is attributed to erring_node ==
self. accumulate_failure_feedback's node-level branch called disable_node(
erring_node) unconditionally, so it disabled OUR OWN node in the persistent
clboss-xrebalance layer. askrene then treats every one of our channels as a
disabled source -- getroutes fails with 205 "source has disabled N of N
channels, leaving capacity only 0msat" -- and because disabled_nodes never
ages, every subsequent rebalance is locked out permanently (fee budget is
irrelevant). Observed on prod1: one end-of-route node failure took out all 73
source channels at once.

Guard the node-level branch: if erring_node == self_id, return without
disabling. Mirrors the self-loop guard FundsMover already has on the clboss
layer. A node-level failure blamed on us (we are the paying destination, so we
would accept) is a mis-attribution anyway and nothing about our own node should
be disabled.

Recovery for an already-poisoned layer (no askrene un-disable-node exists):
askrene-remove-layer clboss-xrebalance ; askrene-create-layer clboss-xrebalance true

Logging/behavior otherwise unchanged.
2026-06-04 13:25:19 -07:00
..
Mod XMoveFunds: never disable_node our own node on a NODE-level failure 2026-06-04 13:25:19 -07:00
ModG Boss/Msg/ReqRespTraits.hpp: Use a traits class for requests and response. 2023-07-11 20:57:51 +08:00
Msg EarningsTracker: attribute clboss-xrebalance per-part fees + amounts 2026-06-01 10:50:34 -07:00
concurrent.cpp Ev/Io.hpp: Avoid copying objects, just move things around. 2020-09-14 09:12:46 +08:00
concurrent.hpp Boss/concurrent.cpp: Wrapper for Ev::concurrent that ignores Boss::Shutdown exceptions. 2020-09-07 07:39:36 +08:00
JsonInput.cpp Boss/Mod/CommandReceiver.cpp: Handle rpc_command at this level, to increase our responsiveness. 2020-11-10 10:19:53 +08:00
JsonInput.hpp Boss/JsonInput.cpp: Implement input loop. 2020-09-07 11:51:30 +08:00
log.cpp Util/Str.cpp: Implement Util::Str::fmt. 2021-10-06 19:26:55 +08:00
log.hpp Boss/log.hpp: Have GCC do printf checks. 2020-11-24 18:58:39 +08:00
Main.cpp Avoid program_invocation_name which is available only on Linux 2024-10-28 12:12:15 -05:00
Main.hpp Boss/open_rpc_socket.cpp: Function to open the RPC socket. 2020-09-07 21:50:38 +08:00
open_rpc_socket.cpp Use BacktraceException for appropriate (most) exceptions 2024-08-19 15:04:30 -07:00
open_rpc_socket.hpp Boss/open_rpc_socket.cpp: Function to open the RPC socket. 2020-09-07 21:50:38 +08:00
random_engine.cpp Use BacktraceException for appropriate (most) exceptions 2024-08-19 15:04:30 -07:00
random_engine.hpp Boss/random_engine.cpp: Common random engine. 2020-09-10 00:13:02 +08:00
Shutdown.hpp Boss/Shutdown.hpp: Trivial struct for signalling shutdown. 2020-09-07 07:06:30 +08:00
Signer.cpp Use BacktraceException for appropriate (most) exceptions 2024-08-19 15:04:30 -07:00
Signer.hpp Boss/Signer.cpp: Signer for boltz-swapping transactions. 2020-09-23 12:45:50 +08:00