@@ -67,23 +67,34 @@ func (s *service) Traverse(ctx context.Context, addr swarm.Address, iterFn swarm
6767 }
6868 }
6969
70- ls := loadsave .NewReadonly (s .getter , s .rLevel )
71- switch mf , err := manifest .NewDefaultManifestReference (addr , ls ); {
72- case errors .Is (err , manifest .ErrInvalidManifestType ):
73- break
74- case err != nil :
75- return fmt .Errorf ("traversal: unable to create manifest reference for %q: %w" , addr , err )
76- default :
77- err := mf .IterateAddresses (ctx , processBytes )
78- if errors .Is (err , mantaray .ErrTooShort ) || errors .Is (err , mantaray .ErrInvalidVersionHash ) {
79- // Based on the returned errors we conclude that it might
80- // not be a manifest, so we try non-manifest processing.
70+ j , _ , err := joiner .New (ctx , s .getter , s .putter , addr , s .rLevel )
71+ if err != nil {
72+ return err
73+ }
74+
75+ // Heuristic determination if the reference represents a manifest reference.
76+ // The assumption is that if the root chunk span is less than or equal to swarm.ChunkSize,
77+ // then the reference is likely a manifest reference. This is because manifest holds metadata
78+ // that points to the actual data file, and this metadata is assumed to be small - Less than or equal to swarm.ChunkSize.
79+ if j .Size () <= swarm .ChunkSize {
80+ ls := loadsave .NewReadonly (s .getter , s .rLevel )
81+ switch mf , err := manifest .NewDefaultManifestReference (addr , ls ); {
82+ case errors .Is (err , manifest .ErrInvalidManifestType ):
8183 break
84+ case err != nil :
85+ return fmt .Errorf ("traversal: unable to create manifest reference for %q: %w" , addr , err )
86+ default :
87+ err := mf .IterateAddresses (ctx , processBytes )
88+ if errors .Is (err , mantaray .ErrTooShort ) || errors .Is (err , mantaray .ErrInvalidVersionHash ) {
89+ // Based on the returned errors we conclude that it might
90+ // not be a manifest, so we try non-manifest processing.
91+ break
92+ }
93+ if err != nil {
94+ return fmt .Errorf ("traversal: unable to process bytes for %q: %w" , addr , err )
95+ }
96+ return nil
8297 }
83- if err != nil {
84- return fmt .Errorf ("traversal: unable to process bytes for %q: %w" , addr , err )
85- }
86- return nil
8798 }
8899
89100 // Non-manifest processing.
0 commit comments