From 4d63820bbe93df7ffa9b06a5a78692249532bc9f Mon Sep 17 00:00:00 2001 From: Jeromy <jeromyj@gmail.com> Date: Fri, 17 Oct 2014 13:53:49 -0700 Subject: [PATCH] move indirect pinning to its own structure --- blocks/set/refset.go | 39 --------------------------------------- pin/indirect.go | 43 +++++++++++++++++++++++++++++++++++++++++++ pin/pin.go | 11 +++++++---- 3 files changed, 50 insertions(+), 43 deletions(-) delete mode 100644 blocks/set/refset.go create mode 100644 pin/indirect.go diff --git a/blocks/set/refset.go b/blocks/set/refset.go deleted file mode 100644 index 9f1007ab5..000000000 --- a/blocks/set/refset.go +++ /dev/null @@ -1,39 +0,0 @@ -package set - -import ( - "github.com/jbenet/go-ipfs/blocks/bloom" - "github.com/jbenet/go-ipfs/util" -) - -type refCntBlockSet struct { - blocks map[util.Key]int -} - -func NewRefCountBlockSet() BlockSet { - return &refCntBlockSet{blocks: make(map[util.Key]int)} -} - -func (r *refCntBlockSet) AddBlock(k util.Key) { - r.blocks[k]++ -} - -func (r *refCntBlockSet) RemoveBlock(k util.Key) { - v, ok := r.blocks[k] - if !ok { - return - } - if v <= 1 { - delete(r.blocks, k) - } else { - r.blocks[k] = v - 1 - } -} - -func (r *refCntBlockSet) HasKey(k util.Key) bool { - _, ok := r.blocks[k] - return ok -} - -func (r *refCntBlockSet) GetBloomFilter() bloom.Filter { - return nil -} diff --git a/pin/indirect.go b/pin/indirect.go new file mode 100644 index 000000000..b3b60e753 --- /dev/null +++ b/pin/indirect.go @@ -0,0 +1,43 @@ +package pin + +import ( + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" + bc "github.com/jbenet/go-ipfs/blocks/set" + "github.com/jbenet/go-ipfs/util" +) + +type indirectPin struct { + blockset bc.BlockSet + refCounts map[util.Key]int +} + +func loadBlockSet(d ds.Datastore) (bc.BlockSet, map[util.Key]int) { + panic("Not yet implemented!") + return nil, nil +} + +func newIndirectPin(d ds.Datastore) indirectPin { + // suppose the blockset actually takes blocks, not just keys + bs, rc := loadBlockSet(d) + return indirectPin{bs, rc} +} + +func (i *indirectPin) Increment(k util.Key) { + c := i.refCounts[k] + i.refCounts[k] = c + 1 + if c <= 0 { + i.blockset.AddBlock(k) + } +} + +func (i *indirectPin) Decrement(k util.Key) { + c := i.refCounts[k] - 1 + i.refCounts[k] = c + if c <= 0 { + i.blockset.RemoveBlock(k) + } +} + +func (i *indirectPin) HasKey(k util.Key) bool { + return i.blockset.HasKey(k) +} diff --git a/pin/pin.go b/pin/pin.go index d7184e24f..86fff2afb 100644 --- a/pin/pin.go +++ b/pin/pin.go @@ -15,19 +15,22 @@ type Pinner interface { type pinner struct { recursePin set.BlockSet directPin set.BlockSet - indirPin set.BlockSet + indirPin indirectPin dserv *mdag.DAGService dstore ds.Datastore } func NewPinner(dstore ds.Datastore, serv *mdag.DAGService) Pinner { + + // Load set from given datastore... rcset := set.NewDBWrapperSet(dstore, "/pinned/recurse/", set.NewSimpleBlockSet()) dirset := set.NewDBWrapperSet(dstore, "/pinned/direct/", set.NewSimpleBlockSet()) - indset := set.NewDBWrapperSet(dstore, "/pinned/indirect/", set.NewRefCountBlockSet()) + + nsdstore := dstore // WRAP IN NAMESPACE return &pinner{ recursePin: rcset, directPin: dirset, - indirPin: indset, + indirPin: newIndirectPin(nsdstore), dserv: serv, dstore: dstore, } @@ -99,7 +102,7 @@ func (p *pinner) pinIndirectRecurse(node *mdag.Node) error { return err } - p.indirPin.AddBlock(k) + p.indirPin.Increment(k) return p.pinLinks(node) } -- GitLab