From: Yehuda Sadeh Date: Thu, 23 Mar 2017 20:38:21 +0000 (-0700) Subject: cls/user: cls_user_bucket backward compatibility X-Git-Tag: v12.0.2~273^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=702904820ce1378e53a43239c52e1e5c5c1948eb;p=ceph.git cls/user: cls_user_bucket backward compatibility Fixes: http://tracker.ceph.com/issues/19367 Signed-off-by: Yehuda Sadeh --- diff --git a/src/cls/user/cls_user_types.h b/src/cls/user/cls_user_types.h index 97bd959243e..8595f25fd1c 100644 --- a/src/cls/user/cls_user_types.h +++ b/src/cls/user/cls_user_types.h @@ -24,17 +24,28 @@ struct cls_user_bucket { } explicit_placement; void encode(bufferlist& bl) const { - ENCODE_START(8, 8, bl); - ::encode(name, bl); - ::encode(marker, bl); - ::encode(bucket_id, bl); - ::encode(placement_id, bl); - if (placement_id.empty()) { + /* since new version of this structure is not backward compatible, + * we have older rgw running against newer osd if we encode it + * in the new way. Only encode newer version if placement_id is + * not empty, otherwise keep handling it as before + */ + if (!placement_id.empty()) { + ENCODE_START(9, 8, bl); + ::encode(name, bl); + ::encode(marker, bl); + ::encode(bucket_id, bl); + ::encode(placement_id, bl); + ENCODE_FINISH(bl); + } else { + ENCODE_START(7, 3, bl); + ::encode(name, bl); ::encode(explicit_placement.data_pool, bl); + ::encode(marker, bl); + ::encode(bucket_id, bl); ::encode(explicit_placement.index_pool, bl); ::encode(explicit_placement.data_extra_pool, bl); + ENCODE_FINISH(bl); } - ENCODE_FINISH(bl); } void decode(bufferlist::iterator& bl) { DECODE_START_LEGACY_COMPAT_LEN(8, 3, 3, bl); @@ -65,7 +76,7 @@ struct cls_user_bucket { } } else { ::decode(placement_id, bl); - if (placement_id.empty()) { + if (struct_v == 8 && placement_id.empty()) { ::decode(explicit_placement.data_pool, bl); ::decode(explicit_placement.index_pool, bl); ::decode(explicit_placement.data_extra_pool, bl);