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:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user