TBR namespace: ResolveX/ResolveToMountTableX become Resolve/ResolveToMountTable.
This change goes with the wspr change https://vanadium-review.googlesource.com/#/c/1928/

Change-Id: I32946684530ab02e6e74b7380746490308982c34
diff --git a/runtimes/google/ipc/client.go b/runtimes/google/ipc/client.go
index 596f736..2199a8d 100644
--- a/runtimes/google/ipc/client.go
+++ b/runtimes/google/ipc/client.go
@@ -398,8 +398,8 @@
 	var servers []string
 	var pattern security.BlessingPattern
 
-	if resolved, err := c.ns.ResolveX(ctx, name, resolveOpts...); err != nil {
-		vlog.Errorf("ResolveX: %v", err)
+	if resolved, err := c.ns.Resolve(ctx, name, resolveOpts...); err != nil {
+		vlog.Errorf("Resolve: %v", err)
 		if verror.Is(err, naming.ErrNoSuchName.ID) {
 			return nil, verror.RetryRefetch, verror.Make(verror.NoServers, ctx, name)
 		}
diff --git a/runtimes/google/ipc/client_test.go b/runtimes/google/ipc/client_test.go
index a124355..e44b5bb 100644
--- a/runtimes/google/ipc/client_test.go
+++ b/runtimes/google/ipc/client_test.go
@@ -98,7 +98,7 @@
 }
 
 func numServers(t *testing.T, name string) int {
-	me, err := veyron2.GetNamespace(gctx).ResolveX(gctx, name)
+	me, err := veyron2.GetNamespace(gctx).Resolve(gctx, name)
 	if err != nil {
 		return 0
 	}
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index 3db30e5..e8d702d 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -233,7 +233,7 @@
 }
 
 func verifyMount(t *testing.T, ns naming.Namespace, name string) []string {
-	me, err := ns.ResolveX(testContext(), name)
+	me, err := ns.Resolve(testContext(), name)
 	if err != nil {
 		t.Errorf("%s: %s not found in mounttable", loc(1), name)
 		return nil
@@ -242,7 +242,7 @@
 }
 
 func verifyMountMissing(t *testing.T, ns naming.Namespace, name string) {
-	if me, err := ns.ResolveX(testContext(), name); err == nil {
+	if me, err := ns.Resolve(testContext(), name); err == nil {
 		names := me.Names()
 		t.Errorf("%s: %s not supposed to be found in mounttable; got %d servers instead: %v", loc(1), name, len(names), names)
 	}
@@ -280,7 +280,7 @@
 // It must return a name since it'll be passed to StartCall.
 func fakeWSName(ns naming.Namespace, name string) (string, error) {
 	// Find the ws endpoint and use that.
-	me, err := ns.ResolveX(testContext(), name)
+	me, err := ns.Resolve(testContext(), name)
 	if err != nil {
 		return "", err
 	}
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index e6afaed..d6df99b 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -155,7 +155,7 @@
 	if s.ns != nil {
 		var entry *naming.MountEntry
 		var err error
-		if entry, err = s.ns.ResolveX(s.ctx, address); err != nil {
+		if entry, err = s.ns.Resolve(s.ctx, address); err != nil {
 			return "", err
 		}
 		names = entry.Names()
diff --git a/runtimes/google/ipc/server_test.go b/runtimes/google/ipc/server_test.go
index 1f362be..b71aed9 100644
--- a/runtimes/google/ipc/server_test.go
+++ b/runtimes/google/ipc/server_test.go
@@ -198,7 +198,7 @@
 	waitfor := func(expect int) {
 		then := time.Now().Add(time.Minute)
 		for {
-			me, err := ns.ResolveX(testContext(), name)
+			me, err := ns.Resolve(testContext(), name)
 			if err == nil && len(me.Servers) == expect {
 				close(ch)
 				return
@@ -268,7 +268,7 @@
 	}
 
 	for {
-		if _, err := ns.ResolveX(testContext(), name); err != nil {
+		if _, err := ns.Resolve(testContext(), name); err != nil {
 			break
 		}
 		time.Sleep(10 * time.Millisecond)
diff --git a/runtimes/google/lib/publisher/publisher.go b/runtimes/google/lib/publisher/publisher.go
index c5d35ed..5ccf6e7 100644
--- a/runtimes/google/lib/publisher/publisher.go
+++ b/runtimes/google/lib/publisher/publisher.go
@@ -342,7 +342,7 @@
 func (ps *pubState) published() []string {
 	var ret []string
 	for name, _ := range ps.names {
-		e, err := ps.ns.ResolveToMountTableX(ps.ctx, name)
+		e, err := ps.ns.ResolveToMountTable(ps.ctx, name)
 		if err != nil {
 			vlog.Errorf("ipc pub: couldn't resolve %v to mount table: %v", name, err)
 			continue
diff --git a/runtimes/google/lib/publisher/publisher_test.go b/runtimes/google/lib/publisher/publisher_test.go
index c0d0c4d..a947799 100644
--- a/runtimes/google/lib/publisher/publisher_test.go
+++ b/runtimes/google/lib/publisher/publisher_test.go
@@ -28,11 +28,11 @@
 }
 
 func resolve(t *testing.T, ns naming.Namespace, name string) []string {
-	servers, err := ns.Resolve(testContext(), name)
+	me, err := ns.Resolve(testContext(), name)
 	if err != nil {
 		t.Fatalf("failed to resolve %q", name)
 	}
-	return servers
+	return me.Names()
 }
 
 func TestAddAndRemove(t *testing.T) {
diff --git a/runtimes/google/naming/namespace/all_test.go b/runtimes/google/naming/namespace/all_test.go
index 406a884..ad898a7 100644
--- a/runtimes/google/naming/namespace/all_test.go
+++ b/runtimes/google/naming/namespace/all_test.go
@@ -149,19 +149,19 @@
 }
 
 func testResolveToMountTable(t *testing.T, ctx *context.T, ns naming.Namespace, name string, want ...string) {
-	doResolveTest(t, "ResolveToMountTable", ns.ResolveToMountTableX, ctx, name, want)
+	doResolveTest(t, "ResolveToMountTable", ns.ResolveToMountTable, ctx, name, want)
 }
 
 func testResolveToMountTableWithPattern(t *testing.T, ctx *context.T, ns naming.Namespace, name string, pattern naming.ResolveOpt, want ...string) {
-	doResolveTest(t, "ResolveToMountTable", ns.ResolveToMountTableX, ctx, name, want, pattern)
+	doResolveTest(t, "ResolveToMountTable", ns.ResolveToMountTable, ctx, name, want, pattern)
 }
 
 func testResolve(t *testing.T, ctx *context.T, ns naming.Namespace, name string, want ...string) {
-	doResolveTest(t, "Resolve", ns.ResolveX, ctx, name, want)
+	doResolveTest(t, "Resolve", ns.Resolve, ctx, name, want)
 }
 
 func testResolveWithPattern(t *testing.T, ctx *context.T, ns naming.Namespace, name string, pattern naming.ResolveOpt, want ...string) {
-	doResolveTest(t, "Resolve", ns.ResolveX, ctx, name, want, pattern)
+	doResolveTest(t, "Resolve", ns.Resolve, ctx, name, want, pattern)
 }
 
 type serverEntry struct {
@@ -562,7 +562,7 @@
 	for i := 0; i < 40; i++ {
 		cycle += "/c3/c4"
 	}
-	if _, err := ns.ResolveX(c, "c1/"+cycle); !verror.Is(err, naming.ErrResolutionDepthExceeded.ID) {
+	if _, err := ns.Resolve(c, "c1/"+cycle); !verror.Is(err, naming.ErrResolutionDepthExceeded.ID) {
 		boom(t, "Failed to detect cycle")
 	}
 
diff --git a/runtimes/google/naming/namespace/mount.go b/runtimes/google/naming/namespace/mount.go
index 9b7d186..66bf6d0 100644
--- a/runtimes/google/naming/namespace/mount.go
+++ b/runtimes/google/naming/namespace/mount.go
@@ -85,10 +85,11 @@
 // dispatch executes f in parallel for each mount table implementing mTName.
 func (ns *namespace) dispatch(ctx *context.T, mTName string, f func(*context.T, string, string) status) error {
 	// Resolve to all the mount tables implementing name.
-	mts, err := ns.ResolveToMountTable(ctx, mTName)
+	me, err := ns.ResolveToMountTable(ctx, mTName)
 	if err != nil {
 		return err
 	}
+	mts := me.Names()
 	// Apply f to each of the returned mount tables.
 	c := make(chan status, len(mts))
 	for _, mt := range mts {
diff --git a/runtimes/google/naming/namespace/resolve.go b/runtimes/google/naming/namespace/resolve.go
index 5c2d26a..97f8e9b 100644
--- a/runtimes/google/naming/namespace/resolve.go
+++ b/runtimes/google/naming/namespace/resolve.go
@@ -68,14 +68,14 @@
 	return len(e.Name) == 0
 }
 
-// ResolveX implements veyron2/naming.Namespace.
-func (ns *namespace) ResolveX(ctx *context.T, name string, opts ...naming.ResolveOpt) (*naming.MountEntry, error) {
+// Resolve implements veyron2/naming.Namespace.
+func (ns *namespace) Resolve(ctx *context.T, name string, opts ...naming.ResolveOpt) (*naming.MountEntry, error) {
 	defer vlog.LogCall()()
 	e, _ := ns.rootMountEntry(name)
 	if vlog.V(2) {
 		_, file, line, _ := runtime.Caller(1)
-		vlog.Infof("ResolveX(%s) called from %s:%d", name, file, line)
-		vlog.Infof("ResolveX(%s) -> rootMountEntry %v", name, *e)
+		vlog.Infof("Resolve(%s) called from %s:%d", name, file, line)
+		vlog.Infof("Resolve(%s) -> rootMountEntry %v", name, *e)
 	}
 	if skipResolve(opts) {
 		return e, nil
@@ -93,9 +93,9 @@
 	}
 	// Iterate walking through mount table servers.
 	for remaining := ns.maxResolveDepth; remaining > 0; remaining-- {
-		vlog.VI(2).Infof("ResolveX(%s) loop %v", name, *e)
+		vlog.VI(2).Infof("Resolve(%s) loop %v", name, *e)
 		if !e.ServesMountTable() || terminal(e) {
-			vlog.VI(1).Infof("ResolveX(%s) -> %v", name, *e)
+			vlog.VI(1).Infof("Resolve(%s) -> %v", name, *e)
 			return e, nil
 		}
 		var err error
@@ -104,13 +104,13 @@
 			// Lots of reasons why another error can happen.  We are trying
 			// to single out "this isn't a mount table".
 			if notAnMT(err) {
-				vlog.VI(1).Infof("ResolveX(%s) -> %v", name, curr)
+				vlog.VI(1).Infof("Resolve(%s) -> %v", name, curr)
 				return curr, nil
 			}
 			if verror.Is(err, naming.ErrNoSuchNameRoot.ID) {
 				err = verror.Make(naming.ErrNoSuchName, ctx, name)
 			}
-			vlog.VI(1).Infof("ResolveX(%s) -> (%s: %v)", err, name, curr)
+			vlog.VI(1).Infof("Resolve(%s) -> (%s: %v)", err, name, curr)
 			return nil, err
 		}
 		pattern = ""
@@ -118,24 +118,14 @@
 	return nil, verror.Make(naming.ErrResolutionDepthExceeded, ctx)
 }
 
-// Resolve implements veyron2/naming.Namespace.
-func (ns *namespace) Resolve(ctx *context.T, name string, opts ...naming.ResolveOpt) ([]string, error) {
-	defer vlog.LogCall()()
-	e, err := ns.ResolveX(ctx, name, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return e.Names(), nil
-}
-
-// ResolveToMountTableX implements veyron2/naming.Namespace.
-func (ns *namespace) ResolveToMountTableX(ctx *context.T, name string, opts ...naming.ResolveOpt) (*naming.MountEntry, error) {
+// ResolveToMountTable implements veyron2/naming.Namespace.
+func (ns *namespace) ResolveToMountTable(ctx *context.T, name string, opts ...naming.ResolveOpt) (*naming.MountEntry, error) {
 	defer vlog.LogCall()()
 	e, _ := ns.rootMountEntry(name)
 	if vlog.V(2) {
 		_, file, line, _ := runtime.Caller(1)
-		vlog.Infof("ResolveToMountTableX(%s) called from %s:%d", name, file, line)
-		vlog.Infof("ResolveToMountTableX(%s) -> rootNames %v", name, e)
+		vlog.Infof("ResolveToMountTable(%s) called from %s:%d", name, file, line)
+		vlog.Infof("ResolveToMountTable(%s) -> rootNames %v", name, e)
 	}
 	if len(e.Servers) == 0 {
 		return nil, verror.Make(naming.ErrNoMountTable, ctx)
@@ -144,33 +134,33 @@
 	client := veyron2.GetClient(ctx)
 	last := e
 	for remaining := ns.maxResolveDepth; remaining > 0; remaining-- {
-		vlog.VI(2).Infof("ResolveToMountTableX(%s) loop %v", name, e)
+		vlog.VI(2).Infof("ResolveToMountTable(%s) loop %v", name, e)
 		var err error
 		curr := e
 		// If the next name to resolve doesn't point to a mount table, we're done.
 		if !e.ServesMountTable() || terminal(e) {
-			vlog.VI(1).Infof("ResolveToMountTableX(%s) -> %v", name, last)
+			vlog.VI(1).Infof("ResolveToMountTable(%s) -> %v", name, last)
 			return last, nil
 		}
 		if e, err = ns.resolveAgainstMountTable(ctx, client, e, pattern); err != nil {
 			if verror.Is(err, naming.ErrNoSuchNameRoot.ID) {
-				vlog.VI(1).Infof("ResolveToMountTableX(%s) -> %v (NoSuchRoot: %v)", name, last, curr)
+				vlog.VI(1).Infof("ResolveToMountTable(%s) -> %v (NoSuchRoot: %v)", name, last, curr)
 				return last, nil
 			}
 			if verror.Is(err, naming.ErrNoSuchName.ID) {
-				vlog.VI(1).Infof("ResolveToMountTableX(%s) -> %v (NoSuchName: %v)", name, curr, curr)
+				vlog.VI(1).Infof("ResolveToMountTable(%s) -> %v (NoSuchName: %v)", name, curr, curr)
 				return curr, nil
 			}
 			// Lots of reasons why another error can happen.  We are trying
 			// to single out "this isn't a mount table".
 			if notAnMT(err) {
-				vlog.VI(1).Infof("ResolveToMountTableX(%s) -> %v", name, last)
+				vlog.VI(1).Infof("ResolveToMountTable(%s) -> %v", name, last)
 				return last, nil
 			}
 			// TODO(caprita): If the server is unreachable for
 			// example, we may still want to return its parent
 			// mounttable rather than an error.
-			vlog.VI(1).Infof("ResolveToMountTableX(%s) -> %v", name, err)
+			vlog.VI(1).Infof("ResolveToMountTable(%s) -> %v", name, err)
 			return nil, err
 		}
 		last = curr
@@ -179,16 +169,6 @@
 	return nil, verror.Make(naming.ErrResolutionDepthExceeded, ctx)
 }
 
-// ResolveToMountTable implements veyron2/naming.Namespace.
-func (ns *namespace) ResolveToMountTable(ctx *context.T, name string, opts ...naming.ResolveOpt) ([]string, error) {
-	defer vlog.LogCall()()
-	e, err := ns.ResolveToMountTableX(ctx, name, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return e.Names(), nil
-}
-
 // FlushCache flushes the most specific entry found for name.  It returns true if anything was
 // actually flushed.
 func (ns *namespace) FlushCacheEntry(name string) bool {
diff --git a/runtimes/google/testing/mocks/naming/namespace.go b/runtimes/google/testing/mocks/naming/namespace.go
index c46eca8..ad9a139 100644
--- a/runtimes/google/testing/mocks/naming/namespace.go
+++ b/runtimes/google/testing/mocks/naming/namespace.go
@@ -65,29 +65,9 @@
 	return nil
 }
 
-func (ns *namespace) Resolve(ctx *context.T, name string, opts ...naming.ResolveOpt) ([]string, error) {
+func (ns *namespace) Resolve(ctx *context.T, name string, opts ...naming.ResolveOpt) (*naming.MountEntry, error) {
 	defer vlog.LogCall()()
-	if address, _ := naming.SplitAddressName(name); len(address) > 0 {
-		return []string{name}, nil
-	}
-	ns.Lock()
-	defer ns.Unlock()
-	for prefix, servers := range ns.mounts {
-		if strings.HasPrefix(name, prefix) {
-			suffix := strings.TrimLeft(strings.TrimPrefix(name, prefix), "/")
-			var ret []string
-			for _, s := range servers {
-				ret = append(ret, naming.JoinAddressName(s, suffix))
-			}
-			return ret, nil
-		}
-	}
-	return nil, verror.Make(naming.ErrNoSuchName, ctx, fmt.Sprintf("Resolve name %q not found in %v", name, ns.mounts))
-}
-
-func (ns *namespace) ResolveX(ctx *context.T, name string, opts ...naming.ResolveOpt) (*naming.MountEntry, error) {
-	defer vlog.LogCall()()
-	e, err := ns.ns.ResolveX(ctx, name, options.NoResolve{})
+	e, err := ns.ns.Resolve(ctx, name, options.NoResolve{})
 	if err != nil {
 		return e, err
 	}
@@ -111,14 +91,7 @@
 	return nil, verror.Make(naming.ErrNoSuchName, ctx, fmt.Sprintf("Resolve name %q not found in %v", name, ns.mounts))
 }
 
-func (ns *namespace) ResolveToMountTableX(ctx *context.T, name string, opts ...naming.ResolveOpt) (*naming.MountEntry, error) {
-	defer vlog.LogCall()()
-	// TODO(mattr): Implement this method for tests that might need it.
-	panic("ResolveToMountTable not implemented")
-	return nil, nil
-}
-
-func (ns *namespace) ResolveToMountTable(ctx *context.T, name string, opts ...naming.ResolveOpt) ([]string, error) {
+func (ns *namespace) ResolveToMountTable(ctx *context.T, name string, opts ...naming.ResolveOpt) (*naming.MountEntry, error) {
 	defer vlog.LogCall()()
 	// TODO(mattr): Implement this method for tests that might need it.
 	panic("ResolveToMountTable not implemented")
diff --git a/services/mgmt/device/impl/util_test.go b/services/mgmt/device/impl/util_test.go
index dd072de..4d8be6d 100644
--- a/services/mgmt/device/impl/util_test.go
+++ b/services/mgmt/device/impl/util_test.go
@@ -45,8 +45,8 @@
 
 // resolveExpectNotFound verifies that the given name is not in the mounttable.
 func resolveExpectNotFound(t *testing.T, name string) {
-	if results, err := veyron2.GetNamespace(globalCtx).Resolve(globalCtx, name); err == nil {
-		t.Fatalf(testutil.FormatLogLine(2, "Resolve(%v) succeeded with results %v when it was expected to fail", name, results))
+	if me, err := veyron2.GetNamespace(globalCtx).Resolve(globalCtx, name); err == nil {
+		t.Fatalf(testutil.FormatLogLine(2, "Resolve(%v) succeeded with results %v when it was expected to fail", name, me.Names()))
 	} else if expectErr := naming.ErrNoSuchName.ID; !verror2.Is(err, expectErr) {
 		t.Fatalf(testutil.FormatLogLine(2, "Resolve(%v) failed with error %v, expected error ID %v", name, err, expectErr))
 	}
@@ -54,13 +54,13 @@
 
 // resolve looks up the given name in the mounttable.
 func resolve(t *testing.T, name string, replicas int) []string {
-	results, err := veyron2.GetNamespace(globalCtx).Resolve(globalCtx, name)
+	me, err := veyron2.GetNamespace(globalCtx).Resolve(globalCtx, name)
 	if err != nil {
 		t.Fatalf("Resolve(%v) failed: %v", name, err)
 	}
 
 	filteredResults := []string{}
-	for _, r := range results {
+	for _, r := range me.Names() {
 		if strings.Index(r, "@tcp") != -1 {
 			filteredResults = append(filteredResults, r)
 		}
diff --git a/services/mounttable/lib/neighborhood_test.go b/services/mounttable/lib/neighborhood_test.go
index 7b48e53..6f197d6 100644
--- a/services/mounttable/lib/neighborhood_test.go
+++ b/services/mounttable/lib/neighborhood_test.go
@@ -83,13 +83,13 @@
 
 	client := veyron2.GetClient(rootCtx)
 	name := naming.JoinAddressName(estr, serverName+"/"+expectedSuffix)
-	call, cerr := client.StartCall(rootCtx, name, "ResolveStepX", nil, options.NoResolve{})
+	call, cerr := client.StartCall(rootCtx, name, "ResolveStep", nil, options.NoResolve{})
 	if cerr != nil {
-		boom(t, "ResolveStepX.StartCall: %s", cerr)
+		boom(t, "ResolveStep.StartCall: %s", cerr)
 	}
 	var entry naming.VDLMountEntry
 	if cerr = call.Finish(&entry, &err); cerr != nil {
-		boom(t, "ResolveStepX: %s", cerr)
+		boom(t, "ResolveStep: %s", cerr)
 	}
 
 	// Resolution returned something.  Make sure its correct.
diff --git a/tools/namespace/impl.go b/tools/namespace/impl.go
index b2df4db..cae7c40 100644
--- a/tools/namespace/impl.go
+++ b/tools/namespace/impl.go
@@ -145,12 +145,12 @@
 
 	ns := veyron2.GetNamespace(ctx)
 
-	servers, err := ns.Resolve(ctx, name)
+	me, err := ns.Resolve(ctx, name)
 	if err != nil {
 		vlog.Infof("ns.Resolve(%q) failed: %v", name, err)
 		return err
 	}
-	for _, s := range servers {
+	for _, s := range me.Names() {
 		fmt.Fprintln(cmd.Stdout(), s)
 	}
 	return nil
@@ -176,9 +176,9 @@
 
 	ns := veyron2.GetNamespace(ctx)
 
-	e, err := ns.ResolveToMountTableX(ctx, name)
+	e, err := ns.ResolveToMountTable(ctx, name)
 	if err != nil {
-		vlog.Infof("ns.ResolveToMountTableX(%q) failed: %v", name, err)
+		vlog.Infof("ns.ResolveToMountTable(%q) failed: %v", name, err)
 		return err
 	}
 	for _, s := range e.Servers {
diff --git a/tools/naming/simulator/shell_functions.go b/tools/naming/simulator/shell_functions.go
index 396fe6d..552635b 100644
--- a/tools/naming/simulator/shell_functions.go
+++ b/tools/naming/simulator/shell_functions.go
@@ -87,18 +87,19 @@
 	return nil
 }
 
-type resolver func(ctx *context.T, name string, opts ...naming.ResolveOpt) (names []string, err error)
+type resolver func(ctx *context.T, name string, opts ...naming.ResolveOpt) (me *naming.MountEntry, err error)
 
 func resolve(fn resolver, stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
 	if err := checkArgs(args[1:], 1, "<name>"); err != nil {
 		return err
 	}
 	name := args[1]
-	servers, err := fn(ctx, name)
+	me, err := fn(ctx, name)
 	if err != nil {
 		fmt.Fprintf(stdout, "RN=0\n")
 		return err
 	}
+	servers := me.Names()
 	fmt.Fprintf(stdout, "RN=%d\n", len(servers))
 	for i, s := range servers {
 		fmt.Fprintf(stdout, "R%d=%s\n", i, s)