Merge "veyron/services/wsprd: Use the origin from the websocket to link the identity to the pipe."
diff --git a/services/store/memstore/blackbox/many_to_many/many_to_many_test.go b/services/store/memstore/blackbox/many_to_many/many_to_many_test.go
index 7b62ff4..a925681 100644
--- a/services/store/memstore/blackbox/many_to_many/many_to_many_test.go
+++ b/services/store/memstore/blackbox/many_to_many/many_to_many_test.go
@@ -6,7 +6,6 @@
"veyron/services/store/memstore"
"veyron/services/store/memstore/blackbox"
- "veyron/services/store/service"
"veyron2/security"
"veyron2/storage"
@@ -89,7 +88,7 @@
return &Role{Position: pos, Player: playerID, Team: teamID}
}
-func getPerson(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Person) {
+func getPerson(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) (storage.ID, *Person) {
_, file, line, _ := runtime.Caller(1)
e := blackbox.Get(t, st, tr, path)
v := e.Value
@@ -100,7 +99,7 @@
return e.Stat.ID, p
}
-func getPlayer(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Player) {
+func getPlayer(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) (storage.ID, *Player) {
_, file, line, _ := runtime.Caller(1)
e := blackbox.Get(t, st, tr, path)
v := e.Value
@@ -111,7 +110,7 @@
return e.Stat.ID, p
}
-func getTeam(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Team) {
+func getTeam(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) (storage.ID, *Team) {
_, file, line, _ := runtime.Caller(1)
e := blackbox.Get(t, st, tr, path)
v := e.Value
@@ -122,7 +121,7 @@
return e.Stat.ID, p
}
-func getRole(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Role) {
+func getRole(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) (storage.ID, *Role) {
_, file, line, _ := runtime.Caller(1)
e := blackbox.Get(t, st, tr, path)
v := e.Value
@@ -221,7 +220,7 @@
return &DirectTeam{}
}
-func getDirectPlayer(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *DirectPlayer) {
+func getDirectPlayer(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) (storage.ID, *DirectPlayer) {
_, file, line, _ := runtime.Caller(1)
e := blackbox.Get(t, st, tr, path)
v := e.Value
@@ -232,7 +231,7 @@
return e.Stat.ID, p
}
-func getDirectTeam(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *DirectTeam) {
+func getDirectTeam(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) (storage.ID, *DirectTeam) {
_, file, line, _ := runtime.Caller(1)
e := blackbox.Get(t, st, tr, path)
v := e.Value
diff --git a/services/store/memstore/blackbox/photoalbum_test.go b/services/store/memstore/blackbox/photoalbum_test.go
index ad9e487..b1deb61 100644
--- a/services/store/memstore/blackbox/photoalbum_test.go
+++ b/services/store/memstore/blackbox/photoalbum_test.go
@@ -5,7 +5,6 @@
"testing"
"veyron/services/store/memstore"
- "veyron/services/store/service"
"veyron2/storage"
"veyron2/vom"
@@ -65,7 +64,7 @@
return &Photo{Content: content, Comment: comment}
}
-func getPhoto(t *testing.T, st *memstore.Store, tr service.Transaction, path string) *Photo {
+func getPhoto(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) *Photo {
_, file, line, _ := runtime.Caller(1)
v := Get(t, st, tr, path).Value
p, ok := v.(*Photo)
diff --git a/services/store/memstore/blackbox/team_player_test.go b/services/store/memstore/blackbox/team_player_test.go
index 61a1255..a086129 100644
--- a/services/store/memstore/blackbox/team_player_test.go
+++ b/services/store/memstore/blackbox/team_player_test.go
@@ -6,7 +6,6 @@
"veyron/services/store/memstore"
"veyron/services/store/memstore/state"
- "veyron/services/store/service"
"veyron2/storage"
"veyron2/vom"
@@ -41,7 +40,7 @@
return &Team{FullName: name}
}
-func getPlayer(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Player) {
+func getPlayer(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) (storage.ID, *Player) {
_, file, line, _ := runtime.Caller(1)
e := Get(t, st, tr, path)
p, ok := e.Value.(*Player)
@@ -51,7 +50,7 @@
return e.Stat.ID, p
}
-func getTeam(t *testing.T, st *memstore.Store, tr service.Transaction, path string) (storage.ID, *Team) {
+func getTeam(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) (storage.ID, *Team) {
_, file, line, _ := runtime.Caller(1)
e := Get(t, st, tr, path)
p, ok := e.Value.(*Team)
diff --git a/services/store/memstore/blackbox/util.go b/services/store/memstore/blackbox/util.go
index c618fb8..5d99c44 100644
--- a/services/store/memstore/blackbox/util.go
+++ b/services/store/memstore/blackbox/util.go
@@ -10,7 +10,6 @@
"veyron/services/store/memstore"
memwatch "veyron/services/store/memstore/watch"
"veyron/services/store/raw"
- "veyron/services/store/service"
"veyron2/ipc"
"veyron2/naming"
@@ -84,7 +83,7 @@
return nil
}
-func Get(t *testing.T, st *memstore.Store, tr service.Transaction, path string) *storage.Entry {
+func Get(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) *storage.Entry {
_, file, line, _ := runtime.Caller(1)
e, err := st.Bind(path).Get(rootPublicID, tr)
if err != nil {
@@ -93,7 +92,7 @@
return e
}
-func Put(t *testing.T, st *memstore.Store, tr service.Transaction, path string, v interface{}) storage.ID {
+func Put(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string, v interface{}) storage.ID {
_, file, line, _ := runtime.Caller(1)
stat, err := st.Bind(path).Put(rootPublicID, tr, v)
if err != nil {
@@ -109,14 +108,14 @@
return storage.ID{}
}
-func Remove(t *testing.T, st *memstore.Store, tr service.Transaction, path string) {
+func Remove(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) {
_, file, line, _ := runtime.Caller(1)
if err := st.Bind(path).Remove(rootPublicID, tr); err != nil {
t.Fatalf("%s(%d): can't remove %s: %s", file, line, path, err)
}
}
-func Commit(t *testing.T, tr service.Transaction) {
+func Commit(t *testing.T, tr *memstore.Transaction) {
if err := tr.Commit(); err != nil {
t.Fatalf("Transaction aborted: %s", err)
}
@@ -177,7 +176,7 @@
}
}
-func OpenWatch(t *testing.T, dbName string) (service.Watcher, func()) {
+func OpenWatch(t *testing.T, dbName string) (*memwatch.Watcher, func()) {
w, err := memwatch.New(rootPublicID, dbName)
if err != nil {
t.Fatalf("New() failed: %v", err)
diff --git a/services/store/memstore/object.go b/services/store/memstore/object.go
index 411b0a2..9fb0540 100644
--- a/services/store/memstore/object.go
+++ b/services/store/memstore/object.go
@@ -2,7 +2,6 @@
import (
iquery "veyron/services/store/memstore/query"
- "veyron/services/store/service"
"veyron2/query"
"veyron2/security"
@@ -19,7 +18,7 @@
}
// Exists returns true iff the object has a value in the current transaction.
-func (o *Object) Exists(pid security.PublicID, trans service.Transaction) (bool, error) {
+func (o *Object) Exists(pid security.PublicID, trans *Transaction) (bool, error) {
tr, _, err := o.store.getTransaction(trans)
if err != nil {
return false, err
@@ -30,7 +29,7 @@
}
// Get returns the value for an object.
-func (o *Object) Get(pid security.PublicID, trans service.Transaction) (*storage.Entry, error) {
+func (o *Object) Get(pid security.PublicID, trans *Transaction) (*storage.Entry, error) {
tr, _, err := o.store.getTransaction(trans)
if err != nil {
return nil, err
@@ -39,7 +38,7 @@
}
// Put updates the value for an object.
-func (o *Object) Put(pid security.PublicID, trans service.Transaction, v interface{}) (*storage.Stat, error) {
+func (o *Object) Put(pid security.PublicID, trans *Transaction, v interface{}) (*storage.Stat, error) {
tr, commit, err := o.store.getTransaction(trans)
if err != nil {
return nil, err
@@ -55,7 +54,7 @@
}
// Remove removes the value for an object.
-func (o *Object) Remove(pid security.PublicID, trans service.Transaction) error {
+func (o *Object) Remove(pid security.PublicID, trans *Transaction) error {
tr, commit, err := o.store.getTransaction(trans)
if err != nil {
return err
@@ -70,12 +69,12 @@
}
// Stat returns entry info.
-func (o *Object) Stat(pid security.PublicID, tr service.Transaction) (*storage.Stat, error) {
+func (o *Object) Stat(pid security.PublicID, trans *Transaction) (*storage.Stat, error) {
return nil, verror.Internalf("Stat not yet implemented")
}
// Query returns entries matching the given query.
-func (o *Object) Query(pid security.PublicID, trans service.Transaction, q query.Query) (iquery.QueryStream, error) {
+func (o *Object) Query(pid security.PublicID, trans *Transaction, q query.Query) (iquery.QueryStream, error) {
tr, _, err := o.store.getTransaction(trans)
if err != nil {
return nil, err
@@ -85,7 +84,7 @@
}
// Glob returns names that match the given pattern.
-func (o *Object) Glob(pid security.PublicID, trans service.Transaction, pattern string) (iquery.GlobStream, error) {
+func (o *Object) Glob(pid security.PublicID, trans *Transaction, pattern string) (iquery.GlobStream, error) {
tr, _, err := o.store.getTransaction(trans)
if err != nil {
return nil, err
diff --git a/services/store/memstore/transaction.go b/services/store/memstore/transaction.go
index bb82a34..cf01271 100644
--- a/services/store/memstore/transaction.go
+++ b/services/store/memstore/transaction.go
@@ -4,8 +4,6 @@
"sync"
"veyron/services/store/memstore/state"
- "veyron/services/store/service"
- "veyron2/verror"
)
// Transaction is the type of transactions. Each transaction has a snapshot of
@@ -21,10 +19,6 @@
snapshot *state.MutableSnapshot
}
-var (
- errBadTransaction = verror.BadArgf("bad transaction")
-)
-
// newNilTransaction is used when nil is passed in as the transaction for an
// object operation. This means that the operation is to be performed on the
// state <st>.
@@ -39,20 +33,16 @@
// that the transaction lifetime is the duration of the operation (so the
// transaction should be committed immediately after the operation that uses it
// is performed).
-func (st *Store) getTransaction(tr service.Transaction) (*Transaction, bool, error) {
+func (st *Store) getTransaction(tr *Transaction) (*Transaction, bool, error) {
if tr == nil {
return st.newNilTransaction(), true, nil
}
- t, ok := tr.(*Transaction)
- if !ok {
- return nil, false, errBadTransaction
- }
- t.useState(st)
- return t, false, nil
+ tr.useState(st)
+ return tr, false, nil
}
// GetTransactionSnapshot returns a read-only snapshot from the transaction.
-func (st *Store) GetTransactionSnapshot(tr service.Transaction) (state.Snapshot, error) {
+func (st *Store) GetTransactionSnapshot(tr *Transaction) (state.Snapshot, error) {
t, _, err := st.getTransaction(tr)
if err != nil {
return nil, err
diff --git a/services/store/memstore/util_test.go b/services/store/memstore/util_test.go
index c95f94b..a7571ee 100644
--- a/services/store/memstore/util_test.go
+++ b/services/store/memstore/util_test.go
@@ -4,12 +4,10 @@
"runtime"
"testing"
- "veyron/services/store/service"
-
"veyron2/storage"
)
-func mkdir(t *testing.T, st *Store, tr service.Transaction, path string) (storage.ID, interface{}) {
+func mkdir(t *testing.T, st *Store, tr *Transaction, path string) (storage.ID, interface{}) {
_, file, line, _ := runtime.Caller(1)
dir := &Dir{}
stat, err := st.Bind(path).Put(rootPublicID, tr, dir)
@@ -19,7 +17,7 @@
return stat.ID, dir
}
-func get(t *testing.T, st *Store, tr service.Transaction, path string) interface{} {
+func get(t *testing.T, st *Store, tr *Transaction, path string) interface{} {
_, file, line, _ := runtime.Caller(1)
e, err := st.Bind(path).Get(rootPublicID, tr)
if err != nil {
@@ -28,7 +26,7 @@
return e.Value
}
-func put(t *testing.T, st *Store, tr service.Transaction, path string, v interface{}) storage.ID {
+func put(t *testing.T, st *Store, tr *Transaction, path string, v interface{}) storage.ID {
_, file, line, _ := runtime.Caller(1)
stat, err := st.Bind(path).Put(rootPublicID, tr, v)
if err != nil {
@@ -43,35 +41,35 @@
return storage.ID{}
}
-func remove(t *testing.T, st *Store, tr service.Transaction, path string) {
+func remove(t *testing.T, st *Store, tr *Transaction, path string) {
if err := st.Bind(path).Remove(rootPublicID, tr); err != nil {
_, file, line, _ := runtime.Caller(1)
t.Errorf("%s(%d): can't remove %s: %s", file, line, path, err)
}
}
-func commit(t *testing.T, tr service.Transaction) {
+func commit(t *testing.T, tr *Transaction) {
if err := tr.Commit(); err != nil {
_, file, line, _ := runtime.Caller(1)
t.Fatalf("%s(%d): Transaction aborted: %s", file, line, err)
}
}
-func expectExists(t *testing.T, st *Store, tr service.Transaction, path string) {
+func expectExists(t *testing.T, st *Store, tr *Transaction, path string) {
_, file, line, _ := runtime.Caller(1)
if ok, _ := st.Bind(path).Exists(rootPublicID, tr); !ok {
t.Errorf("%s(%d): does not exist: %s", file, line, path)
}
}
-func expectNotExists(t *testing.T, st *Store, tr service.Transaction, path string) {
+func expectNotExists(t *testing.T, st *Store, tr *Transaction, path string) {
if e, err := st.Bind(path).Get(rootPublicID, tr); err == nil {
_, file, line, _ := runtime.Caller(1)
t.Errorf("%s(%d): should not exist: %s: got %+v", file, line, path, e.Value)
}
}
-func expectValue(t *testing.T, st *Store, tr service.Transaction, path string, v interface{}) {
+func expectValue(t *testing.T, st *Store, tr *Transaction, path string, v interface{}) {
_, file, line, _ := runtime.Caller(1)
e, err := st.Bind(path).Get(rootPublicID, tr)
if err != nil {
diff --git a/services/store/memstore/watch/test_util.go b/services/store/memstore/watch/test_util.go
index 882e03e..2a5216b 100644
--- a/services/store/memstore/watch/test_util.go
+++ b/services/store/memstore/watch/test_util.go
@@ -8,7 +8,6 @@
"veyron/services/store/memstore"
"veyron/services/store/memstore/state"
- "veyron/services/store/service"
"veyron2/security"
"veyron2/services/watch"
@@ -19,7 +18,7 @@
rootPublicID security.PublicID = security.FakePublicID("root")
)
-func get(t *testing.T, st *memstore.Store, tr service.Transaction, path string) interface{} {
+func get(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) interface{} {
_, file, line, _ := runtime.Caller(1)
e, err := st.Bind(path).Get(rootPublicID, tr)
if err != nil {
@@ -28,7 +27,7 @@
return e.Value
}
-func put(t *testing.T, st *memstore.Store, tr service.Transaction, path string, v interface{}) storage.ID {
+func put(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string, v interface{}) storage.ID {
_, file, line, _ := runtime.Caller(1)
stat, err := st.Bind(path).Put(rootPublicID, tr, v)
if err != nil {
@@ -43,14 +42,14 @@
return storage.ID{}
}
-func remove(t *testing.T, st *memstore.Store, tr service.Transaction, path string) {
+func remove(t *testing.T, st *memstore.Store, tr *memstore.Transaction, path string) {
if err := st.Bind(path).Remove(rootPublicID, tr); err != nil {
_, file, line, _ := runtime.Caller(1)
t.Fatalf("%s(%d): can't remove %s: %s", file, line, path, err)
}
}
-func commit(t *testing.T, tr service.Transaction) {
+func commit(t *testing.T, tr *memstore.Transaction) {
if err := tr.Commit(); err != nil {
_, file, line, _ := runtime.Caller(1)
t.Fatalf("%s(%d): Transaction aborted: %s", file, line, err)
@@ -120,7 +119,7 @@
return processor
}
-func createWatcher(t *testing.T, dbName string) (service.Watcher, func()) {
+func createWatcher(t *testing.T, dbName string) (*Watcher, func()) {
w, err := New(rootPublicID, dbName)
if err != nil {
t.Fatalf("New() failed: %v", err)
diff --git a/services/store/memstore/watch/watcher.go b/services/store/memstore/watch/watcher.go
index 9c3e925..7df6565 100644
--- a/services/store/memstore/watch/watcher.go
+++ b/services/store/memstore/watch/watcher.go
@@ -9,7 +9,6 @@
"veyron/runtimes/google/lib/sync"
"veyron/services/store/memstore"
"veyron/services/store/raw"
- "veyron/services/store/service"
"veyron2/ipc"
"veyron2/security"
@@ -28,7 +27,7 @@
}
)
-type watcher struct {
+type Watcher struct {
// admin is the public id of the store administrator.
admin security.PublicID
// dbName is the name of the store's database directory.
@@ -45,8 +44,8 @@
// concurrent invocations of Watch until it is closed.
// admin is the public id of the store administrator. dbName is the name of the
// of the store's database directory.
-func New(admin security.PublicID, dbName string) (service.Watcher, error) {
- return &watcher{
+func New(admin security.PublicID, dbName string) (*Watcher, error) {
+ return &Watcher{
admin: admin,
dbName: dbName,
closed: make(chan struct{}),
@@ -54,7 +53,7 @@
}
// WatchRaw returns a stream of all changes.
-func (w *watcher) WatchRaw(ctx ipc.ServerContext, req raw.Request,
+func (w *Watcher) WatchRaw(ctx ipc.ServerContext, req raw.Request,
stream raw.StoreServiceWatchStream) error {
processor, err := newRawProcessor(ctx.RemoteID())
@@ -65,7 +64,7 @@
}
// WatchGlob returns a stream of changes that match a pattern.
-func (w *watcher) WatchGlob(ctx ipc.ServerContext, path storage.PathName,
+func (w *Watcher) WatchGlob(ctx ipc.ServerContext, path storage.PathName,
req watch.GlobRequest, stream watch.GlobWatcherServiceWatchGlobStream) error {
processor, err := newGlobProcessor(ctx.RemoteID(), path, req.Pattern)
@@ -76,7 +75,7 @@
}
// WatchQuery returns a stream of changes that satisfy a query.
-func (w *watcher) WatchQuery(ctx ipc.ServerContext, path storage.PathName,
+func (w *Watcher) WatchQuery(ctx ipc.ServerContext, path storage.PathName,
req watch.QueryRequest, stream watch.QueryWatcherServiceWatchQueryStream) error {
return verror.Internalf("WatchQuery not yet implemented")
@@ -93,7 +92,7 @@
// sending changes to the specified watch stream. If the call is cancelled or
// otherwise closed early, Watch will terminate and return an error.
// Watch implements the service.Watcher interface.
-func (w *watcher) Watch(ctx ipc.ServerContext, processor reqProcessor,
+func (w *Watcher) Watch(ctx ipc.ServerContext, processor reqProcessor,
resumeMarker watch.ResumeMarker, stream WatchStream) error {
// Closing cancel terminates processRequest.
@@ -124,7 +123,7 @@
return errWatchClosed
}
-func (w *watcher) processRequest(cancel <-chan struct{}, processor reqProcessor,
+func (w *Watcher) processRequest(cancel <-chan struct{}, processor reqProcessor,
resumeMarker watch.ResumeMarker, stream WatchStream) error {
log, err := memstore.OpenLog(w.dbName, true)
@@ -197,14 +196,14 @@
}
// Close implements the service.Watcher interface.
-func (w *watcher) Close() error {
+func (w *Watcher) Close() error {
close(w.closed)
w.pending.Wait()
return nil
}
// IsClosed returns true iff the watcher has been closed.
-func (w *watcher) isClosed() bool {
+func (w *Watcher) isClosed() bool {
select {
case <-w.closed:
return true
diff --git a/services/store/server/server.go b/services/store/server/server.go
index e273656..de5824b 100644
--- a/services/store/server/server.go
+++ b/services/store/server/server.go
@@ -17,7 +17,6 @@
"veyron/services/store/memstore"
memwatch "veyron/services/store/memstore/watch"
"veyron/services/store/raw"
- "veyron/services/store/service"
"veyron2/ipc"
"veyron2/security"
@@ -61,7 +60,7 @@
closed chan struct{}
// watcher is the actual store watcher implementation.
- watcher service.Watcher
+ watcher *memwatch.Watcher
}
// transactionID is an internal transaction identifier chosen by the server.
@@ -87,7 +86,7 @@
}
type transaction struct {
- trans service.Transaction
+ trans *memstore.Transaction
expires time.Time
creatorCtx transactionContext
}
@@ -209,13 +208,13 @@
}
// findTransaction returns the transaction for the given transaction ID.
-func (s *Server) findTransaction(ctx transactionContext, id transactionID) (service.Transaction, error) {
+func (s *Server) findTransaction(ctx transactionContext, id transactionID) (*memstore.Transaction, error) {
s.mutex.RLock()
defer s.mutex.RUnlock()
return s.findTransactionLocked(ctx, id)
}
-func (s *Server) findTransactionLocked(ctx transactionContext, id transactionID) (service.Transaction, error) {
+func (s *Server) findTransactionLocked(ctx transactionContext, id transactionID) (*memstore.Transaction, error) {
if id == nullTransactionID {
return nil, nil
}
diff --git a/services/store/service/service.go b/services/store/service/service.go
deleted file mode 100644
index d6f6fda..0000000
--- a/services/store/service/service.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package service
-
-// Defines the store server Go API.
-// NOTE(sadovsky): See comments in go/vcl/3292 for why we have this API. It may
-// no longer be necessary.
-
-import (
- "veyron/services/store/raw"
-
- "veyron2/ipc"
- "veyron2/services/watch"
- "veyron2/storage"
-)
-
-// Transaction is like storage.Transaction, but doesn't include extra
-// client-side parameters.
-type Transaction interface {
- // Commit commits the changes (the Set and Delete operations) in the
- // transaction to the store. The operation is atomic, so all Set/Delete
- // operations are performed, or none. Returns an error if the transaction
- // aborted.
- //
- // The Transaction should be discarded once Commit is called. It can no
- // longer be used.
- Commit() error
-
- // Abort discards a transaction. This is an optimization; transactions
- // eventually time out and get discarded. However, live transactions
- // consume resources, so it is good practice to clean up.
- Abort() error
-}
-
-// Watcher is the interface for watching store updates matching a pattern or query.
-type Watcher interface {
- // WatchRaw returns a stream of all changes.
- WatchRaw(ctx ipc.ServerContext, req raw.Request, stream raw.StoreServiceWatchStream) error
-
- // WatchGlob returns a stream of changes that match a pattern.
- WatchGlob(ctx ipc.ServerContext, path storage.PathName, req watch.GlobRequest,
- stream watch.GlobWatcherServiceWatchGlobStream) error
-
- // WatchQuery returns a stream of changes that satisfy a query.
- WatchQuery(ctx ipc.ServerContext, path storage.PathName, req watch.QueryRequest,
- stream watch.QueryWatcherServiceWatchQueryStream) error
-
- // Close closes the Watcher, blocking until all Watch invocations complete.
- Close() error
-}