From 582e5dee3a97f994e7d204ed23960f5752f86553 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 19 Aug 2016 18:33:44 -0700 Subject: [PATCH] blockservice: don't store blocks we already have License: MIT Signed-off-by: Jeromy --- blockservice/blockservice.go | 28 +++++++++++++++++++++++++--- exchange/bitswap/workers.go | 1 + 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/blockservice/blockservice.go b/blockservice/blockservice.go index 71058061444..12aa022c000 100644 --- a/blockservice/blockservice.go +++ b/blockservice/blockservice.go @@ -43,7 +43,15 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService { // TODO pass a context into this if the remote.HasBlock is going to remain here. func (s *BlockService) AddBlock(b blocks.Block) (key.Key, error) { k := b.Key() - err := s.Blockstore.Put(b) + has, err := s.Blockstore.Has(k) + if err != nil { + return k, err + } + if has { + return k, nil + } + + err = s.Blockstore.Put(b) if err != nil { return k, err } @@ -54,13 +62,27 @@ func (s *BlockService) AddBlock(b blocks.Block) (key.Key, error) { } func (s *BlockService) AddBlocks(bs []blocks.Block) ([]key.Key, error) { - err := s.Blockstore.PutMany(bs) + var toput []blocks.Block + for _, b := range bs { + has, err := s.Blockstore.Has(b.Key()) + if err != nil { + return nil, err + } + + if has { + continue + } + + toput = append(toput, b) + } + + err := s.Blockstore.PutMany(toput) if err != nil { return nil, err } var ks []key.Key - for _, b := range bs { + for _, b := range toput { if err := s.Exchange.HasBlock(b); err != nil { return nil, errors.New("blockservice is closed") } diff --git a/exchange/bitswap/workers.go b/exchange/bitswap/workers.go index 4aa45791733..b7e4a4a7cf5 100644 --- a/exchange/bitswap/workers.go +++ b/exchange/bitswap/workers.go @@ -133,6 +133,7 @@ func (bs *Bitswap) provideCollector(ctx context.Context) { log.Debug("newBlocks channel closed") return } + if keysOut == nil { nextKey = blk.Key() keysOut = bs.provideKeys