rule_iter = manifest->rules.begin();
stripe_ofs = 0;
stripe_size = manifest->get_head_size();
- cur_part_id = rule_iter->second.start_part_num;
+ if (rule_iter != manifest->rules.end()) {
+ cur_part_id = rule_iter->second.start_part_num;
+ cur_override_prefix = rule_iter->second.override_prefix;
+ }
update_location();
return;
}
--rule_iter;
}
+ if (rule_iter == manifest->rules.end()) {
+ update_location();
+ return;
+ }
+
RGWObjManifestRule& rule = rule_iter->second;
if (rule.part_size > 0) {
stripe_size = next - stripe_ofs;
}
+ cur_override_prefix = rule.override_prefix;
+
update_location();
}
return;
}
- manifest->get_implicit_location(cur_part_id, cur_stripe, ofs, &location);
+ manifest->get_implicit_location(cur_part_id, cur_stripe, ofs, &cur_override_prefix, &location);
}
void RGWObjManifest::obj_iterator::operator++()
stripe_size = MIN(rule->part_size - (stripe_ofs - part_ofs), rule->stripe_max_size);
}
+ cur_override_prefix = rule->override_prefix;
+
ofs = stripe_ofs;
if (ofs > obj_size) {
ofs = obj_size;
cur_part_id = rule.start_part_num;
- manifest->get_implicit_location(cur_part_id, cur_stripe, 0, &cur_obj);
+ manifest->get_implicit_location(cur_part_id, cur_stripe, 0, NULL, &cur_obj);
manifest->update_iterators();
manifest->set_obj_size(ofs);
- manifest->get_implicit_location(cur_part_id, cur_stripe, ofs, &cur_obj);
+ manifest->get_implicit_location(cur_part_id, cur_stripe, ofs, NULL, &cur_obj);
manifest->update_iterators();
return end_iter;
}
-void RGWObjManifest::get_implicit_location(uint64_t cur_part_id, uint64_t cur_stripe, uint64_t ofs, rgw_obj *location)
+void RGWObjManifest::get_implicit_location(uint64_t cur_part_id, uint64_t cur_stripe, uint64_t ofs, string *override_prefix, rgw_obj *location)
{
- string oid = prefix;
+ string oid;
+ if (!override_prefix || override_prefix->empty()) {
+ oid = prefix;
+ } else {
+ oid = *override_prefix;
+ }
string ns;
if (!cur_part_id) {
return 0;
}
+ string override_prefix;
+
if (prefix.empty()) {
prefix = m.prefix;
- } else if (prefix != m.prefix) {
- return append_explicit(m);
+ }
+
+ if (prefix != m.prefix) {
+ override_prefix = m.prefix;
}
map<uint64_t, RGWObjManifestRule>::iterator miter = m.rules.begin();
next_rule.part_size = m.obj_size - next_rule.start_ofs;
}
+ if (override_prefix != rule.override_prefix) {
+ append_rules(m, miter, &override_prefix);
+ break;
+ }
+
if (rule.part_size != next_rule.part_size ||
- rule.stripe_max_size != next_rule.stripe_max_size) {
- append_rules(m, miter);
+ rule.stripe_max_size != next_rule.stripe_max_size ||
+ rule.override_prefix != next_rule.override_prefix) {
+ append_rules(m, miter, NULL);
break;
}
}
if (expected_part_num != next_rule.start_part_num) {
- append_rules(m, miter);
+ append_rules(m, miter, NULL);
break;
}
}
return 0;
}
-void RGWObjManifest::append_rules(RGWObjManifest& m, map<uint64_t, RGWObjManifestRule>::iterator& miter)
+void RGWObjManifest::append_rules(RGWObjManifest& m, map<uint64_t, RGWObjManifestRule>::iterator& miter,
+ string *override_prefix)
{
for (; miter != m.rules.end(); ++miter) {
RGWObjManifestRule rule = miter->second;
rule.start_ofs += obj_size;
+ if (override_prefix)
+ rule.override_prefix = *override_prefix;
rules[rule.start_ofs] = rule;
}
}
uint64_t start_ofs;
uint64_t part_size; /* each part size, 0 if there's no part size, meaning it's unlimited */
uint64_t stripe_max_size; /* underlying obj max size */
+ string override_prefix;
RGWObjManifestRule() : start_part_num(0), start_ofs(0), part_size(0), stripe_max_size(0) {}
RGWObjManifestRule(uint32_t _start_part_num, uint64_t _start_ofs, uint64_t _part_size, uint64_t _stripe_max_size) :
start_part_num(_start_part_num), start_ofs(_start_ofs), part_size(_part_size), stripe_max_size(_stripe_max_size) {}
void encode(bufferlist& bl) const {
- ENCODE_START(1, 1, bl);
+ ENCODE_START(2, 1, bl);
::encode(start_part_num, bl);
::encode(start_ofs, bl);
::encode(part_size, bl);
::encode(stripe_max_size, bl);
+ ::encode(override_prefix, bl);
ENCODE_FINISH(bl);
}
void decode(bufferlist::iterator& bl) {
- DECODE_START(1, bl);
+ DECODE_START(2, bl);
::decode(start_part_num, bl);
::decode(start_ofs, bl);
::decode(part_size, bl);
::decode(stripe_max_size, bl);
+ ::decode(override_prefix, bl);
DECODE_FINISH(bl);
}
void dump(Formatter *f) const;
void convert_to_explicit();
int append_explicit(RGWObjManifest& m);
- void append_rules(RGWObjManifest& m, map<uint64_t, RGWObjManifestRule>::iterator& iter);
+ void append_rules(RGWObjManifest& m, map<uint64_t, RGWObjManifestRule>::iterator& iter, string *override_prefix);
void update_iterators() {
begin_iter.seek(0);
objs.swap(_objs);
}
- void get_implicit_location(uint64_t cur_part_id, uint64_t cur_stripe, uint64_t ofs, rgw_obj *location);
+ void get_implicit_location(uint64_t cur_part_id, uint64_t cur_stripe, uint64_t ofs, string *override_prefix, rgw_obj *location);
void set_trivial_rule(uint64_t tail_ofs, uint64_t stripe_max_size) {
RGWObjManifestRule rule(0, tail_ofs, 0, stripe_max_size);
int cur_part_id;
int cur_stripe;
+ string cur_override_prefix;
rgw_obj location;