Don't log grpclb server ending connection as error (#2162)

Fixes https://github.com/grpc/grpc-go/issues/2161

I introduced `serverTerminatedConnectionErr `, because I wanted `callRemoteBalancer` to still returns error on a terminated connections. Its client, which is function `watchRemoteBalancer` can decide how to log this error.

When remote grpclb-server terminates the connection, don't log it as
error. Instead, log it as info.

It is natural for servers to terminate long lived grpc streaming
connections. Two sample reasons to do this are: load balancing and
deployment of a new version. Therefore client of grpclb-server shouldn't
recognise this situation as an error.

diff --git a/balancer/grpclb/grpclb.go b/balancer/grpclb/grpclb.go
index 0a48533..0c46ae3 100644
--- a/balancer/grpclb/grpclb.go
+++ b/balancer/grpclb/grpclb.go
@@ -25,6 +25,7 @@
 package grpclb
 
 import (
+	"fmt"
 	"strconv"
 	"strings"
 	"sync"
@@ -58,6 +59,7 @@
 	defaultBackoffConfig = backoff.Exponential{
 		MaxDelay: 120 * time.Second,
 	}
+	errServerTerminatedConnection = fmt.Errorf("grpclb: failed to recv server list: server terminated connection")
 )
 
 func convertDuration(d *durationpb.Duration) time.Duration {
diff --git a/balancer/grpclb/grpclb_remote_balancer.go b/balancer/grpclb/grpclb_remote_balancer.go
index b959266..d0ecd68 100644
--- a/balancer/grpclb/grpclb_remote_balancer.go
+++ b/balancer/grpclb/grpclb_remote_balancer.go
@@ -20,6 +20,7 @@
 
 import (
 	"fmt"
+	"io"
 	"net"
 	"reflect"
 	"time"
@@ -146,6 +147,9 @@
 	for {
 		reply, err := s.Recv()
 		if err != nil {
+			if err == io.EOF {
+				return errServerTerminatedConnection
+			}
 			return fmt.Errorf("grpclb: failed to recv server list: %v", err)
 		}
 		if serverList := reply.GetServerList(); serverList != nil {
@@ -229,7 +233,11 @@
 			return
 		default:
 			if err != nil {
-				grpclog.Error(err)
+				if err == errServerTerminatedConnection {
+					grpclog.Info(err)
+				} else {
+					grpclog.Error(err)
+				}
 			}
 		}