fix: locking
This commit is contained in:
1 parent
c8a16d3f3e
commit
6041cc0a33
2 files changed
+27
-5
No files matched your search
@@ -377,6 +377,8 @@ type lazyByIDNode struct {
|
|||||||
client *DocspellClient
|
client *DocspellClient
|
||||||
query string
|
query string
|
||||||
limit int
|
limit int
|
||||||
|
mu sync.Mutex
|
||||||
|
shards map[string]*lazyByIDShardNode
|
||||||
}
|
}
|
||||||
|
|
||||||
type lazyByIDShardNode struct {
|
type lazyByIDShardNode struct {
|
||||||
@@ -511,11 +513,21 @@ func (d *lazyByIDNode) Lookup(ctx context.Context, name string) (fs.Node, error)
|
|||||||
if !isDocspellIDPrefix(name) {
|
if !isDocspellIDPrefix(name) {
|
||||||
return nil, fuse.ENOENT
|
return nil, fuse.ENOENT
|
||||||
}
|
}
|
||||||
return &lazyByIDShardNode{
|
d.mu.Lock()
|
||||||
query: combineItemQueries(d.query, "id:"+name+"*"),
|
defer d.mu.Unlock()
|
||||||
client: d.client,
|
if d.shards == nil {
|
||||||
limit: d.limit,
|
d.shards = map[string]*lazyByIDShardNode{}
|
||||||
}, nil
|
}
|
||||||
|
shard, ok := d.shards[name]
|
||||||
|
if !ok {
|
||||||
|
shard = &lazyByIDShardNode{
|
||||||
|
query: combineItemQueries(d.query, "id:"+name+"*"),
|
||||||
|
client: d.client,
|
||||||
|
limit: d.limit,
|
||||||
|
}
|
||||||
|
d.shards[name] = shard
|
||||||
|
}
|
||||||
|
return shard, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *lazyByIDNode) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
|
func (d *lazyByIDNode) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
|
||||||
|
|||||||
@@ -104,6 +104,16 @@ func TestLazyByIDShardFetchesMatchingPrefix(t *testing.T) {
|
|||||||
if _, err := shard.(*lazyByIDShardNode).Lookup(context.Background(), "it-item-1.pdf"); err != nil {
|
if _, err := shard.(*lazyByIDShardNode).Lookup(context.Background(), "it-item-1.pdf"); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
lookupAgain, err := byID.(*lazyByIDNode).Lookup(context.Background(), "it")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if lookupAgain != shard {
|
||||||
|
t.Fatal("expected repeated shard lookup to return its cached node")
|
||||||
|
}
|
||||||
|
if _, err := lookupAgain.(*lazyByIDShardNode).Lookup(context.Background(), "it-item-1.pdf"); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
if len(queries) != 2 || queries[0] != "id:it*" || queries[1] != "id:it*" {
|
if len(queries) != 2 || queries[0] != "id:it*" || queries[1] != "id:it*" {
|
||||||
t.Fatalf("unexpected queries: %v", queries)
|
t.Fatalf("unexpected queries: %v", queries)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user