From 6a2c35e3677c5261a3d46da5378112f9f0ce5c97 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 28 Mar 2023 14:40:59 +0000 Subject: [PATCH] [BUGFIX] fix read lob over 64K from 4.0 --- deps/oblib/src/common/object/ob_object.cpp | 5 ++++- deps/oblib/src/common/object/ob_object.h | 1 + src/share/ob_lob_access_utils.cpp | 1 + src/storage/lob/ob_lob_locator.cpp | 2 ++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/deps/oblib/src/common/object/ob_object.cpp b/deps/oblib/src/common/object/ob_object.cpp index 8710183fba..250a0485f7 100644 --- a/deps/oblib/src/common/object/ob_object.cpp +++ b/deps/oblib/src/common/object/ob_object.cpp @@ -368,6 +368,7 @@ int ObLobLocatorV2::fill(ObMemLobType type, const ObString &rowkey_str, const ObLobCommon *disk_loc, uint32_t disk_lob_full_size, + uint32_t disk_lob_header_size, bool is_simple) { validate_has_lob_header(has_lob_header_); @@ -453,6 +454,8 @@ int ObLobLocatorV2::fill(ObMemLobType type, if (disk_loc->is_init_) { disk_loc_header_size += sizeof(ObLobData); } + } else if (disk_lob_header_size != 0) { + disk_loc_header_size = disk_lob_header_size; } else { int64_t tbz = disk_loc->get_byte_size(disk_lob_full_size); int64_t thz = disk_loc->get_handle_size(tbz); @@ -461,7 +464,7 @@ int ObLobLocatorV2::fill(ObMemLobType type, if (offset + disk_loc_header_size > size_ || disk_lob_full_size < disk_loc_header_size) { ret = OB_INVALID_ARGUMENT; COMMON_LOG(WARN, "Lob: invalid disk locator", - K(ret), K(type), KP(offset), K(size_), K(flags), K(offset), + K(ret), K(type), K(offset), K(size_), K(flags), K(disk_lob_header_size), K(disk_loc_header_size), K(disk_lob_full_size), K(*disk_loc)); } else { offset += disk_loc_header_size; diff --git a/deps/oblib/src/common/object/ob_object.h b/deps/oblib/src/common/object/ob_object.h index b843a48e40..fcf849c9de 100644 --- a/deps/oblib/src/common/object/ob_object.h +++ b/deps/oblib/src/common/object/ob_object.h @@ -929,6 +929,7 @@ public: const ObString &rowkey_str, const ObLobCommon *disk_loc, uint32_t disk_lob_full_size, + uint32_t disk_lob_header_size, bool is_simple); int copy(const ObLobLocatorV2* src_locator) const; diff --git a/src/share/ob_lob_access_utils.cpp b/src/share/ob_lob_access_utils.cpp index cd8bc08014..75cc899192 100644 --- a/src/share/ob_lob_access_utils.cpp +++ b/src/share/ob_lob_access_utils.cpp @@ -1048,6 +1048,7 @@ int ObTextStringResult::fill_temp_lob_header(const int64_t res_len) rowkey_str, &lob_common, static_cast(res_len + sizeof(ObLobCommon)), + 0, false))) { LOG_WARN("Lob: fill temp lob locator failed", K(type_), K(ret)); } else if (OB_FAIL((locator.set_payload_data(&lob_common, empty_str)))) { diff --git a/src/storage/lob/ob_lob_locator.cpp b/src/storage/lob/ob_lob_locator.cpp index c92a1626e0..ba519fc7a2 100644 --- a/src/storage/lob/ob_lob_locator.cpp +++ b/src/storage/lob/ob_lob_locator.cpp @@ -303,6 +303,7 @@ int ObLobLocatorHelper::fuse_mem_lob_header(ObObj &def_obj, uint64_t col_id, boo rowkey_str_, &lob_common, payload_size, + 0, false))) { STORAGE_LOG(WARN, "Lob: init locator in build_lob_locatorv2", K(ret), K(column_id)); } else if (OB_FAIL(locator.set_payload_data(&lob_common, def_obj.get_string()))) { @@ -500,6 +501,7 @@ int ObLobLocatorHelper::build_lob_locatorv2(ObLobLocatorV2 &locator, rowid_str, lob_common, out_payload_len, + is_dst_inrow ? 0 : payload.length(), is_simple))) { STORAGE_LOG(WARN, "Lob: init locator in build_lob_locatorv2", K(ret), K(column_id)); } else if (OB_SUCC(locator.get_mem_locator(mem_lob_common))) {