agent: Restore error message when the agent client loses it's update feed.

Change-Id: I2e46b4643b8a48ecd14db89ab81fe65424e1b5bf
diff --git a/profiles/internal/rt/runtime.go b/profiles/internal/rt/runtime.go
index bc9c3af..320a1b2 100644
--- a/profiles/internal/rt/runtime.go
+++ b/profiles/internal/rt/runtime.go
@@ -145,11 +145,11 @@
 	}
 
 	// Create and set the principal
-	principal, deps, err := r.initPrincipal(ctx, flags.Credentials)
+	principal, deps, shutdown, err := r.initPrincipal(ctx, flags.Credentials)
 	if err != nil {
 		return nil, nil, nil, err
 	}
-	ctx, err = r.setPrincipal(ctx, principal, deps...)
+	ctx, err = r.setPrincipal(ctx, principal, shutdown, deps...)
 	if err != nil {
 		return nil, nil, nil, err
 	}
@@ -308,7 +308,7 @@
 	return newctx, nil
 }
 
-func (r *Runtime) setPrincipal(ctx *context.T, principal security.Principal, deps ...interface{}) (*context.T, error) {
+func (r *Runtime) setPrincipal(ctx *context.T, principal security.Principal, shutdown func(), deps ...interface{}) (*context.T, error) {
 	if principal != nil {
 		// We uniquely identify a principal with "security/principal/<publicKey>"
 		principalName := "security/principal/" + principal.PublicKey().String()
@@ -316,7 +316,7 @@
 		stats.NewStringFunc(principalName+"/blessingroots", principal.Roots().DebugString)
 	}
 	ctx = context.WithValue(ctx, principalKey, principal)
-	return ctx, r.addChild(ctx, principal, func() {}, deps...)
+	return ctx, r.addChild(ctx, principal, shutdown, deps...)
 }
 
 func (r *Runtime) WithPrincipal(ctx *context.T, principal security.Principal) (*context.T, error) {
@@ -328,7 +328,7 @@
 	// For example if they create an agent principal with some client, we don't know
 	// about that, so servers based of this new principal will not prevent the client
 	// from terminating early.
-	if newctx, err = r.setPrincipal(ctx, principal); err != nil {
+	if newctx, err = r.setPrincipal(ctx, principal, func() {}); err != nil {
 		return ctx, err
 	}
 	if newctx, err = r.setNewStreamManager(newctx); err != nil {
diff --git a/profiles/internal/rt/security.go b/profiles/internal/rt/security.go
index d601968..0488424 100644
--- a/profiles/internal/rt/security.go
+++ b/profiles/internal/rt/security.go
@@ -23,9 +23,9 @@
 	"v.io/x/ref/services/agent/agentlib"
 )
 
-func (r *Runtime) initPrincipal(ctx *context.T, credentials string) (principal security.Principal, deps []interface{}, err error) {
+func (r *Runtime) initPrincipal(ctx *context.T, credentials string) (principal security.Principal, deps []interface{}, shutdown func(), err error) {
 	if principal, _ = ctx.Value(principalKey).(security.Principal); principal != nil {
-		return principal, nil, nil
+		return principal, nil, func() {}, nil
 	}
 	if len(credentials) > 0 {
 		// Explicitly specified credentials, ignore the agent.
@@ -39,17 +39,17 @@
 		if principal, err = vsecurity.LoadPersistentPrincipal(credentials, nil); err != nil {
 			if os.IsNotExist(err) {
 				if principal, err = vsecurity.CreatePersistentPrincipal(credentials, nil); err != nil {
-					return principal, nil, err
+					return principal, nil, nil, err
 				}
-				return principal, nil, vsecurity.InitDefaultBlessings(principal, defaultBlessingName())
+				return principal, nil, func() {}, vsecurity.InitDefaultBlessings(principal, defaultBlessingName())
 			}
-			return nil, nil, err
+			return nil, nil, nil, err
 		}
-		return principal, nil, nil
+		return principal, nil, func() {}, nil
 	}
 	// Use credentials stored in the agent.
 	if ep, _, err := agentEP(); err != nil {
-		return nil, nil, err
+		return nil, nil, nil, err
 	} else if ep != nil {
 		// Use a new stream manager and an "incomplete" client (the
 		// principal is nil) to talk to the agent.
@@ -63,26 +63,27 @@
 		// from management of any other connections created in the
 		// process (such as future RPCs to other services).
 		if ctx, err = r.WithNewStreamManager(ctx); err != nil {
-			return nil, nil, err
+			return nil, nil, nil, err
 		}
 		client := r.GetClient(ctx)
 
 		// We reparent the context we use to construct the agent.
 		// We do this because the agent needs to be able to make RPCs
 		// during runtime shutdown.
-		ctx, _ = context.WithRootCancel(ctx)
+		ctx, shutdown = context.WithRootCancel(ctx)
 
 		if principal, err = agentlib.NewAgentPrincipal(ctx, ep, client); err != nil {
+			shutdown()
 			client.Close()
-			return nil, nil, err
+			return nil, nil, nil, err
 		}
-		return principal, []interface{}{client}, nil
+		return principal, []interface{}{client}, shutdown, nil
 	}
 	// No agent, no explicit credentials specified: - create a new principal and blessing in memory.
 	if principal, err = vsecurity.NewPrincipal(); err != nil {
-		return principal, nil, err
+		return principal, nil, nil, err
 	}
-	return principal, nil, vsecurity.InitDefaultBlessings(principal, defaultBlessingName())
+	return principal, nil, func() {}, vsecurity.InitDefaultBlessings(principal, defaultBlessingName())
 }
 
 func parseAgentFD(ep naming.Endpoint) (int, error) {
diff --git a/services/agent/internal/cache/cache.go b/services/agent/internal/cache/cache.go
index e0e7026..cc6b904 100644
--- a/services/agent/internal/cache/cache.go
+++ b/services/agent/internal/cache/cache.go
@@ -375,15 +375,13 @@
 	if err != nil {
 		return
 	}
+
 	go func() {
 		var x bool
 		for {
 			if recvErr := call.Recv(&x); recvErr != nil {
 				if ctx.Err() != context.Canceled {
-					// TODO(mattr): For now I'm commenting this out since the context
-					// doesn't get cancelled before the client is closed.
-					// Revisit this.
-					vlog.VI(2).Infof("Error from agent: %v", recvErr)
+					vlog.Errorf("Error from agent: %v", recvErr)
 				}
 				flush()
 				call.Finish()