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
}