From: lu.shasha Date: Tue, 12 Sep 2017 03:04:23 +0000 (+0800) Subject: rgw: set bucket versioninig do not change versioning status if missing "Status" in xml X-Git-Tag: v13.0.1~750^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2d5195b559b44537416767fa1d4b87c464609957;p=ceph.git rgw: set bucket versioninig do not change versioning status if missing "Status" in xml Fixes: http://tracker.ceph.com/issues/21364 Signed-off-by: Shasha Lu --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 64bee32ec97..43e25ceab8b 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2034,11 +2034,13 @@ void RGWSetBucketVersioning::execute() } } - if (enable_versioning) { + if (versioning_status == VersioningEnabled) { s->bucket_info.flags |= BUCKET_VERSIONED; s->bucket_info.flags &= ~BUCKET_VERSIONS_SUSPENDED; - } else { + } else if (versioning_status == VersioningSuspended) { s->bucket_info.flags |= (BUCKET_VERSIONED | BUCKET_VERSIONS_SUSPENDED); + } else { + return; } op_ret = store->put_bucket_instance_info(s->bucket_info, false, real_time(), diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index b8fe07d3a73..cd9b7064e2b 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -760,12 +760,18 @@ public: uint32_t op_mask() override { return RGW_OP_TYPE_READ; } }; +enum BucketVersionStatus { + VersioningNotChanged = 0, + VersioningEnabled = 1, + VersioningSuspended =2, +}; + class RGWSetBucketVersioning : public RGWOp { protected: - bool enable_versioning; + int versioning_status; bufferlist in_data; public: - RGWSetBucketVersioning() : enable_versioning(false) {} + RGWSetBucketVersioning() : versioning_status(VersioningNotChanged) {} int verify_permission() override; void pre_exec() override; diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 024ac4a0229..5d91ec83965 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -893,21 +893,22 @@ public: RGWSetBucketVersioningParser() {} ~RGWSetBucketVersioningParser() override {} - int get_versioning_status(bool *status) { + int get_versioning_status(int *status) { XMLObj *config = find_first("VersioningConfiguration"); if (!config) return -EINVAL; - *status = false; + *status = VersioningNotChanged; XMLObj *field = config->find_first("Status"); if (!field) return 0; + *status = VersioningSuspended; string& s = field->get_data(); if (stringcasecmp(s, "Enabled") == 0) { - *status = true; + *status = VersioningEnabled; } else if (stringcasecmp(s, "Suspended") != 0) { return -EINVAL; } @@ -952,7 +953,7 @@ int RGWSetBucketVersioning_ObjStore_S3::get_params() in_data.append(data, len); } - r = parser.get_versioning_status(&enable_versioning); + r = parser.get_versioning_status(&versioning_status); return r; }