From 293affe992118ed6e04f685030b2d83a794ca624 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 13 May 2015 17:05:22 -0700 Subject: [PATCH] rgw: merge manifests correctly when there's prefix override Fixes: #11622 Backport: hammer, firefly Prefix override happens in a manifest when a rados object does not conform to the generic prefix set on the manifest. When merging manifests (specifically being used in multipart objects upload), we need to check if the rule that we try to merge has a prefix that is the same as the previous rule. Beforehand we checked if both had the same override_prefix setting, but that might not apply as both manifests might have different prefixes. Signed-off-by: Yehuda Sadeh (cherry picked from commit 389ae6739ddc6239a4dd7c5f7f9bfc9b645b8577) --- src/rgw/rgw_rados.cc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 604d4cb8ba715..2ee23bd13851d 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -773,15 +773,24 @@ int RGWObjManifest::append(RGWObjManifest& m) next_rule.part_size = m.obj_size - next_rule.start_ofs; } - if (override_prefix != rule.override_prefix) { - append_rules(m, miter, &override_prefix); - break; + string rule_prefix = prefix; + if (!rule.override_prefix.empty()) { + rule_prefix = rule.override_prefix; + } + + string next_rule_prefix = m.prefix; + if (!next_rule.override_prefix.empty()) { + next_rule_prefix = next_rule.override_prefix; } if (rule.part_size != next_rule.part_size || rule.stripe_max_size != next_rule.stripe_max_size || - rule.override_prefix != next_rule.override_prefix) { - append_rules(m, miter, NULL); + rule_prefix != next_rule_prefix) { + if (next_rule_prefix != prefix) { + append_rules(m, miter, &next_rule_prefix); + } else { + append_rules(m, miter, NULL); + } break; } -- 2.47.3