Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
caoersss
oceanbase
提交
46cd5c3c
O
oceanbase
项目概览
caoersss
/
oceanbase
与 Fork 源项目一致
Fork自
oceanbase / oceanbase
通知
1
Star
0
Fork
0
代码
文件
提交
分支
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,发现更多精彩内容 >>
提交
46cd5c3c
编写于
7月 16, 2021
作者:
O
obdev
提交者:
wangzelin.wzl
7月 16, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix bug of not kill session when execute ob_disconnect
上级
18070dfc
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
43 addition
and
28 deletion
+43
-28
src/observer/mysql/obsm_handler.cpp
src/observer/mysql/obsm_handler.cpp
+43
-28
未找到文件。
src/observer/mysql/obsm_handler.cpp
浏览文件 @
46cd5c3c
...
...
@@ -126,8 +126,45 @@ int ObSMHandler::on_connect(easy_connection_t* c)
int
ObSMHandler
::
on_disconnect
(
easy_connection_t
*
c
)
{
UNUSED
(
c
);
return
EASY_OK
;
// https://work.aone.alibaba-inc.com/issue/34775964
int
eret
=
EASY_OK
;
int
tmp_ret
=
OB_SUCCESS
;
ObSMConnection
*
conn
=
NULL
;
if
(
OB_ISNULL
(
c
)
||
OB_ISNULL
(
gctx_
.
session_mgr_
))
{
eret
=
EASY_ERROR
;
LOG_ERROR
(
"easy_connection_t or gctx_.session_mgr_ is null"
,
K
(
eret
),
K
(
c
),
K
(
gctx_
.
session_mgr_
));
}
else
if
(
OB_ISNULL
(
c
->
user_data
))
{
eret
=
EASY_ERROR
;
LOG_ERROR
(
"connection user data is NULL"
,
K
(
eret
));
}
else
if
(
OB_ISNULL
(
conn
=
reinterpret_cast
<
ObSMConnection
*>
(
c
->
user_data
)))
{
eret
=
EASY_ERROR
;
LOG_ERROR
(
"conn is null"
,
K
(
eret
));
}
else
{
//set session shadow
if
(
conn
->
is_sess_alloc_
&&
!
conn
->
is_sess_free_
&&
ObSMConnection
::
INITIAL_SESSID
!=
conn
->
sessid_
)
{
sql
::
ObSQLSessionInfo
*
sess_info
=
NULL
;
if
(
OB_UNLIKELY
(
OB_SUCCESS
!=
(
tmp_ret
=
gctx_
.
session_mgr_
->
get_session
(
conn
->
version_
,
conn
->
sessid_
,
sess_info
))))
{
LOG_WARN
(
"fail to get session"
,
K
(
tmp_ret
),
K
(
conn
->
version_
),
K
(
conn
->
sessid_
),
"proxy_sessid"
,
conn
->
proxy_sessid_
);
}
else
if
(
OB_ISNULL
(
sess_info
))
{
tmp_ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"session info is NULL"
,
K
(
tmp_ret
),
K
(
conn
->
version_
),
K
(
conn
->
sessid_
),
"proxy_sessid"
,
conn
->
proxy_sessid_
);
}
else
{
sess_info
->
set_session_state
(
sql
::
SESSION_KILLED
);
sess_info
->
set_shadow
(
true
);
if
(
OB_UNLIKELY
(
OB_SUCCESS
!=
(
tmp_ret
=
gctx_
.
session_mgr_
->
revert_session
(
sess_info
))))
{
LOG_ERROR
(
"fail to revert_session"
,
K
(
tmp_ret
),
K
(
conn
->
version_
),
K
(
conn
->
sessid_
),
"proxy_sessid"
,
conn
->
proxy_sessid_
);
}
}
}
LOG_INFO
(
"kill and revert session"
,
K
(
conn
->
version_
),
K
(
conn
->
sessid_
),
"proxy_sessid"
,
conn
->
proxy_sessid_
,
"server_id"
,
GCTX
.
server_id_
,
K
(
tmp_ret
),
K
(
eret
));
}
return
eret
;
}
int
ObSMHandler
::
on_close
(
easy_connection_t
*
c
)
...
...
@@ -152,32 +189,10 @@ int ObSMHandler::on_close(easy_connection_t* c)
ctx
.
proxy_sessid_
=
conn
->
proxy_sessid_
;
ctx
.
has_inc_active_num_
=
conn
->
has_inc_active_num_
;
// set session shadow
if
(
ObSMConnection
::
INITIAL_SESSID
!=
conn
->
sessid_
)
{
sql
::
ObSQLSessionInfo
*
sess_info
=
NULL
;
if
(
OB_UNLIKELY
(
OB_FAIL
(
gctx_
.
session_mgr_
->
get_session
(
conn
->
version_
,
conn
->
sessid_
,
sess_info
))))
{
LOG_WARN
(
"fail to get session"
,
K
(
ret
),
K
(
conn
->
version_
),
K
(
conn
->
sessid_
),
"proxy_sessid"
,
conn
->
proxy_sessid_
);
}
else
if
(
OB_ISNULL
(
sess_info
))
{
ret
=
OB_ERR_UNEXPECTED
;
LOG_WARN
(
"session info is NULL"
,
K
(
ret
),
K
(
conn
->
version_
),
K
(
conn
->
sessid_
),
"proxy_sessid"
,
conn
->
proxy_sessid_
);
}
else
{
sess_info
->
set_session_state
(
sql
::
SESSION_KILLED
);
sess_info
->
set_shadow
(
true
);
if
(
OB_UNLIKELY
(
OB_FAIL
(
gctx_
.
session_mgr_
->
revert_session
(
sess_info
))))
{
LOG_ERROR
(
"fail to revert_session"
,
K
(
ret
),
K
(
conn
->
version_
),
K
(
conn
->
sessid_
),
"proxy_sessid"
,
conn
->
proxy_sessid_
);
}
}
}
// free session in task
ObSrvTask
*
task
=
OB_NEW
(
ObDisconnectTask
,
ObModIds
::
OB_RPC
,
ctx
);
//free session in task
ObSrvTask
*
task
=
OB_NEW
(
ObDisconnectTask
,
ObModIds
::
OB_RPC
,
ctx
);
if
(
OB_UNLIKELY
(
NULL
==
task
))
{
ret
=
OB_ALLOCATE_MEMORY_FAILED
;
}
else
if
(
OB_UNLIKELY
(
NULL
==
conn
->
tenant_
))
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录