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 <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2026-01-20 15:06:07 +10:30
parent eba330566d
commit cef86d1e25

View File

@@ -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));