ipfs / ipfs/boxo

blockservice: AddBlock will check file exist twice for new file

Open
#373 4 comments 0 reactions 0 assignees View on GitHub
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.