Skip to content

Commit 4f76ba1

Browse files
authored
Fix/object counters with new GC (#3615)
2 parents 58b3d32 + 1b91ec5 commit 4f76ba1

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

pkg/local_object_storage/metabase/delete.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,13 @@ func (db *DB) Delete(addrs []oid.Address) (DeleteRes, error) {
7070
// removed number: objects that were available (without Tombstones, GCMarks
7171
// non-expired, etc.)
7272
func (db *DB) deleteGroup(tx *bbolt.Tx, addrs []oid.Address, sizes []uint64) (uint64, uint64, error) {
73-
currEpoch := db.epochState.CurrentEpoch()
74-
7573
var rawDeleted uint64
7674
var availableDeleted uint64
7775
var errorCount int
7876
var firstErr error
7977

8078
for i := range addrs {
81-
removed, available, size, err := db.delete(tx, addrs[i], currEpoch)
79+
removed, available, size, err := db.delete(tx, addrs[i])
8280
if err != nil {
8381
errorCount++
8482
db.log.Warn("failed to delete object", zap.Stringer("addr", addrs[i]), zap.Error(err))
@@ -127,7 +125,7 @@ func (db *DB) deleteGroup(tx *bbolt.Tx, addrs []oid.Address, sizes []uint64) (ui
127125
// non-exist object is error-free). The second return value indicates if an
128126
// object was available before the removal (for calculating the logical object
129127
// counter). The third return value is removed object payload size.
130-
func (db *DB) delete(tx *bbolt.Tx, addr oid.Address, currEpoch uint64) (bool, bool, uint64, error) {
128+
func (db *DB) delete(tx *bbolt.Tx, addr oid.Address) (bool, bool, uint64, error) {
131129
key := make([]byte, addressKeySize)
132130
cID := addr.Container()
133131
addrKey := addressKey(addr, key)
@@ -154,6 +152,16 @@ func (db *DB) delete(tx *bbolt.Tx, addr oid.Address, currEpoch uint64) (bool, bo
154152
return false, false, 0, fmt.Errorf("can't remove metadata indexes: %w", err)
155153
}
156154

155+
// if object is not available, counters have already been handled in
156+
// `Inhume` call, but if we are removing an available object, this is
157+
// either a force removal or GC work, and counters must be kept up-to-date
158+
if removeAvailableObject {
159+
err = changeContainerInfo(tx, cID, -int(payloadSize), -1)
160+
if err != nil {
161+
return false, false, 0, fmt.Errorf("can't update container info: %w", err)
162+
}
163+
}
164+
157165
return true, removeAvailableObject, payloadSize, nil
158166
}
159167

pkg/local_object_storage/metabase/delete_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,39 @@ func TestDB_Delete(t *testing.T) {
7272
require.False(t, ok)
7373
}
7474

75+
func TestContainerInfo(t *testing.T) {
76+
db := newDB(t)
77+
78+
cID := cidtest.ID()
79+
obj := generateObjectWithCID(t, cID)
80+
obj.ResetRelations()
81+
82+
payloadSize := obj.PayloadSize()
83+
84+
err := putBig(db, obj)
85+
require.NoError(t, err)
86+
87+
info, err := db.GetContainerInfo(cID)
88+
require.NoError(t, err)
89+
90+
require.Equal(t, uint64(1), info.ObjectsNumber)
91+
require.Equal(t, payloadSize, info.StorageSize)
92+
93+
res, err := db.Delete([]oid.Address{object.AddressOf(obj)})
94+
require.NoError(t, err)
95+
96+
require.Equal(t, uint64(1), res.AvailableRemoved)
97+
require.Equal(t, uint64(1), res.RawRemoved)
98+
require.Len(t, res.Sizes, 1)
99+
require.Equal(t, payloadSize, res.Sizes[0])
100+
101+
info, err = db.GetContainerInfo(cID)
102+
require.NoError(t, err)
103+
104+
require.Zero(t, info.ObjectsNumber)
105+
require.Zero(t, info.StorageSize)
106+
}
107+
75108
func TestDeleteAllChildren(t *testing.T) {
76109
db := newDB(t)
77110

0 commit comments

Comments
 (0)