diff --git a/conn.go b/conn.go index bcbc21e..aa632ac 100644 --- a/conn.go +++ b/conn.go @@ -161,10 +161,6 @@ func (c *conn) qid(name string, qtype uint8) styxproto.Qid { return c.qidpool.Put(name, qtype) } -func (c *conn) getQid(name string, qtype uint8) (styxproto.Qid, bool) { - return c.qidpool.Get(name) -} - // All request contexts must have their cancel functions // called, to free up resources in the context. Returns false // if the tag is already cancelled diff --git a/go.mod b/go.mod index 7b14752..05d4ff7 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,5 @@ module aqwari.net/net/styx -go 1.16 +go 1.19 require aqwari.net/retry v0.0.0-20180428204214-1281ce5d8df0 diff --git a/internal/qidpool/pool.go b/internal/qidpool/pool.go index 84ef385..5cfbc19 100644 --- a/internal/qidpool/pool.go +++ b/internal/qidpool/pool.go @@ -42,8 +42,6 @@ func (p *Pool) Put(name string, qtype uint8) styxproto.Qid { m[name] = qid } }) - - p.m.Put(name, qid) return qid } diff --git a/request.go b/request.go index c7be0e9..d9aed12 100644 --- a/request.go +++ b/request.go @@ -1,10 +1,11 @@ package styx import ( - "context" "os" "path" + "context" + "aqwari.net/net/styx/internal/styxfile" "aqwari.net/net/styx/internal/sys" "aqwari.net/net/styx/styxproto" @@ -265,7 +266,6 @@ func (t Tcreate) Rcreate(rwc interface{}, err error) { } if dir, ok := rwc.(Directory); t.Mode.IsDir() && ok { - f = styxfile.NewDir(dir, path.Join(t.Path(), t.Name), t.session.conn.qidpool) } else { f, err = styxfile.New(rwc) diff --git a/server_test.go b/server_test.go index f88a461..cd3710b 100644 --- a/server_test.go +++ b/server_test.go @@ -488,6 +488,34 @@ func TestWalk(t *testing.T) { } } +func TestWalkNonexistent(t *testing.T) { + srv := testServer{test: t} + srv.callback = func(req, rsp styxproto.Msg) { + if _, ok := req.(styxproto.Twalk); ok { + if _, ok := rsp.(styxproto.Rerror); !ok { + t.Errorf("expected Rerror response to nonexistent Twalk, instead got: %T", rsp) + } + } + } + srv.handler = HandlerFunc(func(s *Session) { + for s.Next() { + switch req := s.Request().(type) { + case Twalk: + t.Logf("Twalk %s", req.Path()) + req.Rwalk(nil, errors.New("not found")) + // If the walk resulted in an error, then no Qid should have been created for this path + if _, ok := s.conn.qidpool.Get(req.Path()); ok { + t.Error("qid was created when it shouldn't have been") + } + } + } + }) + + srv.runMsg(func(enc *styxproto.Encoder) { + enc.Twalk(1, 0, 1, "nonexistent") + }) +} + func blankQid() styxproto.Qid { buf := make([]byte, styxproto.QidLen) qid, _, err := styxproto.NewQid(buf, 0, 0, 0) diff --git a/walk.go b/walk.go index de66bf4..91c3a60 100644 --- a/walk.go +++ b/walk.go @@ -1,7 +1,6 @@ package styx import ( - "errors" "fmt" "os" "path" @@ -181,12 +180,7 @@ func (t Twalk) Rwalk(info os.FileInfo, err error) { var mode os.FileMode if err == nil { mode = info.Mode() - fqid, found := t.session.conn.getQid(t.Path(), styxfile.QidType(styxfile.Mode9P(mode))) - if !found { - err = errors.New("rwalk did not find file") - } else { - qid = fqid - } + qid = t.session.conn.qid(t.Path(), styxfile.QidType(styxfile.Mode9P(mode))) } t.walk.filled[t.index] = 1 elem := walkElem{qid: qid, index: t.index, err: err}