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  }