mirror of
https://github.com/nspcc-dev/neofs-node.git
synced 2026-03-01 04:29:10 +00:00
Child is still alive after the big object was deleted after expiration #1515
Labels
No labels
I1
I2
I3
I4
S0
S1
S2
S3
S4
U0
U1
U2
U3
U4
blocked
bug
config
dependencies
discussion
documentation
enhancement
enhancement
epic
feature
go
good first issue
help wanted
neofs-adm
neofs-cli
neofs-cli
neofs-cli
neofs-ir
neofs-lens
neofs-storage
neofs-storage
performance
question
security
task
test
windows
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
nspcc-dev/neofs-node#1515
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @End-rey on GitHub (Oct 6, 2025).
Expected Behavior
When a big object is deleted after expiration, all of its parts are also deleted.
Current Behavior
After we delete expired objects on the garbage collector tick in #3582, a situation may arise where a big object has been deleted after expiration in one node, but not yet in another, and the policy is triggered. The parent is not allowed by the expiration attribute, but the child is copied, so it becomes available.
Possible Solution
Maybe, in the policy, check for more accurate expiration attributes.
Steps to Reproduce (for bugs)
Put a big object with multiple parts and an expiration attribute in a container with replicas on multiple nodes. Wait for the expiration to occur, then head the child objects. Sometimes these parts may still be available.
Context
Flacky test case https://rest.fs.neo.org/HXSaMJXk2g8C14ht8HSi7BBaiYZ1HeWh2xnWPGQCg4H6/4145-1759747062/index.html#suites/87d8da5f92824d091055170c29079bc0/2215af6c5636b4/.
Regression
Yes, store dead objects that will no longer be removed.
@roman-khimov commented on GitHub (Oct 15, 2025):
Same thing can happen with TS marks.
@roman-khimov commented on GitHub (Dec 3, 2025):
Seems like we can't solve it without a mark of some kind for expired big objects. And it needs to have first oid to match any part of the object.
@roman-khimov commented on GitHub (Dec 24, 2025):
Or we can just delay the deletion by a single epoch. Normally this race has rather narrow window of time since nodes eventually synchronize their epoch number, so if we're to drop objects an epoch later this won't be a problem unless sender is totally out of sync with the network, but it's likely to have some other problems if it is.