1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-08-06 19:44:01 +08:00

add pin lock in AddallPin function

License: MIT
Signed-off-by: Kejie Zhang <601172892@qq.com>
This commit is contained in:
Kejie Zhang
2018-09-21 14:55:15 +08:00
committed by Steven Allen
parent 49bb9fba2a
commit 1379ee76f3
3 changed files with 42 additions and 36 deletions

View File

@ -276,6 +276,7 @@ You can now check what blocks have been created by:
fileAdder.NoCopy = nocopy fileAdder.NoCopy = nocopy
fileAdder.Name = pathName fileAdder.Name = pathName
fileAdder.CidBuilder = prefix fileAdder.CidBuilder = prefix
fileAdder.Hash = hash
if inline { if inline {
fileAdder.CidBuilder = cidutil.InlineBuilder{ fileAdder.CidBuilder = cidutil.InlineBuilder{
@ -297,42 +298,12 @@ You can now check what blocks have been created by:
fileAdder.SetMfsRoot(mr) fileAdder.SetMfsRoot(mr)
} }
addAllAndPin := func(f files.File) error {
// Iterate over each top-level file and add individually. Otherwise the
// single files.File f is treated as a directory, affecting hidden file
// semantics.
for {
file, err := f.NextFile()
if err == io.EOF {
// Finished the list of files.
break
} else if err != nil {
return err
}
if err := fileAdder.AddFile(file); err != nil {
return err
}
}
// copy intermediary nodes from editor to our actual dagservice
_, err := fileAdder.Finalize()
if err != nil {
return err
}
if hash {
return nil
}
return fileAdder.PinRoot()
}
errCh := make(chan error) errCh := make(chan error)
go func() { go func() {
var err error var err error
defer func() { errCh <- err }() defer func() { errCh <- err }()
defer close(outChan) defer close(outChan)
err = addAllAndPin(req.Files) err = fileAdder.AddAllAndPin(req.Files)
}() }()
err = res.Emit(outChan) err = res.Emit(outChan)

View File

@ -86,6 +86,7 @@ type Adder struct {
Name string Name string
NoCopy bool NoCopy bool
Chunker string Chunker string
Hash bool
root ipld.Node root ipld.Node
mroot *mfs.Root mroot *mfs.Root
unlocker bstore.Unlocker unlocker bstore.Unlocker
@ -398,8 +399,8 @@ func (adder *Adder) addNode(node ipld.Node, path string) error {
return nil return nil
} }
// AddFile adds the given file while respecting the adder. // AddAllAndPin adds the given request's files and pin them.
func (adder *Adder) AddFile(file files.File) error { func (adder *Adder) AddAllAndPin(file files.File) error {
if adder.Pin { if adder.Pin {
adder.unlocker = adder.blockstore.PinLock() adder.unlocker = adder.blockstore.PinLock()
} }
@ -409,7 +410,41 @@ func (adder *Adder) AddFile(file files.File) error {
} }
}() }()
return adder.addFile(file) switch {
case file.IsDirectory():
// Iterate over each top-level file and add individually. Otherwise the
// single files.File f is treated as a directory, affecting hidden file
// semantics.
for {
file, err := file.NextFile()
if err == io.EOF {
// Finished the list of files.
break
} else if err != nil {
return err
}
if err := adder.addFile(file); err != nil {
return err
}
}
break
default:
if err := adder.addFile(file); err != nil {
return err
}
break
}
// copy intermediary nodes from editor to our actual dagservice
_, err := adder.Finalize()
if err != nil {
return err
}
if adder.Hash {
return nil
}
return adder.PinRoot()
} }
func (adder *Adder) addFile(file files.File) error { func (adder *Adder) addFile(file files.File) error {

View File

@ -85,7 +85,7 @@ func TestAddGCLive(t *testing.T) {
go func() { go func() {
defer close(addDone) defer close(addDone)
defer close(out) defer close(out)
err := adder.AddFile(slf) err := adder.AddAllAndPin(slf)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@ -191,7 +191,7 @@ func testAddWPosInfo(t *testing.T, rawLeaves bool) {
go func() { go func() {
defer close(adder.Out) defer close(adder.Out)
err = adder.AddFile(file) err = adder.AddAllAndPin(file)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }