소스 검색

fix(app/log): prevent close of closed channel

The close of `done` channel may be called many times.
And the handler will be blocked when the log client exists and the
closure func is still not be called.
So use context to resolve those two problems.
Allo 2 년 전
부모
커밋
4f2fc729ce
1개의 변경된 파일3개의 추가작업 그리고 3개의 파일을 삭제
  1. 3 3
      app/log/command/command.go

+ 3 - 3
app/log/command/command.go

@@ -43,18 +43,18 @@ func (s *LoggerServer) FollowLog(_ *FollowLogRequest, stream LoggerService_Follo
 	if !ok {
 		return newError("logger not support following")
 	}
-	done := make(chan struct{})
+	ctx, cancel := context.WithCancel(stream.Context())
 	f := func(msg cmlog.Message) {
 		err := stream.Send(&FollowLogResponse{
 			Message: msg.String(),
 		})
 		if err != nil {
-			close(done)
+			cancel()
 		}
 	}
 	follower.AddFollower(f)
 	defer follower.RemoveFollower(f)
-	<-done
+	<-ctx.Done()
 	return nil
 }