diff --git a/storage/localstore/localstore_test.go b/storage/localstore/localstore_test.go index ace0a10dcb..41d757506e 100644 --- a/storage/localstore/localstore_test.go +++ b/storage/localstore/localstore_test.go @@ -613,6 +613,6 @@ func TestDBDebugIndexes(t *testing.T) { } // assert that there's a pin and gc exclude entry now - testIndexCounts(t, 1, 1, 1, 1, 1, 1, 1, indexCounts) + testIndexCounts(t, 1, 1, 0, 1, 1, 1, 1, indexCounts) } diff --git a/storage/localstore/mode_get.go b/storage/localstore/mode_get.go index 0ad8825a19..d86d60b77d 100644 --- a/storage/localstore/mode_get.go +++ b/storage/localstore/mode_get.go @@ -154,7 +154,16 @@ func (db *DB) updateGC(item shed.Item) (err error) { // update retrieve access index db.retrievalAccessIndex.PutInBatch(batch, item) // add new entry to gc index - db.gcIndex.PutInBatch(batch, item) + ok, err := db.pinIndex.Has(item) + if err != nil { + return err + } + if !ok { + err = db.gcIndex.PutInBatch(batch, item) + if err != nil { + return err + } + } return db.shed.WriteBatch(batch) } diff --git a/storage/localstore/mode_put.go b/storage/localstore/mode_put.go index 8de4cc0f7f..dc48436621 100644 --- a/storage/localstore/mode_put.go +++ b/storage/localstore/mode_put.go @@ -317,8 +317,17 @@ func (db *DB) setGC(batch *leveldb.Batch, item shed.Item) (gcSizeChange int64, e item.AccessTimestamp = now() db.retrievalAccessIndex.PutInBatch(batch, item) - db.gcIndex.PutInBatch(batch, item) - gcSizeChange++ + ok, err := db.pinIndex.Has(item) + if err != nil { + return 0, err + } + if !ok { + err = db.gcIndex.PutInBatch(batch, item) + if err != nil { + return 0, err + } + gcSizeChange++ + } return gcSizeChange, nil } diff --git a/storage/localstore/mode_set.go b/storage/localstore/mode_set.go index 319ec1bf87..7703532fdc 100644 --- a/storage/localstore/mode_set.go +++ b/storage/localstore/mode_set.go @@ -171,8 +171,18 @@ func (db *DB) setAccess(batch *leveldb.Batch, binIDs map[uint8]uint64, addr chun item.AccessTimestamp = now() db.retrievalAccessIndex.PutInBatch(batch, item) db.pullIndex.PutInBatch(batch, item) - db.gcIndex.PutInBatch(batch, item) - gcSizeChange++ + + ok, err := db.pinIndex.Has(item) + if err != nil { + return 0, err + } + if !ok { + err = db.gcIndex.PutInBatch(batch, item) + if err != nil { + return 0, err + } + gcSizeChange++ + } return gcSizeChange, nil } @@ -296,7 +306,10 @@ func (db *DB) setSync(batch *leveldb.Batch, addr chunk.Address, mode chunk.ModeS return 0, err } if !ok { - db.gcIndex.PutInBatch(batch, item) + err = db.gcIndex.PutInBatch(batch, item) + if err != nil { + return 0, err + } gcSizeChange++ }