Merge "veyron/services/mgmt/logreader: Remove dependency on stubs"
diff --git a/services/mgmt/logreader/impl/logdir_invoker.go b/services/mgmt/logreader/impl/logdir_invoker.go
index ae1d44d..be4a741 100644
--- a/services/mgmt/logreader/impl/logdir_invoker.go
+++ b/services/mgmt/logreader/impl/logdir_invoker.go
@@ -7,7 +7,6 @@
 	"veyron/lib/glob"
 
 	"veyron2/ipc"
-	"veyron2/services/mounttable"
 	"veyron2/services/mounttable/types"
 	"veyron2/vlog"
 )
@@ -22,28 +21,25 @@
 }
 
 // NewLogDirectoryInvoker is the invoker factory.
-func NewLogDirectoryInvoker(root, suffix string) *logDirectoryInvoker {
-	return &logDirectoryInvoker{
-		root:   path.Clean(root),
-		suffix: suffix,
-	}
+func NewLogDirectoryInvoker(root, suffix string) ipc.Invoker {
+	return ipc.ReflectInvoker(&logDirectoryInvoker{path.Clean(root), suffix})
 }
 
 // Glob streams the name of all the objects that match pattern.
-func (i *logDirectoryInvoker) Glob(context ipc.ServerContext, pattern string, stream mounttable.GlobbableServiceGlobStream) error {
+func (i *logDirectoryInvoker) Glob(call ipc.ServerCall, pattern string) error {
 	vlog.VI(1).Infof("%v.Glob(%v)", i.suffix, pattern)
 	g, err := glob.Parse(pattern)
 	if err != nil {
 		return err
 	}
 	i.root = path.Join(i.root, i.suffix)
-	return i.globStep("", g, true, stream)
+	return i.globStep("", g, true, call)
 }
 
 // globStep applies a glob recursively.
-func (i *logDirectoryInvoker) globStep(name string, g *glob.Glob, isDir bool, stream mounttable.GlobbableServiceGlobStream) error {
+func (i *logDirectoryInvoker) globStep(name string, g *glob.Glob, isDir bool, call ipc.ServerCall) error {
 	if g.Len() == 0 && !isDir {
-		if err := stream.SendStream().Send(types.MountEntry{Name: name}); err != nil {
+		if err := call.Send(types.MountEntry{Name: name}); err != nil {
 			return err
 		}
 	}
@@ -72,7 +68,7 @@
 			continue
 		}
 		if ok, left := g.MatchInitialSegment(fileName); ok {
-			if err := i.globStep(path.Join(name, fileName), left, file.IsDir(), stream); err != nil {
+			if err := i.globStep(path.Join(name, fileName), left, file.IsDir(), call); err != nil {
 				return err
 			}
 		}
diff --git a/services/mgmt/logreader/impl/logdir_invoker_test.go b/services/mgmt/logreader/impl/logdir_invoker_test.go
index 192959d..f47e546 100644
--- a/services/mgmt/logreader/impl/logdir_invoker_test.go
+++ b/services/mgmt/logreader/impl/logdir_invoker_test.go
@@ -23,8 +23,7 @@
 }
 
 func (d *logDirectoryDispatcher) Lookup(suffix, _ string) (ipc.Invoker, security.Authorizer, error) {
-	invoker := ipc.ReflectInvoker(mounttable.NewServerGlobbable(impl.NewLogDirectoryInvoker(d.root, suffix)))
-	return invoker, nil, nil
+	return impl.NewLogDirectoryInvoker(d.root, suffix), nil, nil
 }
 
 func TestLogDirectory(t *testing.T) {
diff --git a/services/mgmt/logreader/impl/logfile_invoker.go b/services/mgmt/logreader/impl/logfile_invoker.go
index a6820ea..951458d 100644
--- a/services/mgmt/logreader/impl/logfile_invoker.go
+++ b/services/mgmt/logreader/impl/logfile_invoker.go
@@ -7,7 +7,6 @@
 	"path"
 
 	"veyron2/ipc"
-	"veyron2/services/mgmt/logreader"
 	"veyron2/services/mgmt/logreader/types"
 	"veyron2/vlog"
 )
@@ -22,15 +21,12 @@
 }
 
 // NewLogFileInvoker is the invoker factory.
-func NewLogFileInvoker(root, suffix string) *logFileInvoker {
-	return &logFileInvoker{
-		root:   path.Clean(root),
-		suffix: suffix,
-	}
+func NewLogFileInvoker(root, suffix string) ipc.Invoker {
+	return ipc.ReflectInvoker(&logFileInvoker{path.Clean(root), suffix})
 }
 
 // Size returns the size of the log file, in bytes.
-func (i *logFileInvoker) Size(context ipc.ServerContext) (int64, error) {
+func (i *logFileInvoker) Size(call ipc.ServerCall) (int64, error) {
 	vlog.VI(1).Infof("%v.Size()", i.suffix)
 	fname, err := translateNameToFilename(i.root, i.suffix)
 	if err != nil {
@@ -51,7 +47,7 @@
 }
 
 // ReadLog returns log entries from the log file.
-func (i *logFileInvoker) ReadLog(context ipc.ServerContext, startpos int64, numEntries int32, follow bool, stream logreader.LogFileServiceReadLogStream) (int64, error) {
+func (i *logFileInvoker) ReadLog(call ipc.ServerCall, startpos int64, numEntries int32, follow bool) (int64, error) {
 	vlog.VI(1).Infof("%v.ReadLog(%v, %v, %v)", i.suffix, startpos, numEntries, follow)
 	fname, err := translateNameToFilename(i.root, i.suffix)
 	if err != nil {
@@ -64,11 +60,10 @@
 		}
 		return 0, errOperationFailed
 	}
-	reader := newFollowReader(context, f, startpos, follow)
+	reader := newFollowReader(call, f, startpos, follow)
 	if numEntries == types.AllEntries {
 		numEntries = int32(math.MaxInt32)
 	}
-	sender := stream.SendStream()
 	for n := int32(0); n < numEntries; n++ {
 		line, offset, err := reader.readLine()
 		if err == io.EOF && n > 0 {
@@ -80,7 +75,7 @@
 		if err != nil {
 			return reader.tell(), errOperationFailed
 		}
-		if err := sender.Send(types.LogEntry{Position: offset, Line: line}); err != nil {
+		if err := call.Send(types.LogEntry{Position: offset, Line: line}); err != nil {
 			return reader.tell(), err
 		}
 	}
diff --git a/services/mgmt/logreader/impl/logfile_invoker_test.go b/services/mgmt/logreader/impl/logfile_invoker_test.go
index 8980595..a2c3399 100644
--- a/services/mgmt/logreader/impl/logfile_invoker_test.go
+++ b/services/mgmt/logreader/impl/logfile_invoker_test.go
@@ -22,8 +22,7 @@
 }
 
 func (d *logFileDispatcher) Lookup(suffix, _ string) (ipc.Invoker, security.Authorizer, error) {
-	invoker := ipc.ReflectInvoker(logreader.NewServerLogFile(impl.NewLogFileInvoker(d.root, suffix)))
-	return invoker, nil, nil
+	return impl.NewLogFileInvoker(d.root, suffix), nil, nil
 }
 
 func writeAndSync(t *testing.T, w *os.File, s string) {
diff --git a/services/mgmt/logreader/impl/reader.go b/services/mgmt/logreader/impl/reader.go
index 7db874f..29c8698 100644
--- a/services/mgmt/logreader/impl/reader.go
+++ b/services/mgmt/logreader/impl/reader.go
@@ -14,7 +14,7 @@
 // - it aborts when the parent RPC is canceled.
 type followReader struct {
 	reader io.ReadSeeker
-	ctx    ipc.ServerContext
+	call   ipc.ServerCall
 	offset int64
 	follow bool
 	err    error
@@ -22,11 +22,11 @@
 }
 
 // newFollowReader is the factory for followReader.
-func newFollowReader(ctx ipc.ServerContext, reader io.ReadSeeker, startpos int64, follow bool) *followReader {
+func newFollowReader(call ipc.ServerCall, reader io.ReadSeeker, startpos int64, follow bool) *followReader {
 	_, err := reader.Seek(startpos, 0)
 	return &followReader{
 		reader: reader,
-		ctx:    ctx,
+		call:   call,
 		offset: startpos,
 		follow: follow,
 		err:    err,
@@ -43,9 +43,9 @@
 		return 0, f.err
 	}
 	for {
-		if f.ctx != nil {
+		if f.call != nil {
 			select {
-			case <-f.ctx.Done():
+			case <-f.call.Done():
 				return 0, errCanceled
 			default:
 			}