@@ -70,15 +70,13 @@ func (db *DB) Delete(addrs []oid.Address) (DeleteRes, error) {
70
70
// removed number: objects that were available (without Tombstones, GCMarks
71
71
// non-expired, etc.)
72
72
func (db * DB ) deleteGroup (tx * bbolt.Tx , addrs []oid.Address , sizes []uint64 ) (uint64 , uint64 , error ) {
73
- currEpoch := db .epochState .CurrentEpoch ()
74
-
75
73
var rawDeleted uint64
76
74
var availableDeleted uint64
77
75
var errorCount int
78
76
var firstErr error
79
77
80
78
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 ])
82
80
if err != nil {
83
81
errorCount ++
84
82
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
127
125
// non-exist object is error-free). The second return value indicates if an
128
126
// object was available before the removal (for calculating the logical object
129
127
// 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 ) {
131
129
key := make ([]byte , addressKeySize )
132
130
cID := addr .Container ()
133
131
addrKey := addressKey (addr , key )
@@ -154,6 +152,16 @@ func (db *DB) delete(tx *bbolt.Tx, addr oid.Address, currEpoch uint64) (bool, bo
154
152
return false , false , 0 , fmt .Errorf ("can't remove metadata indexes: %w" , err )
155
153
}
156
154
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
+
157
165
return true , removeAvailableObject , payloadSize , nil
158
166
}
159
167
0 commit comments