Commit 9bd777f
committed
fix(network): remove goroutine leak in transfer-metadata lookup wait
LookupTransferMetadataKey waited for its lookupListener by spawning a
goroutine parked on sync.WaitGroup.Wait(). On the timeout path the
function returns and its deferred RemoveLookupListener tears the listener
down, so OnStatus/OnError -- the only callers of wg.Done() -- never fire
and the goroutine is parked for the life of the process. ScanForPreImage
uses a 5 minute timeout, so every HTLC pre-image that is never revealed
stranded one goroutine.
Buffering the channel does not help: the goroutine blocked on wg.Wait(),
not on a channel send, and the send it replaced was a close(), which
never blocks.
Remove the goroutine instead. lookupListener now owns a done channel that
the first matching notification closes, and the waiter selects on it
against a timer. With nothing parked on the notification there is nothing
to leak. Closing exactly once also removes the "negative WaitGroup
counter" panic a duplicate notification could trigger, and the timer is
explicitly stopped so a lookup that completes early no longer retains one
for the rest of its timeout.
The timeout is reported as a plain error naming the key rather than a bare
context sentinel: a lookup that does not complete in time is an expected
outcome here, and surfacing context.DeadlineExceeded would make it
indistinguishable from caller cancellation to errors.Is-based retry logic.
The context parameter is dropped rather than left dead -- neither
driver.Network.LookupTransferMetadataKey nor htlc.ScanForPreImage carries
a context, so the only caller could pass nothing but context.Background().
The tests are rewritten to actually reproduce the bug: they never release
the listener, since releasing it also let the leaked goroutine exit, which
is why the previous ones passed against the unfixed code. Verified that
goleak flags the pre-fix implementation under these assertions and passes
the new one.
Fixes #2124
Signed-off-by: AkramBitar <akram@il.ibm.com>1 parent 5655709 commit 9bd777f
3 files changed
Lines changed: 165 additions & 27 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| 29 | + | |
29 | 30 | | |
30 | 31 | | |
31 | 32 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
407 | 407 | | |
408 | 408 | | |
409 | 409 | | |
410 | | - | |
411 | | - | |
412 | | - | |
| 410 | + | |
413 | 411 | | |
414 | 412 | | |
415 | 413 | | |
| |||
418 | 416 | | |
419 | 417 | | |
420 | 418 | | |
421 | | - | |
422 | | - | |
423 | | - | |
424 | | - | |
| 419 | + | |
| 420 | + | |
425 | 421 | | |
426 | | - | |
| 422 | + | |
427 | 423 | | |
428 | 424 | | |
429 | 425 | | |
| |||
552 | 548 | | |
553 | 549 | | |
554 | 550 | | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
555 | 556 | | |
556 | 557 | | |
557 | | - | |
| 558 | + | |
| 559 | + | |
558 | 560 | | |
559 | 561 | | |
560 | 562 | | |
561 | 563 | | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
562 | 569 | | |
563 | 570 | | |
564 | | - | |
565 | | - | |
566 | | - | |
567 | | - | |
| 571 | + | |
568 | 572 | | |
569 | 573 | | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
570 | 578 | | |
571 | 579 | | |
572 | 580 | | |
573 | 581 | | |
574 | | - | |
575 | | - | |
576 | | - | |
577 | | - | |
| 582 | + | |
578 | 583 | | |
579 | 584 | | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
580 | 589 | | |
581 | 590 | | |
582 | | - | |
583 | | - | |
584 | | - | |
585 | | - | |
586 | | - | |
587 | | - | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
588 | 599 | | |
589 | | - | |
590 | | - | |
591 | | - | |
592 | | - | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
593 | 604 | | |
594 | 605 | | |
595 | 606 | | |
| |||
0 commit comments