add waitGroups for waiting finish all connects #131

Merged
vtolstov merged 7 commits from devstigneev/micro-server-tcp:issue_130 into v3 2024-03-13 15:36:35 +03:00
Showing only changes of commit 9d321b12b8 - Show all commits

25
tcp.go
View File

@ -16,6 +16,7 @@ import (
"go.unistack.org/micro/v3/register" "go.unistack.org/micro/v3/register"
"go.unistack.org/micro/v3/server" "go.unistack.org/micro/v3/server"
"golang.org/x/net/netutil" "golang.org/x/net/netutil"
"golang.org/x/sync/errgroup"
) )
type tcpServer struct { type tcpServer struct {
@ -427,15 +428,27 @@ func (h *tcpServer) Stop() error {
} }
func (h *tcpServer) gracefulStop() { func (h *tcpServer) gracefulStop() {
ctx, cancel := context.WithTimeout(context.Background(), h.opts.GracefulTimeout) tm := time.NewTimer(h.opts.GracefulTimeout)
defer tm.Stop()
vtolstov marked this conversation as resolved Outdated

смотри, лучше сделать канал и если вейтгруппа кончилась- прямо там закрывать канал, тогда в селекте мы сразу попадем на нужный кейс

смотри, лучше сделать канал и если вейтгруппа кончилась- прямо там закрывать канал, тогда в селекте мы сразу попадем на нужный кейс

да, я прикинул потом, что закрытие нужно сместить

да, я прикинул потом, что закрытие нужно сместить
go func() { g, gctx := errgroup.WithContext(context.Background())
g.Go(func() error {
h.opts.Wait.Wait() h.opts.Wait.Wait()
cancel() return nil

Тут мы ждем либо у нас концертны все закрылись и вызвался cancel()
либо ctx.Done выполнился по GracefulTimeout

Тут мы ждем либо у нас концертны все закрылись и вызвался cancel() либо ctx.Done выполнился по GracefulTimeout

если я использую time.Timer, не совсем смог прийти к решению, что я его в ручную остановил и мог без препятствий завершить метод

если я использую time.Timer, не совсем смог прийти к решению, что я его в ручную остановил и мог без препятствий завершить метод

но возникает другая проблема, если Wait - залочился, то горутина с ней утекла

но возникает другая проблема, если Wait - залочился, то горутина с ней утекла
}() })
// wait timeout or finish all connects g.Go(func() error {
<-ctx.Done() select {
case <-tm.C:
return nil
case <-gctx.Done():
return gctx.Err()

тут везде нужно возвращать ошибку иначе ерргруппа будет висеть пока все горутины не закончатся

тут везде нужно возвращать ошибку иначе ерргруппа будет висеть пока все горутины не закончатся
}
})
g.Wait()
return
} }
func (h *tcpServer) String() string { func (h *tcpServer) String() string {