| 279 | } |
| 280 | |
| 281 | static void try_connect(const tal_t *ctx, |
| 282 | struct lightningd *ld, |
| 283 | const struct node_id *id, |
| 284 | u32 seconds_delay, |
| 285 | const struct wireaddr_internal *addrhint) |
| 286 | { |
| 287 | struct delayed_reconnect *d; |
| 288 | struct peer *peer; |
| 289 | |
| 290 | d = tal(ctx, struct delayed_reconnect); |
| 291 | d->ld = ld; |
| 292 | d->id = *id; |
| 293 | d->addrhint = tal_dup_or_null(d, struct wireaddr_internal, addrhint); |
| 294 | |
| 295 | if (!seconds_delay) { |
| 296 | do_connect(d); |
| 297 | return; |
| 298 | } |
| 299 | |
| 300 | log_peer_debug(ld->log, id, "Will try reconnect in %u seconds", |
| 301 | seconds_delay); |
| 302 | /* Update any channel billboards */ |
| 303 | peer = peer_by_id(ld, id); |
| 304 | if (peer) { |
| 305 | struct channel *channel; |
| 306 | list_for_each(&peer->channels, channel, list) { |
| 307 | if (!channel_active(channel)) |
| 308 | continue; |
| 309 | channel_set_billboard(channel, false, |
| 310 | tal_fmt(tmpctx, |
| 311 | "Will attempt reconnect " |
| 312 | "in %u seconds", |
| 313 | seconds_delay)); |
| 314 | } |
| 315 | peer->last_connect_attempt = time_now(); |
| 316 | } |
| 317 | |
| 318 | /* We fuzz the timer by up to 1 second, to avoid getting into |
| 319 | * simultanous-reconnect deadlocks with peer. */ |
| 320 | notleak(new_reltimer(ld->timers, d, |
| 321 | timerel_add(time_from_sec(seconds_delay), |
| 322 | time_from_usec(pseudorand(1000000))), |
| 323 | do_connect, d)); |
| 324 | } |
| 325 | |
| 326 | /*~ In C convention, constants are UPPERCASE macros. Not everything needs to |
| 327 | * be a constant, but it soothes the programmer's conscience to encapsulate |
no test coverage detected