When trying to migrate execution/write_concurrent_test.go
to testify, I write a TestMain
first with goleak.VerifyTestMain(m, opts...)
. It reports qute a lot leaks and when I ignore them one after another, it turns out to be 35 different cases.
Formerly, we ignore leak goroutines by regex and I found @rleungx asked uber/goleak to support regex.
In the issue, the maintainer said
Putting more generic skips makes it easier to accidentally ignore real leaks as well, so want to make it more specific to the type of leak being ignored.
… which I think get the point. We ignore a lot leak cases and when figure it out, the iceberg is already too large to avoid.
goleak.IgnoreTopFunction("github.com/dgraph-io/ristretto.(*Cache).processItems"),
goleak.IgnoreTopFunction("github.com/dgraph-io/ristretto.(*defaultPolicy).processItems"),
goleak.IgnoreTopFunction("github.com/pingcap/badger.(*DB).runFlushMemTable"),
goleak.IgnoreTopFunction("github.com/pingcap/badger.(*DB).updateSize"),
goleak.IgnoreTopFunction("github.com/pingcap/badger.(*blobGCHandler).run"),
goleak.IgnoreTopFunction("github.com/pingcap/badger.(*levelsController).runWorker"),
goleak.IgnoreTopFunction("github.com/pingcap/badger.(*writeWorker).runMergeLSM"),
goleak.IgnoreTopFunction("github.com/pingcap/badger.(*writeWorker).runWriteLSM"),
goleak.IgnoreTopFunction("github.com/pingcap/badger.(*writeWorker).runWriteVLog"),
goleak.IgnoreTopFunction("github.com/pingcap/badger.Open.func4"),
goleak.IgnoreTopFunction("github.com/pingcap/badger/epoch.(*ResourceManager).collectLoop"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/ddl.(*ddl).limitDDLJobs"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/ddl.(*delRange).startEmulator"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/ddl.(*worker).start"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/domain.(*Domain).LoadPrivilegeLoop.func1"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/domain.(*Domain).LoadSysVarCacheLoop.func1"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/domain.(*Domain).TelemetryReportLoop.func1"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/domain.(*Domain).TelemetryRotateSubWindowLoop.func1"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/domain.(*Domain).globalBindHandleWorkerLoop.func1"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/domain.(*Domain).handleEvolvePlanTasksLoop.func1"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/domain.(*Domain).infoSyncerKeeper"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/domain.(*Domain).topNSlowQueryLoop"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/domain.(*Domain).topologySyncerKeeper"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/executor_test.testSerialSuite.TestTemporaryTableNoNetwork.func2"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/store/mockstore/unistore/tikv.(*MVCCStore).StartDeadlockDetection.func1"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/store/mockstore/unistore/tikv.(*MVCCStore).runUpdateSafePointLoop"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/store/mockstore/unistore/tikv.writeDBWorker.run"),
goleak.IgnoreTopFunction("github.com/pingcap/tidb/store/mockstore/unistore/tikv.writeLockWorker.run"),
goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/internal/locate.(*RegionCache).asyncCheckAndResolveLoop"),
goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/oracle/oracles.(*pdOracle).updateTS"),
goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/tikv.(*KVStore).runSafePointChecker"),
goleak.IgnoreTopFunction("github.com/tikv/client-go/v2/tikv.(*KVStore).safeTSUpdater"),
goleak.IgnoreTopFunction("go.etcd.io/etcd/pkg/logutil.(*MergeLogger).outputLoop"),
goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"),
goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"),
Do you have idea on the goroutine top function above that we should avoid leak from?