blockservice: don't store blocks we already have
License: MIT Signed-off-by: Jeromy <why@ipfs.io>
Jeromy committed
Aug 19, 2016 at 18:33 UTC
582e5dee3a97f994e7d204ed23960f5752f86553
2 files changed
+26
-3
blockservice/blockservice.go
+25
-3
@@ -43,7 +43,15 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService {
43
// TODO pass a context into this if the remote.HasBlock is going to remain here.
44
func (s *BlockService) AddBlock(b blocks.Block) (key.Key, error) {
45
k := b.Key()
46
- err := s.Blockstore.Put(b)
46
+ has, err := s.Blockstore.Has(k)
47
+ if err != nil {
48
+ return k, err
49
+ }
50
+ if has {
51
+ return k, nil
52
+ }
53
+
54
+ err = s.Blockstore.Put(b)
55
if err != nil {
56
return k, err
57
}
@@ -54,13 +62,27 @@ func (s *BlockService) AddBlock(b blocks.Block) (key.Key, error) {
62
}
63
64
func (s *BlockService) AddBlocks(bs []blocks.Block) ([]key.Key, error) {
57
- err := s.Blockstore.PutMany(bs)
65
+ var toput []blocks.Block
66
+ for _, b := range bs {
67
+ has, err := s.Blockstore.Has(b.Key())
68
+ if err != nil {
69
+ return nil, err
70
+ }
71
+
72
+ if has {
73
+ continue
74
+ }
75
+
76
+ toput = append(toput, b)
77
+ }
78
+
79
+ err := s.Blockstore.PutMany(toput)
80
if err != nil {
81
return nil, err
82
}
83
84
var ks []key.Key
63
- for _, b := range bs {
85
+ for _, b := range toput {
86
if err := s.Exchange.HasBlock(b); err != nil {
87
return nil, errors.New("blockservice is closed")
88
}
exchange/bitswap/workers.go
+1
@@ -133,6 +133,7 @@ func (bs *Bitswap) provideCollector(ctx context.Context) {
133
log.Debug("newBlocks channel closed")
134
return
135
}
136
+
137
if keysOut == nil {
138
nextKey = blk.Key()
139
keysOut = bs.provideKeys