diff --git a/pkg/local_object_storage/metabase/delete.go b/pkg/local_object_storage/metabase/delete.go
index 4fea4b4f2..6a5661ed1 100644
--- a/pkg/local_object_storage/metabase/delete.go
+++ b/pkg/local_object_storage/metabase/delete.go
@@ -139,81 +139,21 @@ func (db *DB) deleteGroup(tx *bbolt.Tx, addrs []oid.Address) (DeleteRes, error)
 	for i := range addrs {
 		r, err := db.delete(tx, addrs[i], refCounter, currEpoch)
 		if err != nil {
-			return DeleteRes{}, err // maybe log and continue?
+			return DeleteRes{}, err
 		}
 
-		if r.Removed {
-			if v, ok := res.removedByCnrID[addrs[i].Container()]; ok {
-				v.Phy++
-				res.removedByCnrID[addrs[i].Container()] = v
-			} else {
-				res.removedByCnrID[addrs[i].Container()] = ObjectCounters{
-					Phy: 1,
-				}
-			}
-
-			res.rawRemoved++
-			res.sizes[i] = r.Size
-		}
-
-		if r.Available {
-			if v, ok := res.removedByCnrID[addrs[i].Container()]; ok {
-				v.Logic++
-				res.removedByCnrID[addrs[i].Container()] = v
-			} else {
-				res.removedByCnrID[addrs[i].Container()] = ObjectCounters{
-					Logic: 1,
-				}
-			}
-
-			res.availableRemoved++
-			res.availableSizes[i] = r.Size
-		}
-
-		if r.User {
-			if v, ok := res.removedByCnrID[addrs[i].Container()]; ok {
-				v.User++
-				res.removedByCnrID[addrs[i].Container()] = v
-			} else {
-				res.removedByCnrID[addrs[i].Container()] = ObjectCounters{
-					User: 1,
-				}
-			}
-
-			res.userRemoved++
-		}
+		applyDeleteSingleResult(r, &res, addrs, i)
 	}
 
-	if res.rawRemoved > 0 {
-		err := db.updateShardObjectCounter(tx, phy, res.rawRemoved, false)
-		if err != nil {
-			return DeleteRes{}, fmt.Errorf("could not decrease phy object counter: %w", err)
-		}
-	}
-
-	if res.availableRemoved > 0 {
-		err := db.updateShardObjectCounter(tx, logical, res.availableRemoved, false)
-		if err != nil {
-			return DeleteRes{}, fmt.Errorf("could not decrease logical object counter: %w", err)
-		}
-	}
-
-	if res.userRemoved > 0 {
-		err := db.updateShardObjectCounter(tx, user, res.userRemoved, false)
-		if err != nil {
-			return DeleteRes{}, fmt.Errorf("could not decrease user object counter: %w", err)
-		}
-	}
-
-	if err := db.updateContainerCounter(tx, res.removedByCnrID, false); err != nil {
-		return DeleteRes{}, fmt.Errorf("could not decrease container object counter: %w", err)
+	if err := db.updateCountersDelete(tx, res); err != nil {
+		return DeleteRes{}, err
 	}
 
 	for _, refNum := range refCounter {
 		if refNum.cur == refNum.all {
 			err := db.deleteObject(tx, refNum.obj, true)
 			if err != nil {
-				return DeleteRes{}, err // maybe log and continue?
+				return DeleteRes{}, err
 			}
 		}
 	}
@@ -221,6 +161,77 @@ func (db *DB) deleteGroup(tx *bbolt.Tx, addrs []oid.Address) (DeleteRes, error)
 	return res, nil
 }
 
+func (db *DB) updateCountersDelete(tx *bbolt.Tx, res DeleteRes) error {
+	if res.rawRemoved > 0 {
+		err := db.updateShardObjectCounter(tx, phy, res.rawRemoved, false)
+		if err != nil {
+			return fmt.Errorf("could not decrease phy object counter: %w", err)
+		}
+	}
+
+	if res.availableRemoved > 0 {
+		err := db.updateShardObjectCounter(tx, logical, res.availableRemoved, false)
+		if err != nil {
+			return fmt.Errorf("could not decrease logical object counter: %w", err)
+		}
+	}
+
+	if res.userRemoved > 0 {
+		err := db.updateShardObjectCounter(tx, user, res.userRemoved, false)
+		if err != nil {
+			return fmt.Errorf("could not decrease user object counter: %w", err)
+		}
+	}
+
+	if err := db.updateContainerCounter(tx, res.removedByCnrID, false); err != nil {
+		return fmt.Errorf("could not decrease container object counter: %w", err)
+	}
+	return nil
+}
+
+func applyDeleteSingleResult(r deleteSingleResult, res *DeleteRes, addrs []oid.Address, i int) {
+	if r.Removed {
+		if v, ok := res.removedByCnrID[addrs[i].Container()]; ok {
+			v.Phy++
+			res.removedByCnrID[addrs[i].Container()] = v
+		} else {
+			res.removedByCnrID[addrs[i].Container()] = ObjectCounters{
+				Phy: 1,
+			}
+		}
+
+		res.rawRemoved++
+		res.sizes[i] = r.Size
+	}
+
+	if r.Available {
+		if v, ok := res.removedByCnrID[addrs[i].Container()]; ok {
+			v.Logic++
+			res.removedByCnrID[addrs[i].Container()] = v
+		} else {
+			res.removedByCnrID[addrs[i].Container()] = ObjectCounters{
+				Logic: 1,
+			}
+		}
+
+		res.availableRemoved++
+		res.availableSizes[i] = r.Size
+	}
+
+	if r.User {
+		if v, ok := res.removedByCnrID[addrs[i].Container()]; ok {
+			v.User++
+			res.removedByCnrID[addrs[i].Container()] = v
+		} else {
+			res.removedByCnrID[addrs[i].Container()] = ObjectCounters{
+				User: 1,
+			}
+		}
+
+		res.userRemoved++
+	}
+}
+
 type deleteSingleResult struct {
 	Removed   bool
 	Available bool