@@ -87,8 +87,12 @@ func (dl directoryLayer) createOrOpen(rtr fdb.ReadTransaction, tr *fdb.Transacti
87
87
return nil , errors .New ("the root directory cannot be opened" )
88
88
}
89
89
90
- existingNode := dl .find (rtr , path ).prefetchMetadata (rtr )
91
- if existingNode .exists () {
90
+ existingNode , exists := dl .find (rtr , path ).prefetchMetadata (rtr )
91
+ if exists {
92
+ defer existingNode ._layer .Close ()
93
+ }
94
+
95
+ if exists {
92
96
if existingNode .isInPartition (nil , false ) {
93
97
subpath := existingNode .getPartitionSubpath ()
94
98
enc , err := existingNode .getContents (dl , nil )
@@ -225,9 +229,11 @@ func (dl directoryLayer) Exists(rt fdb.ReadTransactor, path []string) (bool, err
225
229
return false , err
226
230
}
227
231
228
- node := dl .find (rtr , path ).prefetchMetadata (rtr )
229
- if ! node . exists () {
232
+ node , exists := dl .find (rtr , path ).prefetchMetadata (rtr )
233
+ if ! exists {
230
234
return false , nil
235
+ } else {
236
+ defer node ._layer .Close ()
231
237
}
232
238
233
239
if node .isInPartition (nil , false ) {
@@ -252,9 +258,11 @@ func (dl directoryLayer) List(rt fdb.ReadTransactor, path []string) ([]string, e
252
258
return nil , err
253
259
}
254
260
255
- node := dl .find (rtr , path ).prefetchMetadata (rtr )
256
- if ! node . exists () {
261
+ node , exists := dl .find (rtr , path ).prefetchMetadata (rtr )
262
+ if ! exists {
257
263
return nil , ErrDirNotExists
264
+ } else {
265
+ defer node ._layer .Close ()
258
266
}
259
267
260
268
if node .isInPartition (nil , true ) {
@@ -291,8 +299,14 @@ func (dl directoryLayer) Move(t fdb.Transactor, oldPath []string, newPath []stri
291
299
return nil , errors .New ("the destination directory cannot be a subdirectory of the source directory" )
292
300
}
293
301
294
- oldNode := dl .find (tr , oldPath ).prefetchMetadata (tr )
295
- newNode := dl .find (tr , newPath ).prefetchMetadata (tr )
302
+ oldNode , oldNodeExists := dl .find (tr , oldPath ).prefetchMetadata (tr )
303
+ if oldNodeExists {
304
+ defer oldNode ._layer .Close ()
305
+ }
306
+ newNode , newNodeExists := dl .find (tr , newPath ).prefetchMetadata (tr )
307
+ if newNodeExists {
308
+ defer newNode ._layer .Close ()
309
+ }
296
310
297
311
if ! oldNode .exists () {
298
312
return nil , errors .New ("the source directory does not exist" )
@@ -349,10 +363,11 @@ func (dl directoryLayer) Remove(t fdb.Transactor, path []string) (bool, error) {
349
363
return false , errors .New ("the root directory cannot be removed" )
350
364
}
351
365
352
- node := dl .find (tr , path ).prefetchMetadata (tr )
353
-
354
- if ! node .exists () {
366
+ node , exists := dl .find (tr , path ).prefetchMetadata (tr )
367
+ if ! exists {
355
368
return false , nil
369
+ } else {
370
+ defer node ._layer .Close ()
356
371
}
357
372
358
373
if node .isInPartition (nil , false ) {
@@ -416,16 +431,10 @@ func (dl directoryLayer) subdirNames(rtr fdb.ReadTransaction, node subspace.Subs
416
431
sd := node .Sub (_SUBDIRS )
417
432
418
433
rr := rtr .GetRange (sd , fdb.RangeOptions {})
419
- ri := rr .Iterator ()
420
434
421
435
var ret []string
422
-
423
- for ri .Advance () {
424
- kv , err := ri .Get ()
425
- if err != nil {
426
- return nil , err
427
- }
428
-
436
+ kvs := rr .GetSliceOrPanic ()
437
+ for _ , kv := range kvs {
429
438
p , err := sd .Unpack (kv .Key )
430
439
if err != nil {
431
440
return nil , err
@@ -441,13 +450,10 @@ func (dl directoryLayer) subdirNodes(tr fdb.Transaction, node subspace.Subspace)
441
450
sd := node .Sub (_SUBDIRS )
442
451
443
452
rr := tr .GetRange (sd , fdb.RangeOptions {})
444
- ri := rr .Iterator ()
445
453
446
454
var ret []subspace.Subspace
447
-
448
- for ri .Advance () {
449
- kv := ri .MustGet ()
450
-
455
+ kvs := rr .GetSliceOrPanic ()
456
+ for _ , kv := range kvs {
451
457
ret = append (ret , dl .nodeWithPrefix (kv .Value ))
452
458
}
453
459
@@ -507,7 +513,10 @@ func (dl directoryLayer) isPrefixFree(rtr fdb.ReadTransaction, prefix []byte) (b
507
513
}
508
514
509
515
func (dl directoryLayer ) checkVersion (rtr fdb.ReadTransaction , tr * fdb.Transaction ) error {
510
- version , err := rtr .Get (dl .rootNode .Sub ([]byte ("version" ))).Get ()
516
+ f := rtr .Get (dl .rootNode .Sub ([]byte ("version" )))
517
+ defer f .Close ()
518
+
519
+ version , err := f .Get ()
511
520
if err != nil {
512
521
return err
513
522
}
@@ -590,8 +599,18 @@ func (dl directoryLayer) nodeWithPrefix(prefix []byte) subspace.Subspace {
590
599
591
600
func (dl directoryLayer ) find (rtr fdb.ReadTransaction , path []string ) * node {
592
601
n := & node {dl .rootNode , []string {}, path , nil }
602
+ futures := make ([]fdb.FutureByteSlice , len (path ))
593
603
for i := range path {
594
- n = & node {dl .nodeWithPrefix (rtr .Get (n .subspace .Sub (_SUBDIRS , path [i ])).MustGet ()), path [:i + 1 ], path , nil }
604
+ futures [i ] = rtr .Get (n .subspace .Sub (_SUBDIRS , path [i ]))
605
+ }
606
+ defer func () {
607
+ for _ , f := range futures {
608
+ f .Close ()
609
+ }
610
+ }()
611
+
612
+ for i , f := range futures {
613
+ n = & node {dl .nodeWithPrefix (f .MustGet ()), path [:i + 1 ], path , nil }
595
614
if ! n .exists () || bytes .Compare (n .layer (rtr ).MustGet (), []byte ("partition" )) == 0 {
596
615
return n
597
616
}
0 commit comments