Skip to content

Commit de4b932

Browse files
authored
Merge pull request ceph#61946 from cbodley/wip-70013
rgw: PutObjectLockConfiguration can enable object lock on existing buckets Reviewed-by: Daniel Gryniewicz <[email protected]>
2 parents 7307a3d + b454668 commit de4b932

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

PendingReleaseNotes

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@
7373
headers only when the `read-stats` querystring is explicitly included in the
7474
API request.
7575

76+
* RGW: PutObjectLockConfiguration can now be used to enable S3 Object Lock on an
77+
existing versioning-enabled bucket that was not created with Object Lock enabled.
78+
7679
* RADOS: The ceph df command reports incorrect MAX AVAIL for stretch mode pools when
7780
CRUSH rules use multiple take steps for datacenters. PGMap::get_rule_avail
7881
incorrectly calculates available space from only one datacenter.

src/rgw/rgw_op.cc

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8665,8 +8665,9 @@ int RGWPutBucketObjectLock::verify_permission(optional_yield y)
86658665

86668666
void RGWPutBucketObjectLock::execute(optional_yield y)
86678667
{
8668-
if (!s->bucket->get_info().obj_lock_enabled()) {
8669-
s->err.message = "object lock configuration can't be set if bucket object lock not enabled";
8668+
if (!s->bucket->get_info().versioning_enabled()) {
8669+
s->err.message = "Object lock cannot be enabled unless the "
8670+
"bucket has versioning enabled";
86708671
ldpp_dout(this, 4) << "ERROR: " << s->err.message << dendl;
86718672
op_ret = -ERR_INVALID_BUCKET_STATE;
86728673
return;
@@ -8709,6 +8710,17 @@ void RGWPutBucketObjectLock::execute(optional_yield y)
87098710
}
87108711

87118712
op_ret = retry_raced_bucket_write(this, s->bucket.get(), [this, y] {
8713+
if (!s->bucket->get_info().obj_lock_enabled()) {
8714+
// automatically enable object lock if the bucket is versioning-enabled
8715+
if (!s->bucket->get_info().versioning_enabled()) {
8716+
s->err.message = "Object lock cannot be enabled unless the "
8717+
"bucket has versioning enabled";
8718+
ldpp_dout(this, 4) << "ERROR: " << s->err.message << dendl;
8719+
return -ERR_INVALID_BUCKET_STATE;
8720+
}
8721+
s->bucket->get_info().flags |= BUCKET_OBJ_LOCK_ENABLED;
8722+
}
8723+
87128724
s->bucket->get_info().obj_lock = obj_lock;
87138725
op_ret = s->bucket->put_info(this, false, real_time(), y);
87148726
return op_ret;

0 commit comments

Comments
 (0)