@cryptotaxi247 / kubo / commits / 0718bd73a

fix locking

Jeromy committed Mar 14, 2015 at 21:45 UTC 0718bd73a72cc49a70d8eea19e5c9d99f1e8135f
1 file changed +15 -16
ipnsfs/dir.go
+15 -16
@@ -70,7 +70,6 @@ func (d *Directory) Open(tpath []string, mode int) (*File, error) {
70 return dir.Open(tpath[1:], mode)
71 }
72
73 -// consider combining into a single method...
73 type childCloser interface {
74 closeChild(string, *dag.Node) error
75 }
@@ -82,18 +81,16 @@ func (d *Directory) closeChild(name string, nd *dag.Node) error {
81 }
82
83 d.lock.Lock()
84 + defer d.lock.Unlock()
85 err = d.node.RemoveNodeLink(name)
86 if err != nil && err != dag.ErrNotFound {
87 - d.lock.Unlock()
87 return err
88 }
89
90 err = d.node.AddNodeLinkClean(name, nd)
91 if err != nil {
93 - d.lock.Unlock()
92 return err
93 }
96 - d.lock.Unlock()
94
95 return d.parent.closeChild(d.name, d.node)
96 }
@@ -179,6 +176,10 @@ func (d *Directory) childDir(name string) (*Directory, error) {
176 func (d *Directory) Child(name string) (FSNode, error) {
177 d.lock.Lock()
178 defer d.lock.Unlock()
179 + return d.childUnsync(name)
180 +}
181 +
182 +func (d *Directory) childUnsync(name string) (FSNode, error) {
183 dir, err := d.childDir(name)
184 if err == nil {
185 return dir, nil
@@ -204,54 +205,50 @@ func (d *Directory) List() []string {
205
206 func (d *Directory) Mkdir(name string) (*Directory, error) {
207 d.lock.Lock()
208 + defer d.lock.Unlock()
209
210 _, err := d.childDir(name)
211 if err == nil {
210 - d.lock.Unlock()
211 - return nil, errors.New("directory by that name already exists")
212 + return nil, os.ErrExist
213 }
214 _, err = d.childFile(name)
215 if err == nil {
215 - d.lock.Unlock()
216 - return nil, errors.New("file by that name already exists")
216 + return nil, os.ErrExist
217 }
218
219 ndir := &dag.Node{Data: ft.FolderPBData()}
220 err = d.node.AddNodeLinkClean(name, ndir)
221 if err != nil {
222 - d.lock.Unlock()
222 return nil, err
223 }
225 - d.lock.Unlock()
224
225 err = d.parent.closeChild(d.name, d.node)
226 if err != nil {
227 return nil, err
228 }
229
232 - d.lock.Lock()
233 - defer d.lock.Unlock()
234 -
230 return d.childDir(name)
231 }
232
233 func (d *Directory) Unlink(name string) error {
234 d.lock.Lock()
235 + defer d.lock.Unlock()
236 +
237 delete(d.childDirs, name)
238 delete(d.files, name)
239
240 err := d.node.RemoveNodeLink(name)
241 if err != nil {
245 - d.lock.Unlock()
242 return err
243 }
248 - d.lock.Unlock()
244
245 return d.parent.closeChild(d.name, d.node)
246 }
247
248 // RenameEntry renames the child by 'oldname' of this directory to 'newname'
249 func (d *Directory) RenameEntry(oldname, newname string) error {
250 + d.Lock()
251 + defer d.Unlock()
252 // Is the child a directory?
253 dir, err := d.childDir(oldname)
254 if err == nil {
@@ -300,12 +297,14 @@ func (d *Directory) RenameEntry(oldname, newname string) error {
297
298 // AddChild adds the node 'nd' under this directory giving it the name 'name'
299 func (d *Directory) AddChild(name string, nd *dag.Node) error {
300 + d.Lock()
301 + defer d.Unlock()
302 pbn, err := ft.FromBytes(nd.Data)
303 if err != nil {
304 return err
305 }
306
308 - _, err = d.Child(name)
307 + _, err = d.childUnsync(name)
308 if err == nil {
309 return errors.New("directory already has entry by that name")
310 }