gossipd: apply private updates to announce channel.

We trade channel_update before channel_announce makes the channel
public, and currently forget them when we finally get the
channel_announce.  We should instead apply them, and not rely on
retransmission (which we remove in the next patch!).

This earlier channel_update means test_gossip_jsonrpc triggers too
early, so have that wait for node_announcement.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2018-09-24 13:58:27 +09:30
parent 66105e83ea
commit 16e16a725e
2 changed files with 11 additions and 6 deletions

View file

@ -753,11 +753,16 @@ bool routing_add_channel_announcement(struct routing_state *rstate,
/* Channel is now public. */
chan->channel_announce = tal_dup_arr(chan, u8, msg, tal_count(msg), 0);
/* Clear any private updates: new updates will trigger broadcast of
* this channel_announce. */
for (size_t i = 0; i < ARRAY_SIZE(chan->half); i++)
chan->half[i].channel_update
= tal_free(chan->half[i].channel_update);
/* Apply any private updates. */
for (size_t i = 0; i < ARRAY_SIZE(chan->half); i++) {
const u8 *update = chan->half[i].channel_update;
if (!update)
continue;
/* Remove from channel, otherwise it will be freed! */
chan->half[i].channel_update = NULL;
routing_add_channel_update(rstate, take(update));
}
return true;
}

View file

@ -282,7 +282,7 @@ def test_gossip_jsonrpc(node_factory):
'peer_in WIRE_ANNOUNCEMENT_SIGNATURES'])
# Just wait for the update to kick off and then check the effect
needle = "Received channel_update for channel"
needle = "Received node_announcement for node"
l1.daemon.wait_for_log(needle)
l2.daemon.wait_for_log(needle)
# Need to increase timeout, intervals cannot be shortened with DEVELOPER=0