@@ -14,6 +14,9 @@ import (
1414 "sync/atomic"
1515 "time"
1616
17+ "google.golang.org/grpc/codes"
18+ "google.golang.org/grpc/status"
19+
1720 "google.golang.org/protobuf/proto"
1821
1922 "github.com/secmc/plugin/plugin/adapters/grpc"
@@ -217,7 +220,14 @@ func (p *pluginProcess) sendLoop() {
217220 continue
218221 }
219222 if err := p .stream .Send (data ); err != nil {
220- p .log .Error ("send message" , "error" , err )
223+ // Treat expected shutdown conditions as non-errors.
224+ if st , ok := status .FromError (err ); ok && (st .Code () == codes .Canceled || st .Code () == codes .Unavailable ) {
225+ p .log .Info ("connection closed" , "reason" , st .Code ().String ())
226+ } else if errors .Is (err , io .EOF ) || errors .Is (err , context .Canceled ) {
227+ p .log .Info ("connection closed" , "reason" , "canceled" )
228+ } else {
229+ p .log .Error ("send message" , "error" , err )
230+ }
221231 p .Stop ()
222232 return
223233 }
@@ -230,7 +240,16 @@ func (p *pluginProcess) recvLoop() {
230240 for {
231241 data , err := p .stream .Recv ()
232242 if err != nil {
233- if ! errors .Is (err , io .EOF ) && ! errors .Is (err , context .Canceled ) {
243+ if st , ok := status .FromError (err ); ok {
244+ switch st .Code () {
245+ case codes .Canceled , codes .Unavailable :
246+ p .log .Info ("connection closed" , "reason" , st .Code ().String ())
247+ default :
248+ p .log .Error ("receive message" , "error" , err )
249+ }
250+ } else if errors .Is (err , io .EOF ) || errors .Is (err , context .Canceled ) {
251+ p .log .Info ("connection closed" , "reason" , "canceled" )
252+ } else {
234253 p .log .Error ("receive message" , "error" , err )
235254 }
236255 p .Stop ()
0 commit comments