Skip to content

askrene crash when loading node bias descriptions #9433

Description

@endothermicdev

When starting the node, it shuts down due to askrene exiting before replying to init.

2026-07-30T23:23:55.804Z INFO plugin-cln-askrene: Killing plugin: exited before replying to init
2026-07-30T23:23:55.805Z BROKEN plugin-cln-askrene: Plugin marked as important, shutting down lightningd!

Attaching gdb to the core dump shows:

  __pthread_kill_implementation (no_tid=0, signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=<optimized out>, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3  0x00007c180ec4527e in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4  0x00007c180ec288ff in __GI_abort () at ./stdlib/abort.c:79
#5  0x00006317663af6e0 in call_error (msg=msg@entry=0x6317664c7c36 "Not a valid header") at ccan/ccan/tal/tal.c:95
#6  0x00006317663af789 in check_bounds (p=<optimized out>) at ccan/ccan/tal/tal.c:169
#7  0x00006317663af7ba in to_tal_hdr (ctx=0x63179352c3d8) at ccan/ccan/tal/tal.c:179
#8  0x00006317663b0727 in tal_resize_ (ctxp=ctxp@entry=0x7ffdf6cc1098, size=<optimized out>, size@entry=1, count=count@entry=40, clear=clear@entry=false) at ccan/ccan/tal/tal.c:750
#9  0x00006317663b0a38 in tal_dup_ (ctx=ctx@entry=0x631793529a18, p=<optimized out>, p@entry=0x63179352c3d8, size=size@entry=1, n=<optimized out>, extra=extra@entry=0, nullok=nullok@entry=false, label=0x6317664c4322 "char[]")
    at ccan/ccan/tal/tal.c:854
#10 0x00006317663aedd8 in tal_strdup_ (ctx=ctx@entry=0x631793529a18, p=p@entry=0x63179352c3d8 "3 failures in current renerebalance run", label=label@entry=0x6317664c4322 "char[]") at ccan/ccan/tal/str/str.c:17
#11 0x0000631766387cd5 in tal_strdup_or_null (ctx=ctx@entry=0x631793529a18, str=str@entry=0x63179352c3d8 "3 failures in current renerebalance run") at common/utils.c:192
#12 0x000063176636708d in set_node_bias (layer=layer@entry=0x6317933b2558, node=node@entry=0x7ffdf6cc11a0, description=0x63179352c3d8 "3 failures in current renerebalance run", bias_factor=bias_factor@entry=-10 '\366', 
    relative=relative@entry=false, dir_out=dir_out@entry=true, timestamp=1785452703) at plugins/askrene/layer.c:360
#13 0x0000631766367281 in load_node_bias (plugin=<optimized out>, layer=layer@entry=0x6317933b2558, cursor=cursor@entry=0x7ffdf6cc1208, len=len@entry=0x7ffdf6cc1210) at plugins/askrene/layer.c:657
#14 0x0000631766367f34 in populate_layer (askrene=askrene@entry=0x6317933a92c8, layername=<optimized out>, data=<optimized out>, data@entry=0x631793528f08 "") at plugins/askrene/layer.c:783
#15 0x00006317663680d3 in load_layers (askrene=askrene@entry=0x6317933a92c8, init_cmd=init_cmd@entry=0x6317933a9ce8) at plugins/askrene/layer.c:826
#16 0x00006317663641f3 in init (init_cmd=0x6317933a9ce8, buf=<optimized out>, config=<optimized out>) at plugins/askrene/askrene.c:1413
#17 0x0000631766376b17 in handle_init (cmd=cmd@entry=0x6317933a9ce8, 
    buf=buf@entry=0x7c180e9ff0b6 "\n\n{\"jsonrpc\":\"2.0\",\"id\":\"cln:init#43400\",\"method\":\"init\",\"params\":{\"options\":{\"askrene-timeout\":10},\"configuration\":{\"lightning-dir\":\"/mnt/hdd/bitcoin/.lightning/bitcoin\",\"rpc-file\":\"lightning-rpc\",\"s"..., params=params@entry=0x6317933ac868) at plugins/libplugin.c:1556
#18 0x0000631766376e3d in ld_command_handle (plugin=plugin@entry=0x6317933a9498, 
    buffer=0x7c180e9ff0b6 "\n\n{\"jsonrpc\":\"2.0\",\"id\":\"cln:init#43400\",\"method\":\"init\",\"params\":{\"options\":{\"askrene-timeout\":10},\"configuration\":{\"lightning-dir\":\"/mnt/hdd/bitcoin/.lightning/bitcoin\",\"rpc-file\":\"lightning-rpc\",\"s"..., toks=<optimized out>) at plugins/libplugin.c:2062
#19 0x00006317663773be in ld_read_json (conn=0x6317933ab138, plugin=0x6317933a9498) at plugins/libplugin.c:2231
#20 0x00006317663a8b99 in next_plan (conn=conn@entry=0x6317933ab138, plan=plan@entry=0x6317933ab158) at ccan/ccan/io/io.c:60
#21 0x00006317663a906a in do_plan (conn=conn@entry=0x6317933ab138, plan=plan@entry=0x6317933ab158, idle_on_epipe=idle_on_epipe@entry=false) at ccan/ccan/io/io.c:422
#22 0x00006317663a9127 in io_ready (conn=conn@entry=0x6317933ab138, pollflags=pollflags@entry=1) at ccan/ccan/io/io.c:439
#23 0x00006317663aab35 in io_loop (timers=timers@entry=0x6317933a9590, expired=expired@entry=0x7ffdf6cc14e8) at ccan/ccan/io/poll.c:470
#24 0x000063176637782f in plugin_main (argv=argv@entry=0x7ffdf6cc17d8, init=init@entry=0x631766364113 <init>, data=0x6317933a92c8, restartability=restartability@entry=PLUGIN_RESTARTABLE, init_rpc=init_rpc@entry=true, 
    features=features@entry=0x0, commands=0x63176661e7e0 <commands>, num_commands=14, notif_subs=0x0, num_notif_subs=0, hook_subs=0x0, num_hook_subs=0, notif_topics=0x0, num_notif_topics=0) at plugins/libplugin.c:2429
#25 0x00006317663654d3 in main (argc=<optimized out>, argv=0x7ffdf6cc17d8) at plugins/askrene/askrene.c:1427

It might be due to a double take() on the same string in load_node_bias:

if (fromwire_dstore_node_bias(tmpctx, cursor, len,
&node,
&description,
&in_bias,
&out_bias,
&timestamp)) {
set_node_bias(layer, &node, take(description), in_bias,
/* relative = */ false,
/* out dir = */ false, timestamp);
set_node_bias(layer, &node, take(description), out_bias,
/* relative = */ false,
/* out dir = */ true, timestamp);
}

The description really only needs to be loaded once anyway. For context, I've been working on a plugin that adds a lot of layer data to askrene and sometimes biasing the whole node is more efficient than individual channels.

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions