github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/core/corerepo/gc.go (about) 1 package corerepo 2 3 import ( 4 context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" 5 key "github.com/ipfs/go-ipfs/blocks/key" 6 "github.com/ipfs/go-ipfs/core" 7 8 eventlog "github.com/ipfs/go-ipfs/thirdparty/eventlog" 9 ) 10 11 var log = eventlog.Logger("corerepo") 12 13 type KeyRemoved struct { 14 Key key.Key 15 } 16 17 func GarbageCollect(n *core.IpfsNode, ctx context.Context) error { 18 ctx, cancel := context.WithCancel(context.Background()) 19 defer cancel() // in case error occurs during operation 20 keychan, err := n.Blockstore.AllKeysChan(ctx) 21 if err != nil { 22 return err 23 } 24 for k := range keychan { // rely on AllKeysChan to close chan 25 if !n.Pinning.IsPinned(k) { 26 err := n.Blockstore.DeleteBlock(k) 27 if err != nil { 28 return err 29 } 30 } 31 } 32 return nil 33 } 34 35 func GarbageCollectAsync(n *core.IpfsNode, ctx context.Context) (<-chan *KeyRemoved, error) { 36 37 keychan, err := n.Blockstore.AllKeysChan(ctx) 38 if err != nil { 39 return nil, err 40 } 41 42 output := make(chan *KeyRemoved) 43 go func() { 44 defer close(output) 45 for { 46 select { 47 case k, ok := <-keychan: 48 if !ok { 49 return 50 } 51 if !n.Pinning.IsPinned(k) { 52 err := n.Blockstore.DeleteBlock(k) 53 if err != nil { 54 log.Debugf("Error removing key from blockstore: %s", err) 55 continue 56 } 57 select { 58 case output <- &KeyRemoved{k}: 59 case <-ctx.Done(): 60 } 61 } 62 case <-ctx.Done(): 63 return 64 } 65 } 66 }() 67 return output, nil 68 }