From 7a66a7dc9ffb28a6dfccf692b78968ce44235563 Mon Sep 17 00:00:00 2001 From: Tommi Virtanen Date: Mon, 8 Jun 2015 21:42:04 -0700 Subject: [PATCH] pin: Do not accidentally delete indirect pins on Flush License: MIT Signed-off-by: Jeromy --- pin/pin_test.go | 21 +++++++++++++++++++++ pin/set.go | 11 +++++++++++ 2 files changed, 32 insertions(+) diff --git a/pin/pin_test.go b/pin/pin_test.go index d3947254d..e96adb292 100644 --- a/pin/pin_test.go +++ b/pin/pin_test.go @@ -192,6 +192,27 @@ func TestDuplicateSemantics(t *testing.T) { } } +func TestFlush(t *testing.T) { + dstore := dssync.MutexWrap(ds.NewMapDatastore()) + bstore := blockstore.NewBlockstore(dstore) + bserv, err := bs.New(bstore, offline.Exchange(bstore)) + if err != nil { + t.Fatal(err) + } + + dserv := mdag.NewDAGService(bserv) + p := NewPinner(dstore, dserv) + _, k := randNode() + + p.PinWithMode(k, Indirect) + if err := p.Flush(); err != nil { + t.Fatal(err) + } + if !p.IsPinned(k) { + t.Fatal("expected key to still be pinned") + } +} + func TestPinRecursiveFail(t *testing.T) { ctx := context.Background() dstore := dssync.MutexWrap(ds.NewMapDatastore()) diff --git a/pin/set.go b/pin/set.go index 4b6edc2ed..71851af6e 100644 --- a/pin/set.go +++ b/pin/set.go @@ -314,7 +314,18 @@ func storeSet(ctx context.Context, dag merkledag.DAGService, keys []key.Key, int return n, nil } +func copyRefcounts(orig map[key.Key]uint64) map[key.Key]uint64 { + r := make(map[key.Key]uint64, len(orig)) + for k, v := range orig { + r[k] = v + } + return r +} + func storeMultiset(ctx context.Context, dag merkledag.DAGService, refcounts map[key.Key]uint64, internalKeys keyObserver) (*merkledag.Node, error) { + // make a working copy of the refcounts + refcounts = copyRefcounts(refcounts) + iter := func() (k key.Key, data []byte, ok bool) { // Every call of this function returns the next refcount item. //