You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@yunikorn.apache.org by "Dale Richardson (Jira)" <ji...@apache.org> on 2026/08/11 07:59:00 UTC

[jira] [Assigned] (YUNIKORN-3357) Add goroutine leak detection to core tests via uber-go/goleak

     [ https://issues.apache.org/jira/browse/YUNIKORN-3357?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Dale Richardson reassigned YUNIKORN-3357:
-----------------------------------------

    Assignee: Dale Richardson

> Add goroutine leak detection to core tests via uber-go/goleak
> -------------------------------------------------------------
>
>                 Key: YUNIKORN-3357
>                 URL: https://issues.apache.org/jira/browse/YUNIKORN-3357
>             Project: Apache YuniKorn
>          Issue Type: Improvement
>          Components: core - common, core - scheduler
>            Reporter: Dale Richardson
>            Assignee: Dale Richardson
>            Priority: Major
>              Labels: pull-request-available
>
> Yunikorn tests currently leak goroutines silently: components started by a test (event system, partition manager cleaners, user group cache) outlive the test binary with nobody noticing, and one intermittent shutdown race makes a leaked goroutine appear in ~43% of full pkg/scheduler/tests runs.
> Proposal: wire [uber-go/goleak|https://github.com/uber-go/goleak] into every test package in core/k8shim repos via a shared {{pkg/common/leakcheck}} helper.
>  * One {{TestMain}} per test package 
>  * All exemptions live in a single (per repo) documented list in {{{}leakcheck.options(){}}}; {{VerifyTestMain}} accepts per-package extra options so the shared list never needs widening
>  * No existing test or production code is modified; goleak is already a transitive dependency and becomes a direct test-only one ({{{}go.sum{}}} unchanged)
> Switching detection on in Yunikorn-core surfaced seven pre-existing leaked-goroutine shapes. Each gets a documented baseline exemption so this change lands green and blocks new kinds of leaks immediately; each exemption is to be deleted by its own follow-up fix:
> || #  ||Goroutine||Cause||
> |1|{{EventSystemImpl.StartServiceWithPublisher.func1}}|tests start the event system without {{Stop()}}|
> |2|{{eventPublisher.start.func1}}|{{Init()}} registers a configmap callback that {{Stop()}} never removes — a config update after shutdown restarts the event system|
> |3|{{EventStreaming.CreateEventStream.func1}}|(a) test never calls {{{}RemoveStream{}}}; (b) forwarder blocks on a bare {{consumer <- event}} send, so slow-consumer eviction cannot release it|
> |4|{{partitionManager.cleanRoot}}|tests build a {{ClusterContext}} without {{Stop()}}|
> |5|{{partitionManager.cleanExpiredApps}}|same as 4|
> |6|{{security.UserGroupCache.run}}|same as 4 — {{ClusterContext.Stop()}} already stops it|
> |7|{{ClusterContext.notifyRMNewAllocation}}|shutdown race: {{StopAll}} stops the scheduler before the RM proxy; a queued allocation event can win the select over the closed stop channel, then the notify blocks forever on its unbuffered reply because {{handleRMEvents}} exits without draining|
> Items 2, 3(b) and 7 are production shutdown gaps rather than test hygiene and will be filed as separate JIRAs (linked).
> Known limitation, stated in the code: exemptions match on top stack frame, so the baseline is a ratchet against new leak kinds, not an instance count; three entries key on positional {{.funcN}} closure names that the follow-up fixes should replace by hoisting the goroutine bodies to named methods.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@yunikorn.apache.org
For additional commands, e-mail: issues-help@yunikorn.apache.org