@cryptotaxi247 / kubo / commits / f2fbfdf29

mfs: inherit CID prefix from from parent directory

License: MIT Signed-off-by: Kevin Atkinson <k@kevina.org>

Kevin Atkinson committed Aug 16, 2017 at 19:18 UTC f2fbfdf2917af25f61085f55c731a66e46ea09e2
7 files changed +40 -7
core/commands/files/files.go
+2
@@ -890,8 +890,10 @@ func getFileHandle(r *mfs.Root, path string, create bool) (*mfs.File, error) {
890 if !ok {
891 return nil, fmt.Errorf("%s was not a directory", dirname)
892 }
893 + prefix := pdir.GetPrefix()
894
895 nd := dag.NodeWithData(ft.FilePBData(nil, 0))
896 + nd.SetPrefix(prefix)
897 err = pdir.AddChild(fname, nd)
898 if err != nil {
899 return nil, err
mfs/dir.go
+6
@@ -58,6 +58,11 @@ func NewDirectory(ctx context.Context, name string, node node.Node, parent child
58 }, nil
59 }
60
61 +// GetPrefix gets the CID prefix of the root node
62 +func (d *Directory) GetPrefix() *cid.Prefix {
63 + return d.dirbuilder.GetPrefix()
64 +}
65 +
66 // SetPrefix sets the CID prefix
67 func (d *Directory) SetPrefix(prefix *cid.Prefix) {
68 d.dirbuilder.SetPrefix(prefix)
@@ -299,6 +304,7 @@ func (d *Directory) Mkdir(name string) (*Directory, error) {
304 }
305
306 ndir := ft.EmptyDirNode()
307 + ndir.SetPrefix(d.GetPrefix())
308
309 _, err = d.dserv.Add(ndir)
310 if err != nil {
mfs/file.go
+8 -3
@@ -27,14 +27,19 @@ type File struct {
27 RawLeaves bool
28 }
29
30 -// NewFile returns a NewFile object with the given parameters
30 +// NewFile returns a NewFile object with the given parameters. If the
31 +// Cid version is non-zero RawLeaves will be enabled.
32 func NewFile(name string, node node.Node, parent childCloser, dserv dag.DAGService) (*File, error) {
32 - return &File{
33 + fi := &File{
34 dserv: dserv,
35 parent: parent,
36 name: name,
37 node: node,
37 - }, nil
38 + }
39 + if node.Cid().Prefix().Version > 0 {
40 + fi.RawLeaves = true
41 + }
42 + return fi, nil
43 }
44
45 const (
mfs/ops.go
+6 -2
@@ -129,7 +129,9 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error {
129 if err != nil {
130 return err
131 }
132 - mkd.SetPrefix(r.Prefix)
132 + if r.Prefix != nil {
133 + mkd.SetPrefix(r.Prefix)
134 + }
135 fsn = mkd
136 } else if err != nil {
137 return err
@@ -148,7 +150,9 @@ func Mkdir(r *Root, pth string, mkparents bool, flush bool) error {
150 return err
151 }
152 }
151 - final.SetPrefix(r.Prefix)
153 + if r.Prefix != nil {
154 + final.SetPrefix(r.Prefix)
155 + }
156
157 if flush {
158 err := final.Flush()
test/sharness/t0260-sharding-flag.sh
+2 -2
@@ -75,8 +75,8 @@ test_add_large_dir_v1() {
75 '
76 }
77
78 -# this hash implies both the directory and the leaf entries are CIDv1
79 -SHARDEDV1="zdj7WX91spg4DsnNpvoBLjyjXUGgcTTWavygBbSifpmJdgPUA"
78 +# this hash implies the directory is CIDv1 and leaf entries are CIDv1 and raw
79 +SHARDEDV1="zdj7WY8aNcxF49q1ZpFXfchNmbswnUxiVDVjmrHb53xRM8W4C"
80 test_add_large_dir_v1 "$SHARDEDV1"
81
82 test_launch_ipfs_daemon
unixfs/hamt/hamt.go
+7
@@ -121,6 +121,7 @@ func NewHamtFromDag(dserv dag.DAGService, nd node.Node) (*HamtShard, error) {
121 ds.children = make([]child, len(pbnd.Links()))
122 ds.bitfield = new(big.Int).SetBytes(pbd.GetData())
123 ds.hashFunc = pbd.GetHashType()
124 + ds.prefix = &ds.nd.Prefix
125
126 return ds, nil
127 }
@@ -130,6 +131,11 @@ func (ds *HamtShard) SetPrefix(prefix *cid.Prefix) {
131 ds.prefix = prefix
132 }
133
134 +// GetPrefix gets the CID Prefix, may be nil if unset
135 +func (ds *HamtShard) Prefix() *cid.Prefix {
136 + return ds.prefix
137 +}
138 +
139 // Node serializes the HAMT structure into a merkledag node with unixfs formatting
140 func (ds *HamtShard) Node() (node.Node, error) {
141 out := new(dag.ProtoNode)
@@ -500,6 +506,7 @@ func (ds *HamtShard) modifyValue(ctx context.Context, hv *hashBits, key string,
506 if err != nil {
507 return err
508 }
509 + ns.prefix = ds.prefix
510 chhv := &hashBits{
511 b: hash([]byte(child.key)),
512 consumed: hv.consumed,
unixfs/io/dirbuilder.go
+9
@@ -115,6 +115,7 @@ func (d *Directory) switchToSharding(ctx context.Context) error {
115 if err != nil {
116 return err
117 }
118 + s.SetPrefix(&d.dirnode.Prefix)
119
120 d.shard = s
121 for _, lnk := range d.dirnode.Links() {
@@ -192,3 +193,11 @@ func (d *Directory) GetNode() (node.Node, error) {
193
194 return d.shard.Node()
195 }
196 +
197 +func (d *Directory) GetPrefix() *cid.Prefix {
198 + if d.shard == nil {
199 + return &d.dirnode.Prefix
200 + }
201 +
202 + return d.shard.Prefix()
203 +}