Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lihongda1002
oceanbase
提交
d8177e6c
O
oceanbase
项目概览
lihongda1002
/
oceanbase
与 Fork 源项目一致
Fork自
oceanbase / oceanbase
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
oceanbase
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d8177e6c
编写于
11月 02, 2022
作者:
O
obdev
提交者:
wangzelin.wzl
11月 02, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[BUGFIX] dml lob tablet check failed when ddl add lob col
上级
6a33a7e3
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
49 addition
and
30 deletion
+49
-30
src/storage/ls/ob_ls_tablet_service.cpp
src/storage/ls/ob_ls_tablet_service.cpp
+47
-30
src/storage/ls/ob_ls_tablet_service.h
src/storage/ls/ob_ls_tablet_service.h
+2
-0
未找到文件。
src/storage/ls/ob_ls_tablet_service.cpp
浏览文件 @
d8177e6c
...
...
@@ -3265,6 +3265,39 @@ int ObLSTabletService::insert_lob_col(
return
ret
;
}
int
ObLSTabletService
::
check_lob_tablet_valid
(
ObTabletHandle
&
data_tablet
)
{
int
ret
=
OB_SUCCESS
;
bool
is_valid_aux_lob_table
=
false
;
ObTabletBindingInfo
ddl_data
;
if
(
OB_FAIL
(
data_tablet
.
get_obj
()
->
get_ddl_data
(
ddl_data
)))
{
LOG_WARN
(
"failed to get ddl data from tablet"
,
K
(
ret
),
K
(
data_tablet
));
}
else
{
is_valid_aux_lob_table
=
ddl_data
.
lob_meta_tablet_id_
.
is_valid
()
&&
ddl_data
.
lob_piece_tablet_id_
.
is_valid
();
if
(
!
is_valid_aux_lob_table
)
{
ObTabletTxMultiSourceDataUnit
tx_data
;
if
(
OB_FAIL
(
data_tablet
.
get_obj
()
->
get_tx_data
(
tx_data
)))
{
LOG_WARN
(
"fail to get tx data"
,
K
(
ret
),
K
(
data_tablet
));
}
else
if
(
tx_data
.
is_in_tx
())
{
ret
=
OB_SCHEMA_EAGAIN
;
LOG_WARN
(
"do retry for data tablet is in tx, maybe wait for lob tablet finish"
,
K
(
ret
),
K
(
ddl_data
));
}
else
{
// maybe has committed, refresh binding info and check once
if
(
OB_FAIL
(
data_tablet
.
get_obj
()
->
get_ddl_data
(
ddl_data
)))
{
LOG_WARN
(
"failed to get ddl data from tablet"
,
K
(
ret
),
K
(
data_tablet
));
}
else
{
is_valid_aux_lob_table
=
ddl_data
.
lob_meta_tablet_id_
.
is_valid
()
&&
ddl_data
.
lob_piece_tablet_id_
.
is_valid
();
if
(
!
is_valid_aux_lob_table
)
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"aux lob table must valid when lob column exist"
,
K
(
ret
),
K
(
ddl_data
));
}
}
}
}
}
return
ret
;
}
int
ObLSTabletService
::
insert_lob_tablet_row
(
ObTabletHandle
&
data_tablet
,
ObDMLRunningCtx
&
run_ctx
,
...
...
@@ -3273,7 +3306,7 @@ int ObLSTabletService::insert_lob_tablet_row(
int
ret
=
OB_SUCCESS
;
int64_t
col_cnt
=
run_ctx
.
col_descs_
->
count
();
ObLobManager
*
lob_mngr
=
MTL
(
ObLobManager
*
);
bool
check_
ddl_data
=
false
;
bool
check_
lob
=
false
;
if
(
OB_ISNULL
(
lob_mngr
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"[STORAGE_LOB]failed to get lob manager handle."
,
K
(
ret
));
...
...
@@ -3281,27 +3314,20 @@ int ObLSTabletService::insert_lob_tablet_row(
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"[STORAGE_LOB]column count invalid"
,
K
(
ret
),
K
(
col_cnt
),
K
(
row
.
row_val_
.
count_
));
}
else
{
bool
is_valid_aux_lob_table
=
false
;
for
(
int64_t
i
=
0
;
OB_SUCC
(
ret
)
&&
i
<
col_cnt
;
++
i
)
{
const
ObColDesc
&
column
=
run_ctx
.
col_descs_
->
at
(
i
);
if
(
column
.
col_type_
.
is_lob_v2
())
{
if
(
!
check_ddl_data
)
{
ObTabletBindingInfo
ddl_data
;
if
(
OB_FAIL
(
data_tablet
.
get_obj
()
->
get_ddl_data
(
ddl_data
)))
{
LOG_WARN
(
"failed to get ddl data from tablet"
,
K
(
ret
),
K
(
data_tablet
));
ObObj
&
obj
=
row
.
row_val_
.
get_cell
(
i
);
if
(
!
column
.
col_type_
.
is_lob_v2
()
||
obj
.
is_null
()
||
obj
.
is_nop_value
())
{
// do nothing
}
else
{
if
(
!
check_lob
)
{
if
(
OB_FAIL
(
check_lob_tablet_valid
(
data_tablet
)))
{
LOG_WARN
(
"failed to check_lob_tablet_valid"
,
K
(
ret
),
K
(
data_tablet
));
}
else
{
check_ddl_data
=
true
;
const
common
::
ObTabletID
&
data_tablet_id
=
data_tablet
.
get_obj
()
->
tablet_meta_
.
tablet_id_
;
const
common
::
ObTabletID
&
lob_meta_tablet_id
=
ddl_data
.
lob_meta_tablet_id_
;
const
common
::
ObTabletID
&
lob_piece_tablet_id
=
ddl_data
.
lob_piece_tablet_id_
;
is_valid_aux_lob_table
=
lob_meta_tablet_id
.
is_valid
()
&&
lob_piece_tablet_id
.
is_valid
();
check_lob
=
true
;
}
}
ObObj
&
obj
=
row
.
row_val_
.
get_cell
(
i
);
if
(
OB_FAIL
(
ret
))
{
}
else
if
(
!
is_valid_aux_lob_table
)
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"aux lob table must valid when lob column exist"
,
K
(
ret
),
K
(
data_tablet
));
}
else
if
(
OB_FAIL
(
insert_lob_col
(
run_ctx
,
column
,
obj
,
nullptr
,
nullptr
)))
{
LOG_WARN
(
"[STORAGE_LOB]failed to insert lob col."
,
K
(
ret
),
K
(
row
),
K
(
i
));
}
...
...
@@ -3540,8 +3566,7 @@ int ObLSTabletService::process_lob_row(
ObStoreRow
&
new_row
)
{
int
ret
=
OB_SUCCESS
;
bool
is_valid_aux_lob_table
=
false
;
bool
check_ddl_data
=
false
;
bool
check_lob
=
false
;
if
(
OB_UNLIKELY
(
old_row
.
row_val_
.
get_count
()
!=
new_row
.
row_val_
.
get_count
()))
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"[STORAGE_LOB]invalid args"
,
K
(
old_row
),
K
(
new_row
),
K
(
ret
));
...
...
@@ -3564,20 +3589,12 @@ int ObLSTabletService::process_lob_row(
ObLobCommon
*
lob_common
=
nullptr
;
ObLobAccessParam
lob_param
;
lob_param
.
update_len_
=
new_obj
.
get_string_len
();
if
(
!
check_
ddl_data
)
{
if
(
!
check_
lob
)
{
ObTabletBindingInfo
ddl_data
;
if
(
OB_FAIL
(
tablet_handle
.
get_obj
()
->
get_ddl_data
(
ddl_data
)))
{
LOG_WARN
(
"failed to
get ddl data from tablet
"
,
K
(
ret
),
K
(
tablet_handle
));
if
(
OB_FAIL
(
check_lob_tablet_valid
(
tablet_handle
)))
{
LOG_WARN
(
"failed to
check_lob_tablet_valid
"
,
K
(
ret
),
K
(
tablet_handle
));
}
else
{
check_ddl_data
=
true
;
const
common
::
ObTabletID
&
data_tablet_id
=
tablet_handle
.
get_obj
()
->
tablet_meta_
.
tablet_id_
;
const
common
::
ObTabletID
&
lob_meta_tablet_id
=
ddl_data
.
lob_meta_tablet_id_
;
const
common
::
ObTabletID
&
lob_piece_tablet_id
=
ddl_data
.
lob_piece_tablet_id_
;
is_valid_aux_lob_table
=
lob_meta_tablet_id
.
is_valid
()
&&
lob_piece_tablet_id
.
is_valid
();
if
(
!
is_valid_aux_lob_table
)
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"aux lob table must valid when lob column exist"
,
K
(
ret
),
K
(
lob_meta_tablet_id
),
K
(
lob_piece_tablet_id
));
}
check_lob
=
true
;
}
}
if
(
OB_FAIL
(
ret
))
{
...
...
src/storage/ls/ob_ls_tablet_service.h
浏览文件 @
d8177e6c
...
...
@@ -555,6 +555,8 @@ private:
ObObj
&
obj
,
ObLobAccessParam
*
del_param
,
ObLobCommon
*
lob_common
);
static
int
check_lob_tablet_valid
(
ObTabletHandle
&
data_tablet
);
static
int
insert_lob_tablet_row
(
ObTabletHandle
&
data_tablet
,
ObDMLRunningCtx
&
run_ctx
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录