Execution tests report a lot of goroutine leaks

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?

domain.Close() should close all those one

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"),

and store.Close() should close all those

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"),

For others you need more investigation.

You can try create a store, domain, then exit and check is there any leaked goroutine.
If so, that must be a bug.
Otherwise, some tests are not well written.