@@ -95,13 +95,18 @@ func (f *rsDirectory) SetSize(size int64) error {
95
95
return errors .New ("not supported" )
96
96
}
97
97
98
+ func (f * rsDirectory ) IsReedSolomon () bool {
99
+ return true
100
+ }
101
+
98
102
type rsIterator struct {
99
- state int
100
- ctx context.Context
101
- cidString string
102
- files chan interface {}
103
- dserv ipld.DAGService
104
- rsDir * rsDirectory
103
+ state int
104
+ ctx context.Context
105
+ cidString string
106
+ files chan interface {}
107
+ dserv ipld.DAGService
108
+ rsDir * rsDirectory
109
+ breadthFirstTraversal bool
105
110
106
111
curName string
107
112
curFile files.Node
@@ -162,7 +167,8 @@ func (it *rsIterator) Next() bool {
162
167
case * uio.DirNode :
163
168
it .curFile , it .err = NewReedSolomonSubDirectory (it .ctx , it .dserv , it .cidString , nd )
164
169
case * uio.FileNode :
165
- it .curFile , it .err = NewReedSolomonFileUnderDirectory (it .ctx , it .dserv , it .cidString , nd )
170
+ it .curFile , it .err =
171
+ NewReedSolomonFileUnderDirectory (it .ctx , it .dserv , it .cidString , nd , it .breadthFirstTraversal )
166
172
case * uio.SymlinkNode :
167
173
it .curFile , it .err = files .NewLinkFile (nd .Data , nil ), nil
168
174
default :
@@ -219,7 +225,8 @@ func (it *rsIterator) Err() error {
219
225
return it .err
220
226
}
221
227
222
- func (it * rsIterator ) SetReedSolomon () {
228
+ func (it * rsIterator ) BreadthFirstTraversal () {
229
+ it .breadthFirstTraversal = true
223
230
}
224
231
225
232
type rsFile struct {
@@ -321,7 +328,8 @@ func NewReedSolomonSubDirectory(ctx context.Context, dserv ipld.DAGService, cid
321
328
// NewReedSolomonFileUnderDirectory returns a files.Node for the given `nd` Node.
322
329
// This functioon is called within the context of Reed-Solomon DAG for directory.
323
330
// The given `nd` is a uio.FileNode and is used to create a reader.
324
- func NewReedSolomonFileUnderDirectory (ctx context.Context , dserv ipld.DAGService , cid string , nd uio.Node ) (files.Node , error ) {
331
+ func NewReedSolomonFileUnderDirectory (
332
+ ctx context.Context , dserv ipld.DAGService , cid string , nd uio.Node , bfs bool ) (files.Node , error ) {
325
333
// Locking is for synchronizing write access to rsDagInstance.offset.
326
334
// But rsDagInstance.offset may not be necessary. We use this field to verify the offset in `nd`.
327
335
rsDagInstance := GetDag (ctx , cid )
@@ -340,7 +348,7 @@ func NewReedSolomonFileUnderDirectory(ctx context.Context, dserv ipld.DAGService
340
348
341
349
b := rsDagInstance .buff .Bytes ()
342
350
offset := fNode .StartOffset
343
- if rsDagInstance .offset != offset {
351
+ if ! bfs && rsDagInstance .offset != offset {
344
352
return nil , errors .New ("offset from the given FileNode is invalid." )
345
353
}
346
354
newOffset := offset + uint64 (fNode .NodeSize ())
0 commit comments