v.io/x/ref/lib/stats: Use verror instead of fmt.Errorf or errors.New

This change replaces uses of fmt.Errorf and errors.New in lib/stats/...
with verror, and fixes up the dependencies.
The format strings are largely the same:

verror.NoExist is used instead of stats.ErrNotFound, and
stats.ErrNoValue (from services/mgmt/stats) is used instead of stats.ErrNoValue

Tested:
	cd v.io
	v23 go test ./...
	v23 test run vanadium-go-test

Change-Id: I8459ce235b6bbd6c551dbb9cdd45b2116970a8ef
diff --git a/lib/stats/glob.go b/lib/stats/glob.go
index 51b9a83..bcb2997 100644
--- a/lib/stats/glob.go
+++ b/lib/stats/glob.go
@@ -9,6 +9,7 @@
 	"sort"
 	"time"
 
+	"v.io/v23/verror"
 	"v.io/x/ref/lib/glob"
 )
 
@@ -31,7 +32,7 @@
 	defer lock.RUnlock()
 	node := findNodeLocked(root, false)
 	if node == nil {
-		return &GlobIterator{err: ErrNotFound}
+		return &GlobIterator{err: verror.New(verror.ErrNoExist, nil, root)}
 	}
 	var out []KeyValue
 	globStepLocked("", g, node, updatedSince, includeValues, &out)
diff --git a/lib/stats/histogram/histogram.go b/lib/stats/histogram/histogram.go
index 246a3aa..4277d6f 100644
--- a/lib/stats/histogram/histogram.go
+++ b/lib/stats/histogram/histogram.go
@@ -7,13 +7,19 @@
 package histogram
 
 import (
-	"fmt"
 	"time"
 
+	"v.io/v23/verror"
 	"v.io/x/ref/lib/stats/counter"
 	"v.io/x/ref/services/mgmt/stats"
 )
 
+const pkgPath = "v.io/x/ref/lib/stats/histogram"
+
+var (
+	errNoBucketForValue = verror.Register(pkgPath+".errNoBucketForValue", verror.NoRetry, "{1:}{2:} no bucket for value{:_}")
+)
+
 // A Histogram accumulates values in the form of a histogram. The type of the
 // values is int64, which is suitable for keeping track of things like RPC
 // latency in milliseconds. New histogram objects should be obtained via the
@@ -192,5 +198,5 @@
 		}
 		min = b + 1
 	}
-	return 0, fmt.Errorf("no bucket for value: %f", value)
+	return 0, verror.New(errNoBucketForValue, nil, value)
 }
diff --git a/lib/stats/stats.go b/lib/stats/stats.go
index e5932b4..2bdc961 100644
--- a/lib/stats/stats.go
+++ b/lib/stats/stats.go
@@ -16,10 +16,12 @@
 package stats
 
 import (
-	"errors"
 	"strings"
 	"sync"
 	"time"
+
+	mgmtstats "v.io/v23/services/mgmt/stats"
+	"v.io/v23/verror"
 )
 
 // StatsObject is the interface for objects stored in the stats repository.
@@ -36,10 +38,8 @@
 }
 
 var (
-	lock        sync.RWMutex
-	repository  *node // GUARDED_BY(lock)
-	ErrNotFound = errors.New("name not found")
-	ErrNoValue  = errors.New("object has no value")
+	lock       sync.RWMutex
+	repository *node // GUARDED_BY(lock)
 )
 
 func init() {
@@ -53,7 +53,7 @@
 	defer lock.RUnlock()
 	node := findNodeLocked(name, false)
 	if node == nil || node.object == nil {
-		return nil, ErrNotFound
+		return nil, verror.New(verror.ErrNoExist, nil, name)
 	}
 	return node.object, nil
 }
@@ -66,7 +66,7 @@
 		return 0, err
 	}
 	if obj == nil {
-		return nil, ErrNoValue
+		return nil, verror.New(mgmtstats.ErrNoValue, nil, name)
 	}
 	return obj.Value(), nil
 }
@@ -74,7 +74,7 @@
 // Delete deletes a StatsObject and all its children, if any.
 func Delete(name string) error {
 	if name == "" {
-		return ErrNotFound
+		return verror.New(verror.ErrNoExist, nil, name)
 	}
 	elems := strings.Split(name, "/")
 	last := len(elems) - 1
@@ -83,7 +83,7 @@
 	defer lock.Unlock()
 	parent := findNodeLocked(dirname, false)
 	if parent == nil {
-		return ErrNotFound
+		return verror.New(verror.ErrNoExist, nil, name)
 	}
 	delete(parent.children, basename)
 	return nil
diff --git a/lib/stats/stats_test.go b/lib/stats/stats_test.go
index 60aa37d..be5f3ed 100644
--- a/lib/stats/stats_test.go
+++ b/lib/stats/stats_test.go
@@ -9,6 +9,7 @@
 	"testing"
 	"time"
 
+	"v.io/v23/verror"
 	libstats "v.io/x/ref/lib/stats"
 	"v.io/x/ref/lib/stats/counter"
 	"v.io/x/ref/lib/stats/histogram"
@@ -49,11 +50,11 @@
 		t.Errorf("unexpected result. Got %v, want %v", got, expected)
 	}
 
-	if _, err := libstats.Value(""); err != libstats.ErrNotFound {
-		t.Errorf("expected error, got err=%v", err)
+	if _, err := libstats.Value(""); verror.ErrorID(err) != verror.ErrNoExist.ID {
+		t.Errorf("expected error %s, got err=%s", verror.ErrNoExist.ID, verror.ErrorID(err))
 	}
-	if _, err := libstats.Value("does/not/exist"); err != libstats.ErrNotFound {
-		t.Errorf("expected error, got err=%v", err)
+	if _, err := libstats.Value("does/not/exist"); verror.ErrorID(err) != verror.ErrNoExist.ID {
+		t.Errorf("expected error %s, got err=%s", verror.ErrNoExist.ID, verror.ErrorID(err))
 	}
 
 	root := libstats.NewInteger("")
@@ -376,16 +377,16 @@
 	if err := libstats.Delete("a/b/c/d"); err != nil {
 		t.Errorf("unexpected error value: %v", err)
 	}
-	if _, err := libstats.GetStatsObject("a/b/c/d"); err != libstats.ErrNotFound {
-		t.Errorf("unexpected error value: Got %v, want %v", err, libstats.ErrNotFound)
+	if _, err := libstats.GetStatsObject("a/b/c/d"); verror.ErrorID(err) != verror.ErrNoExist.ID {
+		t.Errorf("unexpected error value: Got %v, want %v", verror.ErrorID(err), verror.ErrNoExist.ID)
 	}
 	if err := libstats.Delete("a/b"); err != nil {
 		t.Errorf("unexpected error value: %v", err)
 	}
-	if _, err := libstats.GetStatsObject("a/b"); err != libstats.ErrNotFound {
-		t.Errorf("unexpected error value: Got %v, want %v", err, libstats.ErrNotFound)
+	if _, err := libstats.GetStatsObject("a/b"); verror.ErrorID(err) != verror.ErrNoExist.ID {
+		t.Errorf("unexpected error value: Got %v, want %v", verror.ErrorID(err), verror.ErrNoExist.ID)
 	}
-	if _, err := libstats.GetStatsObject("a/b/c"); err != libstats.ErrNotFound {
-		t.Errorf("unexpected error value: Got %v, want %v", err, libstats.ErrNotFound)
+	if _, err := libstats.GetStatsObject("a/b/c"); verror.ErrorID(err) != verror.ErrNoExist.ID {
+		t.Errorf("unexpected error value: Got %v, want %v", verror.ErrorID(err), verror.ErrNoExist.ID)
 	}
 }