-
-
Notifications
You must be signed in to change notification settings - Fork 3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Stable bits from Pull Request #2634 #2792
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -67,42 +67,46 @@ type AddedObject struct { | |
Bytes int64 `json:",omitempty"` | ||
} | ||
|
||
func NewAdder(ctx context.Context, n *core.IpfsNode, out chan interface{}) (*Adder, error) { | ||
mr, err := mfs.NewRoot(ctx, n.DAG, newDirNode(), nil) | ||
func NewAdder(ctx context.Context, p pin.Pinner, bs bstore.GCBlockstore, ds dag.DAGService) (*Adder, error) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. curious why the interface change? I imagine that this is nicer for users: node := mkipfsNode(...)
add.NewAdder(ctx, node, out) Was there a case where you didnt have a node, but you had everything else? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also, what happens if users do not set There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @jbenet this was changed because passing in a node gives us very little control over how the add gets done. Using a different blockstore or temporary dagservice for different applications is becoming fairly common. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @jbenet also, passing There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes there was a case when I didn't have a node but everthing else. This was discussed with @whyrusleeping over IRC. There are checks in the code to check if fileadder.Out is nil and if so no attempt is written to the channel. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also see #2634 (comment). |
||
mr, err := mfs.NewRoot(ctx, ds, newDirNode(), nil) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
return &Adder{ | ||
mr: mr, | ||
ctx: ctx, | ||
node: n, | ||
out: out, | ||
Progress: false, | ||
Hidden: true, | ||
Pin: true, | ||
Trickle: false, | ||
Wrap: false, | ||
Chunker: "", | ||
mr: mr, | ||
ctx: ctx, | ||
pinning: p, | ||
blockstore: bs, | ||
dagService: ds, | ||
Progress: false, | ||
Hidden: true, | ||
Pin: true, | ||
Trickle: false, | ||
Wrap: false, | ||
Chunker: "", | ||
}, nil | ||
|
||
} | ||
|
||
// Internal structure for holding the switches passed to the `add` call | ||
type Adder struct { | ||
ctx context.Context | ||
node *core.IpfsNode | ||
out chan interface{} | ||
Progress bool | ||
Hidden bool | ||
Pin bool | ||
Trickle bool | ||
Silent bool | ||
Wrap bool | ||
Chunker string | ||
root *dag.Node | ||
mr *mfs.Root | ||
unlocker bs.Unlocker | ||
tempRoot key.Key | ||
ctx context.Context | ||
pinning pin.Pinner | ||
blockstore bstore.GCBlockstore | ||
dagService dag.DAGService | ||
Out chan interface{} | ||
Progress bool | ||
Hidden bool | ||
Pin bool | ||
Trickle bool | ||
Silent bool | ||
Wrap bool | ||
Chunker string | ||
root *dag.Node | ||
mr *mfs.Root | ||
unlocker bs.Unlocker | ||
tempRoot key.Key | ||
} | ||
|
||
// Perform the actual add & pin locally, outputting results to reader | ||
|
@@ -114,12 +118,12 @@ func (adder Adder) add(reader io.Reader) (*dag.Node, error) { | |
|
||
if adder.Trickle { | ||
return importer.BuildTrickleDagFromReader( | ||
adder.node.DAG, | ||
adder.dagService, | ||
chnk, | ||
) | ||
} | ||
return importer.BuildDagFromReader( | ||
adder.node.DAG, | ||
adder.dagService, | ||
chnk, | ||
) | ||
} | ||
|
@@ -137,7 +141,7 @@ func (adder *Adder) RootNode() (*dag.Node, error) { | |
|
||
// if not wrapping, AND one root file, use that hash as root. | ||
if !adder.Wrap && len(root.Links) == 1 { | ||
root, err = root.Links[0].GetNode(adder.ctx, adder.node.DAG) | ||
root, err = root.Links[0].GetNode(adder.ctx, adder.dagService) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
@@ -156,21 +160,21 @@ func (adder *Adder) PinRoot() error { | |
return nil | ||
} | ||
|
||
rnk, err := adder.node.DAG.Add(root) | ||
rnk, err := adder.dagService.Add(root) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
if adder.tempRoot != "" { | ||
err := adder.node.Pinning.Unpin(adder.ctx, adder.tempRoot, true) | ||
err := adder.pinning.Unpin(adder.ctx, adder.tempRoot, true) | ||
if err != nil { | ||
return err | ||
} | ||
adder.tempRoot = rnk | ||
} | ||
|
||
adder.node.Pinning.PinWithMode(rnk, pin.Recursive) | ||
return adder.node.Pinning.Flush() | ||
adder.pinning.PinWithMode(rnk, pin.Recursive) | ||
return adder.pinning.Flush() | ||
} | ||
|
||
func (adder *Adder) Finalize() (*dag.Node, error) { | ||
|
@@ -237,15 +241,15 @@ func (adder *Adder) outputDirs(path string, fs mfs.FSNode) error { | |
} | ||
} | ||
|
||
return outputDagnode(adder.out, path, nd) | ||
return outputDagnode(adder.Out, path, nd) | ||
} | ||
|
||
// Add builds a merkledag from the a reader, pinning all objects to the local | ||
// datastore. Returns a key representing the root node. | ||
func Add(n *core.IpfsNode, r io.Reader) (string, error) { | ||
defer n.Blockstore.PinLock().Unlock() | ||
|
||
fileAdder, err := NewAdder(n.Context(), n, nil) | ||
fileAdder, err := NewAdder(n.Context(), n.Pinning, n.Blockstore, n.DAG) | ||
if err != nil { | ||
return "", err | ||
} | ||
|
@@ -277,7 +281,7 @@ func AddR(n *core.IpfsNode, root string) (key string, err error) { | |
} | ||
defer f.Close() | ||
|
||
fileAdder, err := NewAdder(n.Context(), n, nil) | ||
fileAdder, err := NewAdder(n.Context(), n.Pinning, n.Blockstore, n.DAG) | ||
if err != nil { | ||
return "", err | ||
} | ||
|
@@ -306,7 +310,7 @@ func AddR(n *core.IpfsNode, root string) (key string, err error) { | |
// the directory, and and error if any. | ||
func AddWrapped(n *core.IpfsNode, r io.Reader, filename string) (string, *dag.Node, error) { | ||
file := files.NewReaderFile(filename, filename, ioutil.NopCloser(r), nil) | ||
fileAdder, err := NewAdder(n.Context(), n, nil) | ||
fileAdder, err := NewAdder(n.Context(), n.Pinning, n.Blockstore, n.DAG) | ||
if err != nil { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @jbenet, note that nil was originally passed in to NewAdder here. |
||
return "", nil, err | ||
} | ||
|
@@ -355,14 +359,14 @@ func (adder *Adder) addNode(node *dag.Node, path string) error { | |
} | ||
|
||
if !adder.Silent { | ||
return outputDagnode(adder.out, path, node) | ||
return outputDagnode(adder.Out, path, node) | ||
} | ||
return nil | ||
} | ||
|
||
// Add the given file while respecting the adder. | ||
func (adder *Adder) AddFile(file files.File) error { | ||
adder.unlocker = adder.node.Blockstore.PinLock() | ||
adder.unlocker = adder.blockstore.PinLock() | ||
defer func() { | ||
adder.unlocker.Unlock() | ||
}() | ||
|
@@ -388,7 +392,7 @@ func (adder *Adder) addFile(file files.File) error { | |
} | ||
|
||
dagnode := &dag.Node{Data: sdata} | ||
_, err = adder.node.DAG.Add(dagnode) | ||
_, err = adder.dagService.Add(dagnode) | ||
if err != nil { | ||
return err | ||
} | ||
|
@@ -401,7 +405,7 @@ func (adder *Adder) addFile(file files.File) error { | |
// progress updates to the client (over the output channel) | ||
var reader io.Reader = file | ||
if adder.Progress { | ||
reader = &progressReader{file: file, out: adder.out} | ||
reader = &progressReader{file: file, out: adder.Out} | ||
} | ||
|
||
dagnode, err := adder.add(reader) | ||
|
@@ -445,14 +449,14 @@ func (adder *Adder) addDir(dir files.File) error { | |
} | ||
|
||
func (adder *Adder) maybePauseForGC() error { | ||
if adder.node.Blockstore.GCRequested() { | ||
if adder.blockstore.GCRequested() { | ||
err := adder.PinRoot() | ||
if err != nil { | ||
return err | ||
} | ||
|
||
adder.unlocker.Unlock() | ||
adder.unlocker = adder.node.Blockstore.PinLock() | ||
adder.unlocker = adder.blockstore.PinLock() | ||
} | ||
return nil | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Curious why the name change?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note, that I originally named this RawBlock in commit b84cbec. Both commits where factored out of #2634/#2600. The name
RawBlock
was only a temporary name, I meant to squash this in b84cbec but messed up the rebase and didn't notice until after it was merged.