mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-20 02:21:48 +08:00
add-only-hash no longer stores entirety of everything in memory
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
This commit is contained in:
@ -6,11 +6,16 @@ import (
|
|||||||
"path"
|
"path"
|
||||||
|
|
||||||
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/cheggaaa/pb"
|
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/cheggaaa/pb"
|
||||||
|
ds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
|
||||||
|
syncds "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync"
|
||||||
cxt "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
|
cxt "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
|
||||||
|
|
||||||
|
bstore "github.com/ipfs/go-ipfs/blocks/blockstore"
|
||||||
|
bserv "github.com/ipfs/go-ipfs/blockservice"
|
||||||
cmds "github.com/ipfs/go-ipfs/commands"
|
cmds "github.com/ipfs/go-ipfs/commands"
|
||||||
files "github.com/ipfs/go-ipfs/commands/files"
|
files "github.com/ipfs/go-ipfs/commands/files"
|
||||||
core "github.com/ipfs/go-ipfs/core"
|
core "github.com/ipfs/go-ipfs/core"
|
||||||
|
offline "github.com/ipfs/go-ipfs/exchange/offline"
|
||||||
importer "github.com/ipfs/go-ipfs/importer"
|
importer "github.com/ipfs/go-ipfs/importer"
|
||||||
"github.com/ipfs/go-ipfs/importer/chunk"
|
"github.com/ipfs/go-ipfs/importer/chunk"
|
||||||
dag "github.com/ipfs/go-ipfs/merkledag"
|
dag "github.com/ipfs/go-ipfs/merkledag"
|
||||||
@ -103,17 +108,28 @@ remains to be implemented.
|
|||||||
hidden, _, _ := req.Option(hiddenOptionName).Bool()
|
hidden, _, _ := req.Option(hiddenOptionName).Bool()
|
||||||
chunker, _, _ := req.Option(chunkerOptionName).String()
|
chunker, _, _ := req.Option(chunkerOptionName).String()
|
||||||
|
|
||||||
|
e := dagutils.NewDagEditor(n.DAG, newDirNode())
|
||||||
if hash {
|
if hash {
|
||||||
nilnode, err := core.NewNode(n.Context(), &core.BuildCfg{
|
nilnode, err := core.NewNode(n.Context(), &core.BuildCfg{
|
||||||
//TODO: need this to be true or all files
|
//TODO: need this to be true or all files
|
||||||
// hashed will be stored in memory!
|
// hashed will be stored in memory!
|
||||||
NilRepo: false,
|
NilRepo: true,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
res.SetError(err, cmds.ErrNormal)
|
res.SetError(err, cmds.ErrNormal)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
n = nilnode
|
n = nilnode
|
||||||
|
|
||||||
|
// build mem-datastore for editor's intermediary nodes
|
||||||
|
bs := bstore.NewBlockstore(syncds.MutexWrap(ds.NewMapDatastore()))
|
||||||
|
bsrv, err := bserv.New(bs, offline.Exchange(bs))
|
||||||
|
if err != nil {
|
||||||
|
res.SetError(err, cmds.ErrNormal)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
memds := dag.NewDAGService(bsrv)
|
||||||
|
e = dagutils.NewDagEditor(memds, newDirNode())
|
||||||
}
|
}
|
||||||
|
|
||||||
outChan := make(chan interface{}, 8)
|
outChan := make(chan interface{}, 8)
|
||||||
@ -122,7 +138,7 @@ remains to be implemented.
|
|||||||
fileAdder := adder{
|
fileAdder := adder{
|
||||||
ctx: req.Context(),
|
ctx: req.Context(),
|
||||||
node: n,
|
node: n,
|
||||||
editor: dagutils.NewDagEditor(n.DAG, newDirNode()),
|
editor: e,
|
||||||
out: outChan,
|
out: outChan,
|
||||||
chunker: chunker,
|
chunker: chunker,
|
||||||
progress: progress,
|
progress: progress,
|
||||||
@ -318,7 +334,7 @@ func (params *adder) RootNode() (*dag.Node, error) {
|
|||||||
// if not wrapping, AND one root file, use that hash as root.
|
// if not wrapping, AND one root file, use that hash as root.
|
||||||
if !params.wrap && len(r.Links) == 1 {
|
if !params.wrap && len(r.Links) == 1 {
|
||||||
var err error
|
var err error
|
||||||
r, err = r.Links[0].GetNode(params.ctx, params.node.DAG)
|
r, err = r.Links[0].GetNode(params.ctx, params.editor.GetDagService())
|
||||||
// no need to output, as we've already done so.
|
// no need to output, as we've already done so.
|
||||||
return r, err
|
return r, err
|
||||||
}
|
}
|
||||||
@ -330,16 +346,16 @@ func (params *adder) RootNode() (*dag.Node, error) {
|
|||||||
|
|
||||||
func (params *adder) addNode(node *dag.Node, path string) error {
|
func (params *adder) addNode(node *dag.Node, path string) error {
|
||||||
// patch it into the root
|
// patch it into the root
|
||||||
|
if path == "" {
|
||||||
key, err := node.Key()
|
key, err := node.Key()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if path == "" {
|
|
||||||
path = key.Pretty()
|
path = key.Pretty()
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := params.editor.InsertNodeAtPath(params.ctx, path, key, newDirNode); err != nil {
|
if err := params.editor.InsertNodeAtPath(params.ctx, path, node, newDirNode); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -623,7 +623,12 @@ func addLinkCaller(req cmds.Request, root *dag.Node) (key.Key, error) {
|
|||||||
|
|
||||||
e := dagutils.NewDagEditor(nd.DAG, root)
|
e := dagutils.NewDagEditor(nd.DAG, root)
|
||||||
|
|
||||||
err = e.InsertNodeAtPath(req.Context(), path, childk, createfunc)
|
childnd, err := nd.DAG.Get(req.Context(), childk)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = e.InsertNodeAtPath(req.Context(), path, childnd, createfunc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ import (
|
|||||||
|
|
||||||
context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
|
context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
|
||||||
|
|
||||||
key "github.com/ipfs/go-ipfs/blocks/key"
|
|
||||||
dag "github.com/ipfs/go-ipfs/merkledag"
|
dag "github.com/ipfs/go-ipfs/merkledag"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -26,21 +25,17 @@ func (e *Editor) GetNode() *dag.Node {
|
|||||||
return e.root.Copy()
|
return e.root.Copy()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Editor) AddLink(ctx context.Context, childname string, childk key.Key) error {
|
func (e *Editor) GetDagService() dag.DAGService {
|
||||||
nd, err := addLink(ctx, e.ds, e.root, childname, childk)
|
return e.ds
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
e.root = nd
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func addLink(ctx context.Context, ds dag.DAGService, root *dag.Node, childname string, childk key.Key) (*dag.Node, error) {
|
func addLink(ctx context.Context, ds dag.DAGService, root *dag.Node, childname string, childnd *dag.Node) (*dag.Node, error) {
|
||||||
if childname == "" {
|
if childname == "" {
|
||||||
return nil, errors.New("cannot create link with no name!")
|
return nil, errors.New("cannot create link with no name!")
|
||||||
}
|
}
|
||||||
|
|
||||||
childnd, err := ds.Get(ctx, childk)
|
// ensure that the node we are adding is in the dagservice
|
||||||
|
_, err := ds.Add(childnd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -58,7 +53,7 @@ func addLink(ctx context.Context, ds dag.DAGService, root *dag.Node, childname s
|
|||||||
return root, nil
|
return root, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Editor) InsertNodeAtPath(ctx context.Context, path string, toinsert key.Key, create func() *dag.Node) error {
|
func (e *Editor) InsertNodeAtPath(ctx context.Context, path string, toinsert *dag.Node, create func() *dag.Node) error {
|
||||||
splpath := strings.Split(path, "/")
|
splpath := strings.Split(path, "/")
|
||||||
nd, err := insertNodeAtPath(ctx, e.ds, e.root, splpath, toinsert, create)
|
nd, err := insertNodeAtPath(ctx, e.ds, e.root, splpath, toinsert, create)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -68,7 +63,7 @@ func (e *Editor) InsertNodeAtPath(ctx context.Context, path string, toinsert key
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func insertNodeAtPath(ctx context.Context, ds dag.DAGService, root *dag.Node, path []string, toinsert key.Key, create func() *dag.Node) (*dag.Node, error) {
|
func insertNodeAtPath(ctx context.Context, ds dag.DAGService, root *dag.Node, path []string, toinsert *dag.Node, create func() *dag.Node) (*dag.Node, error) {
|
||||||
if len(path) == 1 {
|
if len(path) == 1 {
|
||||||
return addLink(ctx, ds, root, path[0], toinsert)
|
return addLink(ctx, ds, root, path[0], toinsert)
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ func TestAddLink(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nd := new(dag.Node)
|
nd := new(dag.Node)
|
||||||
nnode, err := addLink(context.Background(), ds, nd, "fish", fk)
|
nnode, err := addLink(context.Background(), ds, nd, "fish", fishnode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -104,7 +104,7 @@ func testInsert(t *testing.T, e *Editor, path, data string, create bool, experr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = e.InsertNodeAtPath(context.Background(), path, ck, c)
|
err = e.InsertNodeAtPath(context.Background(), path, child, c)
|
||||||
if experr != "" {
|
if experr != "" {
|
||||||
var got string
|
var got string
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Reference in New Issue
Block a user