Skip to content

Commit

Permalink
Merge pull request #10680 from filecoin-project/steb/blockstore-has-c…
Browse files Browse the repository at this point in the history
…heck

feat: badger: add a has check before writing to reduce duplicates
  • Loading branch information
arajasek authored Apr 26, 2023
2 parents eb0b1c9 + 0cff56a commit 7903224
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions blockstore/badger/blockstore.go
Original file line number Diff line number Diff line change
Expand Up @@ -746,6 +746,20 @@ func (b *Blockstore) Put(ctx context.Context, block blocks.Block) error {
}

put := func(db *badger.DB) error {
// Check if we have it before writing it.
switch err := db.View(func(txn *badger.Txn) error {
_, err := txn.Get(k)
return err
}); err {
case badger.ErrKeyNotFound:
case nil:
// Already exists, skip the put.
return nil
default:
return err
}

// Then write it.
err := db.Update(func(txn *badger.Txn) error {
return txn.Set(k, block.RawData())
})
Expand Down Expand Up @@ -801,12 +815,33 @@ func (b *Blockstore) PutMany(ctx context.Context, blocks []blocks.Block) error {
keys = append(keys, k)
}

err := b.db.View(func(txn *badger.Txn) error {
for i, k := range keys {
switch _, err := txn.Get(k); err {
case badger.ErrKeyNotFound:
case nil:
keys[i] = nil
default:
// Something is actually wrong
return err
}
}
return nil
})
if err != nil {
return err
}

put := func(db *badger.DB) error {
batch := db.NewWriteBatch()
defer batch.Cancel()

for i, block := range blocks {
k := keys[i]
if k == nil {
// skipped because we already have it.
continue
}
if err := batch.Set(k, block.RawData()); err != nil {
return err
}
Expand Down

0 comments on commit 7903224

Please sign in to comment.