From: Yehuda Sadeh Date: Thu, 18 Feb 2016 04:46:42 +0000 (-0800) Subject: rgw: swift object versioning data structure changes X-Git-Tag: v10.1.0~126^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2ae6d54f1003944ca92d5d4b002f8248016c18c3;p=ceph.git rgw: swift object versioning data structure changes Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 949fc52a2b70..785909090d18 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -892,8 +892,12 @@ struct RGWBucketInfo RGWBucketIndexType index_type; + bool swift_versioning; + string swift_ver_location; + + void encode(bufferlist& bl) const { - ENCODE_START(15, 4, bl); + ENCODE_START(16, 4, bl); ::encode(bucket, bl); ::encode(owner.id, bl); ::encode(flags, bl); @@ -912,10 +916,14 @@ struct RGWBucketInfo ::encode(website_conf, bl); } ::encode((uint32_t)index_type, bl); + ::encode(swift_versioning, bl); + if (swift_versioning) { + ::encode(swift_ver_location, bl); + } ENCODE_FINISH(bl); } void decode(bufferlist::iterator& bl) { - DECODE_START_LEGACY_COMPAT_LEN_32(14, 4, 4, bl); + DECODE_START_LEGACY_COMPAT_LEN_32(16, 4, 4, bl); ::decode(bucket, bl); if (struct_v >= 2) { string s; @@ -960,6 +968,14 @@ struct RGWBucketInfo } else { index_type = RGWBIType_Normal; } + swift_versioning = false; + swift_ver_location.clear(); + if (struct_v >= 16) { + ::decode(swift_versioning, bl); + if (swift_versioning) { + ::decode(swift_ver_location, bl); + } + } DECODE_FINISH(bl); } void dump(Formatter *f) const; @@ -971,8 +987,10 @@ struct RGWBucketInfo int versioning_status() { return flags & (BUCKET_VERSIONED | BUCKET_VERSIONS_SUSPENDED); } bool versioning_enabled() { return versioning_status() == BUCKET_VERSIONED; } + bool has_swift_versioning() { return swift_versioning; } + RGWBucketInfo() : flags(0), creation_time(0), has_instance_obj(false), num_shards(0), bucket_index_shard_hash_type(MOD), requester_pays(false), - has_website(false) {} + has_website(false), swift_versioning(false) {} }; WRITE_CLASS_ENCODER(RGWBucketInfo) diff --git a/src/rgw/rgw_json_enc.cc b/src/rgw/rgw_json_enc.cc index 54b1e8f945db..3d0051a41512 100644 --- a/src/rgw/rgw_json_enc.cc +++ b/src/rgw/rgw_json_enc.cc @@ -637,6 +637,8 @@ void RGWBucketInfo::dump(Formatter *f) const if (has_website) { encode_json("website_conf", website_conf, f); } + encode_json("swift_versioning", swift_versioning, f); + encode_json("swift_ver_location", swift_ver_location, f); } void RGWBucketInfo::decode_json(JSONObj *obj) { @@ -661,6 +663,8 @@ void RGWBucketInfo::decode_json(JSONObj *obj) { if (has_website) { JSONDecoder::decode_json("website_conf", website_conf, obj); } + JSONDecoder::decode_json("swift_versioning", swift_versioning, obj); + JSONDecoder::decode_json("swift_ver_location", swift_ver_location, obj); } void rgw_obj_key::dump(Formatter *f) const diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index c7dbcd224395..259eca302c4c 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1921,6 +1921,7 @@ void RGWCreateBucket::execute() s->bucket.tenant = s->bucket_tenant; /* ignored if bucket exists */ s->bucket.name = s->bucket_name; op_ret = store->create_bucket(*(s->user), s->bucket, zonegroup_id, placement_rule, + swift_ver_location, attrs, info, pobjv, &ep_objv, creation_time, pmaster_bucket, true); /* continue if EEXIST and create_bucket will fail below. this way we can @@ -2808,6 +2809,9 @@ void RGWPutMetadataBucket::execute() attrs[RGW_ATTR_CORS] = bl; } + s->bucket_info.swift_ver_location = swift_ver_location; + s->bucket_info.swift_versioning = (!swift_ver_location.empty()); + op_ret = rgw_bucket_set_attrs(store, s->bucket_info, attrs, &s->bucket_info.objv_tracker); } diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index 997d5a9e6e62..9849b431d3c7 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -537,6 +537,7 @@ protected: obj_version ep_objv; bool has_cors; RGWCORSConfiguration cors_config; + string swift_ver_location; bufferlist in_data; @@ -767,6 +768,7 @@ protected: RGWAccessControlPolicy policy; RGWCORSConfiguration cors_config; string placement_rule; + string swift_ver_location; public: RGWPutMetadataBucket() diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index c6f437a2d26d..0aaf4426bb5e 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -4944,6 +4944,7 @@ int RGWRados::init_bucket_index(rgw_bucket& bucket, int num_shards) int RGWRados::create_bucket(RGWUserInfo& owner, rgw_bucket& bucket, const string& zonegroup_id, const string& placement_rule, + const string& swift_ver_location, map& attrs, RGWBucketInfo& info, obj_version *pobjv, @@ -5004,6 +5005,8 @@ int RGWRados::create_bucket(RGWUserInfo& owner, rgw_bucket& bucket, info.zonegroup = zonegroup_id; info.placement_rule = selected_placement_rule_name; info.index_type = rule_info.index_type; + info.swift_ver_location = swift_ver_location; + info.swift_versioning = (!swift_ver_location.empty()); info.num_shards = bucket_index_max_shards; info.bucket_index_shard_hash_type = RGWBucketInfo::MOD; info.requester_pays = false; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index f2be37d15353..bf36a1e9ee54 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -2032,6 +2032,7 @@ public: virtual int create_bucket(RGWUserInfo& owner, rgw_bucket& bucket, const string& zonegroup_id, const string& placement_rule, + const string& swift_ver_location, map& attrs, RGWBucketInfo& bucket_info, obj_version *pobjv, diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index 734f78bcd2b0..dcb546e2c3d1 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -475,6 +475,8 @@ int RGWCreateBucket_ObjStore_SWIFT::get_params() location_constraint = store->get_zonegroup().api_name; placement_rule = s->info.env->get("HTTP_X_STORAGE_POLICY", ""); + swift_ver_location = s->info.env->get("HTTP_X_VERSIONS_LOCATION", ""); + return 0; } @@ -724,6 +726,8 @@ int RGWPutMetadataBucket_ObjStore_SWIFT::get_params() get_rmattrs_from_headers(s, CONT_PUT_ATTR_PREFIX, CONT_REMOVE_ATTR_PREFIX, rmattr_names); placement_rule = s->info.env->get("HTTP_X_STORAGE_POLICY", ""); + + swift_ver_location = s->info.env->get("HTTP_X_VERSIONS_LOCATION", ""); return 0; }