From cd8f1830eb5d7ff75b17d7f0915ee4b3b834b149 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 ff0c3d275a5ec..25923e1534610 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -758,15 +758,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.39.5