Allow enabling versioning on buckets with a GCP location constraint - #6266
Allow enabling versioning on buckets with a GCP location constraint#6266maeldonn wants to merge 2 commits into
Conversation
Hello maeldonn,My role is to assist you with the merge of this Available options
Available commands
Status report is not available. |
Incorrect fix versionThe
Considering where you are trying to merge, I ignored possible hotfix versions and I expected to find:
Please check the |
Codecov Report❌ Patch coverage is
Additional details and impacted files
... and 1 file with indirect coverage changes @@ Coverage Diff @@
## development/9.5 #6266 +/- ##
===================================================
- Coverage 86.50% 86.45% -0.05%
===================================================
Files 212 212
Lines 14578 14576 -2
===================================================
- Hits 12610 12601 -9
- Misses 1968 1975 +7
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
Waiting for approvalThe following approvals are needed before I can proceed with the merge:
|
860728b to
9c78d85
Compare
9c78d85 to
5749a75
Compare
francoisferrand
left a comment
There was a problem hiding this comment.
S3 has a suspended versioning state, with nullversion ids. GCS versioning is only on or off
Suspended versioning is really just a name : in our implementation it differs (so in particular performance may not be the same), but functionally suspended is about the same as off?
i.e. is suspended not just a different name for no versioning (no versioning → versioning ←→ suspended versioning), so we could map both no & suspended versioning on GCP's disabled versioning?
Object versioning on the GCS bucket is a hard requirement: without it, the delete issued behind a delete marker destroys the data instead of archiving it
- not sure what you mean, there is no "archiving" in S3...
- if using GCP versioning is not practical, another option would be to "flatten" the versions: i.e. store each version side-by-side, as
<objKey>.<scalVersionId>
Block writes on a non-versioned bucket, instead of only reporting it in the healthcheck
If there a GCP "extension" to make the putObject/deleteObject conditional on versioning? Otherwise this may be very costly....
GCS lifecycle rules on noncurrent versions (isLive: false, daysSinceNoncurrentTime, numNewerVersions) can reap generations that S3 still serves as current
- Should be part of the documentation, and may be verified when creating location and/or enabling versioning (though none of these are foolproof, and we still risk a data loss)
- Or a reason to switch to "emulating" versions by flattening them....
GCS never promotes a noncurrent generation, so the backend state diverges from the S3 view after an undelete or a version delete
That is not really a problem for us, right: The issue is more about what the user would see in GCP's bucket?
All in all, I don't think we should merge this -and esp. in 9.4- but take the time to make a (short) design in Citadel : so we can align on the requirements and limits of the solution (i.e. do we want to keep the same "view" on GCP, or is this really just data storage, accessed only through the product ? what to do with GCP-side lifecycle rules ? ...)
Incorrect fix versionThe
Considering where you are trying to merge, I ignored possible hotfix versions and I expected to find:
Please check the |
5749a75 to
58e07b2
Compare
Waiting for approvalThe following approvals are needed before I can proceed with the merge:
|
58e07b2 to
39b4b41
Compare
Arsenal now supports versioning on the GCP backend, so drop gcp from versioningNotImplBackends and stop naming it in the error messages. Issue: CLDSRV-984
39b4b41 to
cb95846
Compare
Checked and you're right, nothing to do. I removed the line from the table.
GCS calls noncurrent versions "archived" (no delete markers, no promotion back to live, and lifecycle rules can target them via
Possible, and it doesn't even need the S3 version id: the backend key isn't recomputed on read, put returns it and it's stored per-version in location[0].key, so any unique suffix minted at put time works. Objects already written keep resolving at their plain key, so no migration either. The cost is elsewhere: every path that recomputes the key via _createAwsKey instead of reading it from MD (whole MPU lifecycle, copyObject/uploadPartCopy, and toObjectGetInfo which the backbeat routes use with only objectKey + bucket), plus _shouldSkipDelete, which skips the old-version delete assuming overwrites are in-place. Real work, but a design-doc call rather than a blocker.
No, GCS preconditions cover generation/metageneration only, nothing on versioning state. We already fail after the fact (no x-goog-generation -> missingVerIdInternalError), but too late, and delete markers are exempted.
Agreed on documenting it. Verifying is doable but not free. We talk to GCS through the S3 interop API, so the AWS SDK is what sends our requests. It can call
Right, not a problem while the bucket is only used as a Scality backend: we always read a specific generation, never the live one. It only bites if the bucket is used without us in front (direct reads, OOB, and GCS lifecycle above all). So we need to pin down the supported usage and document it. Same drift on the AWS backend, so it's the mirrored-bucket model rather than GCS-specific. |
Not handled yet
isLive: false,daysSinceNoncurrentTime,numNewerVersions) can reap generations that S3 still serves as current