commit e32348c6a7fa151d85f326176c793e83aa46f53a
parent c23d5dff3f7930f2c989529400bc973a4bdd7ce7
Author: Matsuda Kenji <info@mtkn.jp>
Date: Mon, 23 Oct 2023 16:26:07 +0900
move tagPool from Client to ClientFS
Diffstat:
5 files changed, 55 insertions(+), 55 deletions(-)
diff --git a/client.go b/client.go
@@ -12,7 +12,6 @@ type Client struct {
mSizeLock *sync.Mutex
uname string
fPool *clientFidPool
- tPool *tagPool
txc chan<- *clientReq
errc chan error
cancel context.CancelFunc
@@ -27,7 +26,6 @@ func NewClient(mSize uint32, uname string, r io.Reader, w io.Writer) *Client {
mSizeLock: new(sync.Mutex),
uname: uname,
fPool: allocClientFidPool(),
- tPool: newTagPool(),
errc: make(chan error),
cancel: cancel,
wg: new(sync.WaitGroup),
@@ -39,9 +37,7 @@ func NewClient(mSize uint32, uname string, r io.Reader, w io.Writer) *Client {
}
func (c *Client) Stop() {
- // TODO: fPool, rPool
c.cancel()
- // TODO: check all goroutines are stopped.
c.wg.Wait()
close(c.errc)
}
diff --git a/client2.go b/client2.go
@@ -11,6 +11,7 @@ import (
type ClientFS struct {
c *Client
+ tPool *tagPool
}
func (fsys *ClientFS) OpenFile(name string, omode OpenMode, perm fs.FileMode) (File, error) {
@@ -18,12 +19,12 @@ func (fsys *ClientFS) OpenFile(name string, omode OpenMode, perm fs.FileMode) (F
if err != nil {
return nil, fmt.Errorf("walkFile: %v", err)
}
- tag, err := fsys.c.tPool.add()
+ tag, err := fsys.tPool.add()
if err != nil {
return nil, err
}
qid, iounit, err := fsys.c.Open(context.TODO(), tag, f.fid.fid, omode)
- fsys.c.tPool.delete(tag)
+ fsys.tPool.delete(tag)
if err != nil {
f.Close()
return nil, fmt.Errorf("open: %v", err)
@@ -43,12 +44,12 @@ func (fsys *ClientFS) walkFile(name string) (*ClientFile, error) {
if name != "." {
wname = strings.Split(path.Clean(name), "/")
}
- tag, err := fsys.c.tPool.add()
+ tag, err := fsys.tPool.add()
if err != nil {
return nil, err
}
wqid, err := fsys.c.Walk(context.TODO(), tag, fsys.c.rootFid.fid, fid.fid, wname)
- fsys.c.tPool.delete(tag)
+ fsys.tPool.delete(tag)
if err != nil {
return nil, fmt.Errorf("walk: %v", err)
}
@@ -65,7 +66,7 @@ func (fsys *ClientFS) walkFile(name string) (*ClientFile, error) {
path: name,
fid: fid,
qid: qid,
- client: fsys.c,
+ fs: fsys,
}
fid.file = f
return f, nil
@@ -77,13 +78,16 @@ func Mount(r io.Reader, w io.Writer, uname, aname string) (fs *ClientFS, err err
version = "9P2000"
ctx = context.TODO()
)
- c := NewClient(mSize, uname, r, w)
+ cfs := &ClientFS{
+ c: NewClient(mSize, uname, r, w),
+ tPool: newTagPool(),
+ }
defer func() {
if err != nil {
- c.Stop()
+ cfs.c.Stop()
}
}()
- rmSize, rver, err := c.Version(ctx, NOTAG, mSize, version)
+ rmSize, rver, err := cfs.c.Version(ctx, NOTAG, mSize, version)
if err != nil {
return nil, fmt.Errorf("version: %v", err)
}
@@ -91,24 +95,22 @@ func Mount(r io.Reader, w io.Writer, uname, aname string) (fs *ClientFS, err err
return nil, fmt.Errorf("incompatible version %s", rver)
}
if rmSize < mSize {
- c.setMSize(rmSize)
+ cfs.c.setMSize(rmSize)
}
// TODO: auth
-
- fid, err := c.fPool.add()
+ fid, err := cfs.c.fPool.add()
if err != nil {
return nil, fmt.Errorf("add fid: %v", err)
}
- tag, err := c.tPool.add()
+ tag, err := cfs.tPool.add()
if err != nil {
return nil, err
}
- _, err = c.Attach(ctx, tag, fid.fid, NOFID, uname, aname)
- c.tPool.delete(tag)
+ _, err = cfs.c.Attach(ctx, tag, fid.fid, NOFID, uname, aname)
+ cfs.tPool.delete(tag)
if err != nil {
return nil, fmt.Errorf("attach: %v", err)
}
-
- c.rootFid = fid
- return &ClientFS{c: c}, nil
+ cfs.c.rootFid = fid
+ return cfs, nil
}
diff --git a/client_test.go b/client_test.go
@@ -19,7 +19,6 @@ func newClientForTest(msize uint32, uname string, tmsgc chan<- Msg, rmsgc <-chan
mSizeLock: new(sync.Mutex),
uname: uname,
fPool: allocClientFidPool(),
- tPool: newTagPool(),
errc: make(chan error),
cancel: cancel,
wg: new(sync.WaitGroup),
@@ -49,6 +48,7 @@ func TestClientVersion(t *testing.T) {
tmsgc := make(chan Msg)
rmsgc := make(chan Msg)
c := newClientForTest(mSize, uname, tmsgc, rmsgc)
+ tPool := newTagPool()
defer c.Stop()
bg := context.Background()
var (
@@ -59,12 +59,12 @@ func TestClientVersion(t *testing.T) {
)
wg.Add(1)
go func() {
- tag, err := c.tPool.add()
+ tag, err := tPool.add()
if err != nil {
t.Fatalf("add tag: %v", err)
}
gotmsize, gotversion, goterr = c.Version(bg, tag, test.mSize, test.version)
- c.tPool.delete(tag)
+ tPool.delete(tag)
wg.Done()
}()
gottmsg := <-tmsgc
@@ -101,36 +101,37 @@ func TestTransaction(t *testing.T) {
server := NewServer(fsys, mSize, sr, sw)
//server.Chatty()
client := NewClient(mSize, uname, cr, cw)
+ tPool := newTagPool()
bg := context.Background()
go server.Serve(bg)
- tag, err := client.tPool.add()
+ tag, err := tPool.add()
if err != nil {
t.Fatalf("add tag: %v", err)
}
rmsize, rversion, err := client.Version(bg, tag, mSize, "9P2000")
- client.tPool.delete(tag)
+ tPool.delete(tag)
if err != nil {
t.Log(err)
} else {
t.Log(&RVersion{mSize: rmsize, version: rversion})
}
- tag, err = client.tPool.add()
+ tag, err = tPool.add()
if err != nil {
t.Fatalf("add tag: %v", err)
}
rauth, err := client.Auth(bg, tag, 0, "kenji", "")
- client.tPool.delete(tag)
+ tPool.delete(tag)
if err != nil {
t.Log(err)
} else {
t.Log(rauth)
}
- tag, err = client.tPool.add()
+ tag, err = tPool.add()
if err != nil {
t.Fatalf("add tag: %v", err)
}
rattach, err := client.Attach(bg, tag, 0, NOFID, "kenji", "")
- client.tPool.delete(tag)
+ tPool.delete(tag)
if err != nil {
t.Log(err)
} else {
diff --git a/file.go b/file.go
@@ -52,16 +52,16 @@ type ClientFile struct {
fid *clientFid
qid Qid
iounit uint32
- client *Client
+ fs *ClientFS
}
func (cf *ClientFile) Stat() (*FileInfo, error) {
- tag, err := cf.client.tPool.add()
+ tag, err := cf.fs.tPool.add()
if err != nil {
return nil, err
}
- st, err := cf.client.Stat(context.TODO(), tag, cf.fid.fid)
- cf.client.tPool.delete(tag)
+ st, err := cf.fs.c.Stat(context.TODO(), tag, cf.fid.fid)
+ cf.fs.tPool.delete(tag)
if err != nil {
return nil, err
}
@@ -70,13 +70,13 @@ func (cf *ClientFile) Stat() (*FileInfo, error) {
// Don't use closed file.
func (cf *ClientFile) Close() error {
- tag, err := cf.client.tPool.add()
+ tag, err := cf.fs.tPool.add()
if err != nil {
return err
}
- err = cf.client.Clunk(context.TODO(), tag, cf.fid.fid)
- cf.client.tPool.delete(tag)
- cf.client.fPool.delete(cf.fid.fid)
+ err = cf.fs.c.Clunk(context.TODO(), tag, cf.fid.fid)
+ cf.fs.tPool.delete(tag)
+ cf.fs.c.fPool.delete(cf.fid.fid)
cf.fid = nil
return err
}
@@ -100,12 +100,12 @@ func (cf *ClientFile) Read(b []byte) (int, error) {
} else {
c = count
}
- tag, err := cf.client.tPool.add()
+ tag, err := cf.fs.tPool.add()
if err != nil {
return 0, err
}
- buf, err := cf.client.Read(context.TODO(), tag, cf.fid.fid, cf.fid.offset, c)
- cf.client.tPool.delete(tag)
+ buf, err := cf.fs.c.Read(context.TODO(), tag, cf.fid.fid, cf.fid.offset, c)
+ cf.fs.tPool.delete(tag)
var i int
for i = 0; i < len(buf); i++ {
b[cur+i] = buf[i]
diff --git a/req_test.go b/req_test.go
@@ -27,40 +27,41 @@ func TestFlush(t *testing.T) {
go s.Serve(ctx)
c := NewClient(mSize, uname, cr, cw)
defer c.Stop()
+ tPool := newTagPool()
rmsize, rversion, err := c.Version(ctx, NOTAG, mSize, "9P2000")
if err != nil {
t.Fatalf("version: %v", err)
}
t.Logf("rversion: %d, %s", rmsize, rversion)
- tag, err := c.tPool.add()
+ tag, err := tPool.add()
if err != nil {
t.Fatalf("add tag: %v", err)
}
_, err = c.Attach(ctx, tag, 0, NOFID, uname, "")
- c.tPool.delete(tag)
+ tPool.delete(tag)
if err != nil {
t.Fatalf("attach: %v", err)
}
- tag, err = c.tPool.add()
+ tag, err = tPool.add()
if err != nil {
t.Fatalf("add tag: %v", err)
}
_, err = c.Walk(ctx, tag, 0, 1, []string{"a"})
- c.tPool.delete(tag)
+ tPool.delete(tag)
if err != nil {
t.Fatalf("walk: %v", err)
}
- tag, err = c.tPool.add()
+ tag, err = tPool.add()
if err != nil {
t.Fatalf("add tag: %v", err)
}
_, _, err = c.Open(ctx, tag, 1, OREAD)
- c.tPool.delete(tag)
+ tPool.delete(tag)
if err != nil {
t.Fatalf("open: %v", err)
}
done := make(chan string)
- tag0, err := c.tPool.add()
+ tag0, err := tPool.add()
if err != nil {
t.Fatalf("add tag: %v", err)
}
@@ -68,26 +69,26 @@ func TestFlush(t *testing.T) {
var data []byte
go func() {
data, err = c.Read(ctx1, tag0, 1, 0, mSize-IOHDRSZ)
- c.tPool.delete(tag0)
+ tPool.delete(tag0)
close(done)
}()
// I want to send Tflush message after sending Tread and before recieving
// Rread. But I think this method is not relyable.
time.Sleep(10 * time.Millisecond)
- tag, err = c.tPool.add()
+ tag, err = tPool.add()
if err != nil {
t.Fatalf("add tag: %v", err)
}
- t.Log(c.tPool)
+ t.Log(tPool)
err = c.Flush(ctx, tag, tag0)
- c.tPool.delete(tag)
+ tPool.delete(tag)
if err != nil {
t.Errorf("flush: %v", err)
}
- t.Log(c.tPool)
+ t.Log(tPool)
cancel1()
- t.Log(c.tPool)
+ t.Log(tPool)
t.Logf("canceled: %v", <-done)
t.Logf("read data: %v, err: %v", data, err)
- t.Log(c.tPool)
+ t.Log(tPool)
}