lib9p

Go 9P library.
Log | Files | Refs

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:
Mclient.go | 4----
Mclient2.go | 36+++++++++++++++++++-----------------
Mclient_test.go | 19++++++++++---------
Mfile.go | 22+++++++++++-----------
Mreq_test.go | 29+++++++++++++++--------------
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) }