mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 13:25:43 +01:00
gossipd: fix reordering of node_announcements in presence of a unannounced channel.
If we receive a channel_announce but not a channel_update, we store the announce but don't put it in the broadcast map. When we delete a channel, we check if the node_announcement broadcast now preceeds all channel_announcements, and if so, we move it to the end of the map. However, with a channel_announcement at index '0', this test fails. This is at least one potential cause of the node map getting out of order. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
e2f426903d
commit
97c7ba2f80
@ -199,7 +199,7 @@ static bool remove_channel_from_array(struct chan ***chans, const struct chan *c
|
|||||||
static bool node_announce_predates_channels(const struct node *node)
|
static bool node_announce_predates_channels(const struct node *node)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < tal_count(node->chans); i++) {
|
for (size_t i = 0; i < tal_count(node->chans); i++) {
|
||||||
if (!is_chan_public(node->chans[i]))
|
if (!is_chan_announced(node->chans[i]))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (node->chans[i]->channel_announcement_index
|
if (node->chans[i]->channel_announcement_index
|
||||||
|
@ -61,11 +61,19 @@ struct chan {
|
|||||||
u64 satoshis;
|
u64 satoshis;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* A local channel can exist which isn't announcable. */
|
||||||
static inline bool is_chan_public(const struct chan *chan)
|
static inline bool is_chan_public(const struct chan *chan)
|
||||||
{
|
{
|
||||||
return chan->channel_announce != NULL;
|
return chan->channel_announce != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A channel is only announced once we have a channel_update to send
|
||||||
|
* with it. */
|
||||||
|
static inline bool is_chan_announced(const struct chan *chan)
|
||||||
|
{
|
||||||
|
return chan->channel_announcement_index != 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool is_halfchan_defined(const struct half_chan *hc)
|
static inline bool is_halfchan_defined(const struct half_chan *hc)
|
||||||
{
|
{
|
||||||
return hc->channel_update != NULL;
|
return hc->channel_update != NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user