blockservice: AddBlock will check file exist twice for new file
- Dominant language
- Go
- Stars
- 316
- Forks
- 163
- Avg merge
- 4d 12h
- Merged PRs (30d)
- 8
Description
1. The BlockService's AddBlock method look like:
```golang
# go-blockservice/blockservice.go
func (s *blockService) AddBlock(o blocks.Block) error {
if s.checkFirst {
if has, err := s.blockstore.Has(c); has || err != nil {
return err
}
}
if err := s.blockstore.Put(o); err != nil {
return err
}
}
```
2. blockstore.Put method look like:
```golang
# go-ipfs-blockstore/blockstore.go
func (bs *blockstore) Put(block blocks.Block) error {
k := dshelp.CidToDsKey(block.Cid())
// Has is cheaper than Put, so see if we already have it
exists, err := bs.datastore.Has(k)
if err == nil && exists {
return nil // already stored.
}
return bs.datastore.Put(k, block.RawData())
}
```
3. As we can see it check key exist twice, the check method is:
```golang
# go-ds-flatfs/flatfs.go
func (fs *Datastore) Has(key datastore.Key) (exists bool, err error) {
_, path := fs.encode(key)
switch _, err := os.Stat(path); {
case err == nil:
return true, nil
case os.IsNotExist(err):
return false, nil
default:
return false, err
}
}
```
It's expensive to check file exist with system call (os.Stat), maybe we can cache the check result.
is it right? maybe I made a mistake.
@whyrusleeping look forward to your reply.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.