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);
::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;
} 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;
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)
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) {
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
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
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);
}
obj_version ep_objv;
bool has_cors;
RGWCORSConfiguration cors_config;
+ string swift_ver_location;
bufferlist in_data;
RGWAccessControlPolicy policy;
RGWCORSConfiguration cors_config;
string placement_rule;
+ string swift_ver_location;
public:
RGWPutMetadataBucket()
int RGWRados::create_bucket(RGWUserInfo& owner, rgw_bucket& bucket,
const string& zonegroup_id,
const string& placement_rule,
+ const string& swift_ver_location,
map<std::string, bufferlist>& attrs,
RGWBucketInfo& info,
obj_version *pobjv,
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;
virtual int create_bucket(RGWUserInfo& owner, rgw_bucket& bucket,
const string& zonegroup_id,
const string& placement_rule,
+ const string& swift_ver_location,
map<std::string,bufferlist>& attrs,
RGWBucketInfo& bucket_info,
obj_version *pobjv,
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;
}
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;
}