@@ -2,9 +2,9 @@ package dmfs
22
33import (
44 "context"
5- "fmt"
65 "sync"
76 "syscall"
7+ "time"
88
99 "github.com/DataManager-Go/libdatamanager"
1010 libdm "github.com/DataManager-Go/libdatamanager"
@@ -15,7 +15,7 @@ import (
1515const (
1616 // NoGroupFolder foldername for
1717 // files without groups
18- NoGroupFolder = "no_group "
18+ NoGroupFolder = "all_files "
1919)
2020
2121var (
@@ -31,18 +31,21 @@ type groupNode struct {
3131 group string
3232 isNoGroupPlaceholder bool
3333
34- files [] libdm.FileResponseItem
34+ fileMap map [ string ] * libdm.FileResponseItem
3535
3636 mx sync.Mutex
3737}
3838
3939// Create a new group node
4040func newGroupNode (namespace , group string ) * groupNode {
41- return & groupNode {
41+ groupNode := & groupNode {
4242 namespace : namespace ,
4343 group : group ,
4444 isNoGroupPlaceholder : group == NoGroupFolder ,
4545 }
46+ groupNode .fileMap = make (map [string ]* libdm.FileResponseItem )
47+
48+ return groupNode
4649}
4750func (groupNode * groupNode ) getRequestAttributes () libdatamanager.FileAttributes {
4851 // Don't send any group to get
@@ -60,43 +63,41 @@ func (groupNode *groupNode) getRequestAttributes() libdatamanager.FileAttributes
6063
6164// List files in group
6265func (groupNode * groupNode ) Readdir (ctx context.Context ) (fs.DirStream , syscall.Errno ) {
63- fmt .Println ("readdir node" )
6466 r := make ([]fuse.DirEntry , 0 )
6567
66- files , err := data .loadFiles (groupNode .getRequestAttributes ())
67- if err != nil {
68- return nil , syscall .EIO
69- }
70-
71- for i := range files {
68+ err := groupNode .loadfiles (func (name string ) {
7269 r = append (r , fuse.DirEntry {
7370 Mode : syscall .S_IFREG ,
74- Name : files [ i ]. Name ,
71+ Name : name ,
7572 })
73+ })
74+
75+ if err != nil {
76+ return nil , syscall .EIO
7677 }
7778
78- groupNode .files = files
7979 return fs .NewListDirStream (r ), 0
8080}
8181
82- func (groupNode * groupNode ) loadfiles () error {
83- fmt .Println ("readdir node" )
84-
82+ func (groupNode * groupNode ) loadfiles (nsCB func (name string )) error {
8583 files , err := data .loadFiles (groupNode .getRequestAttributes ())
8684 if err != nil {
8785 return err
8886 }
8987
90- groupNode .files = files
88+ for i := range files {
89+ groupNode .fileMap [files [i ].Name ] = & files [i ]
90+ if nsCB != nil {
91+ nsCB (files [i ].Name )
92+ }
93+ }
94+
9195 return nil
9296}
9397
9498func (groupNode * groupNode ) Lookup (ctx context.Context , name string , out * fuse.EntryOut ) (* fs.Inode , syscall.Errno ) {
95- groupNode .mx .Lock ()
96- defer groupNode .mx .Unlock ()
97-
98- file := groupNode .findFile (name )
99- if file == nil {
99+ file , has := groupNode .fileMap [name ]
100+ if ! has || file == nil {
100101 return nil , syscall .ENOENT
101102 }
102103
@@ -131,18 +132,16 @@ func (groupNode *groupNode) setFileAttrs(file *libdatamanager.FileResponseItem,
131132 Gid : data .gid ,
132133 Uid : data .uid ,
133134 }
135+
136+ out .SetEntryTimeout (1 * time .Millisecond )
134137}
135138
136139// Delete file
137140func (groupNode * groupNode ) Unlink (ctx context.Context , name string ) syscall.Errno {
138- f := groupNode .findFile (name )
139- if f == nil {
141+ file := groupNode .findFile (name )
142+ if file == nil {
140143 return syscall .ENOENT
141144 }
142- file := * f
143-
144- // Remove local
145- groupNode .removeFile (file )
146145
147146 // Make delete http request
148147 _ , err := data .libdm .DeleteFile ("" , file .ID , false , groupNode .getRequestAttributes ())
@@ -151,33 +150,23 @@ func (groupNode *groupNode) Unlink(ctx context.Context, name string) syscall.Err
151150 return syscall .EIO
152151 }
153152
154- // FIXME delete correctly from slice
153+ groupNode .removeFile (name )
154+ groupNode .GetChild (name ).ForgetPersistent ()
155155
156156 return 0
157157}
158158
159159// Find file by name
160160func (groupNode * groupNode ) findFile (name string ) * libdatamanager.FileResponseItem {
161- for i := range groupNode .files {
162- if groupNode .files [i ].Name == name {
163- return & groupNode .files [i ]
164- }
161+ file , has := groupNode .fileMap [name ]
162+ if ! has {
163+ return nil
165164 }
166165
167- return nil
166+ return file
168167}
169168
170- // Remove file from list
171- func (groupNode * groupNode ) removeFile (file libdatamanager.FileResponseItem ) bool {
172- groupNode .mx .Lock ()
173- defer groupNode .mx .Unlock ()
174-
175- for i := range groupNode .files {
176- if groupNode .files [i ].ID == file .ID {
177- groupNode .files = removeFileByIndex (groupNode .files , i )
178- return true
179- }
180- }
181-
182- return false
169+ func (groupNode * groupNode ) removeFile (name string ) {
170+ delete (groupNode .fileMap , name )
171+ data .removeCachedFile (name , groupNode .namespace )
183172}
0 commit comments