@cryptotaxi247 / kubo / commits / b91db6805

update pinning to new semantics, and fix a couple bugs

Jeromy committed Jan 19, 2015 at 00:26 UTC b91db68056b65ccf2c41547440edb835d4ecf55d
6 files changed +100 -84
core/commands/add.go
+5
@@ -122,6 +122,11 @@ func add(n *core.IpfsNode, readers []io.Reader) ([]*dag.Node, error) {
122 dagnodes = append(dagnodes, node)
123 }
124
125 + err := n.Pinning.Flush()
126 + if err != nil {
127 + return nil, err
128 + }
129 +
130 return dagnodes, nil
131 }
132
core/commands/pin.go
+3 -75
@@ -6,8 +6,7 @@ import (
6 "io"
7
8 cmds "github.com/jbenet/go-ipfs/commands"
9 - "github.com/jbenet/go-ipfs/core"
10 - "github.com/jbenet/go-ipfs/merkledag"
9 + corerepo "github.com/jbenet/go-ipfs/core/repo"
10 u "github.com/jbenet/go-ipfs/util"
11 )
12
@@ -58,21 +57,11 @@ on disk.
57 recursive = false
58 }
59
61 - nodes, err := pin(n, req.Arguments(), recursive)
60 + added, err := corerepo.Pin(n, req.Arguments(), recursive)
61 if err != nil {
62 return nil, err
63 }
64
66 - var added []u.Key
67 - for _, node := range nodes {
68 - k, err := node.Key()
69 - if err != nil {
70 - return nil, err
71 - }
72 - added = append(added, k)
73 - }
74 -
75 - // TODO: create some output to show what got pinned
65 return &PinOutput{added}, nil
66 },
67 Marshalers: cmds.MarshalerMap{
@@ -122,20 +111,11 @@ collected if needed.
111 recursive = false // default
112 }
113
125 - nodes, err := unpin(n, req.Arguments(), recursive)
114 + removed, err := corerepo.Unpin(n, req.Arguments(), recursive)
115 if err != nil {
116 return nil, err
117 }
118
130 - var removed []u.Key
131 - for _, node := range nodes {
132 - k, err := node.Key()
133 - if err != nil {
134 - return nil, err
135 - }
136 - removed = append(removed, k)
137 - }
138 -
119 return &PinOutput{removed}, nil
120 },
121 Marshalers: cmds.MarshalerMap{
@@ -215,55 +195,3 @@ Use --type=<type> to specify the type of pinned keys to list. Valid values are:
195 cmds.Text: KeyListTextMarshaler,
196 },
197 }
218 -
219 -func pin(n *core.IpfsNode, paths []string, recursive bool) ([]*merkledag.Node, error) {
220 -
221 - dagnodes := make([]*merkledag.Node, 0)
222 - for _, path := range paths {
223 - dagnode, err := n.Resolver.ResolvePath(path)
224 - if err != nil {
225 - return nil, fmt.Errorf("pin error: %v", err)
226 - }
227 - dagnodes = append(dagnodes, dagnode)
228 - }
229 -
230 - for _, dagnode := range dagnodes {
231 - err := n.Pinning.Pin(dagnode, recursive)
232 - if err != nil {
233 - return nil, fmt.Errorf("pin: %v", err)
234 - }
235 - }
236 -
237 - err := n.Pinning.Flush()
238 - if err != nil {
239 - return nil, err
240 - }
241 -
242 - return dagnodes, nil
243 -}
244 -
245 -func unpin(n *core.IpfsNode, paths []string, recursive bool) ([]*merkledag.Node, error) {
246 -
247 - dagnodes := make([]*merkledag.Node, 0)
248 - for _, path := range paths {
249 - dagnode, err := n.Resolver.ResolvePath(path)
250 - if err != nil {
251 - return nil, err
252 - }
253 - dagnodes = append(dagnodes, dagnode)
254 - }
255 -
256 - for _, dagnode := range dagnodes {
257 - k, _ := dagnode.Key()
258 - err := n.Pinning.Unpin(k, recursive)
259 - if err != nil {
260 - return nil, err
261 - }
262 - }
263 -
264 - err := n.Pinning.Flush()
265 - if err != nil {
266 - return nil, err
267 - }
268 - return dagnodes, nil
269 -}
core/commands/repo.go
+1 -1
@@ -3,10 +3,10 @@ package commands
3 import (
4 "bytes"
5 "fmt"
6 - "io"
6 cmds "github.com/jbenet/go-ipfs/commands"
7 "github.com/jbenet/go-ipfs/core"
8 u "github.com/jbenet/go-ipfs/util"
9 + "io"
10 )
11
12 var RepoCmd = &cmds.Command{
core/repo/pinning.go new
+70
@@ -0,0 +1,70 @@
1 +package corerepo
2 +
3 +import (
4 + "fmt"
5 +
6 + "github.com/jbenet/go-ipfs/core"
7 + "github.com/jbenet/go-ipfs/merkledag"
8 + u "github.com/jbenet/go-ipfs/util"
9 +)
10 +
11 +func Pin(n *core.IpfsNode, paths []string, recursive bool) ([]u.Key, error) {
12 +
13 + dagnodes := make([]*merkledag.Node, 0)
14 + for _, path := range paths {
15 + dagnode, err := n.Resolver.ResolvePath(path)
16 + if err != nil {
17 + return nil, fmt.Errorf("pin error: %v", err)
18 + }
19 + dagnodes = append(dagnodes, dagnode)
20 + }
21 +
22 + var out []u.Key
23 + for _, dagnode := range dagnodes {
24 + k, err := dagnode.Key()
25 + if err != nil {
26 + return nil, err
27 + }
28 +
29 + err = n.Pinning.Pin(dagnode, recursive)
30 + if err != nil {
31 + return nil, fmt.Errorf("pin: %v", err)
32 + }
33 + out = append(out, k)
34 + }
35 +
36 + err := n.Pinning.Flush()
37 + if err != nil {
38 + return nil, err
39 + }
40 +
41 + return out, nil
42 +}
43 +
44 +func Unpin(n *core.IpfsNode, paths []string, recursive bool) ([]u.Key, error) {
45 +
46 + dagnodes := make([]*merkledag.Node, 0)
47 + for _, path := range paths {
48 + dagnode, err := n.Resolver.ResolvePath(path)
49 + if err != nil {
50 + return nil, err
51 + }
52 + dagnodes = append(dagnodes, dagnode)
53 + }
54 +
55 + var unpinned []u.Key
56 + for _, dagnode := range dagnodes {
57 + k, _ := dagnode.Key()
58 + err := n.Pinning.Unpin(k)
59 + if err != nil {
60 + return nil, err
61 + }
62 + unpinned = append(unpinned, k)
63 + }
64 +
65 + err := n.Pinning.Flush()
66 + if err != nil {
67 + return nil, err
68 + }
69 + return unpinned, nil
70 +}
pin/pin.go
+19 -6
@@ -25,12 +25,13 @@ const (
25 Recursive PinMode = iota
26 Direct
27 Indirect
28 + NotPinned
29 )
30
31 type Pinner interface {
32 IsPinned(util.Key) bool
33 Pin(*mdag.Node, bool) error
33 - Unpin(util.Key, bool) error
34 + Unpin(util.Key) error
35 Flush() error
36 GetManual() ManualPinner
37 DirectKeys() []util.Key
@@ -90,6 +91,10 @@ func (p *pinner) Pin(node *mdag.Node, recurse bool) error {
91 return nil
92 }
93
94 + if p.directPin.HasKey(k) {
95 + p.directPin.RemoveBlock(k)
96 + }
97 +
98 p.recursePin.AddBlock(k)
99
100 err := p.pinLinks(node)
@@ -97,16 +102,19 @@ func (p *pinner) Pin(node *mdag.Node, recurse bool) error {
102 return err
103 }
104 } else {
105 + if p.recursePin.HasKey(k) {
106 + return errors.New("Key already pinned recursively.")
107 + }
108 p.directPin.AddBlock(k)
109 }
110 return nil
111 }
112
105 -// Unpin a given key with optional recursive unpinning
106 -func (p *pinner) Unpin(k util.Key, recurse bool) error {
113 +// Unpin a given key
114 +func (p *pinner) Unpin(k util.Key) error {
115 p.lock.Lock()
116 defer p.lock.Unlock()
109 - if recurse {
117 + if p.recursePin.HasKey(k) {
118 p.recursePin.RemoveBlock(k)
119 node, err := p.dserv.Get(k)
120 if err != nil {
@@ -114,9 +122,14 @@ func (p *pinner) Unpin(k util.Key, recurse bool) error {
122 }
123
124 return p.unpinLinks(node)
125 + } else if p.directPin.HasKey(k) {
126 + p.directPin.RemoveBlock(k)
127 + return nil
128 + } else if p.indirPin.HasKey(k) {
129 + return errors.New("Cannot unpin indirectly pinned block.")
130 + } else {
131 + return errors.New("Given key was not pinned.")
132 }
118 - p.directPin.RemoveBlock(k)
119 - return nil
133 }
134
135 func (p *pinner) unpinLinks(node *mdag.Node) error {
pin/pin_test.go
+2 -2
@@ -100,8 +100,8 @@ func TestPinnerBasic(t *testing.T) {
100 t.Fatal("pinned node not found.")
101 }
102
103 - // Test recursive unpin
104 - err = p.Unpin(dk, true)
103 + // Test unpin
104 + err = p.Unpin(dk)
105 if err != nil {
106 t.Fatal(err)
107 }