Skip to content

Commit

Permalink
raw dag: make raw nodes work in cat and get, add tests
Browse files Browse the repository at this point in the history
License: MIT
Signed-off-by: Jeromy <[email protected]>
  • Loading branch information
whyrusleeping committed Oct 18, 2016
1 parent ded60a7 commit 3796e70
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 31 deletions.
9 changes: 8 additions & 1 deletion importer/helpers/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ func (n *UnixfsNode) GetChild(ctx context.Context, i int, ds dag.DAGService) (*U
// the passed in DagBuilderHelper is used to store the child node an
// pin it locally so it doesnt get lost
func (n *UnixfsNode) AddChild(child *UnixfsNode, db *DagBuilderHelper) error {
n.ufmt.AddBlockSize(child.ufmt.FileSize())
n.ufmt.AddBlockSize(child.DataSize())

childnode, err := child.GetDagNode()
if err != nil {
Expand Down Expand Up @@ -137,6 +137,13 @@ func (n *UnixfsNode) SetData(data []byte) {
n.ufmt.Data = data
}

func (n *UnixfsNode) DataSize() uint64 {
if n.raw {
return uint64(len(n.rawnode.RawData()))
}
return n.ufmt.FileSize()
}

// getDagNode fills out the proper formatting for the unixfs node
// inside of a DAG node and returns the dag node
func (n *UnixfsNode) GetDagNode() (node.Node, error) {
Expand Down
16 changes: 10 additions & 6 deletions test/sharness/t0040-add-and-cat.sh
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ test_add_cat_file() {
}

test_add_cat_5MB() {
ADD_FLAGS="$1"
EXP_HASH="$2"

test_expect_success "generate 5MB file using go-random" '
random 5242880 41 >mountdir/bigfile
'
Expand All @@ -98,25 +101,24 @@ test_add_cat_5MB() {
'

test_expect_success "'ipfs add bigfile' succeeds" '
ipfs add mountdir/bigfile >actual ||
ipfs add $ADD_FLAGS mountdir/bigfile >actual ||
test_fsh cat daemon_err
'

test_expect_success "'ipfs add bigfile' output looks good" '
HASH="QmSr7FqYkxYWGoSfy8ZiaMWQ5vosb18DQGCzjwEQnVHkTb" &&
echo "added $HASH bigfile" >expected &&
echo "added $EXP_HASH bigfile" >expected &&
test_cmp expected actual
'
test_expect_success "'ipfs cat' succeeds" '
ipfs cat "$HASH" >actual
ipfs cat "$EXP_HASH" >actual
'

test_expect_success "'ipfs cat' output looks good" '
test_cmp mountdir/bigfile actual
'

test_expect_success FUSE "cat ipfs/bigfile succeeds" '
cat "ipfs/$HASH" >actual
cat "ipfs/$EXP_HASH" >actual
'

test_expect_success FUSE "cat ipfs/bigfile looks good" '
Expand Down Expand Up @@ -380,7 +382,9 @@ test_expect_success "go-random is installed" '
type random
'

test_add_cat_5MB
test_add_cat_5MB "" "QmSr7FqYkxYWGoSfy8ZiaMWQ5vosb18DQGCzjwEQnVHkTb"

test_add_cat_5MB --raw-leaves "QmefsDaD3YVphd86mxjJfPLceKv8by98aB6J6sJxK13xS2"

test_add_cat_expensive

Expand Down
51 changes: 27 additions & 24 deletions unixfs/io/dagreader.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,33 +129,36 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error {
}
dr.linkPosition++

nxtpb, ok := nxt.(*mdag.ProtoNode)
if !ok {
return mdag.ErrNotProtobuf
}

pb := new(ftpb.Data)
err = proto.Unmarshal(nxtpb.Data(), pb)
if err != nil {
return fmt.Errorf("incorrectly formatted protobuf: %s", err)
}
switch nxt := nxt.(type) {
case *mdag.ProtoNode:
pb := new(ftpb.Data)
err = proto.Unmarshal(nxt.Data(), pb)
if err != nil {
return fmt.Errorf("incorrectly formatted protobuf: %s", err)
}

switch pb.GetType() {
case ftpb.Data_Directory:
// A directory should not exist within a file
return ft.ErrInvalidDirLocation
case ftpb.Data_File:
dr.buf = NewDataFileReader(dr.ctx, nxtpb, pb, dr.serv)
return nil
case ftpb.Data_Raw:
dr.buf = NewRSNCFromBytes(pb.GetData())
switch pb.GetType() {
case ftpb.Data_Directory:
// A directory should not exist within a file
return ft.ErrInvalidDirLocation
case ftpb.Data_File:
dr.buf = NewDataFileReader(dr.ctx, nxt, pb, dr.serv)
return nil
case ftpb.Data_Raw:
dr.buf = NewRSNCFromBytes(pb.GetData())
return nil
case ftpb.Data_Metadata:
return errors.New("shouldnt have had metadata object inside file")
case ftpb.Data_Symlink:
return errors.New("shouldnt have had symlink inside file")
default:
return ft.ErrUnrecognizedType
}
case *mdag.RawNode:
dr.buf = NewRSNCFromBytes(nxt.RawData())
return nil
case ftpb.Data_Metadata:
return errors.New("shouldnt have had metadata object inside file")
case ftpb.Data_Symlink:
return errors.New("shouldnt have had symlink inside file")
default:
return ft.ErrUnrecognizedType
return errors.New("unrecognized node type in DagReader")
}
}

Expand Down

0 comments on commit 3796e70

Please sign in to comment.