TBR go.core: Change IPC protocol to remove error from out-args.

Vanadium IPC method calls look like this in the VDL:

  type Arith interface {
    Add(x, y int32) (int32 | error)
  }

The purpose of the "int32 | error" syntax is to try to make it
clear(er) that you either get the out-args, or the error, but
never both.  Note that when we generate code in languages that
use exceptions (e.g. Java, and sometimes in Javascript), there's
no way to return both the out-args and the error; the error is
thrown as an exception, and we can't collect the out-args.

Prior to this CL, we were still sending the error as the last
out-arg on the wire.  This was purely legacy behavior, that we
never got around to cleaning up during the vom2 transition,
because it's a huge change that's really painful.  This CL is the
huge painful change to clean things up again.

It's hard to separate out the changes into smaller CLs, so this
is an 8-part CL, with lots of changes.  The main changes are in
this CL, which modifies the release.go.core repo.  Here's a
summary of the changes:
  a) VDL parser no longer returns error as the last out-arg.
  b) VDL compiler no longer returns error as the last out-arg.
  c) VDL codegen in each language is updated accordingly.  The
     largest changes are in Go, where we need to change the calls
     to Finish to not pass in the error.
  d) All manual (non-vdl-generated) calls to Finish updated to
     not pass in the error.
  e) ipc.ReflectInvoker updated to require a last out-arg on each
     RPC method, which is captured and special-cased in Invoke.
  f) RPC methods in tests updated to always return an error; some
     of the tests that weren't using VDL weren't always returning
     an error.
  g) Some code was incorrectly relying on returning both the
     out-args and the error, which happened to work in Go, but
     wouldn't work with Java / JS clients.  This was mostly in
     tests.  The only non-test code with this property is in:
        veyron/services/mgmt/application/impl
     This was still "trivial" though, since the returned out-arg
     was only used in the tests.

MultiPart: 1/8
Change-Id: I2e02f50ed768bc1e90a9e4f438dcdccae70854d2
diff --git a/runtimes/google/ipc/benchmark/glob/glob_test.go b/runtimes/google/ipc/benchmark/glob/glob_test.go
index 675ed30..8b81e4e 100644
--- a/runtimes/google/ipc/benchmark/glob/glob_test.go
+++ b/runtimes/google/ipc/benchmark/glob/glob_test.go
@@ -148,10 +148,10 @@
 		count++
 	}
 	b.StopTimer()
-	if ferr := call.Finish(&err); ferr != nil {
-		err = ferr
+	if err := call.Finish(); err != nil {
+		return 0, err
 	}
-	return count, err
+	return count, nil
 }
 
 func RunBenchmarkGlob(b *testing.B, obj interface{}) {
diff --git a/runtimes/google/ipc/benchmark/service.vdl.go b/runtimes/google/ipc/benchmark/service.vdl.go
index 76759b4..982b669 100644
--- a/runtimes/google/ipc/benchmark/service.vdl.go
+++ b/runtimes/google/ipc/benchmark/service.vdl.go
@@ -60,9 +60,7 @@
 	if call, err = c.c(ctx).StartCall(ctx, c.name, "Echo", []interface{}{i0}, opts...); err != nil {
 		return
 	}
-	if ierr := call.Finish(&o0, &err); ierr != nil {
-		err = ierr
-	}
+	err = call.Finish(&o0)
 	return
 }
 
@@ -173,9 +171,7 @@
 	return c.c.CloseSend()
 }
 func (c *implBenchmarkEchoStreamCall) Finish() (err error) {
-	if ierr := c.Call.Finish(&err); ierr != nil {
-		err = ierr
-	}
+	err = c.Call.Finish()
 	return
 }
 
@@ -260,16 +256,12 @@
 			},
 			OutArgs: []ipc.ArgDesc{
 				{"", ``}, // []byte
-				{"", ``}, // error
 			},
 			Tags: []vdl.AnyRep{access.Tag("Read")},
 		},
 		{
 			Name: "EchoStream",
 			Doc:  "// EchoStream returns the payload that it receives via the stream.",
-			OutArgs: []ipc.ArgDesc{
-				{"", ``}, // error
-			},
 			Tags: []vdl.AnyRep{access.Tag("Read")},
 		},
 	},
diff --git a/runtimes/google/ipc/client_test.go b/runtimes/google/ipc/client_test.go
index 9923130..1fa37b7 100644
--- a/runtimes/google/ipc/client_test.go
+++ b/runtimes/google/ipc/client_test.go
@@ -175,11 +175,7 @@
 		fmt.Errorf("unexpected error: %s", err)
 	}
 	got := ""
-	verr := call.Finish(&got, &err)
-	if verr != nil {
-		fmt.Errorf("unexpected error: %s", verr)
-	}
-	if err != nil {
+	if err := call.Finish(&got); err != nil {
 		fmt.Errorf("unexpected error: %s", err)
 	}
 	fmt.Fprintf(stdout, "RESULT=%s\n", got)
@@ -228,8 +224,8 @@
 		testForVerror(t, err, verror.ErrTimeout)
 		return
 	}
-	verr := call.Finish(&err)
-	testForVerror(t, verr, verror.ErrTimeout)
+	err = call.Finish()
+	testForVerror(t, err, verror.ErrTimeout)
 }
 
 func TestArgsAndResponses(t *testing.T) {
@@ -242,8 +238,8 @@
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
-	verr := call.Finish(&err)
-	testForVerror(t, verr, verror.ErrBadProtocol)
+	err = call.Finish()
+	testForVerror(t, err, verror.ErrBadProtocol)
 
 	call, err = veyron2.GetClient(ctx).StartCall(ctx, name, "Ping", nil)
 	if err != nil {
@@ -251,8 +247,8 @@
 	}
 	pong := ""
 	dummy := ""
-	verr = call.Finish(&pong, &dummy, &err)
-	testForVerror(t, verr, verror.ErrBadProtocol)
+	err = call.Finish(&pong, &dummy)
+	testForVerror(t, err, verror.ErrBadProtocol)
 }
 
 func TestAccessDenied(t *testing.T) {
@@ -270,8 +266,8 @@
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
-	verr := call.Finish(&err)
-	testForVerror(t, verr, verror.ErrNoAccess)
+	err = call.Finish()
+	testForVerror(t, err, verror.ErrNoAccess)
 }
 
 func TestCanceledBeforeFinish(t *testing.T) {
@@ -287,9 +283,9 @@
 	}
 	// Cancel before we call finish.
 	cancel()
-	verr := call.Finish(&err)
+	err = call.Finish()
 	// TOO(cnicolaou): this should be Canceled only.
-	testForVerror(t, verr, verror.ErrCanceled)
+	testForVerror(t, err, verror.ErrCanceled)
 }
 
 func TestCanceledDuringFinish(t *testing.T) {
@@ -308,8 +304,8 @@
 		time.Sleep(100 * time.Millisecond)
 		cancel()
 	}()
-	verr := call.Finish(&err)
-	testForVerror(t, verr, verror.ErrCanceled)
+	err = call.Finish()
+	testForVerror(t, err, verror.ErrCanceled)
 }
 
 func TestRendezvous(t *testing.T) {
@@ -338,9 +334,8 @@
 	}
 
 	response := ""
-	verr := call.Finish(&response, &err)
-	if verr != nil {
-		testForVerror(t, verr, verror.ErrCanceled)
+	if err := call.Finish(&response); err != nil {
+		testForVerror(t, err, verror.ErrCanceled)
 		return
 	}
 	if got, want := response, "message: hello\n"; got != want {
@@ -398,8 +393,8 @@
 		testForVerror(t, err, verror.ErrTimeout)
 		break
 	}
-	verr := call.Finish(&err)
-	testForVerror(t, verr, verror.ErrTimeout)
+	err = call.Finish()
+	testForVerror(t, err, verror.ErrTimeout)
 }
 
 func TestStreamAbort(t *testing.T) {
@@ -420,22 +415,14 @@
 		}
 	}
 	call.CloseSend()
-	verr := call.Send(100)
-	testForVerror(t, verr, verror.ErrAborted)
+	err = call.Send(100)
+	testForVerror(t, err, verror.ErrAborted)
 
 	result := 0
-	verr = call.Finish(&result, &err)
-	if verr != nil {
-		t.Fatalf("unexpected error: %s", verr)
+	err = call.Finish(&result)
+	if err != nil {
+		t.Errorf("unexpected error: %#v", err)
 	}
-	if !verror.Is(err, verror.ErrUnknown.ID) || err.Error() != `v.io/core/veyron2/verror.Unknown:   EOF` {
-		t.Errorf("wrong error: %#v", err)
-	}
-	/* TODO(cnicolaou): use this when verror/vom transition is done.
-	if err != nil && !verror.Is(err, verror.EOF.ID) {
-		t.Fatalf("unexpected error: %#v", err)
-	}
-	*/
 	if got := result; got != want {
 		t.Errorf("got %d, want %d", got, want)
 	}
@@ -448,12 +435,12 @@
 	defer fn()
 	name := "noservers"
 	ctx, _ = context.WithTimeout(ctx, 1000*time.Millisecond)
-	call, verr := veyron2.GetClient(ctx).StartCall(ctx, name, "Sleep", nil)
-	if verr != nil {
-		testForVerror(t, verr, verror.ErrNoServers)
+	call, err := veyron2.GetClient(ctx).StartCall(ctx, name, "Sleep", nil)
+	if err != nil {
+		testForVerror(t, err, verror.ErrNoServers)
 		return
 	}
-	err := call.Finish(&verr)
+	err = call.Finish()
 	testForVerror(t, err, verror.ErrNoServers)
 }
 
@@ -465,8 +452,8 @@
 
 	// If there is no mount table, then we'll get a NoServers error message.
 	ctx, _ = context.WithTimeout(ctx, 300*time.Millisecond)
-	_, verr := veyron2.GetClient(ctx).StartCall(ctx, name, "Sleep", nil)
-	testForVerror(t, verr, verror.ErrNoServers)
+	_, err := veyron2.GetClient(ctx).StartCall(ctx, name, "Sleep", nil)
+	testForVerror(t, err, verror.ErrNoServers)
 }
 
 // TestReconnect verifies that the client transparently re-establishes the
@@ -498,8 +485,7 @@
 			return "", fmt.Errorf("START: %s", err)
 		}
 		var result string
-		var rerr error
-		if err = call.Finish(&result, &rerr); err != nil {
+		if err := call.Finish(&result); err != nil {
 			return "", err
 		}
 		return result, nil
diff --git a/runtimes/google/ipc/debug_test.go b/runtimes/google/ipc/debug_test.go
index e351242..a76b913 100644
--- a/runtimes/google/ipc/debug_test.go
+++ b/runtimes/google/ipc/debug_test.go
@@ -61,8 +61,8 @@
 			t.Fatalf("client.StartCall failed: %v", err)
 		}
 		var value string
-		if ferr := call.Finish(&value); ferr != nil {
-			t.Fatalf("call.Finish failed: %v", ferr)
+		if err := call.Finish(&value); err != nil {
+			t.Fatalf("call.Finish failed: %v", err)
 		}
 		if want := "BAR"; value != want {
 			t.Errorf("unexpected value: Got %v, want %v", value, want)
@@ -78,11 +78,8 @@
 			t.Fatalf("client.StartCall failed: %v", err)
 		}
 		var value string
-		if ferr := call.Finish(&value, &err); ferr != nil {
-			t.Fatalf("call.Finish failed: %v", ferr)
-		}
-		if err != nil {
-			t.Fatalf("unexpected error: %v", err)
+		if err := call.Finish(&value); err != nil {
+			t.Fatalf("call.Finish failed: %v", err)
 		}
 		if want := foo.Value(); value != want {
 			t.Errorf("unexpected result: Got %v, want %v", value, want)
@@ -116,8 +113,8 @@
 			}
 			results = append(results, me.Name)
 		}
-		if ferr := call.Finish(&err); ferr != nil {
-			t.Fatalf("call.Finish failed for %q: %v", tc.name, ferr)
+		if err := call.Finish(); err != nil {
+			t.Fatalf("call.Finish failed for %q: %v", tc.name, err)
 		}
 		sort.Strings(results)
 		if !reflect.DeepEqual(tc.expected, results) {
@@ -129,6 +126,6 @@
 type testObject struct {
 }
 
-func (o testObject) Foo(ipc.ServerContext) string {
-	return "BAR"
+func (o testObject) Foo(ipc.ServerContext) (string, error) {
+	return "BAR", nil
 }
diff --git a/runtimes/google/ipc/discharges.go b/runtimes/google/ipc/discharges.go
index 5bf42f7..7cb3155 100644
--- a/runtimes/google/ipc/discharges.go
+++ b/runtimes/google/ipc/discharges.go
@@ -114,8 +114,8 @@
 					return
 				}
 				var wire security.WireDischarge
-				if ierr := call.Finish(&wire, &err); ierr != nil || err != nil {
-					vlog.VI(3).Infof("Discharge fetch for %v failed: (%v, %v)", cav, err, ierr)
+				if err := call.Finish(&wire); err != nil {
+					vlog.VI(3).Infof("Discharge fetch for %v failed: (%v)", cav, err)
 					return
 				}
 				d, err := security.NewDischarge(wire)
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index e5ae443..2fc49da 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -100,29 +100,30 @@
 
 type testServer struct{}
 
-func (*testServer) Closure(ctx ipc.ServerContext) {
+func (*testServer) Closure(ctx ipc.ServerContext) error {
+	return nil
 }
 
 func (*testServer) Error(ctx ipc.ServerContext) error {
 	return errMethod
 }
 
-func (*testServer) Echo(ctx ipc.ServerContext, arg string) string {
-	return fmt.Sprintf("method:%q,suffix:%q,arg:%q", ctx.Method(), ctx.Suffix(), arg)
+func (*testServer) Echo(ctx ipc.ServerContext, arg string) (string, error) {
+	return fmt.Sprintf("method:%q,suffix:%q,arg:%q", ctx.Method(), ctx.Suffix(), arg), nil
 }
 
-func (*testServer) EchoUser(ctx ipc.ServerContext, arg string, u userType) (string, userType) {
-	return fmt.Sprintf("method:%q,suffix:%q,arg:%q", ctx.Method(), ctx.Suffix(), arg), u
+func (*testServer) EchoUser(ctx ipc.ServerContext, arg string, u userType) (string, userType, error) {
+	return fmt.Sprintf("method:%q,suffix:%q,arg:%q", ctx.Method(), ctx.Suffix(), arg), u, nil
 }
 
-func (*testServer) EchoBlessings(ctx ipc.ServerContext) (server, client string) {
+func (*testServer) EchoBlessings(ctx ipc.ServerContext) (server, client string, _ error) {
 	local, _ := ctx.LocalBlessings().ForContext(ctx)
 	remote, _ := ctx.RemoteBlessings().ForContext(ctx)
-	return fmt.Sprintf("%v", local), fmt.Sprintf("%v", remote)
+	return fmt.Sprintf("%v", local), fmt.Sprintf("%v", remote), nil
 }
 
-func (*testServer) EchoGrantedBlessings(ctx ipc.ServerContext, arg string) (result, blessing string) {
-	return arg, fmt.Sprintf("%v", ctx.Blessings())
+func (*testServer) EchoGrantedBlessings(ctx ipc.ServerContext, arg string) (result, blessing string, _ error) {
+	return arg, fmt.Sprintf("%v", ctx.Blessings()), nil
 }
 
 func (*testServer) EchoAndError(ctx ipc.ServerContext, arg string) (string, error) {
@@ -150,7 +151,7 @@
 }
 
 func (*testServer) Unauthorized(ipc.ServerCall) (string, error) {
-	return "UnauthorizedResult", fmt.Errorf("Unauthorized should never be called")
+	return "UnauthorizedResult", nil
 }
 
 type testServerAuthorizer struct{}
@@ -652,18 +653,18 @@
 	var (
 		tests = []testcase{
 			{"mountpoint/server/suffix", "Closure", nil, nil, nil, nil, nil},
-			{"mountpoint/server/suffix", "Error", nil, nil, nil, v{errMethod}, nil},
+			{"mountpoint/server/suffix", "Error", nil, nil, nil, nil, errMethod},
 
 			{"mountpoint/server/suffix", "Echo", v{"foo"}, nil, nil, v{`method:"Echo",suffix:"suffix",arg:"foo"`}, nil},
 			{"mountpoint/server/suffix/abc", "Echo", v{"bar"}, nil, nil, v{`method:"Echo",suffix:"suffix/abc",arg:"bar"`}, nil},
 
 			{"mountpoint/server/suffix", "EchoUser", v{"foo", userType("bar")}, nil, nil, v{`method:"EchoUser",suffix:"suffix",arg:"foo"`, userType("bar")}, nil},
 			{"mountpoint/server/suffix/abc", "EchoUser", v{"baz", userType("bla")}, nil, nil, v{`method:"EchoUser",suffix:"suffix/abc",arg:"baz"`, userType("bla")}, nil},
-			{"mountpoint/server/suffix", "Stream", v{"foo"}, v{userType("bar"), userType("baz")}, nil, v{`method:"Stream",suffix:"suffix",arg:"foo" bar baz`, nil}, nil},
-			{"mountpoint/server/suffix/abc", "Stream", v{"123"}, v{userType("456"), userType("789")}, nil, v{`method:"Stream",suffix:"suffix/abc",arg:"123" 456 789`, nil}, nil},
+			{"mountpoint/server/suffix", "Stream", v{"foo"}, v{userType("bar"), userType("baz")}, nil, v{`method:"Stream",suffix:"suffix",arg:"foo" bar baz`}, nil},
+			{"mountpoint/server/suffix/abc", "Stream", v{"123"}, v{userType("456"), userType("789")}, nil, v{`method:"Stream",suffix:"suffix/abc",arg:"123" 456 789`}, nil},
 			{"mountpoint/server/suffix", "EchoBlessings", nil, nil, nil, v{"[server]", "[client]"}, nil},
-			{"mountpoint/server/suffix", "EchoAndError", v{"bugs bunny"}, nil, nil, v{`method:"EchoAndError",suffix:"suffix",arg:"bugs bunny"`, nil}, nil},
-			{"mountpoint/server/suffix", "EchoAndError", v{"error"}, nil, nil, v{`method:"EchoAndError",suffix:"suffix",arg:"error"`, errMethod}, nil},
+			{"mountpoint/server/suffix", "EchoAndError", v{"bugs bunny"}, nil, nil, v{`method:"EchoAndError",suffix:"suffix",arg:"bugs bunny"`}, nil},
+			{"mountpoint/server/suffix", "EchoAndError", v{"error"}, nil, nil, nil, errMethod},
 		}
 		name = func(t testcase) string {
 			return fmt.Sprintf("%s.%s(%v)", t.name, t.method, t.args)
@@ -725,8 +726,10 @@
 		vlog.VI(1).Infof("%s client.Finish", name(test))
 		results := makeResultPtrs(test.results)
 		err = call.Finish(results...)
-		if err != test.finishErr {
-			t.Errorf(`%s call.Finish got error "%v", want "%v"`, name(test), err, test.finishErr)
+		if got, want := err, test.finishErr; (got == nil) != (want == nil) {
+			t.Errorf(`%s call.Finish got error "%v", want "%v'`, name(test), got, want)
+		} else if want != nil && !verror.Is(got, verror.ErrorID(want)) {
+			t.Errorf(`%s call.Finish got error "%v", want "%v"`, name(test), got, want)
 		}
 		checkResultPtrs(t, name(test), results, test.results)
 	}
@@ -1427,8 +1430,7 @@
 		t.Fatalf("client.StartCall failed: %v", err)
 	}
 	var got string
-	var ierr error
-	if err := call.Finish(&got, &ierr); err != nil {
+	if err := call.Finish(&got); err != nil {
 		t.Errorf("call.Finish failed: %v", err)
 	}
 	if want := "UnauthorizedResult"; got != want {
diff --git a/runtimes/google/ipc/proxy_test.go b/runtimes/google/ipc/proxy_test.go
index 7207320..0795737 100644
--- a/runtimes/google/ipc/proxy_test.go
+++ b/runtimes/google/ipc/proxy_test.go
@@ -48,8 +48,8 @@
 
 type testServer struct{}
 
-func (*testServer) Echo(ctx ipc.ServerContext, arg string) string {
-	return fmt.Sprintf("method:%q,suffix:%q,arg:%q", ctx.Method(), ctx.Suffix(), arg)
+func (*testServer) Echo(ctx ipc.ServerContext, arg string) (string, error) {
+	return fmt.Sprintf("method:%q,suffix:%q,arg:%q", ctx.Method(), ctx.Suffix(), arg), nil
 }
 
 type testServerAuthorizer struct{}
diff --git a/runtimes/google/ipc/server_test.go b/runtimes/google/ipc/server_test.go
index 5575b30..320f9e1 100644
--- a/runtimes/google/ipc/server_test.go
+++ b/runtimes/google/ipc/server_test.go
@@ -76,8 +76,7 @@
 		t.Fatalf("StartCall failed: %v", err)
 	}
 	var result string
-	var rerr error
-	if err = call.Finish(&result, &rerr); err == nil {
+	if err := call.Finish(&result); err == nil {
 		// TODO(caprita): Check the error type rather than
 		// merely ensuring the test doesn't panic.
 		t.Fatalf("should have failed")
@@ -125,8 +124,9 @@
 
 type statusServer struct{ ch chan struct{} }
 
-func (s *statusServer) Hang(ctx ipc.ServerContext) {
+func (s *statusServer) Hang(ctx ipc.ServerContext) error {
 	<-s.ch
+	return nil
 }
 
 func TestServerStatus(t *testing.T) {
diff --git a/runtimes/google/ipc/signature_test.go b/runtimes/google/ipc/signature_test.go
index 7dcc056..12215eb 100644
--- a/runtimes/google/ipc/signature_test.go
+++ b/runtimes/google/ipc/signature_test.go
@@ -34,10 +34,10 @@
 
 type sigImpl struct{}
 
-func (sigImpl) NonStreaming0(ipc.ServerContext)                          { panic("X") }
-func (sigImpl) NonStreaming1(_ ipc.ServerContext, _ string) error        { panic("X") }
-func (sigImpl) Streaming0(_ *streamStringBool)                           { panic("X") }
-func (sigImpl) Streaming1(_ *streamStringBool, _ int64) (float64, error) { panic("X") }
+func (sigImpl) NonStreaming0(ipc.ServerContext) error                      { panic("X") }
+func (sigImpl) NonStreaming1(_ ipc.ServerContext, _ string) (int64, error) { panic("X") }
+func (sigImpl) Streaming0(_ *streamStringBool) error                       { panic("X") }
+func (sigImpl) Streaming1(_ *streamStringBool, _ int64) (float64, error)   { panic("X") }
 
 type streamStringBool struct{ ipc.ServerCall }
 
@@ -75,7 +75,7 @@
 		{"NonStreaming1", signature.Method{
 			Name:    "NonStreaming1",
 			InArgs:  []signature.Arg{{Type: vdl.StringType}},
-			OutArgs: []signature.Arg{{Type: vdl.ErrorType}},
+			OutArgs: []signature.Arg{{Type: vdl.Int64Type}},
 		}},
 		{"Streaming0", signature.Method{
 			Name:      "Streaming0",
@@ -85,7 +85,7 @@
 		{"Streaming1", signature.Method{
 			Name:      "Streaming1",
 			InArgs:    []signature.Arg{{Type: vdl.Int64Type}},
-			OutArgs:   []signature.Arg{{Type: vdl.Float64Type}, {Type: vdl.ErrorType}},
+			OutArgs:   []signature.Arg{{Type: vdl.Float64Type}},
 			InStream:  &signature.Arg{Type: vdl.StringType},
 			OutStream: &signature.Arg{Type: vdl.BoolType},
 		}},
@@ -127,7 +127,7 @@
 			{
 				Name:    "NonStreaming1",
 				InArgs:  []signature.Arg{{Type: vdl.StringType}},
-				OutArgs: []signature.Arg{{Type: vdl.ErrorType}},
+				OutArgs: []signature.Arg{{Type: vdl.Int64Type}},
 			},
 			{
 				Name:      "Streaming0",
@@ -137,7 +137,7 @@
 			{
 				Name:      "Streaming1",
 				InArgs:    []signature.Arg{{Type: vdl.Int64Type}},
-				OutArgs:   []signature.Arg{{Type: vdl.Float64Type}, {Type: vdl.ErrorType}},
+				OutArgs:   []signature.Arg{{Type: vdl.Float64Type}},
 				InStream:  &signature.Arg{Type: vdl.StringType},
 				OutStream: &signature.Arg{Type: vdl.BoolType},
 			},
diff --git a/runtimes/google/ipc/simple_test.go b/runtimes/google/ipc/simple_test.go
index c5bf45c..f8546e8 100644
--- a/runtimes/google/ipc/simple_test.go
+++ b/runtimes/google/ipc/simple_test.go
@@ -7,7 +7,6 @@
 
 	"v.io/core/veyron2"
 	"v.io/core/veyron2/ipc"
-	"v.io/core/veyron2/verror"
 )
 
 type simple struct {
@@ -45,7 +44,10 @@
 	i := 0
 	for {
 		if err := call.Recv(&i); err != nil {
-			return i, err
+			if err == io.EOF {
+				return i, nil
+			}
+			return 0, err
 		}
 	}
 }
@@ -55,12 +57,9 @@
 	for {
 		if err := call.Recv(&i); err != nil {
 			if err == io.EOF {
-				// TODO(cnicolaou): this should return a verror, i.e.
-				// verror.New(verror.EOF, call), but for now we
-				// return an io.EOF
-				return i, io.EOF
+				return i, nil
 			}
-			return i, err
+			return 0, err
 		}
 		call.Send(i + inc)
 	}
@@ -78,9 +77,7 @@
 		t.Fatalf("unexpected error: %s", err)
 	}
 	response := ""
-	var verr error
-	err = call.Finish(&response, &verr)
-	if err != nil {
+	if err := call.Finish(&response); err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
 	if got, want := response, "pong"; got != want {
@@ -115,20 +112,11 @@
 	}
 	call.CloseSend()
 	final := -1
-	verr := call.Finish(&final, &err)
-	if verr != nil {
-		t.Fatalf("unexpected error: %s", verr)
-
+	err = call.Finish(&final)
+	if err != nil {
+		t.Errorf("unexpected error: %#v", err)
 	}
-	if !verror.Is(err, verror.ErrUnknown.ID) || err.Error() != `v.io/core/veyron2/verror.Unknown:   EOF` {
-		t.Errorf("wrong error: %#v", err)
-	}
-	/* TODO(cnicolaou): use this when verror/vom transition is done.
-	if err != nil && !verror.Is(err, verror.EOF.ID) {
-		t.Fatalf("unexpected error: %#v", err)
-	}
-	*/
 	if got := final; got != want {
-		t.Fatalf("got %d, want %d")
+		t.Fatalf("got %d, want %d", got, want)
 	}
 }
diff --git a/runtimes/google/naming/namespace/all_test.go b/runtimes/google/naming/namespace/all_test.go
index ab41beb..5790aef 100644
--- a/runtimes/google/naming/namespace/all_test.go
+++ b/runtimes/google/naming/namespace/all_test.go
@@ -101,8 +101,8 @@
 	suffix string
 }
 
-func (testServer) KnockKnock(ctx ipc.ServerContext) string {
-	return "Who's there?"
+func (testServer) KnockKnock(ctx ipc.ServerContext) (string, error) {
+	return "Who's there?", nil
 }
 
 // testServer has the following namespace:
diff --git a/runtimes/google/naming/namespace/glob.go b/runtimes/google/naming/namespace/glob.go
index 3d81e58..96bfc95 100644
--- a/runtimes/google/naming/namespace/glob.go
+++ b/runtimes/google/naming/namespace/glob.go
@@ -122,12 +122,7 @@
 		}
 		replies <- x
 	}
-
-	var globerr error
-	if err := call.Finish(&globerr); err != nil {
-		globerr = err
-	}
-	t.error = globerr
+	t.error = call.Finish()
 	return
 }
 
diff --git a/runtimes/google/naming/namespace/mount.go b/runtimes/google/naming/namespace/mount.go
index 55a5027..f1abe25 100644
--- a/runtimes/google/naming/namespace/mount.go
+++ b/runtimes/google/naming/namespace/mount.go
@@ -29,9 +29,7 @@
 	if err != nil {
 		return
 	}
-	if ierr := call.Finish(&s.err); ierr != nil {
-		s.err = ierr
-	}
+	s.err = call.Finish()
 	return
 }
 
@@ -44,9 +42,7 @@
 	if err != nil {
 		return
 	}
-	if ierr := call.Finish(&err); ierr != nil {
-		s.err = ierr
-	}
+	s.err = call.Finish()
 	return
 }
 
diff --git a/runtimes/google/naming/namespace/resolve.go b/runtimes/google/naming/namespace/resolve.go
index 8c4bfec..3ff22bb 100644
--- a/runtimes/google/naming/namespace/resolve.go
+++ b/runtimes/google/naming/namespace/resolve.go
@@ -38,18 +38,12 @@
 			continue
 		}
 		var entry naming.VDLMountEntry
-		ierr := call.Finish(&entry, &err)
-		if ierr != nil {
-			// Internal/system error.
-			finalErr = ierr
-			vlog.VI(2).Infof("ResolveStep.Finish %s failed: %s", name, ierr)
-			continue
-		}
-		// If any replica says the name doesn't exist, return that fact.
-		if err != nil {
+		if err := call.Finish(&entry); err != nil {
+			// If any replica says the name doesn't exist, return that fact.
 			if verror.Is(err, naming.ErrNoSuchName.ID) || verror.Is(err, naming.ErrNoSuchNameRoot.ID) {
 				return nil, err
 			}
+			// Keep track of the final error and continue with next server.
 			finalErr = err
 			vlog.VI(2).Infof("ResolveStep %s failed: %s", name, err)
 			continue
diff --git a/runtimes/google/rt/ipc_test.go b/runtimes/google/rt/ipc_test.go
index 102b978..c985e04 100644
--- a/runtimes/google/rt/ipc_test.go
+++ b/runtimes/google/rt/ipc_test.go
@@ -22,9 +22,9 @@
 
 type testService struct{}
 
-func (testService) EchoBlessings(call ipc.ServerContext) []string {
+func (testService) EchoBlessings(call ipc.ServerContext) ([]string, error) {
 	b, _ := call.RemoteBlessings().ForContext(call)
-	return b
+	return b, nil
 }
 
 type dischargeService struct{}
diff --git a/runtimes/google/rt/mgmt.go b/runtimes/google/rt/mgmt.go
index 56240d6..54926a7 100644
--- a/runtimes/google/rt/mgmt.go
+++ b/runtimes/google/rt/mgmt.go
@@ -84,12 +84,8 @@
 func (rt *Runtime) callbackToParent(ctx *context.T, parentName, myName string) error {
 	ctx, _ = context.WithTimeout(ctx, time.Minute)
 	call, err := rt.GetClient(ctx).StartCall(ctx, parentName, "Set", []interface{}{mgmt.AppCycleManagerConfigKey, myName})
-
 	if err != nil {
 		return err
 	}
-	if ierr := call.Finish(&err); ierr != nil {
-		return ierr
-	}
-	return err
+	return call.Finish()
 }
diff --git a/runtimes/google/vtrace/vtrace_test.go b/runtimes/google/vtrace/vtrace_test.go
index bfc442e..8ef5ece 100644
--- a/runtimes/google/vtrace/vtrace_test.go
+++ b/runtimes/google/vtrace/vtrace_test.go
@@ -73,15 +73,10 @@
 			vlog.Error(err)
 			return err
 		}
-		var outerr error
-		if err = call.Finish(&outerr); err != nil {
+		if err := call.Finish(); err != nil {
 			vlog.Error(err)
 			return err
 		}
-		if outerr != nil {
-			vlog.Error(outerr)
-			return outerr
-		}
 	}
 	vtrace.GetSpan(ctx.Context()).Annotate(c.name + "-end")
 
@@ -221,13 +216,9 @@
 	if err != nil {
 		t.Fatal("can't call: ", err)
 	}
-	var outerr error
-	if err = call.Finish(&outerr); err != nil {
+	if err := call.Finish(); err != nil {
 		t.Error(err)
 	}
-	if outerr != nil {
-		t.Error(outerr)
-	}
 }
 
 // TestCancellationPropagation tests that cancellation propogates along an