提交 582e5dee 作者: Jeromy

blockservice: don't store blocks we already have

License: MIT
Signed-off-by: 's avatarJeromy <why@ipfs.io>
上级 8830aae9
...@@ -43,7 +43,15 @@ func New(bs blockstore.Blockstore, rem exchange.Interface) *BlockService { ...@@ -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. // 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) { func (s *BlockService) AddBlock(b blocks.Block) (key.Key, error) {
k := b.Key() 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 { if err != nil {
return k, err return k, err
} }
...@@ -54,13 +62,27 @@ func (s *BlockService) AddBlock(b blocks.Block) (key.Key, error) { ...@@ -54,13 +62,27 @@ func (s *BlockService) AddBlock(b blocks.Block) (key.Key, error) {
} }
func (s *BlockService) AddBlocks(bs []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 { if err != nil {
return nil, err return nil, err
} }
var ks []key.Key var ks []key.Key
for _, b := range bs { for _, b := range toput {
if err := s.Exchange.HasBlock(b); err != nil { if err := s.Exchange.HasBlock(b); err != nil {
return nil, errors.New("blockservice is closed") return nil, errors.New("blockservice is closed")
} }
......
...@@ -133,6 +133,7 @@ func (bs *Bitswap) provideCollector(ctx context.Context) { ...@@ -133,6 +133,7 @@ func (bs *Bitswap) provideCollector(ctx context.Context) {
log.Debug("newBlocks channel closed") log.Debug("newBlocks channel closed")
return return
} }
if keysOut == nil { if keysOut == nil {
nextKey = blk.Key() nextKey = blk.Key()
keysOut = bs.provideKeys keysOut = bs.provideKeys
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论