Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
oceanbase
oceanbase
提交
74d77115
O
oceanbase
项目概览
oceanbase
/
oceanbase
大约 1 年 前同步成功
通知
261
Star
6084
Fork
1301
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
oceanbase
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
74d77115
编写于
12月 27, 2023
作者:
R
renju96
提交者:
ob-robot
12月 27, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Compatible with the block tree format in index block row scanner
上级
a88e8a51
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
362 addition
and
87 deletion
+362
-87
src/storage/blocksstable/encoding/ob_imicro_block_decoder.h
src/storage/blocksstable/encoding/ob_imicro_block_decoder.h
+1
-1
src/storage/blocksstable/index_block/ob_ddl_index_block_row_iterator.cpp
...cksstable/index_block/ob_ddl_index_block_row_iterator.cpp
+109
-8
src/storage/blocksstable/index_block/ob_ddl_index_block_row_iterator.h
...locksstable/index_block/ob_ddl_index_block_row_iterator.h
+4
-6
src/storage/blocksstable/index_block/ob_index_block_row_scanner.cpp
...e/blocksstable/index_block/ob_index_block_row_scanner.cpp
+165
-56
src/storage/blocksstable/index_block/ob_index_block_row_scanner.h
...age/blocksstable/index_block/ob_index_block_row_scanner.h
+14
-16
src/storage/blocksstable/ob_imicro_block_reader.h
src/storage/blocksstable/ob_imicro_block_reader.h
+4
-0
src/storage/blocksstable/ob_micro_block_reader.cpp
src/storage/blocksstable/ob_micro_block_reader.cpp
+21
-0
src/storage/blocksstable/ob_micro_block_reader.h
src/storage/blocksstable/ob_micro_block_reader.h
+4
-0
src/storage/ddl/ob_tablet_ddl_kv.cpp
src/storage/ddl/ob_tablet_ddl_kv.cpp
+36
-0
src/storage/ddl/ob_tablet_ddl_kv.h
src/storage/ddl/ob_tablet_ddl_kv.h
+4
-0
未找到文件。
src/storage/blocksstable/encoding/ob_imicro_block_decoder.h
浏览文件 @
74d77115
...
...
@@ -30,7 +30,7 @@ public:
ObIMicroBlockDecoder
()
:
ObIMicroBlockReader
()
{}
virtual
~
ObIMicroBlockDecoder
()
{}
virtual
int
compare_rowkey
(
const
ObDatumRowkey
&
rowkey
,
const
int64_t
index
,
int32_t
&
compare_result
)
=
0
;
const
ObDatumRowkey
&
rowkey
,
const
int64_t
index
,
int32_t
&
compare_result
)
override
=
0
;
virtual
int
compare_rowkey
(
const
ObDatumRange
&
range
,
const
int64_t
index
,
int32_t
&
start_key_compare_result
,
int32_t
&
end_key_compare_result
)
=
0
;
...
...
src/storage/blocksstable/index_block/ob_ddl_index_block_row_iterator.cpp
浏览文件 @
74d77115
...
...
@@ -11,6 +11,7 @@
*/
#define USING_LOG_PREFIX STORAGE
#include "storage/access/ob_rows_info.h"
#include "storage/blocksstable/index_block/ob_ddl_index_block_row_iterator.h"
#include "storage/ddl/ob_tablet_ddl_kv.h"
#include "storage/ls/ob_ls.h"
...
...
@@ -64,7 +65,6 @@ int ObDDLIndexBlockRowIterator::init(const ObMicroBlockData &idx_block_data,
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
{
int
ret
=
OB_SUCCESS
;
...
...
@@ -177,6 +177,113 @@ int ObDDLIndexBlockRowIterator::locate_range(const ObDatumRange &range,
return
ret
;
}
int
ObDDLIndexBlockRowIterator
::
locate_range
()
{
int
ret
=
OB_SUCCESS
;
ObDatumRange
range
;
range
.
set_start_key
(
ObDatumRowkey
::
MIN_ROWKEY
);
range
.
set_end_key
(
ObDatumRowkey
::
MAX_ROWKEY
);
range
.
set_left_open
();
range
.
set_right_open
();
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Iter not opened yet"
,
K
(
ret
),
KPC
(
this
));
}
else
if
(
OB_ISNULL
(
block_meta_tree_
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"block meta tree is null"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
block_meta_tree_
->
locate_range
(
range
,
*
datum_utils_
,
false
,
/*is_left_border*/
false
,
/*is_right_border*/
is_reverse_scan_
,
btree_iter_
,
cur_tree_value_
)))
{
if
(
OB_BEYOND_THE_RANGE
!=
ret
)
{
LOG_WARN
(
"block meta tree locate range failed"
,
K
(
ret
),
K
(
range
));
}
else
{
is_iter_finish_
=
true
;
LOG_INFO
(
"no data to locate"
,
K
(
ret
));
ret
=
OB_SUCCESS
;
}
}
else
if
(
OB_ISNULL
(
cur_tree_value_
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"cur tree value is null"
,
K
(
ret
),
KP
(
cur_tree_value_
));
}
else
{
is_iter_start_
=
true
;
is_iter_finish_
=
false
;
}
return
ret
;
}
int
ObDDLIndexBlockRowIterator
::
skip_to_next_valid_position
(
const
ObDatumRowkey
&
rowkey
)
{
int
ret
=
OB_SUCCESS
;
storage
::
ObBlockMetaTreeValue
*
tmp_tree_value
=
nullptr
;
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Iter not opened yet"
,
K
(
ret
),
KPC
(
this
));
}
else
if
(
OB_ISNULL
(
block_meta_tree_
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"block meta tree is null"
,
K
(
ret
));
}
else
if
(
OB_FAIL
(
block_meta_tree_
->
skip_to_next_valid_position
(
rowkey
,
*
datum_utils_
,
btree_iter_
,
tmp_tree_value
)))
{
if
(
OB_UNLIKELY
(
OB_ITER_END
!=
ret
))
{
LOG_WARN
(
"Failed to skip to next valid position in block meta tree"
,
K
(
ret
),
K
(
rowkey
));
}
else
{
is_iter_finish_
=
true
;
}
}
else
{
cur_tree_value_
=
tmp_tree_value
;
}
return
ret
;
}
int
ObDDLIndexBlockRowIterator
::
find_rowkeys_belong_to_same_idx_row
(
ObMicroIndexInfo
&
idx_block_row
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
)
{
int
ret
=
OB_SUCCESS
;
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Iter not opened yet"
,
K
(
ret
),
KPC
(
this
));
}
else
if
(
OB_ISNULL
(
rows_info
))
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid rows info"
,
K
(
ret
));
}
else
{
const
ObDatumRowkey
*
cur_rowkey
=
cur_rowkey
=
cur_tree_value_
->
rowkey_
;;
bool
is_decided
=
false
;
for
(;
OB_SUCC
(
ret
)
&&
rowkey_begin_idx
<
rowkey_end_idx
;
++
rowkey_begin_idx
)
{
if
(
rows_info
->
is_row_skipped
(
rowkey_begin_idx
))
{
continue
;
}
const
ObDatumRowkey
&
rowkey
=
rows_info
->
get_rowkey
(
rowkey_begin_idx
);
int32_t
cmp_ret
=
0
;
if
(
OB_ISNULL
(
cur_rowkey
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"null rowkey"
,
K
(
ret
),
K
(
cur_tree_value_
),
KP
(
cur_rowkey
));
}
else
if
(
OB_FAIL
(
rowkey
.
compare
(
*
cur_rowkey
,
*
datum_utils_
,
cmp_ret
,
false
)))
{
LOG_WARN
(
"Failed to compare rowkey"
,
K
(
ret
),
K
(
rowkey
),
KPC
(
cur_rowkey
));
}
if
(
OB_FAIL
(
ret
))
{
}
else
if
(
cmp_ret
>
0
)
{
idx_block_row
.
rowkey_end_idx_
=
rowkey_begin_idx
;
is_decided
=
true
;
break
;
}
else
if
(
cmp_ret
==
0
)
{
idx_block_row
.
rowkey_end_idx_
=
rowkey_begin_idx
+
1
;
is_decided
=
true
;
break
;
}
}
if
(
OB_SUCC
(
ret
)
&&
!
is_decided
)
{
idx_block_row
.
rowkey_end_idx_
=
rowkey_begin_idx
;
}
}
return
ret
;
}
int
ObDDLIndexBlockRowIterator
::
check_blockscan
(
const
ObDatumRowkey
&
rowkey
,
bool
&
can_blockscan
)
{
int
ret
=
OB_SUCCESS
;
...
...
@@ -404,7 +511,6 @@ int ObDDLSStableAllRangeIterator::init(const ObMicroBlockData &idx_block_data,
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
{
int
ret
=
OB_SUCCESS
;
...
...
@@ -646,7 +752,6 @@ int ObDDLMergeEmptyIterator::init(const ObMicroBlockData &idx_block_data,
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
{
is_inited_
=
true
;
...
...
@@ -870,7 +975,6 @@ int ObDDLMergeBlockRowIterator::init(const ObMicroBlockData &idx_block_data,
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
{
int
ret
=
OB_SUCCESS
;
...
...
@@ -888,7 +992,6 @@ int ObDDLMergeBlockRowIterator::init(const ObMicroBlockData &idx_block_data,
datum_utils
,
allocator
,
is_reverse_scan
,
set_iter_end
,
iter_param
,
sst_index_iter
)))
{
LOG_WARN
(
"fail to init sstable index iter"
,
K
(
ret
),
K
(
iters_
),
KPC
(
sst_index_iter
));
...
...
@@ -970,7 +1073,6 @@ int ObDDLMergeBlockRowIterator::init_sstable_index_iter(const ObMicroBlockData &
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
,
ObIndexBlockRowIterator
*&
sst_index_iter
)
{
...
...
@@ -1064,7 +1166,7 @@ int ObDDLMergeBlockRowIterator::init_sstable_index_iter(const ObMicroBlockData &
if
(
OB_ISNULL
(
sst_index_iter
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"iter is null"
,
K
(
idx_block_data
.
type_
),
K
(
ret
));
}
else
if
(
OB_FAIL
(
sst_index_iter
->
init
(
idx_block_data
,
datum_utils
,
allocator
,
is_reverse_scan
,
set_iter_end
,
iter_param
)))
{
}
else
if
(
OB_FAIL
(
sst_index_iter
->
init
(
idx_block_data
,
datum_utils
,
allocator
,
is_reverse_scan
,
iter_param
)))
{
LOG_WARN
(
"fail to init iter"
,
K
(
ret
),
K
(
idx_block_data
),
KPC
(
sst_index_iter
));
}
}
...
...
@@ -2029,7 +2131,6 @@ int ObDDLMergeBlockRowIterator::get_index_row_count(const ObDatumRange &range,
datum_utils_
,
allocator_
,
is_reverse_scan_
,
false
/*set iter end*/
,
iter_param_
)))
{
LOG_WARN
(
"fail to init iter"
,
K
(
ret
),
KPC
(
idx_block_data_
),
KPC
(
tmp_merge_iter
));
}
else
if
(
OB_FAIL
(
tmp_merge_iter
->
locate_range
(
range
,
is_left_border
,
is_right_border
,
true
/*is_normal_cg*/
)))
{
...
...
src/storage/blocksstable/index_block/ob_ddl_index_block_row_iterator.h
浏览文件 @
74d77115
...
...
@@ -35,7 +35,6 @@ public:
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
override
;
virtual
int
get_current
(
const
ObIndexBlockRowHeader
*&
idx_row_header
,
const
ObDatumRowkey
*&
endkey
)
override
;
...
...
@@ -52,6 +51,9 @@ public:
const
bool
is_left_border
,
const
bool
is_right_border
,
const
bool
is_normal_cg
)
override
;
virtual
int
locate_range
()
override
;
virtual
int
skip_to_next_valid_position
(
const
ObDatumRowkey
&
rowkey
)
override
;
virtual
int
find_rowkeys_belong_to_same_idx_row
(
ObMicroIndexInfo
&
idx_block_row
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
)
override
;
virtual
int
check_blockscan
(
const
ObDatumRowkey
&
rowkey
,
bool
&
can_blockscan
)
override
;
virtual
bool
end_of_block
()
const
override
;
virtual
int
get_index_row_count
(
const
ObDatumRange
&
range
,
...
...
@@ -60,6 +62,7 @@ public:
int64_t
&
index_row_count
)
override
;
virtual
void
reset
()
override
;
virtual
void
reuse
()
override
;
virtual
void
set_iter_end
()
override
{
is_iter_finish_
=
true
;
}
INHERIT_TO_STRING_KV
(
"base iterator:"
,
ObIndexBlockRowIterator
,
"format:"
,
"ObDDLIndexBlockRowIterator"
,
K_
(
is_iter_start
),
K_
(
is_iter_finish
),
KP
(
cur_tree_value_
),
KP
(
block_meta_tree_
),
K
(
is_normal_cg_
));
public:
...
...
@@ -69,7 +72,6 @@ public:
const
bool
is_normal_cg
,
const
int64_t
iter_step
=
INT64_MAX
);
bool
is_valid
()
{
return
OB_NOT_NULL
(
block_meta_tree_
);
}
void
set_iter_end
()
{
is_iter_finish_
=
true
;
}
int
get_next_meta
(
const
ObDataMacroBlockMeta
*&
meta
);
private:
bool
is_iter_start_
;
...
...
@@ -90,7 +92,6 @@ public:
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
override
;
virtual
int
get_current
(
const
ObIndexBlockRowHeader
*&
idx_row_header
,
const
ObDatumRowkey
*&
endkey
)
override
;
...
...
@@ -139,7 +140,6 @@ public:
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
override
;
virtual
int
get_current
(
const
ObIndexBlockRowHeader
*&
idx_row_header
,
const
ObDatumRowkey
*&
endkey
)
override
;
...
...
@@ -178,7 +178,6 @@ public:
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
override
;
virtual
int
get_current
(
const
ObIndexBlockRowHeader
*&
idx_row_header
,
const
ObDatumRowkey
*&
endkey
)
override
;
...
...
@@ -254,7 +253,6 @@ private:
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
,
ObIndexBlockRowIterator
*&
sst_index_iter
);
int
init_ddl_kv_index_iters
(
const
ObMicroBlockData
&
idx_block_data
,
...
...
src/storage/blocksstable/index_block/ob_index_block_row_scanner.cpp
浏览文件 @
74d77115
...
...
@@ -410,7 +410,6 @@ int ObRAWIndexBlockRowIterator::init(const ObMicroBlockData &idx_block_data,
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
{
int
ret
=
OB_SUCCESS
;
...
...
@@ -502,6 +501,93 @@ int ObRAWIndexBlockRowIterator::locate_range(const ObDatumRange &range,
return
ret
;
}
int
ObRAWIndexBlockRowIterator
::
locate_range
()
{
int
ret
=
OB_SUCCESS
;
int64_t
row_count
=
0
;
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Iter not opened yet"
,
K
(
ret
),
KPC
(
this
));
}
else
if
(
OB_FAIL
(
micro_reader_
->
get_row_count
(
row_count
)))
{
LOG_WARN
(
"Failed to get row count"
,
K
(
ret
),
K
(
micro_reader_
));
}
else
{
start_
=
0
;
end_
=
row_count
-
1
;
current_
=
0
;
}
return
ret
;
}
int
ObRAWIndexBlockRowIterator
::
skip_to_next_valid_position
(
const
ObDatumRowkey
&
rowkey
)
{
int
ret
=
OB_SUCCESS
;
bool
equal
=
false
;
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Iter not opened yet"
,
K
(
ret
),
KPC
(
this
));
}
else
if
(
OB_FAIL
(
micro_reader_
->
find_bound
(
rowkey
,
true
,
current_
,
current_
,
equal
)))
{
LOG_WARN
(
"Failed to skip to next valid position in micro block reader"
,
K
(
ret
),
K
(
current_
),
K
(
rowkey
));
}
else
if
(
current_
==
(
end_
+
1
))
{
ret
=
OB_ITER_END
;
}
return
ret
;
}
int
ObRAWIndexBlockRowIterator
::
find_rowkeys_belong_to_same_idx_row
(
ObMicroIndexInfo
&
idx_block_row
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
)
{
int
ret
=
OB_SUCCESS
;
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Iter not opened yet"
,
K
(
ret
),
KPC
(
this
));
}
else
if
(
OB_ISNULL
(
rows_info
))
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid rows info"
,
K
(
ret
));
}
else
{
bool
is_decided
=
false
;
for
(;
OB_SUCC
(
ret
)
&&
rowkey_begin_idx
<
rowkey_end_idx
;
++
rowkey_begin_idx
)
{
if
(
rows_info
->
is_row_skipped
(
rowkey_begin_idx
))
{
continue
;
}
const
ObDatumRowkey
&
rowkey
=
rows_info
->
get_rowkey
(
rowkey_begin_idx
);
int32_t
cmp_ret
=
0
;
if
(
OB_FAIL
(
compare_rowkey
(
rowkey
,
cmp_ret
)))
{
LOG_WARN
(
"fail to cmp rowkey in iter"
,
K
(
ret
),
K
(
*
this
),
K
(
rowkey
));
}
else
{
cmp_ret
=
-
cmp_ret
;
}
if
(
OB_FAIL
(
ret
))
{
}
else
if
(
cmp_ret
>
0
)
{
idx_block_row
.
rowkey_end_idx_
=
rowkey_begin_idx
;
is_decided
=
true
;
break
;
}
else
if
(
cmp_ret
==
0
)
{
idx_block_row
.
rowkey_end_idx_
=
rowkey_begin_idx
+
1
;
is_decided
=
true
;
break
;
}
}
if
(
OB_SUCC
(
ret
)
&&
!
is_decided
)
{
idx_block_row
.
rowkey_end_idx_
=
rowkey_begin_idx
;
}
}
return
ret
;
}
int
ObRAWIndexBlockRowIterator
::
compare_rowkey
(
const
ObDatumRowkey
&
rowkey
,
int32_t
&
cmp_ret
)
{
int
ret
=
OB_SUCCESS
;
cmp_ret
=
0
;
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Iter not opened yet"
,
K
(
ret
),
KPC
(
this
));
}
else
if
(
OB_FAIL
(
micro_reader_
->
compare_rowkey
(
rowkey
,
current_
,
cmp_ret
)))
{
LOG_WARN
(
"Failed to compare rowkey"
,
K
(
ret
),
K
(
rowkey
));
}
return
ret
;
}
int
ObRAWIndexBlockRowIterator
::
check_blockscan
(
const
ObDatumRowkey
&
rowkey
,
bool
&
can_blockscan
)
{
int
ret
=
OB_SUCCESS
;
...
...
@@ -709,7 +795,6 @@ int ObTFMIndexBlockRowIterator::init(const ObMicroBlockData &idx_block_data,
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
{
int
ret
=
OB_SUCCESS
;
...
...
@@ -726,11 +811,6 @@ int ObTFMIndexBlockRowIterator::init(const ObMicroBlockData &idx_block_data,
is_reverse_scan_
=
is_reverse_scan
;
iter_step_
=
is_reverse_scan_
?
-
1
:
1
;
datum_utils_
=
datum_utils
;
if
(
set_iter_end
)
{
current_
=
0
;
start_
=
0
;
end_
=
idx_data_header_
->
row_cnt_
-
1
;
}
is_inited_
=
true
;
}
return
ret
;
...
...
@@ -857,6 +937,19 @@ int ObTFMIndexBlockRowIterator::locate_range(const ObDatumRange &range,
return
ret
;
}
int
ObTFMIndexBlockRowIterator
::
locate_range
()
{
int
ret
=
OB_SUCCESS
;
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Iter not opened yet"
,
K
(
ret
),
KPC
(
this
));
}
else
{
start_
=
0
;
end_
=
idx_data_header_
->
row_cnt_
-
1
;
current_
=
0
;
}
return
ret
;
}
int
ObTFMIndexBlockRowIterator
::
check_blockscan
(
const
ObDatumRowkey
&
rowkey
,
bool
&
can_blockscan
)
{
...
...
@@ -1134,79 +1227,67 @@ int ObTFMIndexBlockRowIterator::get_cur_row_id_range(const ObCSRange &parent_row
return
ret
;
}
int
ObTFMIndexBlockRowIterator
::
skip_to_next_valid_position
(
ObMicroIndexInfo
&
idx_block_row
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
)
int
ObTFMIndexBlockRowIterator
::
skip_to_next_valid_position
(
const
ObDatumRowkey
&
rowkey
)
{
int
ret
=
OB_SUCCESS
;
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Iter not opened yet"
,
K
(
ret
),
KPC
(
this
));
}
else
{
for
(;
rowkey_begin_idx
<
rowkey_end_idx
;
++
rowkey_begin_idx
)
{
if
(
!
rows_info
->
is_row_skipped
(
rowkey_begin_idx
))
{
break
;
}
}
if
(
rowkey_begin_idx
==
rowkey_end_idx
)
{
ObDatumComparor
<
ObDatumRowkey
>
cmp
(
*
datum_utils_
,
ret
,
false
,
true
,
false
);
const
ObDatumRowkey
*
first
=
idx_data_header_
->
rowkey_array_
+
current_
;
const
ObDatumRowkey
*
last
=
idx_data_header_
->
rowkey_array_
+
end_
+
1
;
const
ObDatumRowkey
*
found
=
std
::
lower_bound
(
first
,
last
,
rowkey
,
cmp
);
if
(
OB_FAIL
(
ret
))
{
LOG_WARN
(
"Failed to get lower bound of rowkey"
,
K
(
ret
),
K
(
rowkey
),
KPC_
(
idx_data_header
));
}
else
if
(
found
==
last
)
{
ret
=
OB_ITER_END
;
}
else
{
const
ObDatumRowkey
&
rowkey
=
rows_info
->
get_rowkey
(
rowkey_begin_idx
);
ObDatumComparor
<
ObDatumRowkey
>
cmp
(
*
datum_utils_
,
ret
);
const
ObDatumRowkey
*
first
=
idx_data_header_
->
rowkey_array_
+
current_
;
const
ObDatumRowkey
*
last
=
idx_data_header_
->
rowkey_array_
+
end_
+
1
;
const
ObDatumRowkey
*
found
=
std
::
lower_bound
(
first
,
last
,
rowkey
,
cmp
);
if
(
OB_FAIL
(
ret
))
{
LOG_WARN
(
"Failed to get lower bound of rowkey"
,
K
(
ret
),
K
(
rowkey
),
KPC
(
this
));
}
else
if
(
found
==
last
)
{
ret
=
OB_ITER_END
;
}
else
{
current_
=
found
-
idx_data_header_
->
rowkey_array_
;
idx_block_row
.
rows_info_
=
rows_info
;
idx_block_row
.
rowkey_begin_idx_
=
rowkey_begin_idx
++
;
if
(
OB_FAIL
(
find_rowkeys_belong_to_same_idx_row
(
idx_block_row
.
rowkey_end_idx_
,
rowkey_begin_idx
,
rowkey_end_idx
,
rows_info
)))
{
LOG_WARN
(
"Failed to find rowkeys belong to same index row"
,
K
(
ret
),
K
(
rowkey_begin_idx
),
K
(
rowkey_end_idx
),
KPC
(
rows_info
));
}
}
current_
=
found
-
idx_data_header_
->
rowkey_array_
;
}
}
return
ret
;
}
int
ObTFMIndexBlockRowIterator
::
find_rowkeys_belong_to_same_idx_row
(
int64_t
&
rowkey_idx
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
)
int
ObTFMIndexBlockRowIterator
::
find_rowkeys_belong_to_same_idx_row
(
ObMicroIndexInfo
&
idx_block_row
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
)
{
int
ret
=
OB_SUCCESS
;
const
ObDatumRowkey
*
cur_rowkey
=
idx_data_header_
->
rowkey_array_
+
current_
;
bool
is_decided
=
false
;
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Iter not opened yet"
,
K
(
ret
),
KPC
(
this
));
}
else
if
(
OB_ISNULL
(
rows_info
))
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid rows info"
,
K
(
ret
));
}
else
{
const
ObDatumRowkey
*
cur_rowkey
=
idx_data_header_
->
rowkey_array_
+
current_
;
bool
is_decided
=
false
;
for
(;
OB_SUCC
(
ret
)
&&
rowkey_begin_idx
<
rowkey_end_idx
;
++
rowkey_begin_idx
)
{
if
(
rows_info
->
is_row_skipped
(
rowkey_begin_idx
))
{
continue
;
}
const
ObDatumRowkey
&
rowkey
=
rows_info
->
get_rowkey
(
rowkey_begin_idx
);
int
cmp_ret
=
0
;
if
(
OB_FAIL
(
rowkey
.
compare
(
*
cur_rowkey
,
*
datum_utils_
,
cmp_ret
)))
{
int32_t
cmp_ret
=
0
;
if
(
OB_ISNULL
(
cur_rowkey
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"null rowkey"
,
K
(
ret
),
K
(
current_
),
KP
(
cur_rowkey
));
}
else
if
(
OB_FAIL
(
rowkey
.
compare
(
*
cur_rowkey
,
*
datum_utils_
,
cmp_ret
,
false
)))
{
LOG_WARN
(
"Failed to compare rowkey"
,
K
(
ret
),
K
(
rowkey
),
KPC
(
cur_rowkey
));
}
if
(
OB_FAIL
(
ret
))
{
}
else
if
(
cmp_ret
>
0
)
{
rowkey_idx
=
rowkey_begin_idx
;
idx_block_row
.
rowkey_end_idx_
=
rowkey_begin_idx
;
is_decided
=
true
;
break
;
}
else
if
(
cmp_ret
==
0
)
{
rowkey_idx
=
rowkey_begin_idx
+
1
;
idx_block_row
.
rowkey_end_idx_
=
rowkey_begin_idx
+
1
;
is_decided
=
true
;
break
;
}
}
if
(
!
is_decided
)
{
rowkey_idx
=
rowkey_begin_idx
;
if
(
OB_SUCC
(
ret
)
&&
!
is_decided
)
{
idx_block_row
.
rowkey_end_idx_
=
rowkey_begin_idx
;
}
}
return
ret
;
...
...
@@ -1350,7 +1431,7 @@ int ObIndexBlockRowScanner::open(
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"Invalid argument to open an index micro block"
,
K
(
ret
),
K
(
macro_id
),
K
(
idx_block_data
),
K
(
rowkey
),
K_
(
is_normal_cg
),
KP
(
idx_info
));
}
else
if
(
OB_FAIL
(
init_by_micro_data
(
idx_block_data
,
false
/*set iter finish*/
)))
{
}
else
if
(
OB_FAIL
(
init_by_micro_data
(
idx_block_data
)))
{
LOG_WARN
(
"Fail to init scanner by micro data"
,
K
(
ret
),
K
(
idx_block_data
),
K
(
index_format_
));
}
else
if
(
OB_ISNULL
(
iter_
))
{
ret
=
OB_ERR_UNEXPECTED
;
...
...
@@ -1404,11 +1485,13 @@ int ObIndexBlockRowScanner::open(
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"Invalid argument to open an index micro block"
,
K
(
ret
),
K
(
macro_id
),
K
(
idx_block_data
),
KP
(
rows_info
));
}
else
if
(
OB_FAIL
(
init_by_micro_data
(
idx_block_data
,
true
/*set iter finish*/
)))
{
}
else
if
(
OB_FAIL
(
init_by_micro_data
(
idx_block_data
)))
{
LOG_WARN
(
"Fail to init scanner by micro data"
,
K
(
ret
),
K
(
idx_block_data
));
}
else
if
(
OB_ISNULL
(
iter_
)
||
ObIndexFormat
::
TRANSFORMED
!=
index_format_
)
{
}
else
if
(
OB_ISNULL
(
iter_
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"Unexpected index format or iter is null"
,
K
(
index_format_
),
K
(
ret
),
KPC
(
iter_
));
LOG_WARN
(
"iter is null"
,
K
(
index_format_
),
K
(
ret
),
KPC
(
iter_
));
}
else
if
(
OB_FAIL
(
iter_
->
locate_range
()))
{
LOG_WARN
(
"fail to locate range"
,
K
(
ret
),
KPC
(
iter_
));
}
else
{
macro_id_
=
macro_id
;
rows_info_
=
rows_info
;
...
...
@@ -1436,7 +1519,7 @@ int ObIndexBlockRowScanner::open(
||
!
idx_block_data
.
is_index_block
()
||
(
is_normal_cg_
&&
nullptr
==
idx_info
)))
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"Invalid argument to open an index micro block"
,
K
(
ret
),
K
(
idx_block_data
),
K
(
range
),
K_
(
is_normal_cg
),
KP
(
idx_info
));
}
else
if
(
OB_FAIL
(
init_by_micro_data
(
idx_block_data
,
false
/*set iter finish*/
)))
{
}
else
if
(
OB_FAIL
(
init_by_micro_data
(
idx_block_data
)))
{
LOG_WARN
(
"Fail to init scanner by micro data"
,
K
(
ret
),
K
(
idx_block_data
));
}
else
if
(
OB_ISNULL
(
iter_
))
{
ret
=
OB_ERR_UNEXPECTED
;
...
...
@@ -1472,14 +1555,14 @@ int ObIndexBlockRowScanner::get_next(
LOG_WARN
(
"Not inited"
,
K
(
ret
));
}
else
if
(
end_of_block
())
{
ret
=
OB_ITER_END
;
}
else
if
(
is_multi_check
&&
OB_FAIL
(
iter_
->
skip_to_next_valid_position
(
idx_block_row
,
rowkey_begin_idx_
,
rowkey_end_idx_
,
rows_info_
)))
{
}
else
if
(
is_multi_check
&&
OB_FAIL
(
skip_to_next_valid_position
(
idx_block_row
)))
{
if
(
OB_UNLIKELY
(
OB_ITER_END
!=
ret
))
{
LOG_WARN
(
"Failed to skip to next valid position"
,
K
(
ret
),
K
(
rowkey_begin_idx_
),
K
(
rowkey_end_idx_
),
KPC
(
rows_info_
));
}
else
if
(
OB_ISNULL
(
iter_
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"iter is null"
,
K
(
index_format_
),
K
(
ret
));
}
else
{
iter_
->
reuse
();
iter_
->
set_iter_end
();
}
}
else
if
(
OB_FAIL
(
get_next_idx_row
(
idx_block_row
)))
{
LOG_WARN
(
"Failed to get next idx row"
,
K
(
ret
),
K
(
is_multi_check
));
...
...
@@ -1563,7 +1646,7 @@ int ObIndexBlockRowScanner::check_blockscan(
return
ret
;
}
int
ObIndexBlockRowScanner
::
init_by_micro_data
(
const
ObMicroBlockData
&
idx_block_data
,
bool
set_iter_end
)
int
ObIndexBlockRowScanner
::
init_by_micro_data
(
const
ObMicroBlockData
&
idx_block_data
)
{
int
ret
=
OB_SUCCESS
;
void
*
iter_buf
=
nullptr
;
...
...
@@ -1632,7 +1715,7 @@ int ObIndexBlockRowScanner::init_by_micro_data(const ObMicroBlockData &idx_block
if
(
OB_ISNULL
(
iter_
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"iter is null"
,
K
(
index_format_
),
K
(
ret
));
}
else
if
(
OB_FAIL
(
iter_
->
init
(
idx_block_data
,
datum_utils_
,
allocator_
,
is_reverse_scan_
,
set_iter_end
,
iter_param_
)))
{
}
else
if
(
OB_FAIL
(
iter_
->
init
(
idx_block_data
,
datum_utils_
,
allocator_
,
is_reverse_scan_
,
iter_param_
)))
{
LOG_WARN
(
"fail to init iter"
,
K
(
ret
),
K
(
idx_block_data
),
KPC
(
iter_
));
}
}
...
...
@@ -1817,5 +1900,31 @@ void ObIndexBlockRowScanner::skip_index_rows()
}
}
int
ObIndexBlockRowScanner
::
skip_to_next_valid_position
(
ObMicroIndexInfo
&
idx_block_row
)
{
int
ret
=
OB_SUCCESS
;
skip_index_rows
();
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Not inited"
,
K
(
ret
));
}
else
if
(
rowkey_begin_idx_
==
rowkey_end_idx_
)
{
ret
=
OB_ITER_END
;
}
else
if
(
OB_ISNULL
(
iter_
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"iter is null"
,
K
(
index_format_
),
K
(
ret
));
}
else
if
(
OB_FAIL
(
iter_
->
skip_to_next_valid_position
(
rows_info_
->
get_rowkey
(
rowkey_begin_idx_
))))
{
if
(
OB_ITER_END
!=
ret
)
{
LOG_WARN
(
"fail to skip to next valid position"
,
K
(
ret
),
K
(
rowkey_begin_idx_
),
K
(
rowkey_end_idx_
),
KPC
(
rows_info_
),
KPC
(
iter_
));
}
}
else
{
idx_block_row
.
rows_info_
=
rows_info_
;
idx_block_row
.
rowkey_begin_idx_
=
rowkey_begin_idx_
;
if
(
OB_FAIL
(
iter_
->
find_rowkeys_belong_to_same_idx_row
(
idx_block_row
,
rowkey_begin_idx_
,
rowkey_end_idx_
,
rows_info_
)))
{
LOG_WARN
(
"Failed to find rowkeys belong to same index row"
,
K
(
ret
),
KPC
(
iter_
));
}
}
return
ret
;
}
}
// namespace blocksstable
}
// namespace oceanbase
src/storage/blocksstable/index_block/ob_index_block_row_scanner.h
浏览文件 @
74d77115
...
...
@@ -138,7 +138,6 @@ public:
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
=
0
;
virtual
int
get_current
(
const
ObIndexBlockRowHeader
*&
idx_row_header
,
const
ObDatumRowkey
*&
endkey
)
=
0
;
...
...
@@ -155,6 +154,7 @@ public:
const
bool
is_left_border
,
const
bool
is_right_border
,
const
bool
is_normal_cg
)
=
0
;
virtual
int
locate_range
()
{
return
OB_NOT_SUPPORTED
;
}
virtual
int
check_blockscan
(
const
ObDatumRowkey
&
rowkey
,
bool
&
can_blockscan
)
=
0
;
virtual
bool
end_of_block
()
const
=
0
;
virtual
int
get_index_row_count
(
const
ObDatumRange
&
range
,
...
...
@@ -173,16 +173,15 @@ public:
const
ObCSRange
&
parent_row_range
,
bool
&
is_certain
,
int64_t
&
found_idx
)
{
return
OB_NOT_SUPPORTED
;
}
virtual
int
skip_to_next_valid_position
(
ObMicroIndexInfo
&
idx_block_row
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
)
{
return
OB_NOT_SUPPORTED
;
}
virtual
int
skip_to_next_valid_position
(
const
ObDatumRowkey
&
rowkey
)
{
return
OB_NOT_SUPPORTED
;
}
virtual
int
find_rowkeys_belong_to_same_idx_row
(
ObMicroIndexInfo
&
idx_block_row
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
)
{
return
OB_NOT_SUPPORTED
;
}
virtual
int
advance_to_border
(
const
ObDatumRowkey
&
rowkey
,
const
bool
is_left_border
,
const
bool
is_right_border
,
const
ObCSRange
&
parent_row_range
,
ObCSRange
&
cs_range
)
{
return
OB_NOT_SUPPORTED
;
}
virtual
void
get_end_key
(
const
ObDatumRowkey
*&
rowkey
)
{}
virtual
void
set_iter_end
()
{}
public:
virtual
int
switch_context
(
ObStorageDatumUtils
*
datum_utils
)
{
...
...
@@ -210,7 +209,6 @@ public:
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
override
;
virtual
int
get_current
(
const
ObIndexBlockRowHeader
*&
idx_row_header
,
const
ObDatumRowkey
*&
endkey
)
override
;
...
...
@@ -227,6 +225,10 @@ public:
const
bool
is_left_border
,
const
bool
is_right_border
,
const
bool
is_normal_cg
)
override
;
virtual
int
locate_range
()
override
;
virtual
int
skip_to_next_valid_position
(
const
ObDatumRowkey
&
rowkey
)
override
;
virtual
int
find_rowkeys_belong_to_same_idx_row
(
ObMicroIndexInfo
&
idx_block_row
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
)
override
;
virtual
void
set_iter_end
()
override
{
current_
=
ObIMicroBlockReader
::
INVALID_ROW_INDEX
;
}
virtual
int
check_blockscan
(
const
ObDatumRowkey
&
rowkey
,
bool
&
can_blockscan
)
override
;
virtual
bool
end_of_block
()
const
override
;
virtual
int
get_index_row_count
(
const
ObDatumRange
&
range
,
...
...
@@ -240,6 +242,7 @@ public:
private:
int
init_datum_row
(
const
ObStorageDatumUtils
&
datum_utils
,
ObIAllocator
*
allocator
);
bool
is_in_border
(
bool
is_reverse_scan
,
bool
is_left_border
,
bool
is_right_border
);
int
compare_rowkey
(
const
ObDatumRowkey
&
rowkey
,
int32_t
&
cmp_ret
);
protected:
int64_t
current_
;
int64_t
start_
;
// inclusive
...
...
@@ -260,7 +263,6 @@ public:
const
ObStorageDatumUtils
*
datum_utils
,
ObIAllocator
*
allocator
,
const
bool
is_reverse_scan
,
const
bool
set_iter_end
,
const
ObIndexBlockIterParam
&
iter_param
)
override
;
virtual
int
get_current
(
const
ObIndexBlockRowHeader
*&
idx_row_header
,
const
ObDatumRowkey
*&
endkey
)
override
;
...
...
@@ -277,6 +279,7 @@ public:
const
bool
is_left_border
,
const
bool
is_right_border
,
const
bool
is_normal_cg
)
override
;
virtual
int
locate_range
()
override
;
virtual
int
check_blockscan
(
const
ObDatumRowkey
&
rowkey
,
bool
&
can_blockscan
)
override
;
virtual
void
reset
()
override
;
virtual
void
reuse
()
override
;
...
...
@@ -289,10 +292,8 @@ public:
const
ObCSRange
&
parent_row_range
,
bool
&
is_certain
,
int64_t
&
found_idx
)
override
;
virtual
int
skip_to_next_valid_position
(
ObMicroIndexInfo
&
idx_block_row
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
)
override
;
virtual
int
skip_to_next_valid_position
(
const
ObDatumRowkey
&
rowkey
)
override
;
virtual
int
find_rowkeys_belong_to_same_idx_row
(
ObMicroIndexInfo
&
idx_block_row
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
)
override
;
virtual
int
get_idx_row_header_in_target_idx
(
const
int64_t
idx
,
const
ObIndexBlockRowHeader
*&
idx_row_header
)
override
;
virtual
int
advance_to_border
(
const
ObDatumRowkey
&
rowkey
,
...
...
@@ -306,10 +307,6 @@ public:
private:
int
get_cur_row_id_range
(
const
ObCSRange
&
parent_row_range
,
ObCSRange
&
cs_range
);
int
find_rowkeys_belong_to_same_idx_row
(
int64_t
&
rowkey_idx
,
int64_t
&
rowkey_begin_idx
,
int64_t
&
rowkey_end_idx
,
const
ObRowsInfo
*&
rows_info
);
private:
const
ObIndexBlockDataHeader
*
idx_data_header_
;
...
...
@@ -391,7 +388,7 @@ public:
K_
(
is_normal_cg
),
K_
(
parent_row_range
),
K_
(
filter_constant_type
),
K_
(
is_normal_query
),
K_
(
iter_param
));
private:
int
init_by_micro_data
(
const
ObMicroBlockData
&
idx_block_data
,
bool
set_iter_end
);
int
init_by_micro_data
(
const
ObMicroBlockData
&
idx_block_data
);
int
locate_key
(
const
ObDatumRowkey
&
rowkey
);
int
init_datum_row
();
int
read_curr_idx_row
(
const
ObIndexBlockRowHeader
*&
idx_row_header
,
const
ObDatumRowkey
*&
endkey
);
...
...
@@ -405,6 +402,7 @@ private:
ObCSRange
&
cs_range
);
int
get_next_idx_row
(
ObMicroIndexInfo
&
idx_block_row
);
void
skip_index_rows
();
int
skip_to_next_valid_position
(
ObMicroIndexInfo
&
idx_block_row
);
private:
union
{
const
ObDatumRowkey
*
rowkey_
;
...
...
src/storage/blocksstable/ob_imicro_block_reader.h
浏览文件 @
74d77115
...
...
@@ -381,6 +381,10 @@ public:
const
int64_t
begin_idx
,
int64_t
&
row_idx
,
bool
&
equal
)
=
0
;
virtual
int
compare_rowkey
(
const
ObDatumRowkey
&
rowkey
,
const
int64_t
index
,
int32_t
&
compare_result
)
=
0
;
static
int
filter_white_filter
(
const
sql
::
ObWhiteFilterExecutor
&
filter
,
const
common
::
ObObjMeta
&
obj_meta
,
...
...
src/storage/blocksstable/ob_micro_block_reader.cpp
浏览文件 @
74d77115
...
...
@@ -441,6 +441,27 @@ int ObMicroBlockReader::init(
return
ret
;
}
int
ObMicroBlockReader
::
compare_rowkey
(
const
ObDatumRowkey
&
rowkey
,
const
int64_t
idx
,
int32_t
&
compare_result
)
{
int
ret
=
OB_SUCCESS
;
if
(
IS_NOT_INIT
)
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"Not inited"
,
K
(
ret
));
}
else
if
(
OB_UNLIKELY
(
!
rowkey
.
is_valid
()
||
idx
<
0
||
idx
>=
row_count_
))
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"Invalid argument"
,
K
(
ret
),
K
(
rowkey
),
K
(
idx
),
K_
(
row_count
));
}
else
if
(
OB_FAIL
(
flat_row_reader_
.
compare_meta_rowkey
(
rowkey
,
*
datum_utils_
,
data_begin_
+
index_data_
[
idx
],
index_data_
[
idx
+
1
]
-
index_data_
[
idx
],
compare_result
)))
{
LOG_WARN
(
"Failed to compare rowkey"
,
K
(
ret
),
K
(
rowkey
),
K_
(
row_count
),
K
(
idx
));
}
return
ret
;
}
int
ObMicroBlockReader
::
find_bound
(
const
ObDatumRowkey
&
key
,
...
...
src/storage/blocksstable/ob_micro_block_reader.h
浏览文件 @
74d77115
...
...
@@ -134,6 +134,10 @@ public:
const
int32_t
col_offset
,
const
int64_t
row_index
,
ObStorageDatum
&
datum
)
override
;
virtual
int
compare_rowkey
(
const
ObDatumRowkey
&
rowkey
,
const
int64_t
index
,
int32_t
&
compare_result
)
override
;
virtual
int
find_bound
(
const
ObDatumRowkey
&
key
,
const
bool
lower_bound
,
...
...
src/storage/ddl/ob_tablet_ddl_kv.cpp
浏览文件 @
74d77115
...
...
@@ -673,6 +673,42 @@ int ObBlockMetaTree::locate_range(const blocksstable::ObDatumRange &range,
return
ret
;
}
int
ObBlockMetaTree
::
skip_to_next_valid_position
(
const
blocksstable
::
ObDatumRowkey
&
rowkey
,
const
blocksstable
::
ObStorageDatumUtils
&
datum_utils
,
blocksstable
::
DDLBtreeIterator
&
iter
,
ObBlockMetaTreeValue
*&
tree_value
)
const
{
int
ret
=
OB_SUCCESS
;
tree_value
=
nullptr
;
if
(
OB_UNLIKELY
(
!
is_inited_
))
{
ret
=
OB_NOT_INIT
;
LOG_WARN
(
"not init"
,
K
(
ret
));
}
else
{
int
cmp_ret
=
0
;
while
(
OB_SUCC
(
ret
))
{
ObDatumRowkeyWrapper
rowkey_wrapper
;
ObBlockMetaTreeValue
*
tmp_tree_value
=
nullptr
;
if
(
OB_FAIL
(
iter
.
get_next
(
rowkey_wrapper
,
tmp_tree_value
)))
{
if
(
OB_ITER_END
!=
ret
)
{
LOG_WARN
(
"get next failed"
,
K
(
ret
));
}
// just return ITER_END
}
else
if
(
OB_FAIL
(
rowkey_wrapper
.
rowkey_
->
compare
(
rowkey
,
datum_utils
,
cmp_ret
,
false
/*need_compare_datum_cnt*/
)))
{
LOG_WARN
(
"fail to cmp rowkey"
,
K
(
ret
),
K
(
rowkey
),
K
(
rowkey_wrapper
));
}
else
if
(
cmp_ret
>=
0
)
{
//lower bound
if
(
OB_ISNULL
(
tmp_tree_value
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"tree_value is null"
,
K
(
ret
),
KP
(
tmp_tree_value
));
}
else
{
tree_value
=
tmp_tree_value
;
}
break
;
}
}
}
return
ret
;
}
int
ObBlockMetaTree
::
get_next_tree_value
(
blocksstable
::
DDLBtreeIterator
&
iter
,
const
int64_t
step
,
ObBlockMetaTreeValue
*&
tree_value
)
const
...
...
src/storage/ddl/ob_tablet_ddl_kv.h
浏览文件 @
74d77115
...
...
@@ -89,6 +89,10 @@ public:
const
bool
is_reverse_scan
,
blocksstable
::
DDLBtreeIterator
&
iter
,
ObBlockMetaTreeValue
*&
cur_tree_value
)
const
;
int
skip_to_next_valid_position
(
const
blocksstable
::
ObDatumRowkey
&
rowkey
,
const
blocksstable
::
ObStorageDatumUtils
&
datum_utils
,
blocksstable
::
DDLBtreeIterator
&
iter
,
ObBlockMetaTreeValue
*&
tree_value
)
const
;
int
get_next_tree_value
(
blocksstable
::
DDLBtreeIterator
&
iter
,
const
int64_t
step
,
ObBlockMetaTreeValue
*&
tree_value
)
const
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录