Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
b08f6b5e
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
b08f6b5e
编写于
5月 14, 2022
作者:
S
Shengliang Guan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor: multi process mode
上级
ad3fda2e
变更
12
展开全部
隐藏空白更改
内联
并排
Showing
12 changed file
with
586 addition
and
682 deletion
+586
-682
source/dnode/mgmt/mgmt_dnode/inc/dmInt.h
source/dnode/mgmt/mgmt_dnode/inc/dmInt.h
+1
-1
source/dnode/mgmt/mgmt_dnode/src/dmInt.c
source/dnode/mgmt/mgmt_dnode/src/dmInt.c
+1
-1
source/dnode/mgmt/mgmt_dnode/src/dmMonitor.c
source/dnode/mgmt/mgmt_dnode/src/dmMonitor.c
+4
-4
source/dnode/mgmt/node_mgmt/inc/dmMgmt.h
source/dnode/mgmt/node_mgmt/inc/dmMgmt.h
+63
-9
source/dnode/mgmt/node_mgmt/inc/dmProc.h
source/dnode/mgmt/node_mgmt/inc/dmProc.h
+0
-67
source/dnode/mgmt/node_mgmt/src/dmMgmt.c
source/dnode/mgmt/node_mgmt/src/dmMgmt.c
+62
-30
source/dnode/mgmt/node_mgmt/src/dmProc.c
source/dnode/mgmt/node_mgmt/src/dmProc.c
+306
-292
source/dnode/mgmt/node_mgmt/src/dmRun.c
source/dnode/mgmt/node_mgmt/src/dmRun.c
+77
-138
source/dnode/mgmt/node_mgmt/src/dmTransport.c
source/dnode/mgmt/node_mgmt/src/dmTransport.c
+29
-96
source/dnode/mgmt/node_util/inc/dmUtil.h
source/dnode/mgmt/node_util/inc/dmUtil.h
+2
-3
source/util/test/CMakeLists.txt
source/util/test/CMakeLists.txt
+6
-6
source/util/test/procTest.cpp
source/util/test/procTest.cpp
+35
-35
未找到文件。
source/dnode/mgmt/mgmt_dnode/inc/dmInt.h
浏览文件 @
b08f6b5e
...
...
@@ -32,7 +32,7 @@ typedef struct SDnodeMgmt {
SSingleWorker
mgmtWorker
;
ProcessCreateNodeFp
processCreateNodeFp
;
ProcessDropNodeFp
processDropNodeFp
;
IsNode
DeployedFp
isNodeDeploy
edFp
;
IsNode
RequiredFp
isNodeRequir
edFp
;
SDnodeData
data
;
}
SDnodeMgmt
;
...
...
source/dnode/mgmt/mgmt_dnode/src/dmInt.c
浏览文件 @
b08f6b5e
...
...
@@ -58,7 +58,7 @@ static int32_t dmOpenMgmt(const SMgmtInputOpt *pInput, SMgmtOutputOpt *pOutput)
pMgmt
->
name
=
pInput
->
name
;
pMgmt
->
processCreateNodeFp
=
pInput
->
processCreateNodeFp
;
pMgmt
->
processDropNodeFp
=
pInput
->
processDropNodeFp
;
pMgmt
->
isNode
DeployedFp
=
pInput
->
isNodeDeploy
edFp
;
pMgmt
->
isNode
RequiredFp
=
pInput
->
isNodeRequir
edFp
;
taosInitRWLatch
(
&
pMgmt
->
data
.
latch
);
pMgmt
->
data
.
dnodeHash
=
taosHashInit
(
4
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
),
true
,
HASH_NO_LOCK
);
...
...
source/dnode/mgmt/mgmt_dnode/src/dmMonitor.c
浏览文件 @
b08f6b5e
...
...
@@ -40,10 +40,10 @@ static void dmGetMonitorBasicInfo(SDnodeMgmt *pMgmt, SMonBasicInfo *pInfo) {
static
void
dmGetMonitorDnodeInfo
(
SDnodeMgmt
*
pMgmt
,
SMonDnodeInfo
*
pInfo
)
{
pInfo
->
uptime
=
(
taosGetTimestampMs
()
-
pMgmt
->
data
.
rebootTime
)
/
(
86400000
.
0
f
);
pInfo
->
has_mnode
=
(
*
pMgmt
->
isNode
Deploy
edFp
)(
pMgmt
->
pDnode
,
MNODE
);
pInfo
->
has_qnode
=
(
*
pMgmt
->
isNode
Deploy
edFp
)(
pMgmt
->
pDnode
,
QNODE
);
pInfo
->
has_snode
=
(
*
pMgmt
->
isNode
Deploy
edFp
)(
pMgmt
->
pDnode
,
SNODE
);
pInfo
->
has_bnode
=
(
*
pMgmt
->
isNode
Deploy
edFp
)(
pMgmt
->
pDnode
,
BNODE
);
pInfo
->
has_mnode
=
(
*
pMgmt
->
isNode
Requir
edFp
)(
pMgmt
->
pDnode
,
MNODE
);
pInfo
->
has_qnode
=
(
*
pMgmt
->
isNode
Requir
edFp
)(
pMgmt
->
pDnode
,
QNODE
);
pInfo
->
has_snode
=
(
*
pMgmt
->
isNode
Requir
edFp
)(
pMgmt
->
pDnode
,
SNODE
);
pInfo
->
has_bnode
=
(
*
pMgmt
->
isNode
Requir
edFp
)(
pMgmt
->
pDnode
,
BNODE
);
tstrncpy
(
pInfo
->
logdir
.
name
,
tsLogDir
,
sizeof
(
pInfo
->
logdir
.
name
));
pInfo
->
logdir
.
size
=
tsLogSpace
.
size
;
tstrncpy
(
pInfo
->
tempdir
.
name
,
tsTempDir
,
sizeof
(
pInfo
->
tempdir
.
name
));
...
...
source/dnode/mgmt/node_mgmt/inc/dmMgmt.h
浏览文件 @
b08f6b5e
...
...
@@ -19,13 +19,58 @@
// tobe deleted
#include "uv.h"
#include "dmUtil.h"
#include "dmInt.h"
#ifdef __cplusplus
extern
"C"
{
#endif
typedef
struct
SMgmtWrapper
SMgmtWrapper
;
#define SINGLE_PROC 0
#define CHILD_PROC 1
#define PARENT_PROC 2
#define TEST_PROC 3
#define OnlyInSingleProc(ptype) (ptype == SINGLE_PROC)
#define OnlyInChildProc(ptype) (ptype == CHILD_PROC)
#define OnlyInParentProc(ptype) (ptype == PARENT_PROC)
#define OnlyInTestProc(ptype) (ptype & TEST_PROC)
#define InChildProc(ptype) (ptype & CHILD_PROC)
#define InParentProc(ptype) (ptype & PARENT_PROC)
typedef
enum
{
PROC_FUNC_REQ
=
1
,
PROC_FUNC_RSP
=
2
,
PROC_FUNC_REGIST
=
3
,
PROC_FUNC_RELEASE
=
4
,
}
EProcFuncType
;
typedef
struct
{
int32_t
head
;
int32_t
tail
;
int32_t
total
;
int32_t
avail
;
int32_t
items
;
char
name
[
8
];
TdThreadMutex
mutex
;
tsem_t
sem
;
char
pBuffer
[];
}
SProcQueue
;
typedef
struct
{
SMgmtWrapper
*
wrapper
;
const
char
*
name
;
SHashObj
*
hash
;
SProcQueue
*
pqueue
;
SProcQueue
*
cqueue
;
TdThread
pthread
;
TdThread
cthread
;
SShm
shm
;
int32_t
pid
;
int8_t
ptype
;
bool
stop
;
}
SProc
;
typedef
struct
SMgmtWrapper
{
SDnode
*
pDnode
;
SMgmtFunc
func
;
...
...
@@ -34,13 +79,10 @@ typedef struct SMgmtWrapper {
char
*
path
;
int32_t
refCount
;
SRWLatch
latch
;
EDndNodeType
n
odeT
ype
;
EDndNodeType
n
t
ype
;
bool
deployed
;
bool
required
;
EDndProcType
procType
;
int32_t
procId
;
SProcObj
*
procObj
;
SShm
procShm
;
SProc
proc
;
NodeMsgFp
msgFps
[
TDMT_MAX
];
}
SMgmtWrapper
;
...
...
@@ -75,8 +117,8 @@ typedef struct SUdfdData {
}
SUdfdData
;
typedef
struct
SDnode
{
EDndProcType
ptype
;
EDndNodeType
n
type
;
int8_t
ptype
;
EDndNodeType
r
type
;
EDndEvent
event
;
EDndRunStatus
status
;
SStartupInfo
startup
;
...
...
@@ -109,14 +151,26 @@ void dmProcessNetTestReq(SDnode *pDnode, SRpcMsg *pMsg);
int32_t
dmProcessCreateNodeReq
(
SDnode
*
pDnode
,
EDndNodeType
ntype
,
SNodeMsg
*
pMsg
);
int32_t
dmProcessDropNodeReq
(
SDnode
*
pDnode
,
EDndNodeType
ntype
,
SNodeMsg
*
pMsg
);
// dmProc.c
int32_t
dmInitProc
(
struct
SMgmtWrapper
*
pWrapper
);
void
dmCleanupProc
(
struct
SMgmtWrapper
*
pWrapper
);
int32_t
dmRunProc
(
SProc
*
proc
);
void
dmStopProc
(
SProc
*
proc
);
int64_t
dmRemoveProcRpcHandle
(
SProc
*
proc
,
void
*
handle
);
void
dmCloseProcRpcHandles
(
SProc
*
proc
);
int32_t
dmPutToProcCQueue
(
SProc
*
proc
,
const
void
*
pHead
,
int16_t
headLen
,
const
void
*
pBody
,
int32_t
bodyLen
,
void
*
handle
,
int64_t
handleRef
,
EProcFuncType
ftype
);
void
dmPutToProcPQueue
(
SProc
*
proc
,
const
void
*
pHead
,
int16_t
headLen
,
const
void
*
pBody
,
int32_t
bodyLen
,
EProcFuncType
ftype
);
// dmTransport.c
int32_t
dmInitServer
(
SDnode
*
pDnode
);
void
dmCleanupServer
(
SDnode
*
pDnode
);
int32_t
dmInitClient
(
SDnode
*
pDnode
);
void
dmCleanupClient
(
SDnode
*
pDnode
);
SProcCfg
dmGenProcCfg
(
SMgmtWrapper
*
pWrapper
);
SMsgCb
dmGetMsgcb
(
SMgmtWrapper
*
pWrapper
);
int32_t
dmInitMsgHandle
(
SDnode
*
pDnode
);
int32_t
dmProcessNodeMsg
(
SMgmtWrapper
*
pWrapper
,
SNodeMsg
*
pMsg
);
// mgmt nodes
SMgmtFunc
dmGetMgmtFunc
();
...
...
source/dnode/mgmt/node_mgmt/inc/dmProc.h
已删除
100644 → 0
浏览文件 @
ad3fda2e
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _TD_UTIL_PROCESS_H_
#define _TD_UTIL_PROCESS_H_
#include "os.h"
#include "tqueue.h"
#ifdef __cplusplus
extern
"C"
{
#endif
typedef
enum
{
PROC_FUNC_REQ
=
1
,
PROC_FUNC_RSP
,
PROC_FUNC_REGIST
,
PROC_FUNC_RELEASE
}
EProcFuncType
;
typedef
struct
SProcObj
SProcObj
;
typedef
void
*
(
*
ProcMallocFp
)(
int32_t
contLen
,
EQItype
itype
);
typedef
void
*
(
*
ProcFreeFp
)(
void
*
pCont
);
typedef
void
(
*
ProcConsumeFp
)(
void
*
parent
,
void
*
pHead
,
int16_t
headLen
,
void
*
pBody
,
int32_t
bodyLen
,
EProcFuncType
ftype
);
typedef
struct
{
ProcConsumeFp
childConsumeFp
;
ProcMallocFp
childMallocHeadFp
;
ProcFreeFp
childFreeHeadFp
;
ProcMallocFp
childMallocBodyFp
;
ProcFreeFp
childFreeBodyFp
;
ProcConsumeFp
parentConsumeFp
;
ProcMallocFp
parentMallocHeadFp
;
ProcFreeFp
parentFreeHeadFp
;
ProcMallocFp
parentMallocBodyFp
;
ProcFreeFp
parentFreeBodyFp
;
SShm
shm
;
void
*
parent
;
const
char
*
name
;
bool
isChild
;
}
SProcCfg
;
SProcObj
*
taosProcInit
(
const
SProcCfg
*
pCfg
);
void
taosProcCleanup
(
SProcObj
*
pProc
);
int32_t
taosProcRun
(
SProcObj
*
pProc
);
void
taosProcStop
(
SProcObj
*
pProc
);
int32_t
taosProcPutToChildQ
(
SProcObj
*
pProc
,
const
void
*
pHead
,
int16_t
headLen
,
const
void
*
pBody
,
int32_t
bodyLen
,
void
*
handle
,
int64_t
handleRef
,
EProcFuncType
ftype
);
int64_t
taosProcRemoveHandle
(
SProcObj
*
pProc
,
void
*
handle
);
void
taosProcCloseHandles
(
SProcObj
*
pProc
,
void
(
*
HandleFp
)(
void
*
handle
));
void
taosProcPutToParentQ
(
SProcObj
*
pProc
,
const
void
*
pHead
,
int16_t
headLen
,
const
void
*
pBody
,
int32_t
bodyLen
,
EProcFuncType
ftype
);
#ifdef __cplusplus
}
#endif
#endif
/*_TD_UTIL_PROCESS_H_*/
source/dnode/mgmt/node_mgmt/src/dmMgmt.c
浏览文件 @
b08f6b5e
...
...
@@ -16,9 +16,45 @@
#define _DEFAULT_SOURCE
#include "dmMgmt.h"
static
bool
dmIsNodeDeployedFp
(
SDnode
*
pDnode
,
EDndNodeType
ntype
)
{
return
pDnode
->
wrappers
[
ntype
].
required
;
}
static
bool
dmIsNodeRequired
(
SDnode
*
pDnode
,
EDndNodeType
ntype
)
{
return
pDnode
->
wrappers
[
ntype
].
required
;
}
static
bool
dmRequireNode
(
SMgmtWrapper
*
pWrapper
)
{
SMgmtInputOpt
*
pInput
=
&
pWrapper
->
pDnode
->
input
;
pInput
->
name
=
pWrapper
->
name
;
pInput
->
path
=
pWrapper
->
path
;
bool
required
=
false
;
int32_t
code
=
(
*
pWrapper
->
func
.
requiredFp
)(
pInput
,
&
required
);
if
(
!
required
)
{
dDebug
(
"node:%s, does not require startup"
,
pWrapper
->
name
);
}
if
(
pWrapper
->
ntype
==
DNODE
&&
pWrapper
->
pDnode
->
rtype
!=
DNODE
&&
pWrapper
->
pDnode
->
rtype
!=
NODE_END
)
{
required
=
false
;
dDebug
(
"node:%s, does not require startup in child process"
,
pWrapper
->
name
);
}
return
required
;
}
static
int32_t
dmInitVars
(
SDnode
*
pDnode
,
const
SDnodeOpt
*
pOption
)
{
pDnode
->
rtype
=
pOption
->
ntype
;
if
(
tsMultiProcess
==
0
)
{
pDnode
->
ptype
=
DND_PROC_SINGLE
;
dInfo
(
"dnode will run in single-process mode"
);
}
else
if
(
tsMultiProcess
>
1
)
{
pDnode
->
ptype
=
DND_PROC_TEST
;
dInfo
(
"dnode will run in multi-process test mode"
);
}
else
if
(
pDnode
->
rtype
==
DNODE
||
pDnode
->
rtype
==
NODE_END
)
{
pDnode
->
ptype
=
DND_PROC_PARENT
;
dInfo
(
"dnode will run in parent-process mode"
);
}
else
{
pDnode
->
ptype
=
DND_PROC_CHILD
;
SMgmtWrapper
*
pWrapper
=
&
pDnode
->
wrappers
[
pDnode
->
rtype
];
dInfo
(
"dnode will run in child-process mode, node:%s"
,
pWrapper
->
name
);
}
pDnode
->
input
.
dnodeId
=
0
;
pDnode
->
input
.
clusterId
=
0
;
pDnode
->
input
.
localEp
=
strdup
(
pOption
->
localEp
);
...
...
@@ -33,7 +69,7 @@ static int32_t dmInitVars(SDnode *pDnode, const SDnodeOpt *pOption) {
pDnode
->
input
.
pDnode
=
pDnode
;
pDnode
->
input
.
processCreateNodeFp
=
dmProcessCreateNodeReq
;
pDnode
->
input
.
processDropNodeFp
=
dmProcessDropNodeReq
;
pDnode
->
input
.
isNode
DeployedFp
=
dmIsNodeDeployedFp
;
pDnode
->
input
.
isNode
RequiredFp
=
dmIsNodeRequired
;
if
(
pDnode
->
input
.
dataDir
==
NULL
||
pDnode
->
input
.
localEp
==
NULL
||
pDnode
->
input
.
localFqdn
==
NULL
||
pDnode
->
input
.
firstEp
==
NULL
||
pDnode
->
input
.
secondEp
==
NULL
)
{
...
...
@@ -41,14 +77,6 @@ static int32_t dmInitVars(SDnode *pDnode, const SDnodeOpt *pOption) {
return
-
1
;
}
pDnode
->
ntype
=
pOption
->
ntype
;
if
(
!
tsMultiProcess
||
pDnode
->
ntype
==
DNODE
||
pDnode
->
ntype
==
NODE_END
)
{
pDnode
->
lockfile
=
dmCheckRunning
(
pOption
->
dataDir
);
if
(
pDnode
->
lockfile
==
NULL
)
{
return
-
1
;
}
}
taosThreadMutexInit
(
&
pDnode
->
mutex
,
NULL
);
return
0
;
}
...
...
@@ -76,19 +104,6 @@ static void dmClearVars(SDnode *pDnode) {
dDebug
(
"dnode memory is cleared, data:%p"
,
pDnode
);
}
static
bool
dmRequireNode
(
SMgmtWrapper
*
pWrapper
)
{
SMgmtInputOpt
*
pInput
=
&
pWrapper
->
pDnode
->
input
;
pInput
->
name
=
pWrapper
->
name
;
pInput
->
path
=
pWrapper
->
path
;
bool
required
=
false
;
int32_t
code
=
(
*
pWrapper
->
func
.
requiredFp
)(
pInput
,
&
required
);
if
(
!
required
)
{
dDebug
(
"node:%s, does not require startup"
,
pWrapper
->
name
);
}
return
required
;
}
SDnode
*
dmCreate
(
const
SDnodeOpt
*
pOption
)
{
dInfo
(
"start to create dnode"
);
int32_t
code
=
-
1
;
...
...
@@ -105,7 +120,6 @@ SDnode *dmCreate(const SDnodeOpt *pOption) {
goto
_OVER
;
}
dmSetStatus
(
pDnode
,
DND_STAT_INIT
);
pDnode
->
wrappers
[
DNODE
].
func
=
dmGetMgmtFunc
();
pDnode
->
wrappers
[
MNODE
].
func
=
mmGetMgmtFunc
();
pDnode
->
wrappers
[
VNODE
].
func
=
vmGetMgmtFunc
();
...
...
@@ -117,9 +131,14 @@ SDnode *dmCreate(const SDnodeOpt *pOption) {
SMgmtWrapper
*
pWrapper
=
&
pDnode
->
wrappers
[
ntype
];
pWrapper
->
pDnode
=
pDnode
;
pWrapper
->
name
=
dmNodeName
(
ntype
);
pWrapper
->
procShm
.
id
=
-
1
;
pWrapper
->
nodeType
=
ntype
;
pWrapper
->
procType
=
DND_PROC_SINGLE
;
pWrapper
->
ntype
=
ntype
;
pWrapper
->
proc
.
wrapper
=
pWrapper
;
pWrapper
->
proc
.
shm
.
id
=
-
1
;
pWrapper
->
proc
.
pid
=
-
1
;
pWrapper
->
proc
.
ptype
=
pDnode
->
ptype
;
if
(
ntype
==
DNODE
)
{
pWrapper
->
proc
.
ptype
=
DND_PROC_SINGLE
;
}
taosInitRWLatch
(
&
pWrapper
->
latch
);
snprintf
(
path
,
sizeof
(
path
),
"%s%s%s"
,
pOption
->
dataDir
,
TD_DIRSEP
,
pWrapper
->
name
);
...
...
@@ -129,7 +148,7 @@ SDnode *dmCreate(const SDnodeOpt *pOption) {
goto
_OVER
;
}
if
(
ntype
!=
DNODE
&&
dmReadShmFile
(
pWrapper
->
path
,
pWrapper
->
name
,
pDnode
->
ntype
,
&
pWrapper
->
procS
hm
)
!=
0
)
{
if
(
ntype
!=
DNODE
&&
dmReadShmFile
(
pWrapper
->
path
,
pWrapper
->
name
,
pDnode
->
rtype
,
&
pWrapper
->
proc
.
s
hm
)
!=
0
)
{
dError
(
"node:%s, failed to read shm file since %s"
,
pWrapper
->
name
,
terrstr
());
goto
_OVER
;
}
...
...
@@ -146,6 +165,19 @@ SDnode *dmCreate(const SDnodeOpt *pOption) {
goto
_OVER
;
}
if
(
OnlyInSingleProc
(
pDnode
->
ptype
)
&&
InParentProc
(
pDnode
->
ptype
))
{
pDnode
->
lockfile
=
dmCheckRunning
(
pOption
->
dataDir
);
if
(
pDnode
->
lockfile
==
NULL
)
{
goto
_OVER
;
}
if
(
dmInitServer
(
pDnode
)
!=
0
)
{
dError
(
"failed to init transport since %s"
,
terrstr
());
goto
_OVER
;
}
}
dmReportStartup
(
pDnode
,
"dnode-transport"
,
"initialized"
);
dInfo
(
"dnode is created, data:%p"
,
pDnode
);
code
=
0
;
...
...
@@ -203,7 +235,7 @@ int32_t dmMarkWrapper(SMgmtWrapper *pWrapper) {
int32_t
code
=
0
;
taosRLockLatch
(
&
pWrapper
->
latch
);
if
(
pWrapper
->
deployed
||
(
pWrapper
->
procType
==
DND_PROC_PARENT
&&
pWrapper
->
required
))
{
if
(
pWrapper
->
deployed
||
(
InParentProc
(
pWrapper
->
proc
.
ptype
)
&&
pWrapper
->
required
))
{
int32_t
refCount
=
atomic_add_fetch_32
(
&
pWrapper
->
refCount
,
1
);
dTrace
(
"node:%s, is marked, refCount:%d"
,
pWrapper
->
name
,
refCount
);
}
else
{
...
...
@@ -321,7 +353,7 @@ int32_t dmProcessCreateNodeReq(SDnode *pDnode, EDndNodeType ntype, SNodeMsg *pMs
(
void
)
dmOpenNode
(
pWrapper
);
pWrapper
->
required
=
true
;
pWrapper
->
deployed
=
true
;
pWrapper
->
proc
T
ype
=
pDnode
->
ptype
;
pWrapper
->
proc
.
pt
ype
=
pDnode
->
ptype
;
}
taosThreadMutexUnlock
(
&
pDnode
->
mutex
);
...
...
source/dnode/mgmt/node_mgmt/src/dmProc.c
浏览文件 @
b08f6b5e
此差异已折叠。
点击以展开。
source/dnode/mgmt/node_mgmt/src/dmRun.c
浏览文件 @
b08f6b5e
...
...
@@ -18,32 +18,28 @@
static
int32_t
dmInitParentProc
(
SMgmtWrapper
*
pWrapper
)
{
int32_t
shmsize
=
tsMnodeShmSize
;
if
(
pWrapper
->
n
odeT
ype
==
VNODE
)
{
if
(
pWrapper
->
n
t
ype
==
VNODE
)
{
shmsize
=
tsVnodeShmSize
;
}
else
if
(
pWrapper
->
n
odeT
ype
==
QNODE
)
{
}
else
if
(
pWrapper
->
n
t
ype
==
QNODE
)
{
shmsize
=
tsQnodeShmSize
;
}
else
if
(
pWrapper
->
n
odeT
ype
==
SNODE
)
{
}
else
if
(
pWrapper
->
n
t
ype
==
SNODE
)
{
shmsize
=
tsSnodeShmSize
;
}
else
if
(
pWrapper
->
n
odeT
ype
==
MNODE
)
{
}
else
if
(
pWrapper
->
n
t
ype
==
MNODE
)
{
shmsize
=
tsMnodeShmSize
;
}
else
if
(
pWrapper
->
n
odeT
ype
==
BNODE
)
{
}
else
if
(
pWrapper
->
n
t
ype
==
BNODE
)
{
shmsize
=
tsBnodeShmSize
;
}
else
{
return
-
1
;
}
if
(
taosCreateShm
(
&
pWrapper
->
proc
Shm
,
pWrapper
->
nodeT
ype
,
shmsize
)
!=
0
)
{
if
(
taosCreateShm
(
&
pWrapper
->
proc
.
shm
,
pWrapper
->
nt
ype
,
shmsize
)
!=
0
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
terrno
);
dError
(
"node:%s, failed to create shm size:%d since %s"
,
pWrapper
->
name
,
shmsize
,
terrstr
());
return
-
1
;
}
dInfo
(
"node:%s, shm:%d is created, size:%d"
,
pWrapper
->
name
,
pWrapper
->
proc
S
hm
.
id
,
shmsize
);
dInfo
(
"node:%s, shm:%d is created, size:%d"
,
pWrapper
->
name
,
pWrapper
->
proc
.
s
hm
.
id
,
shmsize
);
SProcCfg
cfg
=
dmGenProcCfg
(
pWrapper
);
cfg
.
isChild
=
false
;
pWrapper
->
procType
=
DND_PROC_PARENT
;
pWrapper
->
procObj
=
taosProcInit
(
&
cfg
);
if
(
pWrapper
->
procObj
==
NULL
)
{
if
(
dmInitProc
(
pWrapper
)
!=
0
)
{
dError
(
"node:%s, failed to create proc since %s"
,
pWrapper
->
name
,
terrstr
());
return
-
1
;
}
...
...
@@ -51,10 +47,10 @@ static int32_t dmInitParentProc(SMgmtWrapper *pWrapper) {
return
0
;
}
static
int32_t
dmNewNodeProc
(
SMgmtWrapper
*
pWrapper
,
EDndNodeType
n
)
{
static
int32_t
dmNewNodeProc
(
SMgmtWrapper
*
pWrapper
,
EDndNodeType
n
type
)
{
char
tstr
[
8
]
=
{
0
};
char
*
args
[
6
]
=
{
0
};
snprintf
(
tstr
,
sizeof
(
tstr
),
"%d"
,
n
);
snprintf
(
tstr
,
sizeof
(
tstr
),
"%d"
,
n
type
);
args
[
1
]
=
"-c"
;
args
[
2
]
=
configDir
;
args
[
3
]
=
"-n"
;
...
...
@@ -68,39 +64,20 @@ static int32_t dmNewNodeProc(SMgmtWrapper *pWrapper, EDndNodeType n) {
return
-
1
;
}
pWrapper
->
proc
I
d
=
pid
;
pWrapper
->
proc
.
pi
d
=
pid
;
dInfo
(
"node:%s, continue running in new process:%d"
,
pWrapper
->
name
,
pid
);
return
0
;
}
static
int32_t
dmRunParentProc
(
SMgmtWrapper
*
pWrapper
)
{
if
(
pWrapper
->
pDnode
->
n
type
==
NODE_END
)
{
if
(
pWrapper
->
pDnode
->
r
type
==
NODE_END
)
{
dInfo
(
"node:%s, should be started manually in child process"
,
pWrapper
->
name
);
}
else
{
if
(
dmNewNodeProc
(
pWrapper
,
pWrapper
->
n
odeT
ype
)
!=
0
)
{
if
(
dmNewNodeProc
(
pWrapper
,
pWrapper
->
n
t
ype
)
!=
0
)
{
return
-
1
;
}
}
if
(
taosProcRun
(
pWrapper
->
procObj
)
!=
0
)
{
dError
(
"node:%s, failed to run proc since %s"
,
pWrapper
->
name
,
terrstr
());
return
-
1
;
}
return
0
;
}
static
int32_t
dmInitChildProc
(
SMgmtWrapper
*
pWrapper
)
{
SProcCfg
cfg
=
dmGenProcCfg
(
pWrapper
);
cfg
.
isChild
=
true
;
pWrapper
->
procObj
=
taosProcInit
(
&
cfg
);
if
(
pWrapper
->
procObj
==
NULL
)
{
dError
(
"node:%s, failed to create proc since %s"
,
pWrapper
->
name
,
terrstr
());
return
-
1
;
}
return
0
;
}
static
int32_t
dmRunChildProc
(
SMgmtWrapper
*
pWrapper
)
{
if
(
taosProcRun
(
pWrapper
->
procObj
)
!=
0
)
{
if
(
dmRunProc
(
&
pWrapper
->
proc
)
!=
0
)
{
dError
(
"node:%s, failed to run proc since %s"
,
pWrapper
->
name
,
terrstr
());
return
-
1
;
}
...
...
@@ -119,25 +96,46 @@ int32_t dmOpenNode(SMgmtWrapper *pWrapper) {
pInput
->
name
=
pWrapper
->
name
;
pInput
->
path
=
pWrapper
->
path
;
pInput
->
msgCb
=
dmGetMsgcb
(
pWrapper
);
if
(
pWrapper
->
nodeType
==
DNODE
||
pWrapper
->
procType
==
DND_PROC_CHILD
)
{
if
(
pWrapper
->
ntype
==
DNODE
||
OnlyInChildProc
(
pWrapper
->
proc
.
ptype
))
{
tmsgSetDefaultMsgCb
(
&
pInput
->
msgCb
);
}
if
(
pWrapper
->
procType
==
DND_PROC_SINGLE
||
pWrapper
->
procType
==
DND_PROC_CHILD
)
{
if
(
OnlyInSingleProc
(
pWrapper
->
proc
.
ptype
)
)
{
if
((
*
pWrapper
->
func
.
openFp
)(
pInput
,
&
output
)
!=
0
)
{
dError
(
"node:%s, failed to open since %s"
,
pWrapper
->
name
,
terrstr
());
return
-
1
;
}
if
(
pWrapper
->
procType
==
DND_PROC_CHILD
)
{
if
(
dmInitChildProc
(
pWrapper
)
!=
0
)
return
-
1
;
if
(
dmRunChildProc
(
pWrapper
)
!=
0
)
return
-
1
;
}
dDebug
(
"node:%s, has been opened"
,
pWrapper
->
name
);
pWrapper
->
deployed
=
true
;
}
else
{
if
(
dmInitParentProc
(
pWrapper
)
!=
0
)
return
-
1
;
if
(
dmWriteShmFile
(
pWrapper
->
path
,
pWrapper
->
name
,
&
pWrapper
->
procShm
)
!=
0
)
return
-
1
;
if
(
dmRunParentProc
(
pWrapper
)
!=
0
)
return
-
1
;
}
if
(
InChildProc
(
pWrapper
->
proc
.
ptype
))
{
if
((
*
pWrapper
->
func
.
openFp
)(
pInput
,
&
output
)
!=
0
)
{
dError
(
"node:%s, failed to open since %s"
,
pWrapper
->
name
,
terrstr
());
return
-
1
;
}
if
(
dmInitProc
(
pWrapper
)
!=
0
)
{
return
-
1
;
}
if
(
dmRunProc
(
&
pWrapper
->
proc
)
!=
0
)
{
return
-
1
;
}
dDebug
(
"node:%s, has been opened in child process"
,
pWrapper
->
name
);
pWrapper
->
deployed
=
true
;
}
if
(
InParentProc
(
pWrapper
->
proc
.
ptype
))
{
if
(
dmInitParentProc
(
pWrapper
)
!=
0
)
{
return
-
1
;
}
if
(
dmWriteShmFile
(
pWrapper
->
path
,
pWrapper
->
name
,
&
pWrapper
->
proc
.
shm
)
!=
0
)
{
return
-
1
;
}
if
(
dmRunParentProc
(
pWrapper
)
!=
0
)
{
return
-
1
;
}
dDebug
(
"node:%s, has been opened in parent process"
,
pWrapper
->
name
);
}
if
(
output
.
dnodeId
!=
0
)
{
...
...
@@ -156,22 +154,11 @@ int32_t dmOpenNode(SMgmtWrapper *pWrapper) {
int32_t
dmStartNode
(
SMgmtWrapper
*
pWrapper
)
{
if
(
!
pWrapper
->
required
)
return
0
;
if
(
OnlyInParentProc
(
pWrapper
->
proc
.
ptype
))
return
0
;
if
(
pWrapper
->
procType
==
DND_PROC_PARENT
)
{
dInfo
(
"node:%s, not start in parent process"
,
pWrapper
->
name
);
}
else
if
(
pWrapper
->
procType
==
DND_PROC_CHILD
)
{
dInfo
(
"node:%s, start in child process"
,
pWrapper
->
name
);
if
(
pWrapper
->
nodeType
!=
DNODE
)
{
if
(
pWrapper
->
func
.
startFp
!=
NULL
&&
(
*
pWrapper
->
func
.
startFp
)(
pWrapper
->
pMgmt
)
!=
0
)
{
dError
(
"node:%s, failed to start since %s"
,
pWrapper
->
name
,
terrstr
());
return
-
1
;
}
}
}
else
{
if
(
pWrapper
->
func
.
startFp
!=
NULL
&&
(
*
pWrapper
->
func
.
startFp
)(
pWrapper
->
pMgmt
)
!=
0
)
{
dError
(
"node:%s, failed to start since %s"
,
pWrapper
->
name
,
terrstr
());
return
-
1
;
}
if
(
pWrapper
->
func
.
startFp
!=
NULL
&&
(
*
pWrapper
->
func
.
startFp
)(
pWrapper
->
pMgmt
)
!=
0
)
{
dError
(
"node:%s, failed to start since %s"
,
pWrapper
->
name
,
terrstr
());
return
-
1
;
}
dmReportStartup
(
pWrapper
->
pDnode
,
pWrapper
->
name
,
"started"
);
...
...
@@ -193,13 +180,14 @@ void dmCloseNode(SMgmtWrapper *pWrapper) {
taosMsleep
(
10
);
}
if
(
pWrapper
->
procType
==
DND_PROC_PARENT
)
{
if
(
pWrapper
->
procId
>
0
&&
taosProcExist
(
pWrapper
->
procId
))
{
dInfo
(
"node:%s, send kill signal to the child process:%d"
,
pWrapper
->
name
,
pWrapper
->
procId
);
taosKillProc
(
pWrapper
->
procId
);
dInfo
(
"node:%s, wait for child process:%d to stop"
,
pWrapper
->
name
,
pWrapper
->
procId
);
taosWaitProc
(
pWrapper
->
procId
);
dInfo
(
"node:%s, child process:%d is stopped"
,
pWrapper
->
name
,
pWrapper
->
procId
);
if
(
OnlyInParentProc
(
pWrapper
->
proc
.
ptype
))
{
int32_t
pid
=
pWrapper
->
proc
.
pid
;
if
(
pid
>
0
&&
taosProcExist
(
pid
))
{
dInfo
(
"node:%s, send kill signal to the child process:%d"
,
pWrapper
->
name
,
pid
);
taosKillProc
(
pid
);
dInfo
(
"node:%s, wait for child process:%d to stop"
,
pWrapper
->
name
,
pid
);
taosWaitProc
(
pid
);
dInfo
(
"node:%s, child process:%d is stopped"
,
pWrapper
->
name
,
pid
);
}
}
...
...
@@ -210,9 +198,8 @@ void dmCloseNode(SMgmtWrapper *pWrapper) {
}
taosWUnLockLatch
(
&
pWrapper
->
latch
);
if
(
pWrapper
->
procObj
)
{
taosProcCleanup
(
pWrapper
->
procObj
);
pWrapper
->
procObj
=
NULL
;
if
(
!
OnlyInSingleProc
(
pWrapper
->
proc
.
ptype
))
{
dmCleanupProc
(
pWrapper
);
}
dInfo
(
"node:%s, has been closed"
,
pWrapper
->
name
);
...
...
@@ -222,27 +209,8 @@ static int32_t dmOpenNodes(SDnode *pDnode) {
for
(
EDndNodeType
ntype
=
DNODE
;
ntype
<
NODE_END
;
++
ntype
)
{
SMgmtWrapper
*
pWrapper
=
&
pDnode
->
wrappers
[
ntype
];
if
(
!
pWrapper
->
required
)
continue
;
if
(
ntype
==
DNODE
)
{
pWrapper
->
procType
=
DND_PROC_SINGLE
;
if
(
dmOpenNode
(
pWrapper
)
!=
0
)
{
return
-
1
;
}
}
else
{
if
(
pDnode
->
ptype
==
DND_PROC_CHILD
)
{
if
(
pDnode
->
ntype
==
ntype
)
{
pWrapper
->
procType
=
DND_PROC_CHILD
;
if
(
dmOpenNode
(
pWrapper
)
!=
0
)
{
return
-
1
;
}
}
else
{
pWrapper
->
required
=
false
;
}
}
else
{
pWrapper
->
procType
=
pDnode
->
ptype
;
if
(
dmOpenNode
(
pWrapper
)
!=
0
)
{
return
-
1
;
}
}
if
(
dmOpenNode
(
pWrapper
)
!=
0
)
{
return
-
1
;
}
}
...
...
@@ -253,7 +221,7 @@ static int32_t dmOpenNodes(SDnode *pDnode) {
static
int32_t
dmStartNodes
(
SDnode
*
pDnode
)
{
for
(
EDndNodeType
ntype
=
DNODE
;
ntype
<
NODE_END
;
++
ntype
)
{
SMgmtWrapper
*
pWrapper
=
&
pDnode
->
wrappers
[
ntype
];
if
(
ntype
==
DNODE
&&
(
pDnode
->
ptype
==
DND_PROC_CHILD
||
pDnode
->
ptype
==
DND_PROC_TEST
))
continue
;
if
(
ntype
==
DNODE
&&
(
InChildProc
(
pDnode
->
ptype
)
||
!
OnlyInTestProc
(
pDnode
->
ptype
)
))
continue
;
if
(
dmStartNode
(
pWrapper
)
!=
0
)
{
dError
(
"node:%s, failed to start since %s"
,
pWrapper
->
name
,
terrstr
());
return
-
1
;
...
...
@@ -279,57 +247,28 @@ static void dmCloseNodes(SDnode *pDnode) {
}
}
static
void
dmProcessProcHandle
(
void
*
handle
)
{
dWarn
(
"handle:%p, the child process dies and send an offline rsp"
,
handle
);
SRpcMsg
rpcMsg
=
{.
handle
=
handle
,
.
code
=
TSDB_CODE_NODE_OFFLINE
};
rpcSendResponse
(
&
rpcMsg
);
}
static
void
dmWatchNodes
(
SDnode
*
pDnode
)
{
if
(
pDnode
->
ptype
!=
DND_PROC_PARENT
)
return
;
if
(
pDnode
->
n
type
==
NODE_END
)
return
;
if
(
!
InParentProc
(
pDnode
->
ptype
)
)
return
;
if
(
pDnode
->
r
type
==
NODE_END
)
return
;
taosThreadMutexLock
(
&
pDnode
->
mutex
);
for
(
EDndNodeType
n
=
DNODE
+
1
;
n
<
NODE_END
;
++
n
)
{
SMgmtWrapper
*
pWrapper
=
&
pDnode
->
wrappers
[
n
];
for
(
EDndNodeType
ntype
=
DNODE
+
1
;
ntype
<
NODE_END
;
++
ntype
)
{
SMgmtWrapper
*
pWrapper
=
&
pDnode
->
wrappers
[
ntype
];
SProc
*
proc
=
&
pWrapper
->
proc
;
if
(
!
pWrapper
->
required
)
continue
;
if
(
pWrapper
->
procType
!=
DND_PROC_PARENT
)
continue
;
if
(
pWrapper
->
procId
<=
0
||
!
taosProcExist
(
pWrapper
->
procId
))
{
dWarn
(
"node:%s, process:%d is killed and needs to be restarted"
,
pWrapper
->
name
,
pWrapper
->
procId
);
if
(
pWrapper
->
procObj
)
{
taosProcCloseHandles
(
pWrapper
->
procObj
,
dmProcessProcHandle
);
}
dmNewNodeProc
(
pWrapper
,
n
);
if
(
!
InParentProc
(
proc
->
ptype
))
continue
;
if
(
proc
->
pid
<=
0
||
!
taosProcExist
(
proc
->
pid
))
{
dWarn
(
"node:%s, process:%d is killed and needs to restart"
,
pWrapper
->
name
,
proc
->
pid
);
dmCloseProcRpcHandles
(
&
pWrapper
->
proc
);
dmNewNodeProc
(
pWrapper
,
ntype
);
}
}
taosThreadMutexUnlock
(
&
pDnode
->
mutex
);
}
int32_t
dmRun
(
SDnode
*
pDnode
)
{
if
(
tsMultiProcess
==
0
)
{
pDnode
->
ptype
=
DND_PROC_SINGLE
;
dInfo
(
"dnode run in single process mode"
);
}
else
if
(
tsMultiProcess
==
2
)
{
pDnode
->
ptype
=
DND_PROC_TEST
;
dInfo
(
"dnode run in multi-process test mode"
);
}
else
if
(
pDnode
->
ntype
==
DNODE
||
pDnode
->
ntype
==
NODE_END
)
{
pDnode
->
ptype
=
DND_PROC_PARENT
;
dInfo
(
"dnode run in parent process mode"
);
}
else
{
pDnode
->
ptype
=
DND_PROC_CHILD
;
SMgmtWrapper
*
pWrapper
=
&
pDnode
->
wrappers
[
pDnode
->
ntype
];
dInfo
(
"%s run in child process mode"
,
pWrapper
->
name
);
}
if
(
pDnode
->
ptype
!=
DND_PROC_CHILD
)
{
if
(
dmInitServer
(
pDnode
)
!=
0
)
{
dError
(
"failed to init transport since %s"
,
terrstr
());
return
-
1
;
}
dmReportStartup
(
pDnode
,
"dnode-transport"
,
"initialized"
);
}
if
(
dmOpenNodes
(
pDnode
)
!=
0
)
{
dError
(
"failed to open nodes since %s"
,
terrstr
());
return
-
1
;
...
...
@@ -341,15 +280,15 @@ int32_t dmRun(SDnode *pDnode) {
}
while
(
1
)
{
taosMsleep
(
100
);
if
(
pDnode
->
event
&
DND_EVENT_STOP
)
{
dInfo
(
"dnode is about to stop"
);
dmSetStatus
(
pDnode
,
DND_STAT_STOPPED
);
dmStopNodes
(
pDnode
);
dmCloseNodes
(
pDnode
);
return
0
;
}
else
{
dmWatchNodes
(
pDnode
);
}
dmWatchNodes
(
pDnode
);
taosMsleep
(
100
);
}
}
source/dnode/mgmt/node_mgmt/src/dmTransport.c
浏览文件 @
b08f6b5e
...
...
@@ -48,7 +48,7 @@ static inline NodeMsgFp dmGetMsgFp(SMgmtWrapper *pWrapper, SRpcMsg *pRpc) {
return
msgFp
;
}
static
inline
int32_t
dmBuildMsg
(
SNodeMsg
*
pMsg
,
SRpcMsg
*
pRpc
)
{
static
inline
int32_t
dmBuild
Node
Msg
(
SNodeMsg
*
pMsg
,
SRpcMsg
*
pRpc
)
{
SRpcConnInfo
connInfo
=
{
0
};
if
((
pRpc
->
msgType
&
1U
)
&&
rpcGetConnInfo
(
pRpc
->
handle
,
&
connInfo
)
!=
0
)
{
terrno
=
TSDB_CODE_MND_NO_USER_FROM_CONN
;
...
...
@@ -67,10 +67,26 @@ static inline int32_t dmBuildMsg(SNodeMsg *pMsg, SRpcMsg *pRpc) {
return
0
;
}
int32_t
dmProcessNodeMsg
(
SMgmtWrapper
*
pWrapper
,
SNodeMsg
*
pMsg
)
{
SRpcMsg
*
pRpc
=
&
pMsg
->
rpcMsg
;
if
(
InParentProc
(
pWrapper
->
proc
.
ptype
))
{
dTrace
(
"msg:%p, created and put into child queue, type:%s handle:%p user:%s code:0x%04x contLen:%d"
,
pMsg
,
TMSG_INFO
(
pRpc
->
msgType
),
pRpc
->
handle
,
pMsg
->
user
,
pRpc
->
code
&
0XFFFF
,
pRpc
->
contLen
);
return
dmPutToProcCQueue
(
&
pWrapper
->
proc
,
pMsg
,
sizeof
(
SNodeMsg
),
pRpc
->
pCont
,
pRpc
->
contLen
,
((
pRpc
->
msgType
&
1U
)
&&
(
pRpc
->
code
==
0
))
?
pRpc
->
handle
:
NULL
,
pRpc
->
refId
,
PROC_FUNC_REQ
);
}
else
{
dTrace
(
"msg:%p, created, type:%s handle:%p user:%s"
,
pMsg
,
TMSG_INFO
(
pRpc
->
msgType
),
pRpc
->
handle
,
pMsg
->
user
);
NodeMsgFp
msgFp
=
dmGetMsgFp
(
pWrapper
,
&
pMsg
->
rpcMsg
);
if
(
msgFp
==
NULL
)
return
-
1
;
return
(
*
msgFp
)(
pWrapper
->
pMgmt
,
pMsg
);
}
}
static
void
dmProcessRpcMsg
(
SMgmtWrapper
*
pWrapper
,
SRpcMsg
*
pRpc
,
SEpSet
*
pEpSet
)
{
int32_t
code
=
-
1
;
SNodeMsg
*
pMsg
=
NULL
;
NodeMsgFp
msgFp
=
NULL
;
uint16_t
msgType
=
pRpc
->
msgType
;
bool
needRelease
=
false
;
bool
isReq
=
msgType
&
1U
;
...
...
@@ -78,23 +94,14 @@ static void dmProcessRpcMsg(SMgmtWrapper *pWrapper, SRpcMsg *pRpc, SEpSet *pEpSe
if
(
dmMarkWrapper
(
pWrapper
)
!=
0
)
goto
_OVER
;
needRelease
=
true
;
if
((
msgFp
=
dmGetMsgFp
(
pWrapper
,
pRpc
))
==
NULL
)
goto
_OVER
;
if
((
pMsg
=
taosAllocateQitem
(
sizeof
(
SNodeMsg
),
RPC_QITEM
))
==
NULL
)
goto
_OVER
;
if
(
dmBuildMsg
(
pMsg
,
pRpc
)
!=
0
)
goto
_OVER
;
if
(
dmBuild
Node
Msg
(
pMsg
,
pRpc
)
!=
0
)
goto
_OVER
;
if
(
pWrapper
->
procType
!=
DND_PROC_PARENT
)
{
dTrace
(
"msg:%p, created, type:%s handle:%p user:%s"
,
pMsg
,
TMSG_INFO
(
msgType
),
pRpc
->
handle
,
pMsg
->
user
);
code
=
(
*
msgFp
)(
pWrapper
->
pMgmt
,
pMsg
);
}
else
{
dTrace
(
"msg:%p, created and put into child queue, type:%s handle:%p code:0x%04x user:%s contLen:%d"
,
pMsg
,
TMSG_INFO
(
msgType
),
pRpc
->
handle
,
pMsg
->
rpcMsg
.
code
&
0XFFFF
,
pMsg
->
user
,
pRpc
->
contLen
);
code
=
taosProcPutToChildQ
(
pWrapper
->
procObj
,
pMsg
,
sizeof
(
SNodeMsg
),
pRpc
->
pCont
,
pRpc
->
contLen
,
(
isReq
&&
(
pMsg
->
rpcMsg
.
code
==
0
))
?
pRpc
->
handle
:
NULL
,
pRpc
->
refId
,
PROC_FUNC_REQ
);
}
code
=
dmProcessNodeMsg
(
pWrapper
,
pMsg
);
_OVER:
if
(
code
==
0
)
{
if
(
pWrapper
->
procType
==
DND_PROC_PARENT
)
{
if
(
InParentProc
(
pWrapper
->
proc
.
ptype
)
)
{
dTrace
(
"msg:%p, freed in parent process"
,
pMsg
);
taosFreeQitem
(
pMsg
);
rpcFreeCont
(
pRpc
->
pCont
);
...
...
@@ -291,17 +298,15 @@ static inline int32_t dmSendReq(SMgmtWrapper *pWrapper, const SEpSet *pEpSet, SR
}
static
inline
void
dmSendRsp
(
SMgmtWrapper
*
pWrapper
,
const
SRpcMsg
*
pRsp
)
{
if
(
pWrapper
->
procType
!=
DND_PROC_CHILD
)
{
if
(
!
InChildProc
(
pWrapper
->
proc
.
ptype
)
)
{
dmSendRpcRsp
(
pWrapper
->
pDnode
,
pRsp
);
}
else
{
taosProcPutToParentQ
(
pWrapper
->
procObj
,
pRsp
,
sizeof
(
SRpcMsg
),
pRsp
->
pCont
,
pRsp
->
contLen
,
PROC_FUNC_RSP
);
dmPutToProcPQueue
(
&
pWrapper
->
proc
,
pRsp
,
sizeof
(
SRpcMsg
),
pRsp
->
pCont
,
pRsp
->
contLen
,
PROC_FUNC_RSP
);
}
}
static
inline
void
dmSendRedirectRsp
(
SMgmtWrapper
*
pWrapper
,
const
SRpcMsg
*
pRsp
,
const
SEpSet
*
pNewEpSet
)
{
ASSERT
(
pRsp
->
code
==
TSDB_CODE_RPC_REDIRECT
);
ASSERT
(
pRsp
->
pCont
==
NULL
);
if
(
pWrapper
->
procType
!=
DND_PROC_CHILD
)
{
if
(
!
InChildProc
(
pWrapper
->
proc
.
ptype
))
{
SRpcMsg
resp
=
{
0
};
SMEpSet
msg
=
{.
epSet
=
*
pNewEpSet
};
int32_t
len
=
tSerializeSMEpSet
(
NULL
,
0
,
&
msg
);
...
...
@@ -314,97 +319,25 @@ static inline void dmSendRedirectRsp(SMgmtWrapper *pWrapper, const SRpcMsg *pRsp
resp
.
refId
=
pRsp
->
refId
;
rpcSendResponse
(
&
resp
);
}
else
{
taosProcPutToParentQ
(
pWrapper
->
procObj
,
pRsp
,
sizeof
(
SRpcMsg
),
pRsp
->
pCont
,
pRsp
->
contLen
,
PROC_FUNC_RSP
);
dmPutToProcPQueue
(
&
pWrapper
->
proc
,
pRsp
,
sizeof
(
SRpcMsg
),
pRsp
->
pCont
,
pRsp
->
contLen
,
PROC_FUNC_RSP
);
}
}
static
inline
void
dmRegisterBrokenLinkArg
(
SMgmtWrapper
*
pWrapper
,
SRpcMsg
*
pMsg
)
{
if
(
pWrapper
->
procType
!=
DND_PROC_CHILD
)
{
if
(
!
InChildProc
(
pWrapper
->
proc
.
ptype
)
)
{
rpcRegisterBrokenLinkArg
(
pMsg
);
}
else
{
taosProcPutToParentQ
(
pWrapper
->
procObj
,
pMsg
,
sizeof
(
SRpcMsg
),
pMsg
->
pCont
,
pMsg
->
contLen
,
PROC_FUNC_REGIST
);
dmPutToProcPQueue
(
&
pWrapper
->
proc
,
pMsg
,
sizeof
(
SRpcMsg
),
pMsg
->
pCont
,
pMsg
->
contLen
,
PROC_FUNC_REGIST
);
}
}
static
inline
void
dmReleaseHandle
(
SMgmtWrapper
*
pWrapper
,
void
*
handle
,
int8_t
type
)
{
if
(
pWrapper
->
procType
!=
DND_PROC_CHILD
)
{
if
(
!
InChildProc
(
pWrapper
->
proc
.
ptype
)
)
{
rpcReleaseHandle
(
handle
,
type
);
}
else
{
SRpcMsg
msg
=
{.
handle
=
handle
,
.
code
=
type
};
taosProcPutToParentQ
(
pWrapper
->
procObj
,
&
msg
,
sizeof
(
SRpcMsg
),
NULL
,
0
,
PROC_FUNC_RELEASE
);
}
}
static
void
dmConsumeChildQueue
(
SMgmtWrapper
*
pWrapper
,
SNodeMsg
*
pMsg
,
int16_t
msgLen
,
void
*
pCont
,
int32_t
contLen
,
EProcFuncType
ftype
)
{
SRpcMsg
*
pRpc
=
&
pMsg
->
rpcMsg
;
pRpc
->
pCont
=
pCont
;
dTrace
(
"msg:%p, get from child queue, handle:%p app:%p"
,
pMsg
,
pRpc
->
handle
,
pRpc
->
ahandle
);
NodeMsgFp
msgFp
=
pWrapper
->
msgFps
[
TMSG_INDEX
(
pRpc
->
msgType
)];
int32_t
code
=
(
*
msgFp
)(
pWrapper
->
pMgmt
,
pMsg
);
if
(
code
!=
0
)
{
dError
(
"msg:%p, failed to process since code:0x%04x:%s"
,
pMsg
,
code
&
0XFFFF
,
tstrerror
(
code
));
if
(
pRpc
->
msgType
&
1U
)
{
SRpcMsg
rsp
=
{.
handle
=
pRpc
->
handle
,
.
ahandle
=
pRpc
->
ahandle
,
.
code
=
terrno
,
.
refId
=
pRpc
->
refId
};
dmSendRsp
(
pWrapper
,
&
rsp
);
}
dTrace
(
"msg:%p, is freed"
,
pMsg
);
taosFreeQitem
(
pMsg
);
rpcFreeCont
(
pCont
);
}
}
static
void
dmConsumeParentQueue
(
SMgmtWrapper
*
pWrapper
,
SRpcMsg
*
pMsg
,
int16_t
msgLen
,
void
*
pCont
,
int32_t
contLen
,
EProcFuncType
ftype
)
{
int32_t
code
=
pMsg
->
code
&
0xFFFF
;
pMsg
->
pCont
=
pCont
;
if
(
ftype
==
PROC_FUNC_REQ
)
{
ASSERT
(
1
);
dTrace
(
"msg:%p, get from parent queue, send req:%s handle:%p code:0x%04x, app:%p"
,
pMsg
,
TMSG_INFO
(
pMsg
->
msgType
),
pMsg
->
handle
,
code
,
pMsg
->
ahandle
);
dmSendReq
(
pWrapper
,
(
SEpSet
*
)((
char
*
)
pMsg
+
sizeof
(
SRpcMsg
)),
pMsg
);
}
else
if
(
ftype
==
PROC_FUNC_RSP
)
{
dTrace
(
"msg:%p, get from parent queue, rsp handle:%p code:0x%04x, app:%p"
,
pMsg
,
pMsg
->
handle
,
code
,
pMsg
->
ahandle
);
pMsg
->
refId
=
taosProcRemoveHandle
(
pWrapper
->
procObj
,
pMsg
->
handle
);
dmSendRpcRsp
(
pWrapper
->
pDnode
,
pMsg
);
}
else
if
(
ftype
==
PROC_FUNC_REGIST
)
{
dTrace
(
"msg:%p, get from parent queue, regist handle:%p code:0x%04x, app:%p"
,
pMsg
,
pMsg
->
handle
,
code
,
pMsg
->
ahandle
);
rpcRegisterBrokenLinkArg
(
pMsg
);
}
else
if
(
ftype
==
PROC_FUNC_RELEASE
)
{
dTrace
(
"msg:%p, get from parent queue, release handle:%p code:0x%04x, app:%p"
,
pMsg
,
pMsg
->
handle
,
code
,
pMsg
->
ahandle
);
taosProcRemoveHandle
(
pWrapper
->
procObj
,
pMsg
->
handle
);
rpcReleaseHandle
(
pMsg
->
handle
,
(
int8_t
)
pMsg
->
code
);
rpcFreeCont
(
pCont
);
}
else
{
dError
(
"msg:%p, invalid ftype:%d while get from parent queue, handle:%p"
,
pMsg
,
ftype
,
pMsg
->
handle
);
dmPutToProcPQueue
(
&
pWrapper
->
proc
,
&
msg
,
sizeof
(
SRpcMsg
),
NULL
,
0
,
PROC_FUNC_RELEASE
);
}
taosMemoryFree
(
pMsg
);
}
SProcCfg
dmGenProcCfg
(
SMgmtWrapper
*
pWrapper
)
{
SProcCfg
cfg
=
{
.
childConsumeFp
=
(
ProcConsumeFp
)
dmConsumeChildQueue
,
.
childMallocHeadFp
=
(
ProcMallocFp
)
taosAllocateQitem
,
.
childFreeHeadFp
=
(
ProcFreeFp
)
taosFreeQitem
,
.
childMallocBodyFp
=
(
ProcMallocFp
)
rpcMallocCont
,
.
childFreeBodyFp
=
(
ProcFreeFp
)
rpcFreeCont
,
.
parentConsumeFp
=
(
ProcConsumeFp
)
dmConsumeParentQueue
,
.
parentMallocHeadFp
=
(
ProcMallocFp
)
taosMemoryMalloc
,
.
parentFreeHeadFp
=
(
ProcFreeFp
)
taosMemoryFree
,
.
parentMallocBodyFp
=
(
ProcMallocFp
)
rpcMallocCont
,
.
parentFreeBodyFp
=
(
ProcFreeFp
)
rpcFreeCont
,
.
shm
=
pWrapper
->
procShm
,
.
parent
=
pWrapper
,
.
name
=
pWrapper
->
name
,
};
return
cfg
;
}
static
bool
rpcRfp
(
int32_t
code
)
{
...
...
source/dnode/mgmt/node_util/inc/dmUtil.h
浏览文件 @
b08f6b5e
...
...
@@ -26,7 +26,6 @@
#include "tlog.h"
#include "tmsg.h"
#include "tmsgcb.h"
#include "tprocess.h"
#include "tqueue.h"
#include "trpc.h"
#include "tthread.h"
...
...
@@ -83,7 +82,7 @@ typedef enum {
typedef
int32_t
(
*
ProcessCreateNodeFp
)(
struct
SDnode
*
pDnode
,
EDndNodeType
ntype
,
SNodeMsg
*
pMsg
);
typedef
int32_t
(
*
ProcessDropNodeFp
)(
struct
SDnode
*
pDnode
,
EDndNodeType
ntype
,
SNodeMsg
*
pMsg
);
typedef
bool
(
*
IsNode
Deploy
edFp
)(
struct
SDnode
*
pDnode
,
EDndNodeType
ntype
);
typedef
bool
(
*
IsNode
Requir
edFp
)(
struct
SDnode
*
pDnode
,
EDndNodeType
ntype
);
typedef
struct
{
const
char
*
path
;
...
...
@@ -103,7 +102,7 @@ typedef struct {
struct
SDnode
*
pDnode
;
ProcessCreateNodeFp
processCreateNodeFp
;
ProcessDropNodeFp
processDropNodeFp
;
IsNode
DeployedFp
isNodeDeploy
edFp
;
IsNode
RequiredFp
isNodeRequir
edFp
;
}
SMgmtInputOpt
;
typedef
struct
{
...
...
source/util/test/CMakeLists.txt
浏览文件 @
b08f6b5e
...
...
@@ -46,12 +46,12 @@ target_link_libraries(freelistTest os util gtest gtest_main)
# target_link_libraries(encodeTest os util gtest gtest_main)
# queueTest
add_executable
(
procTest
"procTest.cpp"
)
target_link_libraries
(
procTest os util transport sut gtest_main
)
add_test
(
NAME procTest
COMMAND procTest
)
#
add_executable(procTest "procTest.cpp")
#
target_link_libraries(procTest os util transport sut gtest_main)
#
add_test(
#
NAME procTest
#
COMMAND procTest
#
)
# cfgTest
add_executable
(
cfgTest
"cfgTest.cpp"
)
...
...
source/util/test/procTest.cpp
浏览文件 @
b08f6b5e
...
...
@@ -76,16 +76,16 @@ TEST_F(UtilTesProc, 00_Init_Cleanup) {
shm
,
&
shm
,
"1234"
};
SProc
Obj
*
proc
=
taosProcInit
(
&
cfg
);
SProc
*
proc
=
dmInitProc
(
&
cfg
);
ASSERT_EQ
(
proc
,
nullptr
);
shm
.
size
=
2468
;
cfg
.
shm
=
shm
;
proc
=
taosProcInit
(
&
cfg
);
proc
=
dmInitProc
(
&
cfg
);
ASSERT_NE
(
proc
,
nullptr
);
ASSERT_EQ
(
taosProcRun
(
proc
),
0
);
taosProcCleanup
(
proc
);
ASSERT_EQ
(
dmRunProc
(
proc
),
0
);
dmCleanupProc
(
proc
);
taosDropShm
(
&
shm
);
}
...
...
@@ -117,33 +117,33 @@ TEST_F(UtilTesProc, 01_Push_Pop_Child) {
shm
,
(
void
*
)((
int64_t
)
1235
),
"1235_c"
};
SProc
Obj
*
cproc
=
taosProcInit
(
&
cfg
);
SProc
*
cproc
=
dmInitProc
(
&
cfg
);
ASSERT_NE
(
cproc
,
nullptr
);
ASSERT_NE
(
taosProcPutToChildQ
(
cproc
,
&
head
,
0
,
body
,
0
,
0
,
0
,
PROC_FUNC_RSP
),
0
);
ASSERT_NE
(
taosProcPutToChildQ
(
cproc
,
&
head
,
0
,
body
,
0
,
0
,
0
,
PROC_FUNC_REGIST
),
0
);
ASSERT_NE
(
taosProcPutToChildQ
(
cproc
,
&
head
,
0
,
body
,
0
,
0
,
0
,
PROC_FUNC_RELEASE
),
0
);
ASSERT_NE
(
taosProcPutToChildQ
(
cproc
,
NULL
,
12
,
body
,
0
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
ASSERT_NE
(
taosProcPutToChildQ
(
cproc
,
&
head
,
0
,
body
,
0
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
ASSERT_NE
(
taosProcPutToChildQ
(
cproc
,
&
head
,
shm
.
size
,
body
,
0
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
ASSERT_NE
(
taosProcPutToChildQ
(
cproc
,
&
head
,
sizeof
(
STestMsg
),
body
,
shm
.
size
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
ASSERT_NE
(
dmPutToProcCQueue
(
cproc
,
&
head
,
0
,
body
,
0
,
0
,
0
,
PROC_FUNC_RSP
),
0
);
ASSERT_NE
(
dmPutToProcCQueue
(
cproc
,
&
head
,
0
,
body
,
0
,
0
,
0
,
PROC_FUNC_REGIST
),
0
);
ASSERT_NE
(
dmPutToProcCQueue
(
cproc
,
&
head
,
0
,
body
,
0
,
0
,
0
,
PROC_FUNC_RELEASE
),
0
);
ASSERT_NE
(
dmPutToProcCQueue
(
cproc
,
NULL
,
12
,
body
,
0
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
ASSERT_NE
(
dmPutToProcCQueue
(
cproc
,
&
head
,
0
,
body
,
0
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
ASSERT_NE
(
dmPutToProcCQueue
(
cproc
,
&
head
,
shm
.
size
,
body
,
0
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
ASSERT_NE
(
dmPutToProcCQueue
(
cproc
,
&
head
,
sizeof
(
STestMsg
),
body
,
shm
.
size
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
for
(
int32_t
j
=
0
;
j
<
1000
;
j
++
)
{
int32_t
i
=
0
;
for
(
i
=
0
;
i
<
20
;
++
i
)
{
ASSERT_EQ
(
taosProcPutToChildQ
(
cproc
,
&
head
,
sizeof
(
STestMsg
),
body
,
i
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
ASSERT_EQ
(
dmPutToProcCQueue
(
cproc
,
&
head
,
sizeof
(
STestMsg
),
body
,
i
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
}
ASSERT_NE
(
taosProcPutToChildQ
(
cproc
,
&
head
,
sizeof
(
STestMsg
),
body
,
i
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
ASSERT_NE
(
dmPutToProcCQueue
(
cproc
,
&
head
,
sizeof
(
STestMsg
),
body
,
i
,
0
,
0
,
PROC_FUNC_REQ
),
0
);
cfg
.
isChild
=
true
;
cfg
.
name
=
"1235_p"
;
SProc
Obj
*
pproc
=
taosProcInit
(
&
cfg
);
SProc
*
pproc
=
dmInitProc
(
&
cfg
);
ASSERT_NE
(
pproc
,
nullptr
);
taosProcRun
(
pproc
);
taosProcCleanup
(
pproc
);
dmRunProc
(
pproc
);
dmCleanupProc
(
pproc
);
}
taosProcCleanup
(
cproc
);
dmCleanupProc
(
cproc
);
taosDropShm
(
&
shm
);
}
...
...
@@ -175,26 +175,26 @@ TEST_F(UtilTesProc, 02_Push_Pop_Parent) {
shm
,
(
void
*
)((
int64_t
)
1236
),
"1236_c"
};
SProc
Obj
*
cproc
=
taosProcInit
(
&
cfg
);
SProc
*
cproc
=
dmInitProc
(
&
cfg
);
ASSERT_NE
(
cproc
,
nullptr
);
cfg
.
name
=
"1236_p"
;
cfg
.
isChild
=
true
;
SProc
Obj
*
pproc
=
taosProcInit
(
&
cfg
);
SProc
*
pproc
=
dmInitProc
(
&
cfg
);
ASSERT_NE
(
pproc
,
nullptr
);
for
(
int32_t
j
=
0
;
j
<
1000
;
j
++
)
{
int32_t
i
=
0
;
for
(
i
=
0
;
i
<
20
;
++
i
)
{
taosProcPutToParentQ
(
pproc
,
&
head
,
sizeof
(
STestMsg
),
body
,
i
,
PROC_FUNC_REQ
);
dmPutToProcPQueue
(
pproc
,
&
head
,
sizeof
(
STestMsg
),
body
,
i
,
PROC_FUNC_REQ
);
}
taosProcRun
(
cproc
);
taosProcStop
(
cproc
);
dmRunProc
(
cproc
);
dmStopProc
(
cproc
);
}
taosProcCleanup
(
pproc
);
taosProcCleanup
(
cproc
);
dmCleanupProc
(
pproc
);
dmCleanupProc
(
cproc
);
taosDropShm
(
&
shm
);
}
...
...
@@ -229,34 +229,34 @@ TEST_F(UtilTesProc, 03_Handle) {
shm
,
(
void
*
)((
int64_t
)
1235
),
"1237_p"
};
SProc
Obj
*
cproc
=
taosProcInit
(
&
cfg
);
SProc
*
cproc
=
dmInitProc
(
&
cfg
);
ASSERT_NE
(
cproc
,
nullptr
);
for
(
int32_t
j
=
0
;
j
<
1
;
j
++
)
{
int32_t
i
=
0
;
for
(
i
=
0
;
i
<
20
;
++
i
)
{
head
.
handle
=
(
void
*
)((
int64_t
)
i
);
ASSERT_EQ
(
taosProcPutToChildQ
(
cproc
,
&
head
,
sizeof
(
STestMsg
),
body
,
i
,
(
void
*
)((
int64_t
)
i
),
i
,
PROC_FUNC_REQ
),
0
);
ASSERT_EQ
(
dmPutToProcCQueue
(
cproc
,
&
head
,
sizeof
(
STestMsg
),
body
,
i
,
(
void
*
)((
int64_t
)
i
),
i
,
PROC_FUNC_REQ
),
0
);
}
cfg
.
isChild
=
true
;
cfg
.
name
=
"child_queue"
;
SProc
Obj
*
pproc
=
taosProcInit
(
&
cfg
);
SProc
*
pproc
=
dmInitProc
(
&
cfg
);
ASSERT_NE
(
pproc
,
nullptr
);
taosProcRun
(
pproc
);
taosProcCleanup
(
pproc
);
dmRunProc
(
pproc
);
dmCleanupProc
(
pproc
);
int64_t
ref
=
0
;
ref
=
taosProcRemove
Handle
(
cproc
,
(
void
*
)((
int64_t
)
3
));
ref
=
dmRemoveProcRpc
Handle
(
cproc
,
(
void
*
)((
int64_t
)
3
));
EXPECT_EQ
(
ref
,
3
);
ref
=
taosProcRemove
Handle
(
cproc
,
(
void
*
)((
int64_t
)
5
));
ref
=
dmRemoveProcRpc
Handle
(
cproc
,
(
void
*
)((
int64_t
)
5
));
EXPECT_EQ
(
ref
,
5
);
ref
=
taosProcRemove
Handle
(
cproc
,
(
void
*
)((
int64_t
)
6
));
ref
=
dmRemoveProcRpc
Handle
(
cproc
,
(
void
*
)((
int64_t
)
6
));
EXPECT_EQ
(
ref
,
6
);
taosProcClose
Handles
(
cproc
,
processHandle
);
dmCloseProcRpc
Handles
(
cproc
,
processHandle
);
}
taosProcCleanup
(
cproc
);
dmCleanupProc
(
cproc
);
taosDropShm
(
&
shm
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录