[ 
https://issues.apache.org/jira/browse/HDDS-16093?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Janus Chow updated HDDS-16093:
------------------------------
    Description: 
This ticket includes the following tasks:
|*Sub-task*|*Scope*|*Acceptance*|
|T6.1 lifecycle proto + action wiring|noncurrentVersionExpiration on 
LifecycleAction, expiredObjectDeleteMarker on LifecycleExpiration; 
validation and the three S3 lifecycle endpoints accept them|rules round-trip 
through Put / Get / DeleteBucketLifecycleConfiguration; invalid combinations 
rejected|
|T6.2 versionedKeyTable scan in LifecycleActionTask|a second scan alongside the 
existing keyTable scan, reusing its batching, saved scan state and metrics; 
reclamation goes through a request of its own, since DeleteKeys addresses keys 
by name and cannot name a version|noncurrent versions past NoncurrentDays 
deleted with quota deducted; NewerNoncurrentVersions keeps N per key, 
oldest-first; a pass is bounded by the versions it reads, not the ones it 
selects, so a bucket whose versions all survive still yields between passes; it 
stops only at a key boundary, so a key is never evaluated against half of its 
own versions; versions permanently deleted or promoted since the pass selected 
them are skipped|
|T6.3 Expiration inserts a marker|on a bucket that has ever been versioned, 
Expiration.Days / .Date inserts a delete marker through the insertion the write 
requests already share (T3.4) instead of deleting; a key whose current version 
is already a marker is skipped|an expired current version is demoted to the 
versionedKeyTable under a new marker rather than removed — still readable by 
versionId, its blocks not reclaimed; markers never stack, so the version chain 
does not grow for as long as the rule exists; the run reports markers inserted 
rather than keys deleted with their bytes freed, since nothing was freed; 
unversioned buckets unchanged|
|T6.4 ExpiredObjectDeleteMarker|removes a delete marker, and the key with it, 
once nothing is left under it; the condition is "no version below the marker", 
not the marker's own age; removal goes through the reclaim request, not 
DeleteKeys, which on a versioned bucket would answer a delete by inserting 
another marker|a key whose only remaining version is a marker disappears from 
both tables, releasing namespace and nothing else; a key that still has 
noncurrent versions is left alone, so promotion can never resurrect an object 
the user deleted; the condition is re-checked under the bucket lock, where a 
version written since the scan is still caught; a marker a write has superseded 
is refused|
|T6.5 lifecycle service default and coupling|ozone.lifecycle.service.enabled 
flips to true; OM refuses to enable versioning on a bucket while the service is 
off, on both the create and the set-property path, checked in 
preExecute|enabling versioning with the service disabled returns 
NOT_SUPPORTED_OPERATION with an explanatory message on both paths; suspending 
is not refused, since it can only reduce what has to be reclaimed; with the 
service running, both paths behave as before|

 

  was:
This ticket includes the following tasks:
|*Sub-task*|*Scope*|*Acceptance*|
|T6.1 lifecycle proto + action wiring|noncurrentVersionExpiration on 
LifecycleAction, expiredObjectDeleteMarker on LifecycleExpiration; 
validation and the three S3 lifecycle endpoints accept them|rules round-trip 
through Put / Get / DeleteBucketLifecycleConfiguration; invalid combinations 
rejected|
|T6.2 versionedKeyTable scan in LifecycleActionTask|a second scan alongside the 
existing keyTable scan, reusing its batching, saved scan state and 
metrics|noncurrent versions past NoncurrentDays deleted with quota deducted; 
NewerNoncurrentVersions keeps N per key, oldest-first; the scan resumes from 
saved state;
The scan resumes from saved state at a key boundary, so a key is never 
evaluated against half of its own versions|
|T6.3 Expiration inserts a marker|on an ENABLED or SUSPENDED bucket, 
Expiration.Days / .Date inserts a delete marker through the insertion the write 
requests already share (T3.4) instead of deleting; 
an unversioned bucket keeps today's actual delete|an expired current version is 
demoted to the versionedKeyTable under a new marker rather than removed — still 
readable by versionId, its blocks not reclaimed; a SUSPENDED bucket takes the 
null slot with T5.1's semantics; unversioned buckets byte-for-byte unchanged|
|T6.4 ExpiredObjectDeleteMarker|removes a delete marker, and the key with it, 
once nothing is left under it; the condition is "no version below the marker", 
not the marker's own age|a key whose only remaining version is a marker 
disappears from both tables; 
a key that still has noncurrent versions is left alone, so promotion can never 
resurrect an object the user deleted; 
markers reachable by versionId until then|
|T6.5 maxVersions backstop and defaults|the per-bucket cap folded into the same 
scan, oldest-first, markers counting toward it; an explicit 
NewerNoncurrentVersions rule overrides it; ozone.lifecycle.service.enabled 
flips to true and OM rejects PutBucketVersioning(Enabled) while the service is 
off|a bucket with no lifecycle configuration converges to the cap; where both 
apply the rule's N wins; boundaries (0 = unlimited, 1, cluster default) 
covered; enabling versioning with the service disabled returns an explanatory 
error|
 


> [Ozone versioning] [T6] Version-aware lifecycle
> -----------------------------------------------
>
>                 Key: HDDS-16093
>                 URL: https://issues.apache.org/jira/browse/HDDS-16093
>             Project: Apache Ozone
>          Issue Type: Sub-task
>            Reporter: Janus Chow
>            Assignee: Janus Chow
>            Priority: Major
>              Labels: pull-request-available
>
> This ticket includes the following tasks:
> |*Sub-task*|*Scope*|*Acceptance*|
> |T6.1 lifecycle proto + action wiring|noncurrentVersionExpiration on 
> LifecycleAction, expiredObjectDeleteMarker on LifecycleExpiration; 
> validation and the three S3 lifecycle endpoints accept them|rules round-trip 
> through Put / Get / DeleteBucketLifecycleConfiguration; invalid combinations 
> rejected|
> |T6.2 versionedKeyTable scan in LifecycleActionTask|a second scan alongside 
> the existing keyTable scan, reusing its batching, saved scan state and 
> metrics; reclamation goes through a request of its own, since DeleteKeys 
> addresses keys by name and cannot name a version|noncurrent versions past 
> NoncurrentDays deleted with quota deducted; NewerNoncurrentVersions keeps N 
> per key, oldest-first; a pass is bounded by the versions it reads, not the 
> ones it selects, so a bucket whose versions all survive still yields between 
> passes; it stops only at a key boundary, so a key is never evaluated against 
> half of its own versions; versions permanently deleted or promoted since the 
> pass selected them are skipped|
> |T6.3 Expiration inserts a marker|on a bucket that has ever been versioned, 
> Expiration.Days / .Date inserts a delete marker through the insertion the 
> write requests already share (T3.4) instead of deleting; a key whose current 
> version is already a marker is skipped|an expired current version is demoted 
> to the versionedKeyTable under a new marker rather than removed — still 
> readable by versionId, its blocks not reclaimed; markers never stack, so the 
> version chain does not grow for as long as the rule exists; the run reports 
> markers inserted rather than keys deleted with their bytes freed, since 
> nothing was freed; unversioned buckets unchanged|
> |T6.4 ExpiredObjectDeleteMarker|removes a delete marker, and the key with it, 
> once nothing is left under it; the condition is "no version below the 
> marker", not the marker's own age; removal goes through the reclaim request, 
> not DeleteKeys, which on a versioned bucket would answer a delete by 
> inserting another marker|a key whose only remaining version is a marker 
> disappears from both tables, releasing namespace and nothing else; a key that 
> still has noncurrent versions is left alone, so promotion can never resurrect 
> an object the user deleted; the condition is re-checked under the bucket 
> lock, where a version written since the scan is still caught; a marker a 
> write has superseded is refused|
> |T6.5 lifecycle service default and coupling|ozone.lifecycle.service.enabled 
> flips to true; OM refuses to enable versioning on a bucket while the service 
> is off, on both the create and the set-property path, checked in 
> preExecute|enabling versioning with the service disabled returns 
> NOT_SUPPORTED_OPERATION with an explanatory message on both paths; suspending 
> is not refused, since it can only reduce what has to be reclaimed; with the 
> service running, both paths behave as before|
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to