From cef86d1e255dbb7664b7678398668db1af784d97 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 20 Jan 2026 15:06:07 +1030 Subject: [PATCH] gossmap: don't log every time we don't like a cupdate. This happens for about 300 channels, from every process that loads the gossmap. It's not very useful to flood the logs, so just log a summary. To be fair, on my node, this is only the 11th most common message, so we will revisit the others too: ``` 1589311 DEBUG 02e01367e1d7818a7e9a0e8a52badd5c32615e07568dbe0497b6a47f9bef89d6af-connectd: peer_out WIRE_WARNING 139993 DEBUG lightningd: fixup_scan: block 786151 with 1203 txs 55388 DEBUG plugin-bcli: Log pruned 1001 entries (mem 10508118 -> 10298662) 33000 DEBUG gossipd: Unreasonable timestamp in 0102000a38ec41f9137a5a560dac6effbde059c12cb727344821cbdd4ef46964a4791a0f67cd997499a6062fc8b4284bf1b47a91541fd0e65129505f02e4d08542b16fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d61900000000000d9d56000ba40001690fe262010100900000000000000001000003e8000001f30000000000989680 23515 DEBUG hsmd: Client: Received message 14 from client 22269 DEBUG 024b9a1fa8e006f1e3937f65f66c408e6da8e1ca728ea43222a7381df1cc449605-hsmd: Got WIRE_HSMD_ECDH_REQ 14409 DEBUG gossipd: Enqueueing update for announce 0102002f7e4b4deb19947c67292e70cb22f7fac837fa9ee6269393f3c513d0431d52672e7387625856c19299cfd584e1a3f39e0f98df13c99090df9f4d5cca8446776fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d61900000000000e216b0008050001692e1c390101009000000000000003e800000000000013880000004526945a00 12534 DEBUG gossipd: Previously-rejected announce for 514127x248x1 ===> 12092 DEBUG connectd: Bad cupdate for 641641x1164x1/1, ignoring (delta=80, fee=1073742199/58) 10761 DEBUG 02e01367e1d7818a7e9a0e8a52badd5c32615e07568dbe0497b6a47f9bef89d6af-channeld-chan#70770: Got it! 10761 DEBUG 02e01367e1d7818a7e9a0e8a52badd5c32615e07568dbe0497b6a47f9bef89d6af-channeld-chan#70770: ... , awaiting 1120 10761 DEBUG 02e01367e1d7818a7e9a0e8a52badd5c32615e07568dbe0497b6a47f9bef89d6af-channeld-chan#70770: Sending master 1020 ``` Signed-off-by: Rusty Russell --- common/gossmap.c | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/common/gossmap.c b/common/gossmap.c index 948ed0b9c..9d52569d5 100644 --- a/common/gossmap.c +++ b/common/gossmap.c @@ -503,16 +503,14 @@ static struct gossmap_chan *add_channel(struct gossmap *map, return chan; } -/* Does not set hc->nodeidx! */ -static void fill_from_update(struct gossmap *map, +/* Does not set hc->nodeidx! + * Returns false if it doesn't fit in our representation: this happens + * on the real network, as people set absurd fees + */ +static bool fill_from_update(struct gossmap *map, struct short_channel_id_dir *scidd, struct half_chan *hc, - u64 cupdate_off, - void (*logcb)(void *cbarg, - enum log_level level, - const char *fmt, - ...), - void *cbarg) + u64 cupdate_off) { /* Note that first two bytes are message type */ const u64 scid_off = cupdate_off + 2 + (64 + 32); @@ -543,18 +541,15 @@ static void fill_from_update(struct gossmap *map, hc->proportional_fee = proportional_fee; hc->delay = delay; - /* Check they fit: we turn off if not, log (at debug, it happens!). */ + /* Check they fit: we turn off if not. */ if (hc->base_fee != base_fee || hc->proportional_fee != proportional_fee || hc->delay != delay) { hc->htlc_max = 0; hc->enabled = false; - if (logcb) - logcb(cbarg, LOG_DBG, - "Bad cupdate for %s, ignoring (delta=%u, fee=%u/%u)", - fmt_short_channel_id_dir(tmpctx, scidd), - delay, base_fee, proportional_fee); + return false; } + return true; } /* BOLT #7: @@ -572,23 +567,24 @@ static void fill_from_update(struct gossmap *map, * * [`u32`:`fee_proportional_millionths`] * * [`u64`:`htlc_maximum_msat`] */ -static void update_channel(struct gossmap *map, u64 cupdate_off) +static bool update_channel(struct gossmap *map, u64 cupdate_off) { struct short_channel_id_dir scidd; struct gossmap_chan *chan; struct half_chan hc; + bool ret; - fill_from_update(map, &scidd, &hc, cupdate_off, - map->logcb, map->cbarg); + ret = fill_from_update(map, &scidd, &hc, cupdate_off); chan = gossmap_find_chan(map, &scidd.scid); /* This can happen if channel gets deleted! */ if (!chan) - return; + return ret; /* Preserve this */ hc.nodeidx = chan->half[scidd.dir].nodeidx; chan->half[scidd.dir] = hc; chan->cupdate_off[scidd.dir] = cupdate_off; + return ret; } static void remove_channel_by_deletemsg(struct gossmap *map, u64 del_off) @@ -677,7 +673,7 @@ static bool csum_matches(const struct gossmap *map, /* Returns false only if must_be_clean is true. */ static bool map_catchup(struct gossmap *map, bool must_be_clean, bool *changed) { - size_t reclen; + size_t reclen, num_bad_cupdates = 0; *changed = false; @@ -749,7 +745,7 @@ static bool map_catchup(struct gossmap *map, bool must_be_clean, bool *changed) if (redundant && must_be_clean) return false; } else if (type == WIRE_CHANNEL_UPDATE) - update_channel(map, off); + num_bad_cupdates += update_channel(map, off); else if (type == WIRE_GOSSIP_STORE_DELETE_CHAN) remove_channel_by_deletemsg(map, off); else if (type == WIRE_NODE_ANNOUNCEMENT) @@ -775,6 +771,12 @@ static bool map_catchup(struct gossmap *map, bool must_be_clean, bool *changed) *changed = true; } + if (num_bad_cupdates != 0) + map->logcb(map->cbarg, + LOG_DBG, + "Got %zu bad cupdates, ignoring them (expected on mainnet)", + num_bad_cupdates); + return true; } @@ -1168,7 +1170,7 @@ void gossmap_apply_localmods(struct gossmap *map, off = insert_local_space(&map->local_updates, tal_bytelen(cupdatemsg)); memcpy(map->local_updates + off, cupdatemsg, tal_bytelen(cupdatemsg)); chan->cupdate_off[h] = map->map_size + tal_bytelen(map->local_announces) + off; - fill_from_update(map, &scidd, &chan->half[h], chan->cupdate_off[h], NULL, NULL); + fill_from_update(map, &scidd, &chan->half[h], chan->cupdate_off[h]); /* We wrote the right update, correct? */ assert(short_channel_id_eq(scidd.scid, mod->scid));