config: use Fx hook to close the quicreuse connection manager
This commit is contained in:
parent
945740aa9d
commit
7852bda99a
|
@ -38,6 +38,7 @@ import (
|
||||||
|
|
||||||
ma "github.com/multiformats/go-multiaddr"
|
ma "github.com/multiformats/go-multiaddr"
|
||||||
madns "github.com/multiformats/go-multiaddr-dns"
|
madns "github.com/multiformats/go-multiaddr-dns"
|
||||||
|
"github.com/quic-go/quic-go"
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
"go.uber.org/fx/fxevent"
|
"go.uber.org/fx/fxevent"
|
||||||
)
|
)
|
||||||
|
@ -247,7 +248,16 @@ func (cfg *Config) addTransports() ([]fx.Option, error) {
|
||||||
if cfg.QUICReuse != nil {
|
if cfg.QUICReuse != nil {
|
||||||
fxopts = append(fxopts, cfg.QUICReuse...)
|
fxopts = append(fxopts, cfg.QUICReuse...)
|
||||||
} else {
|
} else {
|
||||||
fxopts = append(fxopts, fx.Provide(quicreuse.NewConnManager)) // TODO: close the ConnManager when shutting down the node
|
fxopts = append(fxopts,
|
||||||
|
fx.Provide(func(key quic.StatelessResetKey, _ *swarm.Swarm, lifecycle fx.Lifecycle) (*quicreuse.ConnManager, error) {
|
||||||
|
cm, err := quicreuse.NewConnManager(key)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
lifecycle.Append(fx.StopHook(cm.Close))
|
||||||
|
return cm, nil
|
||||||
|
}),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fxopts = append(fxopts, fx.Invoke(
|
fxopts = append(fxopts, fx.Invoke(
|
||||||
|
@ -320,7 +330,10 @@ func (cfg *Config) NewNode() (host.Host, error) {
|
||||||
lifecycle.Append(fx.StopHook(sw.Close))
|
lifecycle.Append(fx.StopHook(sw.Close))
|
||||||
return sw, nil
|
return sw, nil
|
||||||
}),
|
}),
|
||||||
fx.Decorate(func(sw *swarm.Swarm, lifecycle fx.Lifecycle) *swarm.Swarm {
|
// Make sure the swarm constructor depends on the quicreuse.ConnManager.
|
||||||
|
// That way, the ConnManager will be started before the swarm, and more importantly,
|
||||||
|
// the swarm will be stopped before the ConnManager.
|
||||||
|
fx.Decorate(func(sw *swarm.Swarm, _ *quicreuse.ConnManager, lifecycle fx.Lifecycle) *swarm.Swarm {
|
||||||
lifecycle.Append(fx.Hook{
|
lifecycle.Append(fx.Hook{
|
||||||
OnStart: func(context.Context) error {
|
OnStart: func(context.Context) error {
|
||||||
// TODO: This method succeeds if listening on one address succeeds. We
|
// TODO: This method succeeds if listening on one address succeeds. We
|
||||||
|
|
|
@ -70,7 +70,7 @@ func (r *acceptLoopRunner) RmAcceptForVersion(v quic.VersionNumber) {
|
||||||
|
|
||||||
ch, ok := r.muxer[v]
|
ch, ok := r.muxer[v]
|
||||||
if !ok {
|
if !ok {
|
||||||
panic("expected chan in accept muxer")
|
return
|
||||||
}
|
}
|
||||||
ch <- acceptVal{err: errors.New("listener Accept closed")}
|
ch <- acceptVal{err: errors.New("listener Accept closed")}
|
||||||
delete(r.muxer, v)
|
delete(r.muxer, v)
|
||||||
|
|
Loading…
Reference in New Issue