uber-go / dig

A reflection based dependency injection toolkit for Go.
https://go.uber.org/dig
MIT License
3.78k stars 206 forks source link

BUG: Stack overflow caused by too many dependencies or too deep nested dependencies #365

Closed junhwong closed 1 year ago

junhwong commented 1 year ago

Describe the bug Stack overflow caused by too many dependencies or too deep nested dependencies

To Reproduce Pseudo code:

// cmd.go

app:=dig.New()
controller.Provide(app)

app.Run(controller.Run)

// controller.go
Provide(app){
  app.Provide(NewControllerA)
  app.Provide(NewControllerB)
  app.Provide(NewControllerC)
  app.Provide(NewControllerD)
  // ...
}

Run(ControllerA,ControllerB...ControllerD, ...){
  // run
}

Additional context stack trace:


runtime: goroutine stack exceeds 1000000000-byte limit
runtime: sp=0xc020d50348 stack=[0xc020d50000, 0xc040d50000]
fatal error: stack overflow

runtime stack:
runtime.throw({0x1373560?, 0x1dc8b40?})
        go1.19.3/src/runtime/panic.go:1047 +0x5d fp=0x7f3ad4f0acb8 sp=0x7f3ad4f0ac88 pc=0x43bb9d
runtime.newstack()
        go1.19.3/src/runtime/stack.go:1103 +0x5cc fp=0x7f3ad4f0ae70 sp=0x7f3ad4f0acb8 pc=0x455e6c
runtime.morestack()
        go1.19.3/src/runtime/asm_amd64.s:570 +0x8b fp=0x7f3ad4f0ae78 sp=0x7f3ad4f0ae70 pc=0x46dc2b

goroutine 218 [running]:
mypkg/myrunner.checkReady-fm()
        <autogenerated>:1 +0x35 fp=0xc020d50358 sp=0xc020d50350 pc=0x10846f5
mypkg/*Controller.Register.func1(0x0, 0x0)
        worker.go:28 +0x8a fp=0xc020d503d0 sp=0xc020d50358 pc=0x1093daa
mypkg/*Controller.Register.func1(0x0, 0x0)
        worker.go:33 +0x159 fp=0xc020d50448 sp=0xc020d503d0 pc=0x1093e79
... over 800 lines
mypkg/*Controller.Register.func1(0x0, 0x0)
        worker.go:33 +0x159 fp=0xc020d531c0 sp=0xc020d53148 pc=0x1093e79
...additional frames elided...
created by mypkg/bootstrap.(*Bootstrap).serve
        bootstrap.go:126 +0x3a5

goroutine 1 [semacquire, 1 minutes]:
runtime.gopark(0xc000407380?, 0x46db2e?, 0x20?, 0x5f?, 0xc000931b20?)
        go1.19.3/src/runtime/proc.go:363 +0xd6 fp=0xc000225b00 sp=0xc000225ae0 pc=0x43e7b6
runtime.goparkunlock(...)
        go1.19.3/src/runtime/proc.go:369
runtime.semacquire1(0xc0003d16a8, 0xa0?, 0x1, 0x0)
        go1.19.3/src/runtime/sema.go:150 +0x1fe fp=0xc000225b68 sp=0xc000225b00 pc=0x44f71e
sync.runtime_Semacquire(0xc00018e8d0?)
        go1.19.3/src/runtime/sema.go:62 +0x25 fp=0xc000225b98 sp=0xc000225b68 pc=0x46b985
sync.(*WaitGroup).Wait(0xc00050ed00?)
        go1.19.3/src/sync/waitgroup.go:139 +0x52 fp=0xc000225bc0 sp=0xc000225b98 pc=0x487d52
app.Wait(0xc0001197c0)
        app.go:143 +0x185 fp=0xc000225c48 sp=0xc000225bc0 pc=0x7db905
cmd.run(0xc0001b6280)
        run.go:73 +0x286 fp=0xc000225c98 sp=0xc000225c48 pc=0x1093786
cmd.NewMainCommand.func1(0x0?, {0x0?, 0x0?, 0x0?})
        cmd.go:88 +0x3e fp=0xc000225cb8 sp=0xc000225c98 pc=0x108cbbe
cmd.FlushRunE.func1(0xc00041c300?, {0x1e639a8?, 0x0?, 0x0?})
        cmd.go:28 +0x26 fp=0xc000225d20 sp=0xc000225cb8 pc=0x108c2e6
github.com/spf13/cobra.(*Command).execute(0xc00041c300, {0xc000040220, 0x0, 0x0})
        cobra@v1.6.1/command.go:916 +0x862 fp=0xc000225e58 sp=0xc000225d20 pc=0x5bd002
github.com/spf13/cobra.(*Command).ExecuteC(0xc00041c300)
        cobra@v1.6.1/command.go:1044 +0x3bd fp=0xc000225f10 sp=0xc000225e58 pc=0x5bd87d
github.com/spf13/cobra.(*Command).Execute(...)
        cobra@v1.6.1/command.go:968
main.main()
        main.go:14 +0x8f fp=0xc000225f80 sp=0xc000225f10 pc=0x10946cf
runtime.main()
        go1.19.3/src/runtime/proc.go:250 +0x212 fp=0xc000225fe0 sp=0xc000225f80 pc=0x43e3f2
runtime.goexit()
        go1.19.3/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc000225fe8 sp=0xc000225fe0 pc=0x46fd01

goroutine 2 [force gc (idle), 1 minutes]:
runtime.gopark(0x0?, 0x0?, 0x0?, 0x0?, 0x0?)
        go1.19.3/src/runtime/proc.go:363 +0xd6 fp=0xc000076fb0 sp=0xc000076f90 pc=0x43e7b6
runtime.goparkunlock(...)
        go1.19.3/src/runtime/proc.go:369
runtime.forcegchelper()
        go1.19.3/src/runtime/proc.go:302 +0xad fp=0xc000076fe0 sp=0xc000076fb0 pc=0x43e64d
runtime.goexit()
        go1.19.3/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc000076fe8 sp=0xc000076fe0 pc=0x46fd01
created by runtime.init.6
        go1.19.3/src/runtime/proc.go:290 +0x25

goroutine 3 [GC sweep wait]:
runtime.gopark(0x1?, 0x0?, 0x0?, 0x0?, 0x0?)
        go1.19.3/src/runtime/proc.go:363 +0xd6 fp=0xc000077790 sp=0xc000077770 pc=0x43e7b6
runtime.goparkunlock(...)
        go1.19.3/src/runtime/proc.go:369
runtime.bgsweep(0x0?)
        go1.19.3/src/runtime/mgcsweep.go:297 +0xd7 fp=0xc0000777c8 sp=0xc000077790 pc=0x428cf7
runtime.gcenable.func1()
        go1.19.3/src/runtime/mgc.go:178 +0x26 fp=0xc0000777e0 sp=0xc0000777c8 pc=0x41d966
runtime.goexit()
        go1.19.3/src/runtime/asm_amd64.s:1594 +0x1 fp=0xc0000777e8 sp=0xc0000777e0 pc=0x46fd01
created by runtime.gcenable
        go1.19.3/src/runtime/mgc.go:178 +0x6b

...

goroutine 676 [chan receive, 1 minutes]:

...
junhwong commented 1 year ago

ps: no dead-loop when the code runs

junhwong commented 1 year ago

... is a problem for me to register