Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Rattenking
TDengine
提交
ea3aae75
T
TDengine
项目概览
Rattenking
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
ea3aae75
编写于
11月 20, 2020
作者:
S
Shengliang Guan
提交者:
GitHub
11月 20, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #4298 from taosdata/feature/wal
Feature/wal
上级
84c1bac5
f323186f
变更
20
显示空白变更内容
内联
并排
Showing
20 changed file
with
1188 addition
and
1185 deletion
+1188
-1185
src/inc/tsync.h
src/inc/tsync.h
+9
-9
src/mnode/inc/mnodeSdb.h
src/mnode/inc/mnodeSdb.h
+45
-42
src/mnode/src/mnodeAcct.c
src/mnode/src/mnodeAcct.c
+35
-36
src/mnode/src/mnodeCluster.c
src/mnode/src/mnodeCluster.c
+30
-30
src/mnode/src/mnodeDb.c
src/mnode/src/mnodeDb.c
+61
-61
src/mnode/src/mnodeDnode.c
src/mnode/src/mnodeDnode.c
+45
-45
src/mnode/src/mnodeMnode.c
src/mnode/src/mnodeMnode.c
+41
-45
src/mnode/src/mnodeSdb.c
src/mnode/src/mnodeSdb.c
+413
-479
src/mnode/src/mnodeTable.c
src/mnode/src/mnodeTable.c
+191
-191
src/mnode/src/mnodeUser.c
src/mnode/src/mnodeUser.c
+52
-52
src/mnode/src/mnodeVgroup.c
src/mnode/src/mnodeVgroup.c
+73
-73
src/plugins/http/inc/httpInt.h
src/plugins/http/inc/httpInt.h
+1
-1
src/plugins/http/src/httpHandle.c
src/plugins/http/src/httpHandle.c
+2
-2
src/sync/inc/syncInt.h
src/sync/inc/syncInt.h
+20
-13
src/sync/src/syncMain.c
src/sync/src/syncMain.c
+132
-77
src/sync/src/syncRestore.c
src/sync/src/syncRestore.c
+13
-4
src/sync/src/syncRetrieve.c
src/sync/src/syncRetrieve.c
+5
-5
src/sync/src/taosTcpPool.c
src/sync/src/taosTcpPool.c
+1
-1
src/wal/src/walWrite.c
src/wal/src/walWrite.c
+2
-2
tests/script/sh/deploy.sh
tests/script/sh/deploy.sh
+17
-17
未找到文件。
src/inc/tsync.h
浏览文件 @
ea3aae75
...
...
@@ -24,18 +24,18 @@ extern "C" {
#define TAOS_SYNC_MAX_INDEX 0x7FFFFFFF
typedef
enum
_TAOS_SYNC_ROLE
{
TAOS_SYNC_ROLE_OFFLINE
,
TAOS_SYNC_ROLE_UNSYNCED
,
TAOS_SYNC_ROLE_SYNCING
,
TAOS_SYNC_ROLE_SLAVE
,
TAOS_SYNC_ROLE_MASTER
,
TAOS_SYNC_ROLE_OFFLINE
=
0
,
TAOS_SYNC_ROLE_UNSYNCED
=
1
,
TAOS_SYNC_ROLE_SYNCING
=
2
,
TAOS_SYNC_ROLE_SLAVE
=
3
,
TAOS_SYNC_ROLE_MASTER
=
4
}
ESyncRole
;
typedef
enum
_TAOS_SYNC_STATUS
{
TAOS_SYNC_STATUS_INIT
,
TAOS_SYNC_STATUS_START
,
TAOS_SYNC_STATUS_FILE
,
TAOS_SYNC_STATUS_CACHE
,
TAOS_SYNC_STATUS_INIT
=
0
,
TAOS_SYNC_STATUS_START
=
1
,
TAOS_SYNC_STATUS_FILE
=
2
,
TAOS_SYNC_STATUS_CACHE
=
3
}
ESyncStatus
;
typedef
struct
{
...
...
src/mnode/inc/mnodeSdb.h
浏览文件 @
ea3aae75
...
...
@@ -20,7 +20,8 @@
extern
"C"
{
#endif
struct
SMnodeMsg
;
#include "mnode.h"
#include "twal.h"
typedef
enum
{
SDB_TABLE_CLUSTER
=
0
,
...
...
@@ -36,44 +37,46 @@ typedef enum {
}
ESdbTable
;
typedef
enum
{
SDB_KEY_STRING
,
SDB_KEY_INT
,
SDB_KEY_AUTO
,
SDB_KEY_VAR_STRING
,
SDB_KEY_STRING
=
0
,
SDB_KEY_INT
=
1
,
SDB_KEY_AUTO
=
2
,
SDB_KEY_VAR_STRING
=
3
,
}
ESdbKey
;
typedef
enum
{
SDB_OPER_GLOBAL
,
SDB_OPER_LOCAL
SDB_OPER_GLOBAL
=
0
,
SDB_OPER_LOCAL
=
1
}
ESdbOper
;
typedef
struct
SSdb
Oper
{
typedef
struct
SSdb
Row
{
ESdbOper
type
;
int32_t
rowSize
;
int32_t
retCode
;
// for callback in sdb queue
int32_t
processedCount
;
// for sync fwd callback
int32_t
(
*
reqFp
)(
struct
SMnodeMsg
*
pMsg
);
int32_t
(
*
writeCb
)(
struct
SMnodeMsg
*
pMsg
,
int32_t
code
);
void
*
table
;
void
*
pObj
;
int32_t
code
;
// for callback in sdb queue
int32_t
rowSize
;
void
*
rowData
;
struct
SMnodeMsg
*
pMsg
;
}
SSdbOper
;
void
*
pObj
;
void
*
pTable
;
SMnodeMsg
*
pMsg
;
int32_t
(
*
fpReq
)(
SMnodeMsg
*
pMsg
);
int32_t
(
*
fpRsp
)(
SMnodeMsg
*
pMsg
,
int32_t
code
);
char
reserveForSync
[
16
];
SWalHead
pHead
[];
}
SSdbRow
;
typedef
struct
{
char
*
tableN
ame
;
char
*
n
ame
;
int32_t
hashSessions
;
int32_t
maxRowSize
;
int32_t
refCountPos
;
ESdbTable
tableI
d
;
ESdbTable
i
d
;
ESdbKey
keyType
;
int32_t
(
*
insertFp
)(
SSdbOper
*
pOper
);
int32_t
(
*
deleteFp
)(
SSdbOper
*
pOper
);
int32_t
(
*
updateFp
)(
SSdbOper
*
pOper
);
int32_t
(
*
encodeFp
)(
SSdbOper
*
pOper
);
int32_t
(
*
decodeFp
)(
SSdbOper
*
pDesc
);
int32_t
(
*
destroyFp
)(
SSdbOper
*
pDesc
);
int32_t
(
*
restoredFp
)();
int32_t
(
*
fpInsert
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpDelete
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpUpdate
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpEncode
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpDecode
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpDestroy
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpRestored
)();
}
SSdbTableDesc
;
int32_t
sdbInit
();
...
...
@@ -84,20 +87,20 @@ bool sdbIsMaster();
bool
sdbIsServing
();
void
sdbUpdateMnodeRoles
();
int32_t
sdbInsertRow
(
SSdb
Oper
*
pOper
);
int32_t
sdbDeleteRow
(
SSdb
Oper
*
pOper
);
int32_t
sdbUpdateRow
(
SSdb
Oper
*
pOper
);
int32_t
sdbInsertRow
Imp
(
SSdbOper
*
pOper
);
int32_t
sdbInsertRow
(
SSdb
Row
*
pRow
);
int32_t
sdbDeleteRow
(
SSdb
Row
*
pRow
);
int32_t
sdbUpdateRow
(
SSdb
Row
*
pRow
);
int32_t
sdbInsertRow
ToQueue
(
SSdbRow
*
pRow
);
void
*
sdbGetRow
(
void
*
hand
le
,
void
*
key
);
void
*
sdbFetchRow
(
void
*
hand
le
,
void
*
pIter
,
void
**
ppRow
);
void
*
sdbGetRow
(
void
*
pTab
le
,
void
*
key
);
void
*
sdbFetchRow
(
void
*
pTab
le
,
void
*
pIter
,
void
**
ppRow
);
void
sdbFreeIter
(
void
*
pIter
);
void
sdbIncRef
(
void
*
thand
le
,
void
*
pRow
);
void
sdbDecRef
(
void
*
thand
le
,
void
*
pRow
);
int64_t
sdbGetNumOfRows
(
void
*
hand
le
);
int32_t
sdbGetId
(
void
*
hand
le
);
void
sdbIncRef
(
void
*
pTab
le
,
void
*
pRow
);
void
sdbDecRef
(
void
*
pTab
le
,
void
*
pRow
);
int64_t
sdbGetNumOfRows
(
void
*
pTab
le
);
int32_t
sdbGetId
(
void
*
pTab
le
);
uint64_t
sdbGetVersion
();
bool
sdbCheckRowDeleted
(
void
*
thand
le
,
void
*
pRow
);
bool
sdbCheckRowDeleted
(
void
*
pTab
le
,
void
*
pRow
);
#ifdef __cplusplus
}
...
...
src/mnode/src/mnodeAcct.c
浏览文件 @
ea3aae75
...
...
@@ -16,6 +16,7 @@
#define _DEFAULT_SOURCE
#include "os.h"
#include "taoserror.h"
#include "tglobal.h"
#include "dnode.h"
#include "mnodeDef.h"
#include "mnodeInt.h"
...
...
@@ -25,36 +26,34 @@
#include "mnodeUser.h"
#include "mnodeVgroup.h"
#include "tglobal.h"
void
*
tsAcctSdb
=
NULL
;
static
int32_t
tsAcctUpdateSize
;
static
int32_t
mnodeCreateRootAcct
();
static
int32_t
mnodeAcctActionDestroy
(
SSdb
Oper
*
pOper
)
{
SAcctObj
*
pAcct
=
p
Oper
->
pObj
;
static
int32_t
mnodeAcctActionDestroy
(
SSdb
Row
*
pRow
)
{
SAcctObj
*
pAcct
=
p
Row
->
pObj
;
pthread_mutex_destroy
(
&
pAcct
->
mutex
);
tfree
(
p
Oper
->
pObj
);
tfree
(
p
Row
->
pObj
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeAcctActionInsert
(
SSdb
Oper
*
pOper
)
{
SAcctObj
*
pAcct
=
p
Oper
->
pObj
;
static
int32_t
mnodeAcctActionInsert
(
SSdb
Row
*
pRow
)
{
SAcctObj
*
pAcct
=
p
Row
->
pObj
;
memset
(
&
pAcct
->
acctInfo
,
0
,
sizeof
(
SAcctInfo
));
pAcct
->
acctInfo
.
accessState
=
TSDB_VN_ALL_ACCCESS
;
pthread_mutex_init
(
&
pAcct
->
mutex
,
NULL
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeAcctActionDelete
(
SSdb
Oper
*
pOper
)
{
SAcctObj
*
pAcct
=
p
Oper
->
pObj
;
static
int32_t
mnodeAcctActionDelete
(
SSdb
Row
*
pRow
)
{
SAcctObj
*
pAcct
=
p
Row
->
pObj
;
mnodeDropAllUsers
(
pAcct
);
mnodeDropAllDbs
(
pAcct
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeAcctActionUpdate
(
SSdb
Oper
*
pOper
)
{
SAcctObj
*
pAcct
=
p
Oper
->
pObj
;
static
int32_t
mnodeAcctActionUpdate
(
SSdb
Row
*
pRow
)
{
SAcctObj
*
pAcct
=
p
Row
->
pObj
;
SAcctObj
*
pSaved
=
mnodeGetAcct
(
pAcct
->
user
);
if
(
pAcct
!=
pSaved
)
{
memcpy
(
pSaved
,
pAcct
,
tsAcctUpdateSize
);
...
...
@@ -64,19 +63,19 @@ static int32_t mnodeAcctActionUpdate(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeAcctActionEncode
(
SSdb
Oper
*
pOper
)
{
SAcctObj
*
pAcct
=
p
Oper
->
pObj
;
memcpy
(
p
Oper
->
rowData
,
pAcct
,
tsAcctUpdateSize
);
p
Oper
->
rowSize
=
tsAcctUpdateSize
;
static
int32_t
mnodeAcctActionEncode
(
SSdb
Row
*
pRow
)
{
SAcctObj
*
pAcct
=
p
Row
->
pObj
;
memcpy
(
p
Row
->
rowData
,
pAcct
,
tsAcctUpdateSize
);
p
Row
->
rowSize
=
tsAcctUpdateSize
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeAcctActionDecode
(
SSdb
Oper
*
pOper
)
{
static
int32_t
mnodeAcctActionDecode
(
SSdb
Row
*
pRow
)
{
SAcctObj
*
pAcct
=
(
SAcctObj
*
)
calloc
(
1
,
sizeof
(
SAcctObj
));
if
(
pAcct
==
NULL
)
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
memcpy
(
pAcct
,
p
Oper
->
rowData
,
tsAcctUpdateSize
);
p
Oper
->
pObj
=
pAcct
;
memcpy
(
pAcct
,
p
Row
->
rowData
,
tsAcctUpdateSize
);
p
Row
->
pObj
=
pAcct
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -99,29 +98,29 @@ int32_t mnodeInitAccts() {
SAcctObj
tObj
;
tsAcctUpdateSize
=
(
int8_t
*
)
tObj
.
updateEnd
-
(
int8_t
*
)
&
tObj
;
SSdbTableDesc
tableD
esc
=
{
.
tableId
=
SDB_TABLE_ACCOUNT
,
.
tableName
=
"accounts"
,
SSdbTableDesc
d
esc
=
{
.
id
=
SDB_TABLE_ACCOUNT
,
.
name
=
"accounts"
,
.
hashSessions
=
TSDB_DEFAULT_ACCOUNTS_HASH_SIZE
,
.
maxRowSize
=
tsAcctUpdateSize
,
.
refCountPos
=
(
int8_t
*
)(
&
tObj
.
refCount
)
-
(
int8_t
*
)
&
tObj
,
.
keyType
=
SDB_KEY_STRING
,
.
insertFp
=
mnodeAcctActionInsert
,
.
deleteFp
=
mnodeAcctActionDelete
,
.
updateFp
=
mnodeAcctActionUpdate
,
.
encodeFp
=
mnodeAcctActionEncode
,
.
decodeFp
=
mnodeAcctActionDecode
,
.
destroyFp
=
mnodeAcctActionDestroy
,
.
restoredFp
=
mnodeAcctActionRestored
.
fpInsert
=
mnodeAcctActionInsert
,
.
fpDelete
=
mnodeAcctActionDelete
,
.
fpUpdate
=
mnodeAcctActionUpdate
,
.
fpEncode
=
mnodeAcctActionEncode
,
.
fpDecode
=
mnodeAcctActionDecode
,
.
fpDestroy
=
mnodeAcctActionDestroy
,
.
fpRestored
=
mnodeAcctActionRestored
};
tsAcctSdb
=
sdbOpenTable
(
&
tableD
esc
);
tsAcctSdb
=
sdbOpenTable
(
&
d
esc
);
if
(
tsAcctSdb
==
NULL
)
{
mError
(
"table:%s, failed to create hash"
,
tableDesc
.
tableN
ame
);
mError
(
"table:%s, failed to create hash"
,
desc
.
n
ame
);
return
-
1
;
}
mDebug
(
"table:%s, hash is created"
,
tableDesc
.
tableN
ame
);
mDebug
(
"table:%s, hash is created"
,
desc
.
n
ame
);
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -226,13 +225,13 @@ static int32_t mnodeCreateRootAcct() {
pAcct
->
acctId
=
sdbGetId
(
tsAcctSdb
);
pAcct
->
createdTime
=
taosGetTimestampMs
();
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsAcctSdb
,
.
pT
able
=
tsAcctSdb
,
.
pObj
=
pAcct
,
};
return
sdbInsertRow
(
&
oper
);
return
sdbInsertRow
(
&
row
);
}
#ifndef _ACCT
...
...
src/mnode/src/mnodeCluster.c
浏览文件 @
ea3aae75
...
...
@@ -32,36 +32,36 @@ static int32_t mnodeCreateCluster();
static
int32_t
mnodeGetClusterMeta
(
STableMetaMsg
*
pMeta
,
SShowObj
*
pShow
,
void
*
pConn
);
static
int32_t
mnodeRetrieveClusters
(
SShowObj
*
pShow
,
char
*
data
,
int32_t
rows
,
void
*
pConn
);
static
int32_t
mnodeClusterActionDestroy
(
SSdb
Oper
*
pOper
)
{
tfree
(
p
Oper
->
pObj
);
static
int32_t
mnodeClusterActionDestroy
(
SSdb
Row
*
pRow
)
{
tfree
(
p
Row
->
pObj
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeClusterActionInsert
(
SSdb
Oper
*
pOper
)
{
static
int32_t
mnodeClusterActionInsert
(
SSdb
Row
*
pRow
)
{
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeClusterActionDelete
(
SSdb
Oper
*
pOper
)
{
static
int32_t
mnodeClusterActionDelete
(
SSdb
Row
*
pRow
)
{
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeClusterActionUpdate
(
SSdb
Oper
*
pOper
)
{
static
int32_t
mnodeClusterActionUpdate
(
SSdb
Row
*
pRow
)
{
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeClusterActionEncode
(
SSdb
Oper
*
pOper
)
{
SClusterObj
*
pCluster
=
p
Oper
->
pObj
;
memcpy
(
p
Oper
->
rowData
,
pCluster
,
tsClusterUpdateSize
);
p
Oper
->
rowSize
=
tsClusterUpdateSize
;
static
int32_t
mnodeClusterActionEncode
(
SSdb
Row
*
pRow
)
{
SClusterObj
*
pCluster
=
p
Row
->
pObj
;
memcpy
(
p
Row
->
rowData
,
pCluster
,
tsClusterUpdateSize
);
p
Row
->
rowSize
=
tsClusterUpdateSize
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeClusterActionDecode
(
SSdb
Oper
*
pOper
)
{
static
int32_t
mnodeClusterActionDecode
(
SSdb
Row
*
pRow
)
{
SClusterObj
*
pCluster
=
(
SClusterObj
*
)
calloc
(
1
,
sizeof
(
SClusterObj
));
if
(
pCluster
==
NULL
)
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
memcpy
(
pCluster
,
p
Oper
->
rowData
,
tsClusterUpdateSize
);
p
Oper
->
pObj
=
pCluster
;
memcpy
(
pCluster
,
p
Row
->
rowData
,
tsClusterUpdateSize
);
p
Row
->
pObj
=
pCluster
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -84,32 +84,32 @@ int32_t mnodeInitCluster() {
SClusterObj
tObj
;
tsClusterUpdateSize
=
(
int8_t
*
)
tObj
.
updateEnd
-
(
int8_t
*
)
&
tObj
;
SSdbTableDesc
tableD
esc
=
{
.
tableId
=
SDB_TABLE_CLUSTER
,
.
tableName
=
"cluster"
,
SSdbTableDesc
d
esc
=
{
.
id
=
SDB_TABLE_CLUSTER
,
.
name
=
"cluster"
,
.
hashSessions
=
TSDB_DEFAULT_CLUSTER_HASH_SIZE
,
.
maxRowSize
=
tsClusterUpdateSize
,
.
refCountPos
=
(
int8_t
*
)(
&
tObj
.
refCount
)
-
(
int8_t
*
)
&
tObj
,
.
keyType
=
SDB_KEY_STRING
,
.
insertFp
=
mnodeClusterActionInsert
,
.
deleteFp
=
mnodeClusterActionDelete
,
.
updateFp
=
mnodeClusterActionUpdate
,
.
encodeFp
=
mnodeClusterActionEncode
,
.
decodeFp
=
mnodeClusterActionDecode
,
.
destroyFp
=
mnodeClusterActionDestroy
,
.
restoredFp
=
mnodeClusterActionRestored
.
fpInsert
=
mnodeClusterActionInsert
,
.
fpDelete
=
mnodeClusterActionDelete
,
.
fpUpdate
=
mnodeClusterActionUpdate
,
.
fpEncode
=
mnodeClusterActionEncode
,
.
fpDecode
=
mnodeClusterActionDecode
,
.
fpDestroy
=
mnodeClusterActionDestroy
,
.
fpRestored
=
mnodeClusterActionRestored
};
tsClusterSdb
=
sdbOpenTable
(
&
tableD
esc
);
tsClusterSdb
=
sdbOpenTable
(
&
d
esc
);
if
(
tsClusterSdb
==
NULL
)
{
mError
(
"table:%s, failed to create hash"
,
tableDesc
.
tableN
ame
);
mError
(
"table:%s, failed to create hash"
,
desc
.
n
ame
);
return
-
1
;
}
mnodeAddShowMetaHandle
(
TSDB_MGMT_TABLE_CLUSTER
,
mnodeGetClusterMeta
);
mnodeAddShowRetrieveHandle
(
TSDB_MGMT_TABLE_CLUSTER
,
mnodeRetrieveClusters
);
mDebug
(
"table:%s, hash is created"
,
tableDesc
.
tableN
ame
);
mDebug
(
"table:%s, hash is created"
,
desc
.
n
ame
);
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -145,13 +145,13 @@ static int32_t mnodeCreateCluster() {
mDebug
(
"uid is %s"
,
pCluster
->
uid
);
}
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsClusterSdb
,
.
pT
able
=
tsClusterSdb
,
.
pObj
=
pCluster
,
};
return
sdbInsertRow
(
&
oper
);
return
sdbInsertRow
(
&
row
);
}
const
char
*
mnodeGetClusterId
()
{
...
...
src/mnode/src/mnodeDb.c
浏览文件 @
ea3aae75
...
...
@@ -56,8 +56,8 @@ static void mnodeDestroyDb(SDbObj *pDb) {
tfree
(
pDb
);
}
static
int32_t
mnodeDbActionDestroy
(
SSdb
Oper
*
pOper
)
{
mnodeDestroyDb
(
p
Oper
->
pObj
);
static
int32_t
mnodeDbActionDestroy
(
SSdb
Row
*
pRow
)
{
mnodeDestroyDb
(
p
Row
->
pObj
);
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -65,8 +65,8 @@ int64_t mnodeGetDbNum() {
return
sdbGetNumOfRows
(
tsDbSdb
);
}
static
int32_t
mnodeDbActionInsert
(
SSdb
Oper
*
pOper
)
{
SDbObj
*
pDb
=
p
Oper
->
pObj
;
static
int32_t
mnodeDbActionInsert
(
SSdb
Row
*
pRow
)
{
SDbObj
*
pDb
=
p
Row
->
pObj
;
SAcctObj
*
pAcct
=
mnodeGetAcct
(
pDb
->
acct
);
pthread_mutex_init
(
&
pDb
->
mutex
,
NULL
);
...
...
@@ -91,8 +91,8 @@ static int32_t mnodeDbActionInsert(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeDbActionDelete
(
SSdb
Oper
*
pOper
)
{
SDbObj
*
pDb
=
p
Oper
->
pObj
;
static
int32_t
mnodeDbActionDelete
(
SSdb
Row
*
pRow
)
{
SDbObj
*
pDb
=
p
Row
->
pObj
;
SAcctObj
*
pAcct
=
mnodeGetAcct
(
pDb
->
acct
);
mnodeDropAllChildTables
(
pDb
);
...
...
@@ -107,11 +107,11 @@ static int32_t mnodeDbActionDelete(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeDbActionUpdate
(
SSdb
Oper
*
pOper
)
{
SDbObj
*
pNew
=
p
Oper
->
pObj
;
static
int32_t
mnodeDbActionUpdate
(
SSdb
Row
*
pRow
)
{
SDbObj
*
pNew
=
p
Row
->
pObj
;
SDbObj
*
pDb
=
mnodeGetDb
(
pNew
->
name
);
if
(
pDb
!=
NULL
&&
pNew
!=
pDb
)
{
memcpy
(
pDb
,
pNew
,
p
Oper
->
rowSize
);
memcpy
(
pDb
,
pNew
,
p
Row
->
rowSize
);
free
(
pNew
->
vgList
);
free
(
pNew
);
}
...
...
@@ -120,19 +120,19 @@ static int32_t mnodeDbActionUpdate(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeDbActionEncode
(
SSdb
Oper
*
pOper
)
{
SDbObj
*
pDb
=
p
Oper
->
pObj
;
memcpy
(
p
Oper
->
rowData
,
pDb
,
tsDbUpdateSize
);
p
Oper
->
rowSize
=
tsDbUpdateSize
;
static
int32_t
mnodeDbActionEncode
(
SSdb
Row
*
pRow
)
{
SDbObj
*
pDb
=
p
Row
->
pObj
;
memcpy
(
p
Row
->
rowData
,
pDb
,
tsDbUpdateSize
);
p
Row
->
rowSize
=
tsDbUpdateSize
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeDbActionDecode
(
SSdb
Oper
*
pOper
)
{
static
int32_t
mnodeDbActionDecode
(
SSdb
Row
*
pRow
)
{
SDbObj
*
pDb
=
(
SDbObj
*
)
calloc
(
1
,
sizeof
(
SDbObj
));
if
(
pDb
==
NULL
)
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
memcpy
(
pDb
,
p
Oper
->
rowData
,
tsDbUpdateSize
);
p
Oper
->
pObj
=
pDb
;
memcpy
(
pDb
,
p
Row
->
rowData
,
tsDbUpdateSize
);
p
Row
->
pObj
=
pDb
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -144,23 +144,23 @@ int32_t mnodeInitDbs() {
SDbObj
tObj
;
tsDbUpdateSize
=
(
int8_t
*
)
tObj
.
updateEnd
-
(
int8_t
*
)
&
tObj
;
SSdbTableDesc
tableD
esc
=
{
.
tableId
=
SDB_TABLE_DB
,
.
tableName
=
"dbs"
,
SSdbTableDesc
d
esc
=
{
.
id
=
SDB_TABLE_DB
,
.
name
=
"dbs"
,
.
hashSessions
=
TSDB_DEFAULT_DBS_HASH_SIZE
,
.
maxRowSize
=
tsDbUpdateSize
,
.
refCountPos
=
(
int8_t
*
)(
&
tObj
.
refCount
)
-
(
int8_t
*
)
&
tObj
,
.
keyType
=
SDB_KEY_STRING
,
.
insertFp
=
mnodeDbActionInsert
,
.
deleteFp
=
mnodeDbActionDelete
,
.
updateFp
=
mnodeDbActionUpdate
,
.
encodeFp
=
mnodeDbActionEncode
,
.
decodeFp
=
mnodeDbActionDecode
,
.
destroyFp
=
mnodeDbActionDestroy
,
.
restoredFp
=
mnodeDbActionRestored
.
fpInsert
=
mnodeDbActionInsert
,
.
fpDelete
=
mnodeDbActionDelete
,
.
fpUpdate
=
mnodeDbActionUpdate
,
.
fpEncode
=
mnodeDbActionEncode
,
.
fpDecode
=
mnodeDbActionDecode
,
.
fpDestroy
=
mnodeDbActionDestroy
,
.
fpRestored
=
mnodeDbActionRestored
};
tsDbSdb
=
sdbOpenTable
(
&
tableD
esc
);
tsDbSdb
=
sdbOpenTable
(
&
d
esc
);
if
(
tsDbSdb
==
NULL
)
{
mError
(
"failed to init db data"
);
return
-
1
;
...
...
@@ -412,16 +412,16 @@ static int32_t mnodeCreateDb(SAcctObj *pAcct, SCreateDbMsg *pCreate, SMnodeMsg *
pMsg
->
pDb
=
pDb
;
mnodeIncDbRef
(
pDb
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsDbSdb
,
.
pT
able
=
tsDbSdb
,
.
pObj
=
pDb
,
.
rowSize
=
sizeof
(
SDbObj
),
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeCreateDbCb
.
fpRsp
=
mnodeCreateDbCb
};
code
=
sdbInsertRow
(
&
oper
);
code
=
sdbInsertRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"db:%s, failed to create, reason:%s"
,
pDb
->
name
,
tstrerror
(
code
));
pMsg
->
pDb
=
NULL
;
...
...
@@ -440,8 +440,8 @@ bool mnodeCheckIsMonitorDB(char *db, char *monitordb) {
}
#if 0
void mnodePrintVgroups(SDbObj *pDb, char *
oper
) {
mInfo("db:%s, vgroup link from head,
oper:%s", pDb->name, oper
);
void mnodePrintVgroups(SDbObj *pDb, char *
row
) {
mInfo("db:%s, vgroup link from head,
row:%s", pDb->name, row
);
SVgObj *pVgroup = pDb->pHead;
while (pVgroup != NULL) {
mInfo("vgId:%d", pVgroup->vgId);
...
...
@@ -807,13 +807,13 @@ static int32_t mnodeSetDbDropping(SDbObj *pDb) {
if
(
pDb
->
status
)
return
TSDB_CODE_SUCCESS
;
pDb
->
status
=
true
;
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsDbSdb
,
.
pT
able
=
tsDbSdb
,
.
pObj
=
pDb
};
int32_t
code
=
sdbUpdateRow
(
&
oper
);
int32_t
code
=
sdbUpdateRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"db:%s, failed to set dropping state, reason:%s"
,
pDb
->
name
,
tstrerror
(
code
));
}
...
...
@@ -1019,15 +1019,15 @@ static int32_t mnodeAlterDb(SDbObj *pDb, SAlterDbMsg *pAlter, void *pMsg) {
if
(
memcmp
(
&
newCfg
,
&
pDb
->
cfg
,
sizeof
(
SDbCfg
))
!=
0
)
{
pDb
->
cfg
=
newCfg
;
pDb
->
cfgVersion
++
;
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
table
=
tsDbSdb
,
.
pTable
=
tsDbSdb
,
.
pObj
=
pDb
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeAlterDbCb
.
fpRsp
=
mnodeAlterDbCb
};
code
=
sdbUpdateRow
(
&
oper
);
code
=
sdbUpdateRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"db:%s, failed to alter, reason:%s"
,
pDb
->
name
,
tstrerror
(
code
));
}
...
...
@@ -1071,15 +1071,15 @@ static int32_t mnodeDropDb(SMnodeMsg *pMsg) {
SDbObj
*
pDb
=
pMsg
->
pDb
;
mInfo
(
"db:%s, drop db from sdb"
,
pDb
->
name
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsDbSdb
,
.
pT
able
=
tsDbSdb
,
.
pObj
=
pDb
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeDropDbCb
.
fpRsp
=
mnodeDropDbCb
};
int32_t
code
=
sdbDeleteRow
(
&
oper
);
int32_t
code
=
sdbDeleteRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"db:%s, failed to drop, reason:%s"
,
pDb
->
name
,
tstrerror
(
code
));
}
...
...
@@ -1134,13 +1134,13 @@ void mnodeDropAllDbs(SAcctObj *pAcct) {
if
(
pDb
->
pAcct
==
pAcct
)
{
mInfo
(
"db:%s, drop db from sdb for acct:%s is dropped"
,
pDb
->
name
,
pAcct
->
user
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_LOCAL
,
.
t
able
=
tsDbSdb
,
.
pT
able
=
tsDbSdb
,
.
pObj
=
pDb
};
sdbDeleteRow
(
&
oper
);
sdbDeleteRow
(
&
row
);
numOfDbs
++
;
}
mnodeDecDbRef
(
pDb
);
...
...
src/mnode/src/mnodeDnode.c
浏览文件 @
ea3aae75
...
...
@@ -87,13 +87,13 @@ static char* offlineReason[] = {
"unknown"
,
};
static
int32_t
mnodeDnodeActionDestroy
(
SSdb
Oper
*
pOper
)
{
tfree
(
p
Oper
->
pObj
);
static
int32_t
mnodeDnodeActionDestroy
(
SSdb
Row
*
pRow
)
{
tfree
(
p
Row
->
pObj
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeDnodeActionInsert
(
SSdb
Oper
*
pOper
)
{
SDnodeObj
*
pDnode
=
p
Oper
->
pObj
;
static
int32_t
mnodeDnodeActionInsert
(
SSdb
Row
*
pRow
)
{
SDnodeObj
*
pDnode
=
p
Row
->
pObj
;
if
(
pDnode
->
status
!=
TAOS_DN_STATUS_DROPPING
)
{
pDnode
->
status
=
TAOS_DN_STATUS_OFFLINE
;
pDnode
->
lastAccess
=
tsAccessSquence
;
...
...
@@ -107,8 +107,8 @@ static int32_t mnodeDnodeActionInsert(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeDnodeActionDelete
(
SSdb
Oper
*
pOper
)
{
SDnodeObj
*
pDnode
=
p
Oper
->
pObj
;
static
int32_t
mnodeDnodeActionDelete
(
SSdb
Row
*
pRow
)
{
SDnodeObj
*
pDnode
=
p
Row
->
pObj
;
#ifndef _SYNC
mnodeDropAllDnodeVgroups
(
pDnode
);
...
...
@@ -121,11 +121,11 @@ static int32_t mnodeDnodeActionDelete(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeDnodeActionUpdate
(
SSdb
Oper
*
pOper
)
{
SDnodeObj
*
pNew
=
p
Oper
->
pObj
;
static
int32_t
mnodeDnodeActionUpdate
(
SSdb
Row
*
pRow
)
{
SDnodeObj
*
pNew
=
p
Row
->
pObj
;
SDnodeObj
*
pDnode
=
mnodeGetDnode
(
pNew
->
dnodeId
);
if
(
pDnode
!=
NULL
&&
pNew
!=
pDnode
)
{
memcpy
(
pDnode
,
pNew
,
p
Oper
->
rowSize
);
memcpy
(
pDnode
,
pNew
,
p
Row
->
rowSize
);
free
(
pNew
);
}
mnodeDecDnodeRef
(
pDnode
);
...
...
@@ -134,19 +134,19 @@ static int32_t mnodeDnodeActionUpdate(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeDnodeActionEncode
(
SSdb
Oper
*
pOper
)
{
SDnodeObj
*
pDnode
=
p
Oper
->
pObj
;
memcpy
(
p
Oper
->
rowData
,
pDnode
,
tsDnodeUpdateSize
);
p
Oper
->
rowSize
=
tsDnodeUpdateSize
;
static
int32_t
mnodeDnodeActionEncode
(
SSdb
Row
*
pRow
)
{
SDnodeObj
*
pDnode
=
p
Row
->
pObj
;
memcpy
(
p
Row
->
rowData
,
pDnode
,
tsDnodeUpdateSize
);
p
Row
->
rowSize
=
tsDnodeUpdateSize
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeDnodeActionDecode
(
SSdb
Oper
*
pOper
)
{
static
int32_t
mnodeDnodeActionDecode
(
SSdb
Row
*
pRow
)
{
SDnodeObj
*
pDnode
=
(
SDnodeObj
*
)
calloc
(
1
,
sizeof
(
SDnodeObj
));
if
(
pDnode
==
NULL
)
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
memcpy
(
pDnode
,
p
Oper
->
rowData
,
tsDnodeUpdateSize
);
p
Oper
->
pObj
=
pDnode
;
memcpy
(
pDnode
,
p
Row
->
rowData
,
tsDnodeUpdateSize
);
p
Row
->
pObj
=
pDnode
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -171,23 +171,23 @@ int32_t mnodeInitDnodes() {
tsDnodeUpdateSize
=
(
int8_t
*
)
tObj
.
updateEnd
-
(
int8_t
*
)
&
tObj
;
pthread_mutex_init
(
&
tsDnodeEpsMutex
,
NULL
);
SSdbTableDesc
tableD
esc
=
{
.
tableId
=
SDB_TABLE_DNODE
,
.
tableName
=
"dnodes"
,
SSdbTableDesc
d
esc
=
{
.
id
=
SDB_TABLE_DNODE
,
.
name
=
"dnodes"
,
.
hashSessions
=
TSDB_DEFAULT_DNODES_HASH_SIZE
,
.
maxRowSize
=
tsDnodeUpdateSize
,
.
refCountPos
=
(
int8_t
*
)(
&
tObj
.
refCount
)
-
(
int8_t
*
)
&
tObj
,
.
keyType
=
SDB_KEY_AUTO
,
.
insertFp
=
mnodeDnodeActionInsert
,
.
deleteFp
=
mnodeDnodeActionDelete
,
.
updateFp
=
mnodeDnodeActionUpdate
,
.
encodeFp
=
mnodeDnodeActionEncode
,
.
decodeFp
=
mnodeDnodeActionDecode
,
.
destroyFp
=
mnodeDnodeActionDestroy
,
.
restoredFp
=
mnodeDnodeActionRestored
.
fpInsert
=
mnodeDnodeActionInsert
,
.
fpDelete
=
mnodeDnodeActionDelete
,
.
fpUpdate
=
mnodeDnodeActionUpdate
,
.
fpEncode
=
mnodeDnodeActionEncode
,
.
fpDecode
=
mnodeDnodeActionDecode
,
.
fpDestroy
=
mnodeDnodeActionDestroy
,
.
fpRestored
=
mnodeDnodeActionRestored
};
tsDnodeSdb
=
sdbOpenTable
(
&
tableD
esc
);
tsDnodeSdb
=
sdbOpenTable
(
&
d
esc
);
if
(
tsDnodeSdb
==
NULL
)
{
mError
(
"failed to init dnodes data"
);
return
-
1
;
...
...
@@ -296,13 +296,13 @@ void mnodeDecDnodeRef(SDnodeObj *pDnode) {
}
void
mnodeUpdateDnode
(
SDnodeObj
*
pDnode
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsDnodeSdb
,
.
pT
able
=
tsDnodeSdb
,
.
pObj
=
pDnode
};
int32_t
code
=
sdbUpdateRow
(
&
oper
);
int32_t
code
=
sdbUpdateRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"dnodeId:%d, failed update"
,
pDnode
->
dnodeId
);
}
...
...
@@ -644,15 +644,15 @@ static int32_t mnodeCreateDnode(char *ep, SMnodeMsg *pMsg) {
tstrncpy
(
pDnode
->
dnodeEp
,
ep
,
TSDB_EP_LEN
);
taosGetFqdnPortFromEp
(
ep
,
pDnode
->
dnodeFqdn
,
&
pDnode
->
dnodePort
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
table
=
tsDnodeSdb
,
.
pTable
=
tsDnodeSdb
,
.
pObj
=
pDnode
,
.
rowSize
=
sizeof
(
SDnodeObj
),
.
pMsg
=
pMsg
};
int32_t
code
=
sdbInsertRow
(
&
oper
);
int32_t
code
=
sdbInsertRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
int
dnodeId
=
pDnode
->
dnodeId
;
tfree
(
pDnode
);
...
...
@@ -665,14 +665,14 @@ static int32_t mnodeCreateDnode(char *ep, SMnodeMsg *pMsg) {
}
int32_t
mnodeDropDnode
(
SDnodeObj
*
pDnode
,
void
*
pMsg
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsDnodeSdb
,
.
pT
able
=
tsDnodeSdb
,
.
pObj
=
pDnode
,
.
pMsg
=
pMsg
};
int32_t
code
=
sdbDeleteRow
(
&
oper
);
int32_t
code
=
sdbDeleteRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"dnode:%d, failed to drop from cluster, result:%s"
,
pDnode
->
dnodeId
,
tstrerror
(
code
));
}
else
{
...
...
@@ -1141,7 +1141,7 @@ static int32_t mnodeRetrieveVnodes(SShowObj *pShow, char *data, int32_t rows, vo
cols
++
;
pWrite
=
data
+
pShow
->
offset
[
cols
]
*
rows
+
pShow
->
bytes
[
cols
]
*
numOfRows
;
strcpy
(
pWrite
,
mnodeGetMnodeRoleStr
(
pVgid
->
role
)
);
strcpy
(
pWrite
,
syncRole
[
pVgid
->
role
]
);
cols
++
;
}
}
...
...
src/mnode/src/mnodeMnode.c
浏览文件 @
ea3aae75
...
...
@@ -58,13 +58,13 @@ static int32_t mnodeRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, vo
#define mnodeMnodeDestroyLock() pthread_mutex_destroy(&tsMnodeLock)
#endif
static
int32_t
mnodeMnodeActionDestroy
(
SSdb
Oper
*
pOper
)
{
tfree
(
p
Oper
->
pObj
);
static
int32_t
mnodeMnodeActionDestroy
(
SSdb
Row
*
pRow
)
{
tfree
(
p
Row
->
pObj
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeMnodeActionInsert
(
SSdb
Oper
*
pOper
)
{
SMnodeObj
*
pMnode
=
p
Oper
->
pObj
;
static
int32_t
mnodeMnodeActionInsert
(
SSdb
Row
*
pRow
)
{
SMnodeObj
*
pMnode
=
p
Row
->
pObj
;
SDnodeObj
*
pDnode
=
mnodeGetDnode
(
pMnode
->
mnodeId
);
if
(
pDnode
==
NULL
)
return
TSDB_CODE_MND_DNODE_NOT_EXIST
;
...
...
@@ -76,8 +76,8 @@ static int32_t mnodeMnodeActionInsert(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeMnodeActionDelete
(
SSdb
Oper
*
pOper
)
{
SMnodeObj
*
pMnode
=
p
Oper
->
pObj
;
static
int32_t
mnodeMnodeActionDelete
(
SSdb
Row
*
pRow
)
{
SMnodeObj
*
pMnode
=
p
Row
->
pObj
;
SDnodeObj
*
pDnode
=
mnodeGetDnode
(
pMnode
->
mnodeId
);
if
(
pDnode
==
NULL
)
return
TSDB_CODE_MND_DNODE_NOT_EXIST
;
...
...
@@ -88,30 +88,30 @@ static int32_t mnodeMnodeActionDelete(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeMnodeActionUpdate
(
SSdb
Oper
*
pOper
)
{
SMnodeObj
*
pMnode
=
p
Oper
->
pObj
;
static
int32_t
mnodeMnodeActionUpdate
(
SSdb
Row
*
pRow
)
{
SMnodeObj
*
pMnode
=
p
Row
->
pObj
;
SMnodeObj
*
pSaved
=
mnodeGetMnode
(
pMnode
->
mnodeId
);
if
(
pMnode
!=
pSaved
)
{
memcpy
(
pSaved
,
pMnode
,
p
Oper
->
rowSize
);
memcpy
(
pSaved
,
pMnode
,
p
Row
->
rowSize
);
free
(
pMnode
);
}
mnodeDecMnodeRef
(
pSaved
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeMnodeActionEncode
(
SSdb
Oper
*
pOper
)
{
SMnodeObj
*
pMnode
=
p
Oper
->
pObj
;
memcpy
(
p
Oper
->
rowData
,
pMnode
,
tsMnodeUpdateSize
);
p
Oper
->
rowSize
=
tsMnodeUpdateSize
;
static
int32_t
mnodeMnodeActionEncode
(
SSdb
Row
*
pRow
)
{
SMnodeObj
*
pMnode
=
p
Row
->
pObj
;
memcpy
(
p
Row
->
rowData
,
pMnode
,
tsMnodeUpdateSize
);
p
Row
->
rowSize
=
tsMnodeUpdateSize
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeMnodeActionDecode
(
SSdb
Oper
*
pOper
)
{
static
int32_t
mnodeMnodeActionDecode
(
SSdb
Row
*
pRow
)
{
SMnodeObj
*
pMnode
=
calloc
(
1
,
sizeof
(
SMnodeObj
));
if
(
pMnode
==
NULL
)
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
memcpy
(
pMnode
,
p
Oper
->
rowData
,
tsMnodeUpdateSize
);
p
Oper
->
pObj
=
pMnode
;
memcpy
(
pMnode
,
p
Row
->
rowData
,
tsMnodeUpdateSize
);
p
Row
->
pObj
=
pMnode
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -137,23 +137,23 @@ int32_t mnodeInitMnodes() {
SMnodeObj
tObj
;
tsMnodeUpdateSize
=
(
int8_t
*
)
tObj
.
updateEnd
-
(
int8_t
*
)
&
tObj
;
SSdbTableDesc
tableD
esc
=
{
.
tableId
=
SDB_TABLE_MNODE
,
.
tableName
=
"mnodes"
,
SSdbTableDesc
d
esc
=
{
.
id
=
SDB_TABLE_MNODE
,
.
name
=
"mnodes"
,
.
hashSessions
=
TSDB_DEFAULT_MNODES_HASH_SIZE
,
.
maxRowSize
=
tsMnodeUpdateSize
,
.
refCountPos
=
(
int8_t
*
)(
&
tObj
.
refCount
)
-
(
int8_t
*
)
&
tObj
,
.
keyType
=
SDB_KEY_INT
,
.
insertFp
=
mnodeMnodeActionInsert
,
.
deleteFp
=
mnodeMnodeActionDelete
,
.
updateFp
=
mnodeMnodeActionUpdate
,
.
encodeFp
=
mnodeMnodeActionEncode
,
.
decodeFp
=
mnodeMnodeActionDecode
,
.
destroyFp
=
mnodeMnodeActionDestroy
,
.
restoredFp
=
mnodeMnodeActionRestored
.
fpInsert
=
mnodeMnodeActionInsert
,
.
fpDelete
=
mnodeMnodeActionDelete
,
.
fpUpdate
=
mnodeMnodeActionUpdate
,
.
fpEncode
=
mnodeMnodeActionEncode
,
.
fpDecode
=
mnodeMnodeActionDecode
,
.
fpDestroy
=
mnodeMnodeActionDestroy
,
.
fpRestored
=
mnodeMnodeActionRestored
};
tsMnodeSdb
=
sdbOpenTable
(
&
tableD
esc
);
tsMnodeSdb
=
sdbOpenTable
(
&
d
esc
);
if
(
tsMnodeSdb
==
NULL
)
{
mError
(
"failed to init mnodes data"
);
return
-
1
;
...
...
@@ -192,10 +192,6 @@ void *mnodeGetNextMnode(void *pIter, SMnodeObj **pMnode) {
return
sdbFetchRow
(
tsMnodeSdb
,
pIter
,
(
void
**
)
pMnode
);
}
char
*
mnodeGetMnodeRoleStr
(
int32_t
role
)
{
return
syncRole
[
role
];
}
void
mnodeUpdateMnodeEpSet
()
{
mInfo
(
"update mnodes epSet, numOfEps:%d "
,
mnodeGetMnodesNum
());
...
...
@@ -329,11 +325,11 @@ void mnodeCreateMnode(int32_t dnodeId, char *dnodeEp, bool needConfirm) {
pMnode
->
mnodeId
=
dnodeId
;
pMnode
->
createdTime
=
taosGetTimestampMs
();
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
table
=
tsMnodeSdb
,
.
pTable
=
tsMnodeSdb
,
.
pObj
=
pMnode
,
.
writeCb
=
mnodeCreateMnodeCb
.
fpRsp
=
mnodeCreateMnodeCb
};
int32_t
code
=
TSDB_CODE_SUCCESS
;
...
...
@@ -346,7 +342,7 @@ void mnodeCreateMnode(int32_t dnodeId, char *dnodeEp, bool needConfirm) {
return
;
}
code
=
sdbInsertRow
(
&
oper
);
code
=
sdbInsertRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"dnode:%d, failed to create mnode, ep:%s reason:%s"
,
dnodeId
,
dnodeEp
,
tstrerror
(
code
));
tfree
(
pMnode
);
...
...
@@ -356,8 +352,8 @@ void mnodeCreateMnode(int32_t dnodeId, char *dnodeEp, bool needConfirm) {
void
mnodeDropMnodeLocal
(
int32_t
dnodeId
)
{
SMnodeObj
*
pMnode
=
mnodeGetMnode
(
dnodeId
);
if
(
pMnode
!=
NULL
)
{
SSdb
Oper
oper
=
{.
type
=
SDB_OPER_LOCAL
,
.
t
able
=
tsMnodeSdb
,
.
pObj
=
pMnode
};
sdbDeleteRow
(
&
oper
);
SSdb
Row
row
=
{.
type
=
SDB_OPER_LOCAL
,
.
pT
able
=
tsMnodeSdb
,
.
pObj
=
pMnode
};
sdbDeleteRow
(
&
row
);
mnodeDecMnodeRef
(
pMnode
);
}
...
...
@@ -371,13 +367,13 @@ int32_t mnodeDropMnode(int32_t dnodeId) {
return
TSDB_CODE_MND_DNODE_NOT_EXIST
;
}
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsMnodeSdb
,
.
pT
able
=
tsMnodeSdb
,
.
pObj
=
pMnode
};
int32_t
code
=
sdbDeleteRow
(
&
oper
);
int32_t
code
=
sdbDeleteRow
(
&
row
);
sdbDecRef
(
tsMnodeSdb
,
pMnode
);
...
...
@@ -469,7 +465,7 @@ static int32_t mnodeRetrieveMnodes(SShowObj *pShow, char *data, int32_t rows, vo
cols
++
;
pWrite
=
data
+
pShow
->
offset
[
cols
]
*
rows
+
pShow
->
bytes
[
cols
]
*
numOfRows
;
char
*
roles
=
mnodeGetMnodeRoleStr
(
pMnode
->
role
)
;
char
*
roles
=
syncRole
[
pMnode
->
role
]
;
STR_WITH_MAXSIZE_TO_VARSTR
(
pWrite
,
roles
,
pShow
->
bytes
[
cols
]);
cols
++
;
...
...
src/mnode/src/mnodeSdb.c
浏览文件 @
ea3aae75
...
...
@@ -34,23 +34,30 @@
#include "mnodeSdb.h"
#define SDB_TABLE_LEN 12
#define
SDB_SYNC_HACK 16
#define
MAX_QUEUED_MSG_NUM 10000
typedef
enum
{
SDB_ACTION_INSERT
,
SDB_ACTION_DELETE
,
SDB_ACTION_UPDATE
SDB_ACTION_INSERT
=
0
,
SDB_ACTION_DELETE
=
1
,
SDB_ACTION_UPDATE
=
2
}
ESdbAction
;
typedef
enum
{
SDB_STATUS_OFFLINE
,
SDB_STATUS_SERVING
,
SDB_STATUS_CLOSING
SDB_STATUS_OFFLINE
=
0
,
SDB_STATUS_SERVING
=
1
,
SDB_STATUS_CLOSING
=
2
}
ESdbStatus
;
typedef
struct
_SSdbTable
{
char
tableName
[
SDB_TABLE_LEN
];
ESdbTable
tableId
;
char
*
actStr
[]
=
{
"insert"
,
"delete"
,
"update"
,
"invalid"
};
typedef
struct
SSdbTable
{
char
name
[
SDB_TABLE_LEN
];
ESdbTable
id
;
ESdbKey
keyType
;
int32_t
hashSessions
;
int32_t
maxRowSize
;
...
...
@@ -58,13 +65,13 @@ typedef struct _SSdbTable {
int32_t
autoIndex
;
int64_t
numOfRows
;
void
*
iHandle
;
int32_t
(
*
insertFp
)(
SSdbOper
*
pDesc
);
int32_t
(
*
deleteFp
)(
SSdbOper
*
pOper
);
int32_t
(
*
updateFp
)(
SSdbOper
*
pOper
);
int32_t
(
*
decodeFp
)(
SSdbOper
*
pOper
);
int32_t
(
*
encodeFp
)(
SSdbOper
*
pOper
);
int32_t
(
*
destroyFp
)(
SSdbOper
*
pOper
);
int32_t
(
*
restoredFp
)();
int32_t
(
*
fpInsert
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpDelete
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpUpdate
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpDecode
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpEncode
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpDestroy
)(
SSdbRow
*
pRow
);
int32_t
(
*
fpRestored
)();
pthread_mutex_t
mutex
;
}
SSdbTable
;
...
...
@@ -75,60 +82,60 @@ typedef struct {
int64_t
sync
;
void
*
wal
;
SSyncCfg
cfg
;
int32_t
queuedMsg
;
int32_t
numOfTables
;
SSdbTable
*
tableList
[
SDB_TABLE_MAX
];
pthread_mutex_t
mutex
;
}
SSdb
Objec
t
;
}
SSdb
Mgm
t
;
typedef
struct
{
pthread_t
thread
;
int32_t
workerId
;
}
SSdbW
riteW
orker
;
}
SSdbWorker
;
typedef
struct
{
int32_t
num
;
SSdbW
riteWorker
*
writeW
orker
;
}
SSdbW
riteW
orkerPool
;
SSdbW
orker
*
w
orker
;
}
SSdbWorkerPool
;
extern
void
*
tsMnodeTmr
;
static
void
*
tsUpdateSyncTmr
;
static
SSdbObject
tsSdbObj
=
{
0
};
static
taos_qset
tsSdbWriteQset
;
static
taos_qall
tsSdbWriteQall
;
static
taos_queue
tsSdbWriteQueue
;
static
SSdbWriteWorkerPool
tsSdbPool
;
static
int32_t
sdbWrite
(
void
*
param
,
void
*
data
,
int32_t
type
,
void
*
pMsg
);
static
int32_t
sdbWriteToQueue
(
void
*
param
,
void
*
data
,
int32_t
type
,
void
*
pMsg
);
static
void
*
sdbWorkerFp
(
void
*
param
);
static
int32_t
sdbInitWriteWorker
();
static
void
sdbCleanupWriteWorker
();
static
int32_t
sdbAllocWriteQueue
();
static
void
sdbFreeWritequeue
();
static
int32_t
sdbUpdateRowImp
(
SSdbOper
*
pOper
);
static
int32_t
sdbDeleteRowImp
(
SSdbOper
*
pOper
);
static
int32_t
sdbInsertHash
(
SSdbTable
*
pTable
,
SSdbOper
*
pOper
);
static
int32_t
sdbUpdateHash
(
SSdbTable
*
pTable
,
SSdbOper
*
pOper
);
static
int32_t
sdbDeleteHash
(
SSdbTable
*
pTable
,
SSdbOper
*
pOper
);
int32_t
sdbGetId
(
void
*
handle
)
{
return
((
SSdbTable
*
)
handle
)
->
autoIndex
;
static
void
*
tsSdbTmr
;
static
SSdbMgmt
tsSdbMgmt
=
{
0
};
static
taos_qset
tsSdbWQset
;
static
taos_qall
tsSdbWQall
;
static
taos_queue
tsSdbWQueue
;
static
SSdbWorkerPool
tsSdbPool
;
static
int32_t
sdbProcessWrite
(
void
*
pRow
,
void
*
pHead
,
int32_t
qtype
,
void
*
unused
);
static
int32_t
sdbWriteWalToQueue
(
void
*
vparam
,
void
*
pHead
,
int32_t
qtype
,
void
*
rparam
);
static
int32_t
sdbWriteRowToQueue
(
SSdbRow
*
pRow
,
int32_t
action
);
static
void
*
sdbWorkerFp
(
void
*
pWorker
);
static
int32_t
sdbInitWorker
();
static
void
sdbCleanupWorker
();
static
int32_t
sdbAllocQueue
();
static
void
sdbFreeQueue
();
static
int32_t
sdbInsertHash
(
SSdbTable
*
pTable
,
SSdbRow
*
pRow
);
static
int32_t
sdbUpdateHash
(
SSdbTable
*
pTable
,
SSdbRow
*
pRow
);
static
int32_t
sdbDeleteHash
(
SSdbTable
*
pTable
,
SSdbRow
*
pRow
);
int32_t
sdbGetId
(
void
*
pTable
)
{
return
((
SSdbTable
*
)
pTable
)
->
autoIndex
;
}
int64_t
sdbGetNumOfRows
(
void
*
hand
le
)
{
return
((
SSdbTable
*
)
hand
le
)
->
numOfRows
;
int64_t
sdbGetNumOfRows
(
void
*
pTab
le
)
{
return
((
SSdbTable
*
)
pTab
le
)
->
numOfRows
;
}
uint64_t
sdbGetVersion
()
{
return
tsSdb
Obj
.
version
;
return
tsSdb
Mgmt
.
version
;
}
bool
sdbIsMaster
()
{
return
tsSdb
Obj
.
role
==
TAOS_SYNC_ROLE_MASTER
;
return
tsSdb
Mgmt
.
role
==
TAOS_SYNC_ROLE_MASTER
;
}
bool
sdbIsServing
()
{
return
tsSdb
Obj
.
status
==
SDB_STATUS_SERVING
;
return
tsSdb
Mgmt
.
status
==
SDB_STATUS_SERVING
;
}
static
void
*
sdbGetObjKey
(
SSdbTable
*
pTable
,
void
*
key
)
{
...
...
@@ -139,18 +146,6 @@ static void *sdbGetObjKey(SSdbTable *pTable, void *key) {
return
key
;
}
static
char
*
sdbGetActionStr
(
int32_t
action
)
{
switch
(
action
)
{
case
SDB_ACTION_INSERT
:
return
"insert"
;
case
SDB_ACTION_DELETE
:
return
"delete"
;
case
SDB_ACTION_UPDATE
:
return
"update"
;
}
return
"invalid"
;
}
static
char
*
sdbGetKeyStr
(
SSdbTable
*
pTable
,
void
*
key
)
{
static
char
str
[
16
];
switch
(
pTable
->
keyType
)
{
...
...
@@ -166,28 +161,28 @@ static char *sdbGetKeyStr(SSdbTable *pTable, void *key) {
}
}
static
char
*
sdbGet
KeyStrFromObj
(
SSdbTable
*
pTable
,
void
*
key
)
{
static
char
*
sdbGet
RowStr
(
SSdbTable
*
pTable
,
void
*
key
)
{
return
sdbGetKeyStr
(
pTable
,
sdbGetObjKey
(
pTable
,
key
));
}
static
void
*
sdbGetTableFromId
(
int32_t
tableId
)
{
return
tsSdb
Obj
.
tableList
[
tableId
];
return
tsSdb
Mgmt
.
tableList
[
tableId
];
}
static
int32_t
sdbInitWal
()
{
SWalCfg
walCfg
=
{.
vgId
=
1
,
.
walLevel
=
TAOS_WAL_FSYNC
,
.
keep
=
TAOS_WAL_KEEP
,
.
fsyncPeriod
=
0
};
char
temp
[
TSDB_FILENAME_LEN
]
;
char
temp
[
TSDB_FILENAME_LEN
]
=
{
0
}
;
sprintf
(
temp
,
"%s/wal"
,
tsMnodeDir
);
tsSdb
Obj
.
wal
=
walOpen
(
temp
,
&
walCfg
);
if
(
tsSdb
Obj
.
wal
==
NULL
)
{
sdbError
(
"
failed to open sdb
wal in %s"
,
tsMnodeDir
);
tsSdb
Mgmt
.
wal
=
walOpen
(
temp
,
&
walCfg
);
if
(
tsSdb
Mgmt
.
wal
==
NULL
)
{
sdbError
(
"
vgId:1, failed to open
wal in %s"
,
tsMnodeDir
);
return
-
1
;
}
sdbInfo
(
"
open sdb
wal for restore"
);
int
code
=
walRestore
(
tsSdbObj
.
wal
,
NULL
,
sdb
Write
);
sdbInfo
(
"
vgId:1, open
wal for restore"
);
int
32_t
code
=
walRestore
(
tsSdbMgmt
.
wal
,
NULL
,
sdbProcess
Write
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
sdbError
(
"
failed to open wal for restore, reason:
%s"
,
tstrerror
(
code
));
sdbError
(
"
vgId:1, failed to open wal for restore since
%s"
,
tstrerror
(
code
));
return
-
1
;
}
return
0
;
...
...
@@ -199,31 +194,31 @@ static void sdbRestoreTables() {
for
(
int32_t
tableId
=
0
;
tableId
<
SDB_TABLE_MAX
;
++
tableId
)
{
SSdbTable
*
pTable
=
sdbGetTableFromId
(
tableId
);
if
(
pTable
==
NULL
)
continue
;
if
(
pTable
->
restoredFp
)
{
(
*
pTable
->
restoredFp
)();
if
(
pTable
->
fpRestored
)
{
(
*
pTable
->
fpRestored
)();
}
totalRows
+=
pTable
->
numOfRows
;
numOfTables
++
;
sdbDebug
(
"
table:%s, is restored, numOfRows:%"
PRId64
,
pTable
->
tableN
ame
,
pTable
->
numOfRows
);
sdbDebug
(
"
vgId:1, sdb:%s is restored, rows:%"
PRId64
,
pTable
->
n
ame
,
pTable
->
numOfRows
);
}
sdbInfo
(
"
sdb is restored, ver:%"
PRId64
" totalRows:%d numOfTables:%d"
,
tsSdbObj
.
version
,
totalRows
,
numOfTables
);
sdbInfo
(
"
vgId:1, sdb is restored, mver:%"
PRIu64
" rows:%d tables:%d"
,
tsSdbMgmt
.
version
,
totalRows
,
numOfTables
);
}
void
sdbUpdateMnodeRoles
()
{
if
(
tsSdb
Obj
.
sync
<=
0
)
return
;
if
(
tsSdb
Mgmt
.
sync
<=
0
)
return
;
SNodesRole
roles
=
{
0
};
syncGetNodesRole
(
tsSdb
Obj
.
sync
,
&
roles
);
syncGetNodesRole
(
tsSdb
Mgmt
.
sync
,
&
roles
);
sdbInfo
(
"
update mnodes sync roles, total:%d"
,
tsSdbObj
.
cfg
.
replica
);
for
(
int32_t
i
=
0
;
i
<
tsSdb
Obj
.
cfg
.
replica
;
++
i
)
{
sdbInfo
(
"
vgId:1, update mnodes role, replica:%d"
,
tsSdbMgmt
.
cfg
.
replica
);
for
(
int32_t
i
=
0
;
i
<
tsSdb
Mgmt
.
cfg
.
replica
;
++
i
)
{
SMnodeObj
*
pMnode
=
mnodeGetMnode
(
roles
.
nodeId
[
i
]);
if
(
pMnode
!=
NULL
)
{
pMnode
->
role
=
roles
.
role
[
i
];
sdbInfo
(
"
mnode:%d, role:%s"
,
pMnode
->
mnodeId
,
mnodeGetMnodeRoleStr
(
pMnode
->
role
)
);
if
(
pMnode
->
mnodeId
==
dnodeGetDnodeId
())
tsSdb
Obj
.
role
=
pMnode
->
role
;
sdbInfo
(
"
vgId:1, mnode:%d, role:%s"
,
pMnode
->
mnodeId
,
syncRole
[
pMnode
->
role
]
);
if
(
pMnode
->
mnodeId
==
dnodeGetDnodeId
())
tsSdb
Mgmt
.
role
=
pMnode
->
role
;
mnodeDecMnodeRef
(
pMnode
);
}
}
...
...
@@ -238,87 +233,73 @@ static uint32_t sdbGetFileInfo(void *ahandle, char *name, uint32_t *index, uint3
}
static
int32_t
sdbGetWalInfo
(
void
*
ahandle
,
char
*
fileName
,
int64_t
*
fileId
)
{
return
walGetWalFile
(
tsSdb
Obj
.
wal
,
fileName
,
fileId
);
return
walGetWalFile
(
tsSdb
Mgmt
.
wal
,
fileName
,
fileId
);
}
static
void
sdbNotifyRole
(
void
*
ahandle
,
int8_t
role
)
{
sdbInfo
(
"
mnode role changed from %s to %s"
,
mnodeGetMnodeRoleStr
(
tsSdbObj
.
role
),
mnodeGetMnodeRoleStr
(
role
)
);
sdbInfo
(
"
vgId:1, mnode role changed from %s to %s"
,
syncRole
[
tsSdbMgmt
.
role
],
syncRole
[
role
]
);
if
(
role
==
TAOS_SYNC_ROLE_MASTER
&&
tsSdb
Obj
.
role
!=
TAOS_SYNC_ROLE_MASTER
)
{
if
(
role
==
TAOS_SYNC_ROLE_MASTER
&&
tsSdb
Mgmt
.
role
!=
TAOS_SYNC_ROLE_MASTER
)
{
balanceReset
();
}
tsSdb
Obj
.
role
=
role
;
tsSdb
Mgmt
.
role
=
role
;
sdbUpdateMnodeRoles
();
}
FORCE_INLINE
static
void
sdbConfirmForward
(
void
*
ahandle
,
void
*
param
,
int32_t
code
)
{
assert
(
param
);
SSdbOper
*
pOper
=
param
;
SMnodeMsg
*
pMsg
=
pOper
->
pMsg
;
if
(
code
<=
0
)
pOper
->
retCode
=
code
;
int32_t
processedCount
=
atomic_add_fetch_32
(
&
pOper
->
processedCount
,
1
);
if
(
processedCount
<=
1
)
{
if
(
pMsg
!=
NULL
)
{
sdbDebug
(
"app:%p:%p, waiting for confirm this operation, count:%d result:%s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
processedCount
,
tstrerror
(
code
));
}
return
;
}
// failed to forward, need revert insert
static
void
sdbHandleFailedConfirm
(
SSdbRow
*
pRow
)
{
SWalHead
*
pHead
=
pRow
->
pHead
;
int32_t
action
=
pHead
->
msgType
%
10
;
if
(
pMsg
!=
NULL
)
{
sdbDebug
(
"app:%p:%p, is confirmed and will do callback func, result:%s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
tstrerror
(
code
));
}
sdbError
(
"vgId:1, row:%p:%s hver:%"
PRIu64
" action:%s, failed to foward since %s"
,
pRow
->
pObj
,
sdbGetKeyStr
(
pRow
->
pTable
,
pHead
->
cont
),
pHead
->
version
,
actStr
[
action
],
tstrerror
(
pRow
->
code
));
// failed to forward, need revert insert
if
(
pOper
->
retCode
!=
TSDB_CODE_SUCCESS
)
{
SWalHead
*
pHead
=
(
void
*
)
pOper
+
sizeof
(
SSdbOper
)
+
SDB_SYNC_HACK
;
int32_t
action
=
pHead
->
msgType
%
10
;
sdbError
(
"table:%s record:%p:%s ver:%"
PRIu64
", action:%d failed to foward reason:%s"
,
((
SSdbTable
*
)
pOper
->
table
)
->
tableName
,
pOper
->
pObj
,
sdbGetKeyStr
(
pOper
->
table
,
pHead
->
cont
),
pHead
->
version
,
action
,
tstrerror
(
pOper
->
retCode
));
if
(
action
==
SDB_ACTION_INSERT
)
{
// It's better to create a table in two stages, create it first and then set it success
//sdbDeleteHash(pOper->table, pOper);
SSdbOper
oper
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
table
=
pOper
->
table
,
.
pObj
=
pOper
->
pObj
};
sdbDeleteRow
(
&
oper
);
}
if
(
action
==
SDB_ACTION_INSERT
)
{
SSdbRow
row
=
{.
type
=
SDB_OPER_GLOBAL
,
.
pTable
=
pRow
->
pTable
,
.
pObj
=
pRow
->
pObj
};
sdbDeleteRow
(
&
row
);
}
}
if
(
pOper
->
writeCb
!=
NULL
)
{
pOper
->
retCode
=
(
*
pOper
->
writeCb
)(
pMsg
,
pOper
->
retCode
);
FORCE_INLINE
static
void
sdbConfirmForward
(
void
*
ahandle
,
void
*
wparam
,
int32_t
code
)
{
if
(
wparam
==
NULL
)
return
;
SSdbRow
*
pRow
=
wparam
;
SMnodeMsg
*
pMsg
=
pRow
->
pMsg
;
if
(
code
<=
0
)
pRow
->
code
=
code
;
int32_t
count
=
atomic_add_fetch_32
(
&
pRow
->
processedCount
,
1
);
if
(
count
<=
1
)
{
if
(
pMsg
!=
NULL
)
sdbTrace
(
"vgId:1, msg:%p waiting for confirm, count:%d code:%x"
,
pMsg
,
count
,
code
);
return
;
}
else
{
if
(
pMsg
!=
NULL
)
sdbTrace
(
"vgId:1, msg:%p is confirmed, code:%x"
,
pMsg
,
code
);
}
dnodeSendRpcMWriteRsp
(
pMsg
,
pOper
->
retCode
);
// if ahandle, means this func is called by sdb write
if
(
ahandle
==
NULL
)
{
sdbDecRef
(
pOper
->
table
,
pOper
->
pObj
);
if
(
pRow
->
code
!=
TSDB_CODE_SUCCESS
)
sdbHandleFailedConfirm
(
pRow
);
if
(
pRow
->
fpRsp
!=
NULL
)
{
pRow
->
code
=
(
*
pRow
->
fpRsp
)(
pMsg
,
pRow
->
code
);
}
taosFreeQitem
(
pOper
);
dnodeSendRpcMWriteRsp
(
pMsg
,
pRow
->
code
);
}
static
void
sdbUpdateSyncTmrFp
(
void
*
param
,
void
*
tmrId
)
{
sdbUpdateSync
(
NULL
);
}
void
sdbUpdateAsync
()
{
taosTmrReset
(
sdbUpdateSyncTmrFp
,
200
,
NULL
,
tsMnodeTmr
,
&
ts
UpdateSync
Tmr
);
taosTmrReset
(
sdbUpdateSyncTmrFp
,
200
,
NULL
,
tsMnodeTmr
,
&
ts
Sdb
Tmr
);
}
void
sdbUpdateSync
(
void
*
pMnodes
)
{
SMnodeInfos
*
mnodes
=
pMnodes
;
if
(
!
mnodeIsRunning
())
{
mDebug
(
"mnode not start yet, update sync config later"
);
mDebug
(
"
vgId:1,
mnode not start yet, update sync config later"
);
return
;
}
mDebug
(
"update sync config in sync module, mnodes:%p"
,
pMnodes
);
mDebug
(
"
vgId:1,
update sync config in sync module, mnodes:%p"
,
pMnodes
);
SSyncCfg
syncCfg
=
{
0
};
int32_t
index
=
0
;
...
...
@@ -344,7 +325,7 @@ void sdbUpdateSync(void *pMnodes) {
}
sdbFreeIter
(
pIter
);
syncCfg
.
replica
=
index
;
mDebug
(
"mnodes info not input, use infos in sdb, numOfMnodes:%d"
,
syncCfg
.
replica
);
mDebug
(
"
vgId:1,
mnodes info not input, use infos in sdb, numOfMnodes:%d"
,
syncCfg
.
replica
);
}
else
{
for
(
index
=
0
;
index
<
mnodes
->
mnodeNum
;
++
index
)
{
SMnodeInfo
*
node
=
&
mnodes
->
mnodeInfos
[
index
];
...
...
@@ -353,7 +334,7 @@ void sdbUpdateSync(void *pMnodes) {
syncCfg
.
nodeInfo
[
index
].
nodePort
+=
TSDB_PORT_SYNC
;
}
syncCfg
.
replica
=
index
;
mDebug
(
"mnodes info input, numOfMnodes:%d"
,
syncCfg
.
replica
);
mDebug
(
"
vgId:1,
mnodes info input, numOfMnodes:%d"
,
syncCfg
.
replica
);
}
syncCfg
.
quorum
=
(
syncCfg
.
replica
==
1
)
?
1
:
2
;
...
...
@@ -367,18 +348,19 @@ void sdbUpdateSync(void *pMnodes) {
}
if
(
!
hasThisDnode
)
{
sdbDebug
(
"update sync config, this dnode not exist"
);
sdbDebug
(
"
vgId:1,
update sync config, this dnode not exist"
);
return
;
}
if
(
memcmp
(
&
syncCfg
,
&
tsSdb
Obj
.
cfg
,
sizeof
(
SSyncCfg
))
==
0
)
{
sdbDebug
(
"update sync config, info not changed"
);
if
(
memcmp
(
&
syncCfg
,
&
tsSdb
Mgmt
.
cfg
,
sizeof
(
SSyncCfg
))
==
0
)
{
sdbDebug
(
"
vgId:1,
update sync config, info not changed"
);
return
;
}
sdbInfo
(
"work as mnode, replica:%d"
,
syncCfg
.
replica
);
sdbInfo
(
"
vgId:1,
work as mnode, replica:%d"
,
syncCfg
.
replica
);
for
(
int32_t
i
=
0
;
i
<
syncCfg
.
replica
;
++
i
)
{
sdbInfo
(
"mnode:%d, %s:%d"
,
syncCfg
.
nodeInfo
[
i
].
nodeId
,
syncCfg
.
nodeInfo
[
i
].
nodeFqdn
,
syncCfg
.
nodeInfo
[
i
].
nodePort
);
sdbInfo
(
"vgId:1, mnode:%d, %s:%d"
,
syncCfg
.
nodeInfo
[
i
].
nodeId
,
syncCfg
.
nodeInfo
[
i
].
nodeFqdn
,
syncCfg
.
nodeInfo
[
i
].
nodePort
);
}
SSyncInfo
syncInfo
=
{
0
};
...
...
@@ -389,23 +371,24 @@ void sdbUpdateSync(void *pMnodes) {
syncInfo
.
ahandle
=
NULL
;
syncInfo
.
getWalInfo
=
sdbGetWalInfo
;
syncInfo
.
getFileInfo
=
sdbGetFileInfo
;
syncInfo
.
writeToCache
=
sdbWriteToQueue
;
syncInfo
.
writeToCache
=
sdbWrite
Wal
ToQueue
;
syncInfo
.
confirmForward
=
sdbConfirmForward
;
syncInfo
.
notifyRole
=
sdbNotifyRole
;
tsSdb
Obj
.
cfg
=
syncCfg
;
tsSdb
Mgmt
.
cfg
=
syncCfg
;
if
(
tsSdb
Obj
.
sync
)
{
syncReconfig
(
tsSdb
Obj
.
sync
,
&
syncCfg
);
if
(
tsSdb
Mgmt
.
sync
)
{
syncReconfig
(
tsSdb
Mgmt
.
sync
,
&
syncCfg
);
}
else
{
tsSdb
Obj
.
sync
=
syncStart
(
&
syncInfo
);
tsSdb
Mgmt
.
sync
=
syncStart
(
&
syncInfo
);
}
sdbUpdateMnodeRoles
();
}
int32_t
sdbInit
()
{
pthread_mutex_init
(
&
tsSdb
Obj
.
mutex
,
NULL
);
pthread_mutex_init
(
&
tsSdb
Mgmt
.
mutex
,
NULL
);
if
(
sdbInitW
riteW
orker
()
!=
0
)
{
if
(
sdbInitWorker
()
!=
0
)
{
return
-
1
;
}
...
...
@@ -416,56 +399,56 @@ int32_t sdbInit() {
sdbRestoreTables
();
if
(
mnodeGetMnodesNum
()
==
1
)
{
tsSdb
Obj
.
role
=
TAOS_SYNC_ROLE_MASTER
;
tsSdb
Mgmt
.
role
=
TAOS_SYNC_ROLE_MASTER
;
}
tsSdb
Obj
.
status
=
SDB_STATUS_SERVING
;
tsSdb
Mgmt
.
status
=
SDB_STATUS_SERVING
;
return
TSDB_CODE_SUCCESS
;
}
void
sdbCleanUp
()
{
if
(
tsSdb
Obj
.
status
!=
SDB_STATUS_SERVING
)
return
;
if
(
tsSdb
Mgmt
.
status
!=
SDB_STATUS_SERVING
)
return
;
tsSdb
Obj
.
status
=
SDB_STATUS_CLOSING
;
tsSdb
Mgmt
.
status
=
SDB_STATUS_CLOSING
;
sdbCleanupW
riteW
orker
();
sdbDebug
(
"
sdb will be closed, ver:%"
PRId64
,
tsSdbObj
.
version
);
sdbCleanupWorker
();
sdbDebug
(
"
vgId:1, sdb will be closed, mver:%"
PRIu64
,
tsSdbMgmt
.
version
);
if
(
tsSdb
Obj
.
sync
)
{
syncStop
(
tsSdb
Obj
.
sync
);
tsSdb
Obj
.
sync
=
-
1
;
if
(
tsSdb
Mgmt
.
sync
)
{
syncStop
(
tsSdb
Mgmt
.
sync
);
tsSdb
Mgmt
.
sync
=
-
1
;
}
if
(
tsSdb
Obj
.
wal
)
{
walClose
(
tsSdb
Obj
.
wal
);
tsSdb
Obj
.
wal
=
NULL
;
if
(
tsSdb
Mgmt
.
wal
)
{
walClose
(
tsSdb
Mgmt
.
wal
);
tsSdb
Mgmt
.
wal
=
NULL
;
}
pthread_mutex_destroy
(
&
tsSdb
Obj
.
mutex
);
pthread_mutex_destroy
(
&
tsSdb
Mgmt
.
mutex
);
}
void
sdbIncRef
(
void
*
handle
,
void
*
pObj
)
{
if
(
p
Obj
==
NULL
||
handle
==
NULL
)
return
;
void
sdbIncRef
(
void
*
tparam
,
void
*
pRow
)
{
if
(
p
Row
==
NULL
||
tparam
==
NULL
)
return
;
SSdbTable
*
pTable
=
handle
;
int32_t
*
pRefCount
=
(
int32_t
*
)(
p
Obj
+
pTable
->
refCountPos
);
SSdbTable
*
pTable
=
tparam
;
int32_t
*
pRefCount
=
(
int32_t
*
)(
p
Row
+
pTable
->
refCountPos
);
int32_t
refCount
=
atomic_add_fetch_32
(
pRefCount
,
1
);
sdbTrace
(
"
add ref to table:%s record:%p:%s:%d"
,
pTable
->
tableName
,
pObj
,
sdbGetKeyStrFromObj
(
pTable
,
pObj
),
refCount
);
sdbTrace
(
"
vgId:1, sdb:%s, inc ref to row:%p:%s:%d"
,
pTable
->
name
,
pRow
,
sdbGetRowStr
(
pTable
,
pRow
),
refCount
);
}
void
sdbDecRef
(
void
*
handle
,
void
*
pObj
)
{
if
(
p
Obj
==
NULL
||
handle
==
NULL
)
return
;
void
sdbDecRef
(
void
*
tparam
,
void
*
pRow
)
{
if
(
p
Row
==
NULL
||
tparam
==
NULL
)
return
;
SSdbTable
*
pTable
=
handle
;
int32_t
*
pRefCount
=
(
int32_t
*
)(
p
Obj
+
pTable
->
refCountPos
);
SSdbTable
*
pTable
=
tparam
;
int32_t
*
pRefCount
=
(
int32_t
*
)(
p
Row
+
pTable
->
refCountPos
);
int32_t
refCount
=
atomic_sub_fetch_32
(
pRefCount
,
1
);
sdbTrace
(
"
def ref of table:%s record:%p:%s:%d"
,
pTable
->
tableName
,
pObj
,
sdbGetKeyStrFromObj
(
pTable
,
pObj
),
refCount
);
sdbTrace
(
"
vgId:1, sdb:%s, dec ref to row:%p:%s:%d"
,
pTable
->
name
,
pRow
,
sdbGetRowStr
(
pTable
,
pRow
),
refCount
);
int32_t
*
updateEnd
=
p
Obj
+
pTable
->
refCountPos
-
4
;
int32_t
*
updateEnd
=
p
Row
+
pTable
->
refCountPos
-
4
;
if
(
refCount
<=
0
&&
*
updateEnd
)
{
sdbTrace
(
"
table:%s, record:%p:%s:%d is destroyed"
,
pTable
->
tableName
,
pObj
,
sdbGetKeyStrFromObj
(
pTable
,
pObj
),
refCount
);
SSdb
Oper
oper
=
{.
pObj
=
pObj
};
(
*
pTable
->
destroyFp
)(
&
oper
);
sdbTrace
(
"
vgId:1, sdb:%s, row:%p:%s:%d destroyed"
,
pTable
->
name
,
pRow
,
sdbGetRowStr
(
pTable
,
pRow
),
refCount
);
SSdb
Row
row
=
{.
pObj
=
pRow
};
(
*
pTable
->
fpDestroy
)(
&
row
);
}
}
...
...
@@ -487,12 +470,12 @@ static void *sdbGetRowMetaFromObj(SSdbTable *pTable, void *key) {
return
sdbGetRowMeta
(
pTable
,
sdbGetObjKey
(
pTable
,
key
));
}
void
*
sdbGetRow
(
void
*
handle
,
void
*
key
)
{
SSdbTable
*
pTable
=
handle
;
void
*
sdbGetRow
(
void
*
tparam
,
void
*
key
)
{
SSdbTable
*
pTable
=
tparam
;
pthread_mutex_lock
(
&
pTable
->
mutex
);
void
*
pRow
=
sdbGetRowMeta
(
hand
le
,
key
);
if
(
pRow
)
sdbIncRef
(
hand
le
,
pRow
);
void
*
pRow
=
sdbGetRowMeta
(
pTab
le
,
key
);
if
(
pRow
)
sdbIncRef
(
pTab
le
,
pRow
);
pthread_mutex_unlock
(
&
pTable
->
mutex
);
return
pRow
;
...
...
@@ -502,8 +485,8 @@ static void *sdbGetRowFromObj(SSdbTable *pTable, void *key) {
return
sdbGetRow
(
pTable
,
sdbGetObjKey
(
pTable
,
key
));
}
static
int32_t
sdbInsertHash
(
SSdbTable
*
pTable
,
SSdb
Oper
*
pOper
)
{
void
*
key
=
sdbGetObjKey
(
pTable
,
p
Oper
->
pObj
);
static
int32_t
sdbInsertHash
(
SSdbTable
*
pTable
,
SSdb
Row
*
pRow
)
{
void
*
key
=
sdbGetObjKey
(
pTable
,
p
Row
->
pObj
);
int32_t
keySize
=
sizeof
(
int32_t
);
if
(
pTable
->
keyType
==
SDB_KEY_STRING
||
pTable
->
keyType
==
SDB_KEY_VAR_STRING
)
{
...
...
@@ -511,43 +494,43 @@ static int32_t sdbInsertHash(SSdbTable *pTable, SSdbOper *pOper) {
}
pthread_mutex_lock
(
&
pTable
->
mutex
);
taosHashPut
(
pTable
->
iHandle
,
key
,
keySize
,
&
p
Oper
->
pObj
,
sizeof
(
int64_t
));
taosHashPut
(
pTable
->
iHandle
,
key
,
keySize
,
&
p
Row
->
pObj
,
sizeof
(
int64_t
));
pthread_mutex_unlock
(
&
pTable
->
mutex
);
sdbIncRef
(
pTable
,
p
Oper
->
pObj
);
sdbIncRef
(
pTable
,
p
Row
->
pObj
);
atomic_add_fetch_32
(
&
pTable
->
numOfRows
,
1
);
if
(
pTable
->
keyType
==
SDB_KEY_AUTO
)
{
pTable
->
autoIndex
=
MAX
(
pTable
->
autoIndex
,
*
((
uint32_t
*
)
p
Oper
->
pObj
));
pTable
->
autoIndex
=
MAX
(
pTable
->
autoIndex
,
*
((
uint32_t
*
)
p
Row
->
pObj
));
}
else
{
atomic_add_fetch_32
(
&
pTable
->
autoIndex
,
1
);
}
sdbDebug
(
"
table:%s, insert record:%s to hash, rowSize:%d numOfRows:%"
PRId64
", msg:%p"
,
pTable
->
tableN
ame
,
sdbGet
KeyStrFromObj
(
pTable
,
pOper
->
pObj
),
pOper
->
rowSize
,
pTable
->
numOfRows
,
pOper
->
pMsg
);
sdbDebug
(
"
vgId:1, sdb:%s, insert key:%s to hash, rowSize:%d rows:%"
PRId64
", msg:%p"
,
pTable
->
n
ame
,
sdbGet
RowStr
(
pTable
,
pRow
->
pObj
),
pRow
->
rowSize
,
pTable
->
numOfRows
,
pRow
->
pMsg
);
int32_t
code
=
(
*
pTable
->
insertFp
)(
pOper
);
int32_t
code
=
(
*
pTable
->
fpInsert
)(
pRow
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
sdbError
(
"
table:%s, failed to insert record:%s to hash, remove it"
,
pTable
->
tableN
ame
,
sdbGet
KeyStrFromObj
(
pTable
,
pOper
->
pObj
));
sdbDeleteHash
(
pTable
,
p
Oper
);
sdbError
(
"
vgId:1, sdb:%s, failed to insert key:%s to hash, remove it"
,
pTable
->
n
ame
,
sdbGet
RowStr
(
pTable
,
pRow
->
pObj
));
sdbDeleteHash
(
pTable
,
p
Row
);
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
sdbDeleteHash
(
SSdbTable
*
pTable
,
SSdb
Oper
*
pOper
)
{
int32_t
*
updateEnd
=
p
Oper
->
pObj
+
pTable
->
refCountPos
-
4
;
static
int32_t
sdbDeleteHash
(
SSdbTable
*
pTable
,
SSdb
Row
*
pRow
)
{
int32_t
*
updateEnd
=
p
Row
->
pObj
+
pTable
->
refCountPos
-
4
;
bool
set
=
atomic_val_compare_exchange_32
(
updateEnd
,
0
,
1
)
==
0
;
if
(
!
set
)
{
sdbError
(
"
table:%s, failed to delete record:%s from hash, for it already removed"
,
pTable
->
tableN
ame
,
sdbGet
KeyStrFromObj
(
pTable
,
pOper
->
pObj
));
sdbError
(
"
vgId:1, sdb:%s, failed to delete key:%s from hash, for it already removed"
,
pTable
->
n
ame
,
sdbGet
RowStr
(
pTable
,
pRow
->
pObj
));
return
TSDB_CODE_MND_SDB_OBJ_NOT_THERE
;
}
(
*
pTable
->
deleteFp
)(
pOper
);
(
*
pTable
->
fpDelete
)(
pRow
);
void
*
key
=
sdbGetObjKey
(
pTable
,
p
Oper
->
pObj
);
void
*
key
=
sdbGetObjKey
(
pTable
,
p
Row
->
pObj
);
int32_t
keySize
=
sizeof
(
int32_t
);
if
(
pTable
->
keyType
==
SDB_KEY_STRING
||
pTable
->
keyType
==
SDB_KEY_VAR_STRING
)
{
keySize
=
strlen
((
char
*
)
key
);
...
...
@@ -559,309 +542,220 @@ static int32_t sdbDeleteHash(SSdbTable *pTable, SSdbOper *pOper) {
atomic_sub_fetch_32
(
&
pTable
->
numOfRows
,
1
);
sdbDebug
(
"
table:%s, delete record:%s from hash, numOfRows:%"
PRId64
", msg:%p"
,
pTable
->
tableN
ame
,
sdbGet
KeyStrFromObj
(
pTable
,
pOper
->
pObj
),
pTable
->
numOfRows
,
pOper
->
pMsg
);
sdbDebug
(
"
vgId:1, sdb:%s, delete key:%s from hash, numOfRows:%"
PRId64
", msg:%p"
,
pTable
->
n
ame
,
sdbGet
RowStr
(
pTable
,
pRow
->
pObj
),
pTable
->
numOfRows
,
pRow
->
pMsg
);
sdbDecRef
(
pTable
,
p
Oper
->
pObj
);
sdbDecRef
(
pTable
,
p
Row
->
pObj
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
sdbUpdateHash
(
SSdbTable
*
pTable
,
SSdb
Oper
*
pOper
)
{
sdbDebug
(
"
table:%s, update record:%s in hash, numOfRows:%"
PRId64
", msg:%p"
,
pTable
->
tableN
ame
,
sdbGet
KeyStrFromObj
(
pTable
,
pOper
->
pObj
),
pTable
->
numOfRows
,
pOper
->
pMsg
);
static
int32_t
sdbUpdateHash
(
SSdbTable
*
pTable
,
SSdb
Row
*
pRow
)
{
sdbDebug
(
"
vgId:1, sdb:%s, update key:%s in hash, numOfRows:%"
PRId64
", msg:%p"
,
pTable
->
n
ame
,
sdbGet
RowStr
(
pTable
,
pRow
->
pObj
),
pTable
->
numOfRows
,
pRow
->
pMsg
);
(
*
pTable
->
updateFp
)(
pOper
);
(
*
pTable
->
fpUpdate
)(
pRow
);
return
TSDB_CODE_SUCCESS
;
}
static
int
sdb
Write
(
void
*
param
,
void
*
data
,
int32_t
type
,
void
*
pMsg
)
{
SSdb
Oper
*
pOper
=
param
;
SWalHead
*
pHead
=
data
;
static
int
sdb
ProcessWrite
(
void
*
wparam
,
void
*
hparam
,
int32_t
qtype
,
void
*
unused
)
{
SSdb
Row
*
pRow
=
w
param
;
SWalHead
*
pHead
=
hparam
;
int32_t
tableId
=
pHead
->
msgType
/
10
;
int32_t
action
=
pHead
->
msgType
%
10
;
SSdbTable
*
pTable
=
sdbGetTableFromId
(
tableId
);
assert
(
pTable
!=
NULL
);
pthread_mutex_lock
(
&
tsSdb
Obj
.
mutex
);
pthread_mutex_lock
(
&
tsSdb
Mgmt
.
mutex
);
if
(
pHead
->
version
==
0
)
{
// assign version
tsSdb
Obj
.
version
++
;
pHead
->
version
=
tsSdb
Obj
.
version
;
tsSdb
Mgmt
.
version
++
;
pHead
->
version
=
tsSdb
Mgmt
.
version
;
}
else
{
// for data from WAL or forward, version may be smaller
if
(
pHead
->
version
<=
tsSdb
Obj
.
version
)
{
pthread_mutex_unlock
(
&
tsSdb
Obj
.
mutex
);
sdbDebug
(
"
table:%s, failed to restore %s record:%s from source(%d), ver:%"
PRId64
" too large, sdb ver:%"
PRId
64
,
pTable
->
tableName
,
sdbGetActionStr
(
action
),
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
type
,
pHead
->
version
,
tsSdbObj
.
version
);
if
(
pHead
->
version
<=
tsSdb
Mgmt
.
version
)
{
pthread_mutex_unlock
(
&
tsSdb
Mgmt
.
mutex
);
sdbDebug
(
"
vgId:1, sdb:%s, failed to restore %s key:%s from source(%d), hver:%"
PRIu64
" too large, mver:%"
PRIu
64
,
pTable
->
name
,
actStr
[
action
],
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
qtype
,
pHead
->
version
,
tsSdbMgmt
.
version
);
return
TSDB_CODE_SUCCESS
;
}
else
if
(
pHead
->
version
!=
tsSdb
Obj
.
version
+
1
)
{
pthread_mutex_unlock
(
&
tsSdb
Obj
.
mutex
);
sdbError
(
"
table:%s, failed to restore %s record:%s from source(%d), ver:%"
PRId64
" too large, sdb ver:%"
PRId
64
,
pTable
->
tableName
,
sdbGetActionStr
(
action
),
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
type
,
pHead
->
version
,
tsSdbObj
.
version
);
}
else
if
(
pHead
->
version
!=
tsSdb
Mgmt
.
version
+
1
)
{
pthread_mutex_unlock
(
&
tsSdb
Mgmt
.
mutex
);
sdbError
(
"
vgId:1, sdb:%s, failed to restore %s key:%s from source(%d), hver:%"
PRIu64
" too large, mver:%"
PRIu
64
,
pTable
->
name
,
actStr
[
action
],
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
qtype
,
pHead
->
version
,
tsSdbMgmt
.
version
);
return
TSDB_CODE_SYN_INVALID_VERSION
;
}
else
{
tsSdb
Obj
.
version
=
pHead
->
version
;
tsSdb
Mgmt
.
version
=
pHead
->
version
;
}
}
int32_t
code
=
walWrite
(
tsSdb
Obj
.
wal
,
pHead
);
int32_t
code
=
walWrite
(
tsSdb
Mgmt
.
wal
,
pHead
);
if
(
code
<
0
)
{
pthread_mutex_unlock
(
&
tsSdb
Obj
.
mutex
);
pthread_mutex_unlock
(
&
tsSdb
Mgmt
.
mutex
);
return
code
;
}
pthread_mutex_unlock
(
&
tsSdb
Obj
.
mutex
);
pthread_mutex_unlock
(
&
tsSdb
Mgmt
.
mutex
);
// from app,
oper
is created
if
(
p
Oper
!=
NULL
)
{
// from app,
row
is created
if
(
p
Row
!=
NULL
)
{
// forward to peers
p
Oper
->
processedCount
=
0
;
int32_t
syncCode
=
syncForwardToPeer
(
tsSdb
Obj
.
sync
,
pHead
,
pOper
,
TAOS_QTYPE_RPC
);
if
(
syncCode
<=
0
)
p
Oper
->
processedCount
=
1
;
p
Row
->
processedCount
=
0
;
int32_t
syncCode
=
syncForwardToPeer
(
tsSdb
Mgmt
.
sync
,
pHead
,
pRow
,
TAOS_QTYPE_RPC
);
if
(
syncCode
<=
0
)
p
Row
->
processedCount
=
1
;
if
(
syncCode
<
0
)
{
sdbError
(
"
table:%s, failed to forward request, result:%s action:%s record:%s ver:%"
PRId64
", msg:%p"
,
pTable
->
tableN
ame
,
tstrerror
(
syncCode
),
sdbGetActionStr
(
action
),
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
pHead
->
version
,
pOper
->
pMsg
);
sdbError
(
"
vgId:1, sdb:%s, failed to forward req since %s action:%s key:%s hver:%"
PRIu64
", msg:%p"
,
pTable
->
n
ame
,
tstrerror
(
syncCode
),
actStr
[
action
],
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
pHead
->
version
,
pRow
->
pMsg
);
}
else
if
(
syncCode
>
0
)
{
sdbDebug
(
"
table:%s, forward request is sent, action:%s record:%s ver:%"
PRId64
", msg:%p"
,
pTable
->
tableN
ame
,
sdbGetActionStr
(
action
),
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
pHead
->
version
,
pOper
->
pMsg
);
sdbDebug
(
"
vgId:1, sdb:%s, forward req is sent, action:%s key:%s hver:%"
PRIu64
", msg:%p"
,
pTable
->
n
ame
,
actStr
[
action
],
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
pHead
->
version
,
pRow
->
pMsg
);
}
else
{
sdbTrace
(
"
table:%s, no need to send fwd request, action:%s record:%s ver:%"
PRId64
", msg:%p"
,
pTable
->
tableN
ame
,
sdbGetActionStr
(
action
),
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
pHead
->
version
,
pOper
->
pMsg
);
sdbTrace
(
"
vgId:1, sdb:%s, no need to send fwd req, action:%s key:%s hver:%"
PRIu64
", msg:%p"
,
pTable
->
n
ame
,
actStr
[
action
],
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
pHead
->
version
,
pRow
->
pMsg
);
}
return
syncCode
;
}
sdbDebug
(
"
table:%s, record from wal/fwd is disposed, action:%s record:%s ver:%"
PRId64
,
pTable
->
tableN
ame
,
sdbGetActionStr
(
action
)
,
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
pHead
->
version
);
sdbDebug
(
"
vgId:1, sdb:%s, record from wal/fwd is disposed, action:%s key:%s hver:%"
PRIu64
,
pTable
->
n
ame
,
actStr
[
action
]
,
sdbGetKeyStr
(
pTable
,
pHead
->
cont
),
pHead
->
version
);
// even it is WAL/FWD, it shall be called to update version in sync
syncForwardToPeer
(
tsSdb
Obj
.
sync
,
pHead
,
pOper
,
TAOS_QTYPE_RPC
);
syncForwardToPeer
(
tsSdb
Mgmt
.
sync
,
pHead
,
pRow
,
TAOS_QTYPE_RPC
);
// from wal or forward msg,
oper
not created, should add into hash
// from wal or forward msg,
row
not created, should add into hash
if
(
action
==
SDB_ACTION_INSERT
)
{
SSdb
Oper
oper
=
{.
rowSize
=
pHead
->
len
,
.
rowData
=
pHead
->
cont
,
.
t
able
=
pTable
};
code
=
(
*
pTable
->
decodeFp
)(
&
oper
);
return
sdbInsertHash
(
pTable
,
&
oper
);
SSdb
Row
row
=
{.
rowSize
=
pHead
->
len
,
.
rowData
=
pHead
->
cont
,
.
pT
able
=
pTable
};
code
=
(
*
pTable
->
fpDecode
)(
&
row
);
return
sdbInsertHash
(
pTable
,
&
row
);
}
else
if
(
action
==
SDB_ACTION_DELETE
)
{
void
*
p
Row
=
sdbGetRowMeta
(
pTable
,
pHead
->
cont
);
if
(
p
Row
==
NULL
)
{
sdbDebug
(
"
table:%s, object:%s not exist in hash, ignore delete action"
,
pTable
->
tableN
ame
,
void
*
p
Obj
=
sdbGetRowMeta
(
pTable
,
pHead
->
cont
);
if
(
p
Obj
==
NULL
)
{
sdbDebug
(
"
vgId:1, sdb:%s, object:%s not exist in hash, ignore delete action"
,
pTable
->
n
ame
,
sdbGetKeyStr
(
pTable
,
pHead
->
cont
));
return
TSDB_CODE_SUCCESS
;
}
SSdb
Oper
oper
=
{.
table
=
pTable
,
.
pObj
=
pRow
};
return
sdbDeleteHash
(
pTable
,
&
oper
);
SSdb
Row
row
=
{.
pTable
=
pTable
,
.
pObj
=
pObj
};
return
sdbDeleteHash
(
pTable
,
&
row
);
}
else
if
(
action
==
SDB_ACTION_UPDATE
)
{
void
*
p
Row
=
sdbGetRowMeta
(
pTable
,
pHead
->
cont
);
if
(
p
Row
==
NULL
)
{
sdbDebug
(
"
table:%s, object:%s not exist in hash, ignore update action"
,
pTable
->
tableN
ame
,
void
*
p
Obj
=
sdbGetRowMeta
(
pTable
,
pHead
->
cont
);
if
(
p
Obj
==
NULL
)
{
sdbDebug
(
"
vgId:1, sdb:%s, object:%s not exist in hash, ignore update action"
,
pTable
->
n
ame
,
sdbGetKeyStr
(
pTable
,
pHead
->
cont
));
return
TSDB_CODE_SUCCESS
;
}
SSdb
Oper
oper
=
{.
rowSize
=
pHead
->
len
,
.
rowData
=
pHead
->
cont
,
.
t
able
=
pTable
};
code
=
(
*
pTable
->
decodeFp
)(
&
oper
);
return
sdbUpdateHash
(
pTable
,
&
oper
);
SSdb
Row
row
=
{.
rowSize
=
pHead
->
len
,
.
rowData
=
pHead
->
cont
,
.
pT
able
=
pTable
};
code
=
(
*
pTable
->
fpDecode
)(
&
row
);
return
sdbUpdateHash
(
pTable
,
&
row
);
}
else
{
return
TSDB_CODE_MND_INVALID_MSG_TYPE
;
}
}
int32_t
sdbInsertRow
(
SSdb
Oper
*
pOper
)
{
SSdbTable
*
pTable
=
(
SSdbTable
*
)
pOper
->
t
able
;
int32_t
sdbInsertRow
(
SSdb
Row
*
pRow
)
{
SSdbTable
*
pTable
=
pRow
->
pT
able
;
if
(
pTable
==
NULL
)
return
TSDB_CODE_MND_SDB_INVALID_TABLE_TYPE
;
if
(
sdbGetRowFromObj
(
pTable
,
pOper
->
pObj
))
{
sdbError
(
"table:%s, failed to insert record:%s, already exist"
,
pTable
->
tableName
,
sdbGetKeyStrFromObj
(
pTable
,
pOper
->
pObj
));
sdbDecRef
(
pTable
,
pOper
->
pObj
);
if
(
sdbGetRowFromObj
(
pTable
,
pRow
->
pObj
))
{
sdbError
(
"vgId:1, sdb:%s, failed to insert:%s since it exist"
,
pTable
->
name
,
sdbGetRowStr
(
pTable
,
pRow
->
pObj
));
sdbDecRef
(
pTable
,
pRow
->
pObj
);
return
TSDB_CODE_MND_SDB_OBJ_ALREADY_THERE
;
}
if
(
pTable
->
keyType
==
SDB_KEY_AUTO
)
{
*
((
uint32_t
*
)
p
Oper
->
pObj
)
=
atomic_add_fetch_32
(
&
pTable
->
autoIndex
,
1
);
*
((
uint32_t
*
)
p
Row
->
pObj
)
=
atomic_add_fetch_32
(
&
pTable
->
autoIndex
,
1
);
// let vgId increase from 2
if
(
pTable
->
autoIndex
==
1
&&
strcmp
(
pTable
->
tableName
,
"vgroups"
)
==
0
)
{
*
((
uint32_t
*
)
p
Oper
->
pObj
)
=
atomic_add_fetch_32
(
&
pTable
->
autoIndex
,
1
);
if
(
pTable
->
autoIndex
==
1
&&
pTable
->
id
==
SDB_TABLE_VGROUP
)
{
*
((
uint32_t
*
)
p
Row
->
pObj
)
=
atomic_add_fetch_32
(
&
pTable
->
autoIndex
,
1
);
}
}
int32_t
code
=
sdbInsertHash
(
pTable
,
p
Oper
);
int32_t
code
=
sdbInsertHash
(
pTable
,
p
Row
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
sdbError
(
"
table:%s, failed to insert into hash"
,
pTable
->
tableName
);
sdbError
(
"
vgId:1, sdb:%s, failed to insert:%s into hash"
,
pTable
->
name
,
sdbGetRowStr
(
pTable
,
pRow
->
pObj
)
);
return
code
;
}
// just insert data into memory
if
(
p
Oper
->
type
!=
SDB_OPER_GLOBAL
)
{
if
(
p
Row
->
type
!=
SDB_OPER_GLOBAL
)
{
return
TSDB_CODE_SUCCESS
;
}
if
(
p
Oper
->
reqFp
)
{
return
(
*
p
Oper
->
reqFp
)(
pOper
->
pMsg
);
if
(
p
Row
->
fpReq
)
{
return
(
*
p
Row
->
fpReq
)(
pRow
->
pMsg
);
}
else
{
return
sdb
InsertRowImp
(
pOper
);
return
sdb
WriteRowToQueue
(
pRow
,
SDB_ACTION_INSERT
);
}
}
int32_t
sdbInsertRowImp
(
SSdbOper
*
pOper
)
{
SSdbTable
*
pTable
=
(
SSdbTable
*
)
pOper
->
table
;
if
(
pTable
==
NULL
)
return
TSDB_CODE_MND_SDB_INVALID_TABLE_TYPE
;
int32_t
size
=
sizeof
(
SSdbOper
)
+
sizeof
(
SWalHead
)
+
pTable
->
maxRowSize
+
SDB_SYNC_HACK
;
SSdbOper
*
pNewOper
=
taosAllocateQitem
(
size
);
SWalHead
*
pHead
=
(
void
*
)
pNewOper
+
sizeof
(
SSdbOper
)
+
SDB_SYNC_HACK
;
pHead
->
version
=
0
;
pHead
->
len
=
pOper
->
rowSize
;
pHead
->
msgType
=
pTable
->
tableId
*
10
+
SDB_ACTION_INSERT
;
pOper
->
rowData
=
pHead
->
cont
;
(
*
pTable
->
encodeFp
)(
pOper
);
pHead
->
len
=
pOper
->
rowSize
;
memcpy
(
pNewOper
,
pOper
,
sizeof
(
SSdbOper
));
if
(
pNewOper
->
pMsg
!=
NULL
)
{
sdbDebug
(
"app:%p:%p, table:%s record:%p:%s, insert action is add to sdb queue"
,
pNewOper
->
pMsg
->
rpcMsg
.
ahandle
,
pNewOper
->
pMsg
,
pTable
->
tableName
,
pOper
->
pObj
,
sdbGetKeyStrFromObj
(
pTable
,
pOper
->
pObj
));
}
sdbIncRef
(
pNewOper
->
table
,
pNewOper
->
pObj
);
taosWriteQitem
(
tsSdbWriteQueue
,
TAOS_QTYPE_RPC
,
pNewOper
);
return
TSDB_CODE_MND_ACTION_IN_PROGRESS
;
}
bool
sdbCheckRowDeleted
(
void
*
pTableInput
,
void
*
pRow
)
{
SSdbTable
*
pTable
=
pTableInput
;
bool
sdbCheckRowDeleted
(
void
*
tparam
,
void
*
pRow
)
{
SSdbTable
*
pTable
=
tparam
;
if
(
pTable
==
NULL
)
return
false
;
int32_t
*
updateEnd
=
pRow
+
pTable
->
refCountPos
-
4
;
return
atomic_val_compare_exchange_32
(
updateEnd
,
1
,
1
)
==
1
;
}
int32_t
sdbDeleteRow
(
SSdb
Oper
*
pOper
)
{
SSdbTable
*
pTable
=
(
SSdbTable
*
)
pOper
->
t
able
;
int32_t
sdbDeleteRow
(
SSdb
Row
*
pRow
)
{
SSdbTable
*
pTable
=
pRow
->
pT
able
;
if
(
pTable
==
NULL
)
return
TSDB_CODE_MND_SDB_INVALID_TABLE_TYPE
;
void
*
p
Row
=
sdbGetRowMetaFromObj
(
pTable
,
pOper
->
pObj
);
if
(
p
Row
==
NULL
)
{
sdbDebug
(
"
table:%s, record is not there, delete failed"
,
pTable
->
tableN
ame
);
void
*
p
Obj
=
sdbGetRowMetaFromObj
(
pTable
,
pRow
->
pObj
);
if
(
p
Obj
==
NULL
)
{
sdbDebug
(
"
vgId:1, sdb:%s, record is not there, delete failed"
,
pTable
->
n
ame
);
return
TSDB_CODE_MND_SDB_OBJ_NOT_THERE
;
}
sdbIncRef
(
pTable
,
pOper
->
pObj
);
int32_t
code
=
sdbDeleteHash
(
pTable
,
pOper
);
int32_t
code
=
sdbDeleteHash
(
pTable
,
pRow
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
sdbError
(
"table:%s, failed to delete from hash"
,
pTable
->
tableName
);
sdbDecRef
(
pTable
,
pOper
->
pObj
);
sdbError
(
"vgId:1, sdb:%s, failed to delete from hash"
,
pTable
->
name
);
return
code
;
}
// just delete data from memory
if
(
pOper
->
type
!=
SDB_OPER_GLOBAL
)
{
sdbDecRef
(
pTable
,
pOper
->
pObj
);
if
(
pRow
->
type
!=
SDB_OPER_GLOBAL
)
{
return
TSDB_CODE_SUCCESS
;
}
if
(
p
Oper
->
reqFp
)
{
return
(
*
p
Oper
->
reqFp
)(
pOper
->
pMsg
);
if
(
p
Row
->
fpReq
)
{
return
(
*
p
Row
->
fpReq
)(
pRow
->
pMsg
);
}
else
{
return
sdb
DeleteRowImp
(
pOper
);
return
sdb
WriteRowToQueue
(
pRow
,
SDB_ACTION_DELETE
);
}
}
int32_t
sdbDeleteRowImp
(
SSdbOper
*
pOper
)
{
SSdbTable
*
pTable
=
(
SSdbTable
*
)
pOper
->
table
;
if
(
pTable
==
NULL
)
return
TSDB_CODE_MND_SDB_INVALID_TABLE_TYPE
;
int32_t
size
=
sizeof
(
SSdbOper
)
+
sizeof
(
SWalHead
)
+
pTable
->
maxRowSize
+
SDB_SYNC_HACK
;
SSdbOper
*
pNewOper
=
taosAllocateQitem
(
size
);
SWalHead
*
pHead
=
(
void
*
)
pNewOper
+
sizeof
(
SSdbOper
)
+
SDB_SYNC_HACK
;
pHead
->
version
=
0
;
pHead
->
msgType
=
pTable
->
tableId
*
10
+
SDB_ACTION_DELETE
;
pOper
->
rowData
=
pHead
->
cont
;
(
*
pTable
->
encodeFp
)(
pOper
);
pHead
->
len
=
pOper
->
rowSize
;
memcpy
(
pNewOper
,
pOper
,
sizeof
(
SSdbOper
));
if
(
pNewOper
->
pMsg
!=
NULL
)
{
sdbDebug
(
"app:%p:%p, table:%s record:%p:%s, delete action is add to sdb queue"
,
pNewOper
->
pMsg
->
rpcMsg
.
ahandle
,
pNewOper
->
pMsg
,
pTable
->
tableName
,
pOper
->
pObj
,
sdbGetKeyStrFromObj
(
pTable
,
pOper
->
pObj
));
}
taosWriteQitem
(
tsSdbWriteQueue
,
TAOS_QTYPE_RPC
,
pNewOper
);
return
TSDB_CODE_MND_ACTION_IN_PROGRESS
;
}
int32_t
sdbUpdateRow
(
SSdbOper
*
pOper
)
{
SSdbTable
*
pTable
=
(
SSdbTable
*
)
pOper
->
table
;
int32_t
sdbUpdateRow
(
SSdbRow
*
pRow
)
{
SSdbTable
*
pTable
=
pRow
->
pTable
;
if
(
pTable
==
NULL
)
return
TSDB_CODE_MND_SDB_INVALID_TABLE_TYPE
;
void
*
p
Row
=
sdbGetRowMetaFromObj
(
pTable
,
pOper
->
pObj
);
if
(
p
Row
==
NULL
)
{
sdbDebug
(
"
table:%s, record is not there, update failed"
,
pTable
->
tableN
ame
);
void
*
p
Obj
=
sdbGetRowMetaFromObj
(
pTable
,
pRow
->
pObj
);
if
(
p
Obj
==
NULL
)
{
sdbDebug
(
"
vgId:1, sdb:%s, record is not there, update failed"
,
pTable
->
n
ame
);
return
TSDB_CODE_MND_SDB_OBJ_NOT_THERE
;
}
int32_t
code
=
sdbUpdateHash
(
pTable
,
p
Oper
);
int32_t
code
=
sdbUpdateHash
(
pTable
,
p
Row
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
sdbError
(
"
table:%s, failed to update hash"
,
pTable
->
tableN
ame
);
sdbError
(
"
vgId:1, sdb:%s, failed to update hash"
,
pTable
->
n
ame
);
return
code
;
}
// just update data in memory
if
(
p
Oper
->
type
!=
SDB_OPER_GLOBAL
)
{
if
(
p
Row
->
type
!=
SDB_OPER_GLOBAL
)
{
return
TSDB_CODE_SUCCESS
;
}
if
(
p
Oper
->
reqFp
)
{
return
(
*
p
Oper
->
reqFp
)(
pOper
->
pMsg
);
if
(
p
Row
->
fpReq
)
{
return
(
*
p
Row
->
fpReq
)(
pRow
->
pMsg
);
}
else
{
return
sdb
UpdateRowImp
(
pOper
);
return
sdb
WriteRowToQueue
(
pRow
,
SDB_ACTION_UPDATE
);
}
}
int32_t
sdbUpdateRowImp
(
SSdbOper
*
pOper
)
{
SSdbTable
*
pTable
=
(
SSdbTable
*
)
pOper
->
table
;
if
(
pTable
==
NULL
)
return
TSDB_CODE_MND_SDB_INVALID_TABLE_TYPE
;
int32_t
size
=
sizeof
(
SSdbOper
)
+
sizeof
(
SWalHead
)
+
pTable
->
maxRowSize
+
SDB_SYNC_HACK
;
SSdbOper
*
pNewOper
=
taosAllocateQitem
(
size
);
SWalHead
*
pHead
=
(
void
*
)
pNewOper
+
sizeof
(
SSdbOper
)
+
SDB_SYNC_HACK
;
pHead
->
version
=
0
;
pHead
->
msgType
=
pTable
->
tableId
*
10
+
SDB_ACTION_UPDATE
;
pOper
->
rowData
=
pHead
->
cont
;
(
*
pTable
->
encodeFp
)(
pOper
);
pHead
->
len
=
pOper
->
rowSize
;
memcpy
(
pNewOper
,
pOper
,
sizeof
(
SSdbOper
));
if
(
pNewOper
->
pMsg
!=
NULL
)
{
sdbDebug
(
"app:%p:%p, table:%s record:%p:%s, update action is add to sdb queue"
,
pNewOper
->
pMsg
->
rpcMsg
.
ahandle
,
pNewOper
->
pMsg
,
pTable
->
tableName
,
pOper
->
pObj
,
sdbGetKeyStrFromObj
(
pTable
,
pOper
->
pObj
));
}
sdbIncRef
(
pNewOper
->
table
,
pNewOper
->
pObj
);
taosWriteQitem
(
tsSdbWriteQueue
,
TAOS_QTYPE_RPC
,
pNewOper
);
return
TSDB_CODE_MND_ACTION_IN_PROGRESS
;
}
void
*
sdbFetchRow
(
void
*
handle
,
void
*
pNode
,
void
**
ppRow
)
{
SSdbTable
*
pTable
=
(
SSdbTable
*
)
handle
;
void
*
sdbFetchRow
(
void
*
tparam
,
void
*
pNode
,
void
**
ppRow
)
{
SSdbTable
*
pTable
=
tparam
;
*
ppRow
=
NULL
;
if
(
pTable
==
NULL
)
return
NULL
;
...
...
@@ -882,7 +776,7 @@ void *sdbFetchRow(void *handle, void *pNode, void **ppRow) {
}
*
ppRow
=
*
ppMetaRow
;
sdbIncRef
(
hand
le
,
*
ppMetaRow
);
sdbIncRef
(
pTab
le
,
*
ppMetaRow
);
return
pIter
;
}
...
...
@@ -899,19 +793,19 @@ void *sdbOpenTable(SSdbTableDesc *pDesc) {
if
(
pTable
==
NULL
)
return
NULL
;
pthread_mutex_init
(
&
pTable
->
mutex
,
NULL
);
tstrncpy
(
pTable
->
tableName
,
pDesc
->
tableN
ame
,
SDB_TABLE_LEN
);
tstrncpy
(
pTable
->
name
,
pDesc
->
n
ame
,
SDB_TABLE_LEN
);
pTable
->
keyType
=
pDesc
->
keyType
;
pTable
->
tableId
=
pDesc
->
tableI
d
;
pTable
->
id
=
pDesc
->
i
d
;
pTable
->
hashSessions
=
pDesc
->
hashSessions
;
pTable
->
maxRowSize
=
pDesc
->
maxRowSize
;
pTable
->
refCountPos
=
pDesc
->
refCountPos
;
pTable
->
insertFp
=
pDesc
->
insertFp
;
pTable
->
deleteFp
=
pDesc
->
deleteFp
;
pTable
->
updateFp
=
pDesc
->
updateFp
;
pTable
->
encodeFp
=
pDesc
->
encodeFp
;
pTable
->
decodeFp
=
pDesc
->
decodeFp
;
pTable
->
destroyFp
=
pDesc
->
destroyFp
;
pTable
->
restoredFp
=
pDesc
->
restoredFp
;
pTable
->
fpInsert
=
pDesc
->
fpInsert
;
pTable
->
fpDelete
=
pDesc
->
fpDelete
;
pTable
->
fpUpdate
=
pDesc
->
fpUpdate
;
pTable
->
fpEncode
=
pDesc
->
fpEncode
;
pTable
->
fpDecode
=
pDesc
->
fpDecode
;
pTable
->
fpDestroy
=
pDesc
->
fpDestroy
;
pTable
->
fpRestored
=
pDesc
->
fpRestored
;
_hash_fn_t
hashFp
=
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
);
if
(
pTable
->
keyType
==
SDB_KEY_STRING
||
pTable
->
keyType
==
SDB_KEY_VAR_STRING
)
{
...
...
@@ -919,8 +813,8 @@ void *sdbOpenTable(SSdbTableDesc *pDesc) {
}
pTable
->
iHandle
=
taosHashInit
(
pTable
->
hashSessions
,
hashFp
,
true
,
true
);
tsSdb
Obj
.
numOfTables
++
;
tsSdb
Obj
.
tableList
[
pTable
->
tableI
d
]
=
pTable
;
tsSdb
Mgmt
.
numOfTables
++
;
tsSdb
Mgmt
.
tableList
[
pTable
->
i
d
]
=
pTable
;
return
pTable
;
}
...
...
@@ -928,87 +822,87 @@ void sdbCloseTable(void *handle) {
SSdbTable
*
pTable
=
(
SSdbTable
*
)
handle
;
if
(
pTable
==
NULL
)
return
;
tsSdb
Obj
.
numOfTables
--
;
tsSdb
Obj
.
tableList
[
pTable
->
tableI
d
]
=
NULL
;
tsSdb
Mgmt
.
numOfTables
--
;
tsSdb
Mgmt
.
tableList
[
pTable
->
i
d
]
=
NULL
;
SHashMutableIterator
*
pIter
=
taosHashCreateIter
(
pTable
->
iHandle
);
while
(
taosHashIterNext
(
pIter
))
{
void
**
ppRow
=
taosHashIterGet
(
pIter
);
if
(
ppRow
==
NULL
)
continue
;
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
pObj
=
*
ppRow
,
.
t
able
=
pTable
,
.
pT
able
=
pTable
,
};
(
*
pTable
->
destroyFp
)(
&
oper
);
(
*
pTable
->
fpDestroy
)(
&
row
);
}
taosHashDestroyIter
(
pIter
);
taosHashCleanup
(
pTable
->
iHandle
);
pthread_mutex_destroy
(
&
pTable
->
mutex
);
sdbDebug
(
"
table:%s, is closed, numOfTables:%d"
,
pTable
->
tableName
,
tsSdbObj
.
numOfTables
);
sdbDebug
(
"
vgId:1, sdb:%s, is closed, numOfTables:%d"
,
pTable
->
name
,
tsSdbMgmt
.
numOfTables
);
free
(
pTable
);
}
int32_t
sdbInitWrite
Worker
()
{
static
int32_t
sdbInit
Worker
()
{
tsSdbPool
.
num
=
1
;
tsSdbPool
.
w
riteWorker
=
(
SSdbWriteWorker
*
)
calloc
(
sizeof
(
SSdbWrite
Worker
),
tsSdbPool
.
num
);
tsSdbPool
.
w
orker
=
calloc
(
sizeof
(
SSdb
Worker
),
tsSdbPool
.
num
);
if
(
tsSdbPool
.
w
riteW
orker
==
NULL
)
return
-
1
;
if
(
tsSdbPool
.
worker
==
NULL
)
return
-
1
;
for
(
int32_t
i
=
0
;
i
<
tsSdbPool
.
num
;
++
i
)
{
SSdbW
riteWorker
*
pWorker
=
tsSdbPool
.
writeW
orker
+
i
;
SSdbW
orker
*
pWorker
=
tsSdbPool
.
w
orker
+
i
;
pWorker
->
workerId
=
i
;
}
sdbAlloc
Write
Queue
();
sdbAllocQueue
();
mInfo
(
"sdb write is opened"
);
mInfo
(
"
vgId:1,
sdb write is opened"
);
return
0
;
}
void
sdbCleanupWrite
Worker
()
{
static
void
sdbCleanup
Worker
()
{
for
(
int32_t
i
=
0
;
i
<
tsSdbPool
.
num
;
++
i
)
{
SSdbW
riteWorker
*
pWorker
=
tsSdbPool
.
writeW
orker
+
i
;
SSdbW
orker
*
pWorker
=
tsSdbPool
.
w
orker
+
i
;
if
(
pWorker
->
thread
)
{
taosQsetThreadResume
(
tsSdbW
rite
Qset
);
taosQsetThreadResume
(
tsSdbWQset
);
}
}
for
(
int32_t
i
=
0
;
i
<
tsSdbPool
.
num
;
++
i
)
{
SSdbW
riteWorker
*
pWorker
=
tsSdbPool
.
writeW
orker
+
i
;
SSdbW
orker
*
pWorker
=
tsSdbPool
.
w
orker
+
i
;
if
(
pWorker
->
thread
)
{
pthread_join
(
pWorker
->
thread
,
NULL
);
}
}
sdbFree
Writeq
ueue
();
tfree
(
tsSdbPool
.
w
riteW
orker
);
sdbFree
Q
ueue
();
tfree
(
tsSdbPool
.
worker
);
mInfo
(
"sdb write is closed"
);
mInfo
(
"
vgId:1,
sdb write is closed"
);
}
int32_t
sdbAllocWrite
Queue
()
{
tsSdbW
rite
Queue
=
taosOpenQueue
();
if
(
tsSdbW
rite
Queue
==
NULL
)
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
static
int32_t
sdbAlloc
Queue
()
{
tsSdbWQueue
=
taosOpenQueue
();
if
(
tsSdbWQueue
==
NULL
)
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
tsSdbW
rite
Qset
=
taosOpenQset
();
if
(
tsSdbW
rite
Qset
==
NULL
)
{
taosCloseQueue
(
tsSdbW
rite
Queue
);
tsSdbWQset
=
taosOpenQset
();
if
(
tsSdbWQset
==
NULL
)
{
taosCloseQueue
(
tsSdbWQueue
);
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
}
taosAddIntoQset
(
tsSdbW
riteQset
,
tsSdbWrite
Queue
,
NULL
);
taosAddIntoQset
(
tsSdbW
Qset
,
tsSdbW
Queue
,
NULL
);
tsSdbW
rite
Qall
=
taosAllocateQall
();
if
(
tsSdbW
rite
Qall
==
NULL
)
{
taosCloseQset
(
tsSdbW
rite
Qset
);
taosCloseQueue
(
tsSdbW
rite
Queue
);
tsSdbWQall
=
taosAllocateQall
();
if
(
tsSdbWQall
==
NULL
)
{
taosCloseQset
(
tsSdbWQset
);
taosCloseQueue
(
tsSdbWQueue
);
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
}
for
(
int32_t
i
=
0
;
i
<
tsSdbPool
.
num
;
++
i
)
{
SSdbW
riteWorker
*
pWorker
=
tsSdbPool
.
writeW
orker
+
i
;
SSdbW
orker
*
pWorker
=
tsSdbPool
.
w
orker
+
i
;
pWorker
->
workerId
=
i
;
pthread_attr_t
thAttr
;
...
...
@@ -1017,9 +911,9 @@ int32_t sdbAllocWriteQueue() {
if
(
pthread_create
(
&
pWorker
->
thread
,
&
thAttr
,
sdbWorkerFp
,
pWorker
)
!=
0
)
{
mError
(
"failed to create thread to process sdb write queue, reason:%s"
,
strerror
(
errno
));
taosFreeQall
(
tsSdbW
rite
Qall
);
taosCloseQset
(
tsSdbW
rite
Qset
);
taosCloseQueue
(
tsSdbW
rite
Queue
);
taosFreeQall
(
tsSdbWQall
);
taosCloseQset
(
tsSdbWQset
);
taosCloseQueue
(
tsSdbWQueue
);
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
}
...
...
@@ -1027,86 +921,126 @@ int32_t sdbAllocWriteQueue() {
mDebug
(
"sdb write worker:%d is launched, total:%d"
,
pWorker
->
workerId
,
tsSdbPool
.
num
);
}
mDebug
(
"sdb write queue:%p is allocated"
,
tsSdbW
rite
Queue
);
mDebug
(
"sdb write queue:%p is allocated"
,
tsSdbWQueue
);
return
TSDB_CODE_SUCCESS
;
}
void
sdbFreeWriteq
ueue
()
{
taosCloseQueue
(
tsSdbW
rite
Queue
);
taosFreeQall
(
tsSdbW
rite
Qall
);
taosCloseQset
(
tsSdbW
rite
Qset
);
tsSdbW
rite
Qall
=
NULL
;
tsSdbW
rite
Qset
=
NULL
;
tsSdbW
rite
Queue
=
NULL
;
static
void
sdbFreeQ
ueue
()
{
taosCloseQueue
(
tsSdbWQueue
);
taosFreeQall
(
tsSdbWQall
);
taosCloseQset
(
tsSdbWQset
);
tsSdbWQall
=
NULL
;
tsSdbWQset
=
NULL
;
tsSdbWQueue
=
NULL
;
}
int32_t
sdbWriteToQueue
(
void
*
param
,
void
*
data
,
int32_t
qtype
,
void
*
pMsg
)
{
SWalHead
*
pHead
=
data
;
int32_t
size
=
sizeof
(
SWalHead
)
+
pHead
->
len
;
SWalHead
*
pWal
=
taosAllocateQitem
(
size
);
memcpy
(
pWal
,
pHead
,
size
);
static
int32_t
sdbWriteToQueue
(
SSdbRow
*
pRow
,
int32_t
qtype
)
{
SWalHead
*
pHead
=
pRow
->
pHead
;
taosWriteQitem
(
tsSdbWriteQueue
,
qtype
,
pWal
);
return
0
;
if
(
pHead
->
len
>
TSDB_MAX_WAL_SIZE
)
{
sdbError
(
"vgId:1, wal len:%d exceeds limit, hver:%"
PRIu64
,
pHead
->
len
,
pHead
->
version
);
taosFreeQitem
(
pRow
);
return
TSDB_CODE_WAL_SIZE_LIMIT
;
}
int32_t
queued
=
atomic_add_fetch_32
(
&
tsSdbMgmt
.
queuedMsg
,
1
);
if
(
queued
>
MAX_QUEUED_MSG_NUM
)
{
sdbDebug
(
"vgId:1, too many msg:%d in sdb queue, flow control"
,
queued
);
taosMsleep
(
1
);
}
sdbIncRef
(
pRow
->
pTable
,
pRow
->
pObj
);
sdbTrace
(
"vgId:1, msg:%p write into to sdb queue"
,
pRow
->
pMsg
);
taosWriteQitem
(
tsSdbWQueue
,
qtype
,
pRow
);
return
TSDB_CODE_MND_ACTION_IN_PROGRESS
;
}
static
void
sdbFreeFromQueue
(
SSdbRow
*
pRow
)
{
int32_t
queued
=
atomic_sub_fetch_32
(
&
tsSdbMgmt
.
queuedMsg
,
1
);
sdbTrace
(
"vgId:1, msg:%p free from sdb queue, queued:%d"
,
pRow
->
pMsg
,
queued
);
sdbDecRef
(
pRow
->
pTable
,
pRow
->
pObj
);
taosFreeQitem
(
pRow
);
}
static
void
*
sdbWorkerFp
(
void
*
param
)
{
SWalHead
*
pHead
;
SSdbOper
*
pOper
;
int32_t
type
;
int32_t
numOfMsgs
;
void
*
item
;
static
int32_t
sdbWriteWalToQueue
(
void
*
vparam
,
void
*
wparam
,
int32_t
qtype
,
void
*
rparam
)
{
SWalHead
*
pHead
=
wparam
;
int32_t
size
=
sizeof
(
SSdbRow
)
+
sizeof
(
SWalHead
)
+
pHead
->
len
;
SSdbRow
*
pRow
=
taosAllocateQitem
(
size
);
if
(
pRow
==
NULL
)
{
return
TSDB_CODE_VND_OUT_OF_MEMORY
;
}
return
sdbWriteToQueue
(
pRow
,
qtype
);
}
static
int32_t
sdbWriteRowToQueue
(
SSdbRow
*
pInputRow
,
int32_t
action
)
{
SSdbTable
*
pTable
=
pInputRow
->
pTable
;
if
(
pTable
==
NULL
)
return
TSDB_CODE_MND_SDB_INVALID_TABLE_TYPE
;
int32_t
size
=
sizeof
(
SSdbRow
)
+
sizeof
(
SWalHead
)
+
pTable
->
maxRowSize
;
SSdbRow
*
pRow
=
taosAllocateQitem
(
size
);
if
(
pRow
==
NULL
)
{
return
TSDB_CODE_VND_OUT_OF_MEMORY
;
}
memcpy
(
pRow
,
pInputRow
,
sizeof
(
SSdbRow
));
pRow
->
processedCount
=
1
;
SWalHead
*
pHead
=
pRow
->
pHead
;
pRow
->
rowData
=
pHead
->
cont
;
(
*
pTable
->
fpEncode
)(
pRow
);
pHead
->
len
=
pRow
->
rowSize
;
pHead
->
version
=
0
;
pHead
->
msgType
=
pTable
->
id
*
10
+
action
;
return
sdbWriteToQueue
(
pRow
,
TAOS_QTYPE_RPC
);
}
int32_t
sdbInsertRowToQueue
(
SSdbRow
*
pRow
)
{
return
sdbWriteRowToQueue
(
pRow
,
SDB_ACTION_INSERT
);
}
static
void
*
sdbWorkerFp
(
void
*
pWorker
)
{
SSdbRow
*
pRow
;
int32_t
qtype
;
void
*
unUsed
;
while
(
1
)
{
numOfMsgs
=
taosReadAllQitemsFromQset
(
tsSdbWriteQset
,
tsSdbWrite
Qall
,
&
unUsed
);
int32_t
numOfMsgs
=
taosReadAllQitemsFromQset
(
tsSdbWQset
,
tsSdbW
Qall
,
&
unUsed
);
if
(
numOfMsgs
==
0
)
{
sdbDebug
(
"qset:%p, sdb got no message from qset, exiting"
,
tsSdbW
rite
Qset
);
sdbDebug
(
"qset:%p, sdb got no message from qset, exiting"
,
tsSdbWQset
);
break
;
}
for
(
int32_t
i
=
0
;
i
<
numOfMsgs
;
++
i
)
{
taosGetQitem
(
tsSdbWriteQall
,
&
type
,
&
item
);
if
(
type
==
TAOS_QTYPE_RPC
)
{
pOper
=
(
SSdbOper
*
)
item
;
pOper
->
processedCount
=
1
;
pHead
=
(
void
*
)
pOper
+
sizeof
(
SSdbOper
)
+
SDB_SYNC_HACK
;
if
(
pOper
->
pMsg
!=
NULL
)
{
sdbDebug
(
"app:%p:%p, table:%s record:%p:%s ver:%"
PRIu64
", will be processed in sdb queue"
,
pOper
->
pMsg
->
rpcMsg
.
ahandle
,
pOper
->
pMsg
,
((
SSdbTable
*
)
pOper
->
table
)
->
tableName
,
pOper
->
pObj
,
sdbGetKeyStr
(
pOper
->
table
,
pHead
->
cont
),
pHead
->
version
);
}
}
else
{
pHead
=
(
SWalHead
*
)
item
;
pOper
=
NULL
;
}
taosGetQitem
(
tsSdbWQall
,
&
qtype
,
(
void
**
)
&
pRow
);
sdbTrace
(
"vgId:1, msg:%p, row:%p hver:%"
PRIu64
", will be processed in sdb queue"
,
pRow
->
pMsg
,
pRow
->
pObj
,
pRow
->
pHead
->
version
);
int32_t
code
=
sdbWrite
(
pOper
,
pHead
,
type
,
NULL
);
if
(
code
>
0
)
code
=
0
;
if
(
pOper
)
{
pOper
->
retCode
=
code
;
}
else
{
pHead
->
len
=
code
;
// hackway
}
pRow
->
code
=
sdbProcessWrite
((
qtype
==
TAOS_QTYPE_RPC
)
?
pRow
:
NULL
,
pRow
->
pHead
,
qtype
,
NULL
);
if
(
pRow
->
code
>
0
)
pRow
->
code
=
0
;
sdbTrace
(
"vgId:1, msg:%p is processed in sdb queue, code:%x"
,
pRow
->
pMsg
,
pRow
->
code
);
}
walFsync
(
tsSdb
Obj
.
wal
,
true
);
walFsync
(
tsSdb
Mgmt
.
wal
,
true
);
// browse all items, and process them one by one
taosResetQitems
(
tsSdbW
rite
Qall
);
taosResetQitems
(
tsSdbWQall
);
for
(
int32_t
i
=
0
;
i
<
numOfMsgs
;
++
i
)
{
taosGetQitem
(
tsSdbWriteQall
,
&
type
,
&
item
);
if
(
type
==
TAOS_QTYPE_RPC
)
{
pOper
=
(
SSdbOper
*
)
item
;
sdbConfirmForward
(
NULL
,
pOper
,
pOper
->
retCode
);
}
else
if
(
type
==
TAOS_QTYPE_FWD
)
{
pHead
=
(
SWalHead
*
)
item
;
syncConfirmForward
(
tsSdbObj
.
sync
,
pHead
->
version
,
pHead
->
len
);
taosFreeQitem
(
item
);
taosGetQitem
(
tsSdbWQall
,
&
qtype
,
(
void
**
)
&
pRow
);
if
(
qtype
==
TAOS_QTYPE_RPC
)
{
sdbConfirmForward
(
NULL
,
pRow
,
pRow
->
code
);
}
else
if
(
qtype
==
TAOS_QTYPE_FWD
)
{
syncConfirmForward
(
tsSdbMgmt
.
sync
,
pRow
->
pHead
->
version
,
pRow
->
code
);
}
else
{
taosFreeQitem
(
item
);
}
sdbFreeFromQueue
(
pRow
);
}
}
...
...
src/mnode/src/mnodeTable.c
浏览文件 @
ea3aae75
...
...
@@ -99,13 +99,13 @@ static void mnodeDestroyChildTable(SCTableObj *pTable) {
tfree
(
pTable
);
}
static
int32_t
mnodeChildTableActionDestroy
(
SSdb
Oper
*
pOper
)
{
mnodeDestroyChildTable
(
p
Oper
->
pObj
);
static
int32_t
mnodeChildTableActionDestroy
(
SSdb
Row
*
pRow
)
{
mnodeDestroyChildTable
(
p
Row
->
pObj
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeChildTableActionInsert
(
SSdb
Oper
*
pOper
)
{
SCTableObj
*
pTable
=
p
Oper
->
pObj
;
static
int32_t
mnodeChildTableActionInsert
(
SSdb
Row
*
pRow
)
{
SCTableObj
*
pTable
=
p
Row
->
pObj
;
SVgObj
*
pVgroup
=
mnodeGetVgroup
(
pTable
->
vgId
);
if
(
pVgroup
==
NULL
)
{
...
...
@@ -153,8 +153,8 @@ static int32_t mnodeChildTableActionInsert(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeChildTableActionDelete
(
SSdb
Oper
*
pOper
)
{
SCTableObj
*
pTable
=
p
Oper
->
pObj
;
static
int32_t
mnodeChildTableActionDelete
(
SSdb
Row
*
pRow
)
{
SCTableObj
*
pTable
=
p
Row
->
pObj
;
if
(
pTable
->
vgId
==
0
)
{
return
TSDB_CODE_MND_VGROUP_NOT_EXIST
;
}
...
...
@@ -189,8 +189,8 @@ static int32_t mnodeChildTableActionDelete(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeChildTableActionUpdate
(
SSdb
Oper
*
pOper
)
{
SCTableObj
*
pNew
=
p
Oper
->
pObj
;
static
int32_t
mnodeChildTableActionUpdate
(
SSdb
Row
*
pRow
)
{
SCTableObj
*
pNew
=
p
Row
->
pObj
;
SCTableObj
*
pTable
=
mnodeGetChildTable
(
pNew
->
info
.
tableId
);
if
(
pTable
!=
pNew
)
{
void
*
oldTableId
=
pTable
->
info
.
tableId
;
...
...
@@ -216,50 +216,50 @@ static int32_t mnodeChildTableActionUpdate(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeChildTableActionEncode
(
SSdb
Oper
*
pOper
)
{
SCTableObj
*
pTable
=
p
Oper
->
pObj
;
assert
(
pTable
!=
NULL
&&
p
Oper
->
rowData
!=
NULL
);
static
int32_t
mnodeChildTableActionEncode
(
SSdb
Row
*
pRow
)
{
SCTableObj
*
pTable
=
p
Row
->
pObj
;
assert
(
pTable
!=
NULL
&&
p
Row
->
rowData
!=
NULL
);
int32_t
len
=
strlen
(
pTable
->
info
.
tableId
);
if
(
len
>=
TSDB_TABLE_FNAME_LEN
)
return
TSDB_CODE_MND_INVALID_TABLE_ID
;
memcpy
(
p
Oper
->
rowData
,
pTable
->
info
.
tableId
,
len
);
memset
(
p
Oper
->
rowData
+
len
,
0
,
1
);
memcpy
(
p
Row
->
rowData
,
pTable
->
info
.
tableId
,
len
);
memset
(
p
Row
->
rowData
+
len
,
0
,
1
);
len
++
;
memcpy
(
p
Oper
->
rowData
+
len
,
(
char
*
)
pTable
+
sizeof
(
char
*
),
tsChildTableUpdateSize
);
memcpy
(
p
Row
->
rowData
+
len
,
(
char
*
)
pTable
+
sizeof
(
char
*
),
tsChildTableUpdateSize
);
len
+=
tsChildTableUpdateSize
;
if
(
pTable
->
info
.
type
!=
TSDB_CHILD_TABLE
)
{
int32_t
schemaSize
=
pTable
->
numOfColumns
*
sizeof
(
SSchema
);
memcpy
(
p
Oper
->
rowData
+
len
,
pTable
->
schema
,
schemaSize
);
memcpy
(
p
Row
->
rowData
+
len
,
pTable
->
schema
,
schemaSize
);
len
+=
schemaSize
;
if
(
pTable
->
sqlLen
!=
0
)
{
memcpy
(
p
Oper
->
rowData
+
len
,
pTable
->
sql
,
pTable
->
sqlLen
);
memcpy
(
p
Row
->
rowData
+
len
,
pTable
->
sql
,
pTable
->
sqlLen
);
len
+=
pTable
->
sqlLen
;
}
}
p
Oper
->
rowSize
=
len
;
p
Row
->
rowSize
=
len
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeChildTableActionDecode
(
SSdb
Oper
*
pOper
)
{
assert
(
p
Oper
->
rowData
!=
NULL
);
static
int32_t
mnodeChildTableActionDecode
(
SSdb
Row
*
pRow
)
{
assert
(
p
Row
->
rowData
!=
NULL
);
SCTableObj
*
pTable
=
calloc
(
1
,
sizeof
(
SCTableObj
));
if
(
pTable
==
NULL
)
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
int32_t
len
=
strlen
(
p
Oper
->
rowData
);
int32_t
len
=
strlen
(
p
Row
->
rowData
);
if
(
len
>=
TSDB_TABLE_FNAME_LEN
)
{
free
(
pTable
);
return
TSDB_CODE_MND_INVALID_TABLE_ID
;
}
pTable
->
info
.
tableId
=
strdup
(
p
Oper
->
rowData
);
pTable
->
info
.
tableId
=
strdup
(
p
Row
->
rowData
);
len
++
;
memcpy
((
char
*
)
pTable
+
sizeof
(
char
*
),
p
Oper
->
rowData
+
len
,
tsChildTableUpdateSize
);
memcpy
((
char
*
)
pTable
+
sizeof
(
char
*
),
p
Row
->
rowData
+
len
,
tsChildTableUpdateSize
);
len
+=
tsChildTableUpdateSize
;
if
(
pTable
->
info
.
type
!=
TSDB_CHILD_TABLE
)
{
...
...
@@ -269,7 +269,7 @@ static int32_t mnodeChildTableActionDecode(SSdbOper *pOper) {
mnodeDestroyChildTable
(
pTable
);
return
TSDB_CODE_MND_INVALID_TABLE_TYPE
;
}
memcpy
(
pTable
->
schema
,
p
Oper
->
rowData
+
len
,
schemaSize
);
memcpy
(
pTable
->
schema
,
p
Row
->
rowData
+
len
,
schemaSize
);
len
+=
schemaSize
;
if
(
pTable
->
sqlLen
!=
0
)
{
...
...
@@ -278,11 +278,11 @@ static int32_t mnodeChildTableActionDecode(SSdbOper *pOper) {
mnodeDestroyChildTable
(
pTable
);
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
}
memcpy
(
pTable
->
sql
,
p
Oper
->
rowData
+
len
,
pTable
->
sqlLen
);
memcpy
(
pTable
->
sql
,
p
Row
->
rowData
+
len
,
pTable
->
sqlLen
);
}
}
p
Oper
->
pObj
=
pTable
;
p
Row
->
pObj
=
pTable
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -297,7 +297,7 @@ static int32_t mnodeChildTableActionRestored() {
SDbObj
*
pDb
=
mnodeGetDbByTableId
(
pTable
->
info
.
tableId
);
if
(
pDb
==
NULL
||
pDb
->
status
!=
TSDB_DB_STATUS_READY
)
{
mError
(
"ctable:%s, failed to get db or db in dropping, discard it"
,
pTable
->
info
.
tableId
);
SSdb
Oper
desc
=
{.
type
=
SDB_OPER_LOCAL
,
.
pObj
=
pTable
,
.
t
able
=
tsChildTableSdb
};
SSdb
Row
desc
=
{.
type
=
SDB_OPER_LOCAL
,
.
pObj
=
pTable
,
.
pT
able
=
tsChildTableSdb
};
sdbDeleteRow
(
&
desc
);
mnodeDecTableRef
(
pTable
);
mnodeDecDbRef
(
pDb
);
...
...
@@ -309,7 +309,7 @@ static int32_t mnodeChildTableActionRestored() {
if
(
pVgroup
==
NULL
)
{
mError
(
"ctable:%s, failed to get vgId:%d tid:%d, discard it"
,
pTable
->
info
.
tableId
,
pTable
->
vgId
,
pTable
->
tid
);
pTable
->
vgId
=
0
;
SSdb
Oper
desc
=
{.
type
=
SDB_OPER_LOCAL
,
.
pObj
=
pTable
,
.
t
able
=
tsChildTableSdb
};
SSdb
Row
desc
=
{.
type
=
SDB_OPER_LOCAL
,
.
pObj
=
pTable
,
.
pT
able
=
tsChildTableSdb
};
sdbDeleteRow
(
&
desc
);
mnodeDecTableRef
(
pTable
);
continue
;
...
...
@@ -320,7 +320,7 @@ static int32_t mnodeChildTableActionRestored() {
mError
(
"ctable:%s, db:%s not match with vgId:%d db:%s sid:%d, discard it"
,
pTable
->
info
.
tableId
,
pDb
->
name
,
pTable
->
vgId
,
pVgroup
->
dbName
,
pTable
->
tid
);
pTable
->
vgId
=
0
;
SSdb
Oper
desc
=
{.
type
=
SDB_OPER_LOCAL
,
.
pObj
=
pTable
,
.
t
able
=
tsChildTableSdb
};
SSdb
Row
desc
=
{.
type
=
SDB_OPER_LOCAL
,
.
pObj
=
pTable
,
.
pT
able
=
tsChildTableSdb
};
sdbDeleteRow
(
&
desc
);
mnodeDecTableRef
(
pTable
);
continue
;
...
...
@@ -331,7 +331,7 @@ static int32_t mnodeChildTableActionRestored() {
if
(
pSuperTable
==
NULL
)
{
mError
(
"ctable:%s, stable:%"
PRIu64
" not exist"
,
pTable
->
info
.
tableId
,
pTable
->
suid
);
pTable
->
vgId
=
0
;
SSdb
Oper
desc
=
{.
type
=
SDB_OPER_LOCAL
,
.
pObj
=
pTable
,
.
t
able
=
tsChildTableSdb
};
SSdb
Row
desc
=
{.
type
=
SDB_OPER_LOCAL
,
.
pObj
=
pTable
,
.
pT
able
=
tsChildTableSdb
};
sdbDeleteRow
(
&
desc
);
mnodeDecTableRef
(
pTable
);
continue
;
...
...
@@ -352,19 +352,19 @@ static int32_t mnodeInitChildTables() {
tsChildTableUpdateSize
=
(
int8_t
*
)
tObj
.
updateEnd
-
(
int8_t
*
)
&
tObj
.
info
.
type
;
SSdbTableDesc
tableDesc
=
{
.
tableId
=
SDB_TABLE_CTABLE
,
.
tableName
=
"ctables"
,
.
id
=
SDB_TABLE_CTABLE
,
.
name
=
"ctables"
,
.
hashSessions
=
TSDB_DEFAULT_CTABLES_HASH_SIZE
,
.
maxRowSize
=
sizeof
(
SCTableObj
)
+
sizeof
(
SSchema
)
*
(
TSDB_MAX_TAGS
+
TSDB_MAX_COLUMNS
+
16
)
+
TSDB_TABLE_FNAME_LEN
+
TSDB_CQ_SQL_SIZE
,
.
refCountPos
=
(
int8_t
*
)(
&
tObj
.
refCount
)
-
(
int8_t
*
)
&
tObj
,
.
keyType
=
SDB_KEY_VAR_STRING
,
.
insertFp
=
mnodeChildTableActionInsert
,
.
deleteFp
=
mnodeChildTableActionDelete
,
.
updateFp
=
mnodeChildTableActionUpdate
,
.
encodeFp
=
mnodeChildTableActionEncode
,
.
decodeFp
=
mnodeChildTableActionDecode
,
.
destroyFp
=
mnodeChildTableActionDestroy
,
.
restoredFp
=
mnodeChildTableActionRestored
.
fpInsert
=
mnodeChildTableActionInsert
,
.
fpDelete
=
mnodeChildTableActionDelete
,
.
fpUpdate
=
mnodeChildTableActionUpdate
,
.
fpEncode
=
mnodeChildTableActionEncode
,
.
fpDecode
=
mnodeChildTableActionDecode
,
.
fpDestroy
=
mnodeChildTableActionDestroy
,
.
fpRestored
=
mnodeChildTableActionRestored
};
tsChildTableSdb
=
sdbOpenTable
(
&
tableDesc
);
...
...
@@ -430,13 +430,13 @@ static void mnodeDestroySuperTable(SSTableObj *pStable) {
tfree
(
pStable
);
}
static
int32_t
mnodeSuperTableActionDestroy
(
SSdb
Oper
*
pOper
)
{
mnodeDestroySuperTable
(
p
Oper
->
pObj
);
static
int32_t
mnodeSuperTableActionDestroy
(
SSdb
Row
*
pRow
)
{
mnodeDestroySuperTable
(
p
Row
->
pObj
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeSuperTableActionInsert
(
SSdb
Oper
*
pOper
)
{
SSTableObj
*
pStable
=
p
Oper
->
pObj
;
static
int32_t
mnodeSuperTableActionInsert
(
SSdb
Row
*
pRow
)
{
SSTableObj
*
pStable
=
p
Row
->
pObj
;
SDbObj
*
pDb
=
mnodeGetDbByTableId
(
pStable
->
info
.
tableId
);
if
(
pDb
!=
NULL
&&
pDb
->
status
==
TSDB_DB_STATUS_READY
)
{
mnodeAddSuperTableIntoDb
(
pDb
);
...
...
@@ -446,8 +446,8 @@ static int32_t mnodeSuperTableActionInsert(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeSuperTableActionDelete
(
SSdb
Oper
*
pOper
)
{
SSTableObj
*
pStable
=
p
Oper
->
pObj
;
static
int32_t
mnodeSuperTableActionDelete
(
SSdb
Row
*
pRow
)
{
SSTableObj
*
pStable
=
p
Row
->
pObj
;
SDbObj
*
pDb
=
mnodeGetDbByTableId
(
pStable
->
info
.
tableId
);
if
(
pDb
!=
NULL
)
{
mnodeRemoveSuperTableFromDb
(
pDb
);
...
...
@@ -458,8 +458,8 @@ static int32_t mnodeSuperTableActionDelete(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeSuperTableActionUpdate
(
SSdb
Oper
*
pOper
)
{
SSTableObj
*
pNew
=
p
Oper
->
pObj
;
static
int32_t
mnodeSuperTableActionUpdate
(
SSdb
Row
*
pRow
)
{
SSTableObj
*
pNew
=
p
Row
->
pObj
;
SSTableObj
*
pTable
=
mnodeGetSuperTable
(
pNew
->
info
.
tableId
);
if
(
pTable
!=
NULL
&&
pTable
!=
pNew
)
{
void
*
oldTableId
=
pTable
->
info
.
tableId
;
...
...
@@ -483,43 +483,43 @@ static int32_t mnodeSuperTableActionUpdate(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeSuperTableActionEncode
(
SSdb
Oper
*
pOper
)
{
SSTableObj
*
pStable
=
p
Oper
->
pObj
;
assert
(
p
Oper
->
pObj
!=
NULL
&&
pOper
->
rowData
!=
NULL
);
static
int32_t
mnodeSuperTableActionEncode
(
SSdb
Row
*
pRow
)
{
SSTableObj
*
pStable
=
p
Row
->
pObj
;
assert
(
p
Row
->
pObj
!=
NULL
&&
pRow
->
rowData
!=
NULL
);
int32_t
len
=
strlen
(
pStable
->
info
.
tableId
);
if
(
len
>=
TSDB_TABLE_FNAME_LEN
)
len
=
TSDB_CODE_MND_INVALID_TABLE_ID
;
memcpy
(
p
Oper
->
rowData
,
pStable
->
info
.
tableId
,
len
);
memset
(
p
Oper
->
rowData
+
len
,
0
,
1
);
memcpy
(
p
Row
->
rowData
,
pStable
->
info
.
tableId
,
len
);
memset
(
p
Row
->
rowData
+
len
,
0
,
1
);
len
++
;
memcpy
(
p
Oper
->
rowData
+
len
,
(
char
*
)
pStable
+
sizeof
(
char
*
),
tsSuperTableUpdateSize
);
memcpy
(
p
Row
->
rowData
+
len
,
(
char
*
)
pStable
+
sizeof
(
char
*
),
tsSuperTableUpdateSize
);
len
+=
tsSuperTableUpdateSize
;
int32_t
schemaSize
=
sizeof
(
SSchema
)
*
(
pStable
->
numOfColumns
+
pStable
->
numOfTags
);
memcpy
(
p
Oper
->
rowData
+
len
,
pStable
->
schema
,
schemaSize
);
memcpy
(
p
Row
->
rowData
+
len
,
pStable
->
schema
,
schemaSize
);
len
+=
schemaSize
;
p
Oper
->
rowSize
=
len
;
p
Row
->
rowSize
=
len
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeSuperTableActionDecode
(
SSdb
Oper
*
pOper
)
{
assert
(
p
Oper
->
rowData
!=
NULL
);
static
int32_t
mnodeSuperTableActionDecode
(
SSdb
Row
*
pRow
)
{
assert
(
p
Row
->
rowData
!=
NULL
);
SSTableObj
*
pStable
=
(
SSTableObj
*
)
calloc
(
1
,
sizeof
(
SSTableObj
));
if
(
pStable
==
NULL
)
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
int32_t
len
=
strlen
(
p
Oper
->
rowData
);
int32_t
len
=
strlen
(
p
Row
->
rowData
);
if
(
len
>=
TSDB_TABLE_FNAME_LEN
){
free
(
pStable
);
return
TSDB_CODE_MND_INVALID_TABLE_ID
;
}
pStable
->
info
.
tableId
=
strdup
(
p
Oper
->
rowData
);
pStable
->
info
.
tableId
=
strdup
(
p
Row
->
rowData
);
len
++
;
memcpy
((
char
*
)
pStable
+
sizeof
(
char
*
),
p
Oper
->
rowData
+
len
,
tsSuperTableUpdateSize
);
memcpy
((
char
*
)
pStable
+
sizeof
(
char
*
),
p
Row
->
rowData
+
len
,
tsSuperTableUpdateSize
);
len
+=
tsSuperTableUpdateSize
;
int32_t
schemaSize
=
sizeof
(
SSchema
)
*
(
pStable
->
numOfColumns
+
pStable
->
numOfTags
);
...
...
@@ -529,9 +529,9 @@ static int32_t mnodeSuperTableActionDecode(SSdbOper *pOper) {
return
TSDB_CODE_MND_NOT_SUPER_TABLE
;
}
memcpy
(
pStable
->
schema
,
p
Oper
->
rowData
+
len
,
schemaSize
);
memcpy
(
pStable
->
schema
,
p
Row
->
rowData
+
len
,
schemaSize
);
p
Oper
->
pObj
=
pStable
;
p
Row
->
pObj
=
pStable
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -545,19 +545,19 @@ static int32_t mnodeInitSuperTables() {
tsSuperTableUpdateSize
=
(
int8_t
*
)
tObj
.
updateEnd
-
(
int8_t
*
)
&
tObj
.
info
.
type
;
SSdbTableDesc
tableDesc
=
{
.
tableId
=
SDB_TABLE_STABLE
,
.
tableName
=
"stables"
,
.
id
=
SDB_TABLE_STABLE
,
.
name
=
"stables"
,
.
hashSessions
=
TSDB_DEFAULT_STABLES_HASH_SIZE
,
.
maxRowSize
=
sizeof
(
SSTableObj
)
+
sizeof
(
SSchema
)
*
(
TSDB_MAX_TAGS
+
TSDB_MAX_COLUMNS
+
16
)
+
TSDB_TABLE_FNAME_LEN
,
.
refCountPos
=
(
int8_t
*
)(
&
tObj
.
refCount
)
-
(
int8_t
*
)
&
tObj
,
.
keyType
=
SDB_KEY_VAR_STRING
,
.
insertFp
=
mnodeSuperTableActionInsert
,
.
deleteFp
=
mnodeSuperTableActionDelete
,
.
updateFp
=
mnodeSuperTableActionUpdate
,
.
encodeFp
=
mnodeSuperTableActionEncode
,
.
decodeFp
=
mnodeSuperTableActionDecode
,
.
destroyFp
=
mnodeSuperTableActionDestroy
,
.
restoredFp
=
mnodeSuperTableActionRestored
.
fpInsert
=
mnodeSuperTableActionInsert
,
.
fpDelete
=
mnodeSuperTableActionDelete
,
.
fpUpdate
=
mnodeSuperTableActionUpdate
,
.
fpEncode
=
mnodeSuperTableActionEncode
,
.
fpDecode
=
mnodeSuperTableActionDecode
,
.
fpDestroy
=
mnodeSuperTableActionDestroy
,
.
fpRestored
=
mnodeSuperTableActionRestored
};
tsSuperTableSdb
=
sdbOpenTable
(
&
tableDesc
);
...
...
@@ -828,7 +828,7 @@ static int32_t mnodeCreateSuperTableCb(SMnodeMsg *pMsg, int32_t code) {
}
else
{
mError
(
"app:%p:%p, stable:%s, failed to create in sdb, reason:%s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pTable
->
info
.
tableId
,
tstrerror
(
code
));
SSdb
Oper
desc
=
{.
type
=
SDB_OPER_GLOBAL
,
.
pObj
=
pTable
,
.
t
able
=
tsSuperTableSdb
};
SSdb
Row
desc
=
{.
type
=
SDB_OPER_GLOBAL
,
.
pObj
=
pTable
,
.
pT
able
=
tsSuperTableSdb
};
sdbDeleteRow
(
&
desc
);
}
...
...
@@ -878,16 +878,16 @@ static int32_t mnodeProcessCreateSuperTableMsg(SMnodeMsg *pMsg) {
pMsg
->
pTable
=
(
STableObj
*
)
pStable
;
mnodeIncTableRef
(
pMsg
->
pTable
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
table
=
tsSuperTableSdb
,
.
pTable
=
tsSuperTableSdb
,
.
pObj
=
pStable
,
.
rowSize
=
sizeof
(
SSTableObj
)
+
schemaSize
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeCreateSuperTableCb
.
fpRsp
=
mnodeCreateSuperTableCb
};
int32_t
code
=
sdbInsertRow
(
&
oper
);
int32_t
code
=
sdbInsertRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mnodeDestroySuperTable
(
pStable
);
pMsg
->
pTable
=
NULL
;
...
...
@@ -937,15 +937,15 @@ static int32_t mnodeProcessDropSuperTableMsg(SMnodeMsg *pMsg) {
mnodeDropAllChildTablesInStable
(
pStable
);
}
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
table
=
tsSuperTableSdb
,
.
pTable
=
tsSuperTableSdb
,
.
pObj
=
pStable
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeDropSuperTableCb
.
fpRsp
=
mnodeDropSuperTableCb
};
int32_t
code
=
sdbDeleteRow
(
&
oper
);
int32_t
code
=
sdbDeleteRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"app:%p:%p, table:%s, failed to drop, reason:%s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pStable
->
info
.
tableId
,
tstrerror
(
code
));
...
...
@@ -1010,15 +1010,15 @@ static int32_t mnodeAddSuperTableTag(SMnodeMsg *pMsg, SSchema schema[], int32_t
mInfo
(
"app:%p:%p, stable %s, start to add tag %s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pStable
->
info
.
tableId
,
schema
[
0
].
name
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsSuperTableSdb
,
.
pT
able
=
tsSuperTableSdb
,
.
pObj
=
pStable
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeAddSuperTableTagCb
.
fpRsp
=
mnodeAddSuperTableTagCb
};
return
sdbUpdateRow
(
&
oper
);
return
sdbUpdateRow
(
&
row
);
}
static
int32_t
mnodeDropSuperTableTagCb
(
SMnodeMsg
*
pMsg
,
int32_t
code
)
{
...
...
@@ -1044,15 +1044,15 @@ static int32_t mnodeDropSuperTableTag(SMnodeMsg *pMsg, char *tagName) {
mInfo
(
"app:%p:%p, stable %s, start to drop tag %s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pStable
->
info
.
tableId
,
tagName
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsSuperTableSdb
,
.
pT
able
=
tsSuperTableSdb
,
.
pObj
=
pStable
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeDropSuperTableTagCb
.
fpRsp
=
mnodeDropSuperTableTagCb
};
return
sdbUpdateRow
(
&
oper
);
return
sdbUpdateRow
(
&
row
);
}
static
int32_t
mnodeModifySuperTableTagNameCb
(
SMnodeMsg
*
pMsg
,
int32_t
code
)
{
...
...
@@ -1088,15 +1088,15 @@ static int32_t mnodeModifySuperTableTagName(SMnodeMsg *pMsg, char *oldTagName, c
mInfo
(
"app:%p:%p, stable %s, start to modify tag %s to %s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pStable
->
info
.
tableId
,
oldTagName
,
newTagName
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsSuperTableSdb
,
.
pT
able
=
tsSuperTableSdb
,
.
pObj
=
pStable
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeModifySuperTableTagNameCb
.
fpRsp
=
mnodeModifySuperTableTagNameCb
};
return
sdbUpdateRow
(
&
oper
);
return
sdbUpdateRow
(
&
row
);
}
static
int32_t
mnodeFindSuperTableColumnIndex
(
SSTableObj
*
pStable
,
char
*
colName
)
{
...
...
@@ -1162,15 +1162,15 @@ static int32_t mnodeAddSuperTableColumn(SMnodeMsg *pMsg, SSchema schema[], int32
mInfo
(
"app:%p:%p, stable %s, start to add column"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pStable
->
info
.
tableId
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsSuperTableSdb
,
.
pT
able
=
tsSuperTableSdb
,
.
pObj
=
pStable
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeAddSuperTableColumnCb
.
fpRsp
=
mnodeAddSuperTableColumnCb
};
return
sdbUpdateRow
(
&
oper
);
return
sdbUpdateRow
(
&
row
);
}
static
int32_t
mnodeDropSuperTableColumnCb
(
SMnodeMsg
*
pMsg
,
int32_t
code
)
{
...
...
@@ -1207,15 +1207,15 @@ static int32_t mnodeDropSuperTableColumn(SMnodeMsg *pMsg, char *colName) {
mInfo
(
"app:%p:%p, stable %s, start to delete column"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pStable
->
info
.
tableId
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsSuperTableSdb
,
.
pT
able
=
tsSuperTableSdb
,
.
pObj
=
pStable
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeDropSuperTableColumnCb
.
fpRsp
=
mnodeDropSuperTableColumnCb
};
return
sdbUpdateRow
(
&
oper
);
return
sdbUpdateRow
(
&
row
);
}
static
int32_t
mnodeChangeSuperTableColumnCb
(
SMnodeMsg
*
pMsg
,
int32_t
code
)
{
...
...
@@ -1251,15 +1251,15 @@ static int32_t mnodeChangeSuperTableColumn(SMnodeMsg *pMsg, char *oldName, char
mInfo
(
"app:%p:%p, stable %s, start to modify column %s to %s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pStable
->
info
.
tableId
,
oldName
,
newName
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsSuperTableSdb
,
.
pT
able
=
tsSuperTableSdb
,
.
pObj
=
pStable
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeChangeSuperTableColumnCb
.
fpRsp
=
mnodeChangeSuperTableColumnCb
};
return
sdbUpdateRow
(
&
oper
);
return
sdbUpdateRow
(
&
row
);
}
// show super tables
...
...
@@ -1417,12 +1417,12 @@ void mnodeDropAllSuperTables(SDbObj *pDropDb) {
if
(
pTable
==
NULL
)
break
;
if
(
strncmp
(
prefix
,
pTable
->
info
.
tableId
,
prefixLen
)
==
0
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_LOCAL
,
.
t
able
=
tsSuperTableSdb
,
.
pT
able
=
tsSuperTableSdb
,
.
pObj
=
pTable
,
};
sdbDeleteRow
(
&
oper
);
sdbDeleteRow
(
&
row
);
numOfTables
++
;
}
...
...
@@ -1694,7 +1694,7 @@ static int32_t mnodeDoCreateChildTableCb(SMnodeMsg *pMsg, int32_t code) {
}
else
{
mError
(
"app:%p:%p, table:%s, failed to create table sid:%d, uid:%"
PRIu64
", reason:%s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pTable
->
info
.
tableId
,
pTable
->
tid
,
pTable
->
uid
,
tstrerror
(
code
));
SSdb
Oper
desc
=
{.
type
=
SDB_OPER_GLOBAL
,
.
pObj
=
pTable
,
.
t
able
=
tsChildTableSdb
};
SSdb
Row
desc
=
{.
type
=
SDB_OPER_GLOBAL
,
.
pObj
=
pTable
,
.
pT
able
=
tsChildTableSdb
};
sdbDeleteRow
(
&
desc
);
return
code
;
}
...
...
@@ -1780,12 +1780,12 @@ static int32_t mnodeDoCreateChildTable(SMnodeMsg *pMsg, int32_t tid) {
pMsg
->
pTable
=
(
STableObj
*
)
pTable
;
mnodeIncTableRef
(
pMsg
->
pTable
);
SSdb
Oper
desc
=
{
SSdb
Row
desc
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
pObj
=
pTable
,
.
t
able
=
tsChildTableSdb
,
.
pT
able
=
tsChildTableSdb
,
.
pMsg
=
pMsg
,
.
reqFp
=
mnodeDoCreateChildTableFp
.
fpReq
=
mnodeDoCreateChildTableFp
};
int32_t
code
=
sdbInsertRow
(
&
desc
);
...
...
@@ -1901,15 +1901,15 @@ static int32_t mnodeProcessDropChildTableMsg(SMnodeMsg *pMsg) {
return
TSDB_CODE_MND_APP_ERROR
;
}
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsChildTableSdb
,
.
pT
able
=
tsChildTableSdb
,
.
pObj
=
pTable
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeDropChildTableCb
.
fpRsp
=
mnodeDropChildTableCb
};
int32_t
code
=
sdbDeleteRow
(
&
oper
);
int32_t
code
=
sdbDeleteRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"app:%p:%p, ctable:%s, failed to drop, reason:%s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pTable
->
info
.
tableId
,
tstrerror
(
code
));
...
...
@@ -2005,15 +2005,15 @@ static int32_t mnodeAddNormalTableColumn(SMnodeMsg *pMsg, SSchema schema[], int3
mInfo
(
"app:%p:%p, ctable %s, start to add column"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pTable
->
info
.
tableId
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsChildTableSdb
,
.
pT
able
=
tsChildTableSdb
,
.
pObj
=
pTable
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeAlterNormalTableColumnCb
.
fpRsp
=
mnodeAlterNormalTableColumnCb
};
return
sdbUpdateRow
(
&
oper
);
return
sdbUpdateRow
(
&
row
);
}
static
int32_t
mnodeDropNormalTableColumn
(
SMnodeMsg
*
pMsg
,
char
*
colName
)
{
...
...
@@ -2038,15 +2038,15 @@ static int32_t mnodeDropNormalTableColumn(SMnodeMsg *pMsg, char *colName) {
mInfo
(
"app:%p:%p, ctable %s, start to drop column %s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pTable
->
info
.
tableId
,
colName
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsChildTableSdb
,
.
pT
able
=
tsChildTableSdb
,
.
pObj
=
pTable
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeAlterNormalTableColumnCb
.
fpRsp
=
mnodeAlterNormalTableColumnCb
};
return
sdbUpdateRow
(
&
oper
);
return
sdbUpdateRow
(
&
row
);
}
static
int32_t
mnodeChangeNormalTableColumn
(
SMnodeMsg
*
pMsg
,
char
*
oldName
,
char
*
newName
)
{
...
...
@@ -2075,15 +2075,15 @@ static int32_t mnodeChangeNormalTableColumn(SMnodeMsg *pMsg, char *oldName, char
mInfo
(
"app:%p:%p, ctable %s, start to modify column %s to %s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pTable
->
info
.
tableId
,
oldName
,
newName
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsChildTableSdb
,
.
pT
able
=
tsChildTableSdb
,
.
pObj
=
pTable
,
.
pMsg
=
pMsg
,
.
writeCb
=
mnodeAlterNormalTableColumnCb
.
fpRsp
=
mnodeAlterNormalTableColumnCb
};
return
sdbUpdateRow
(
&
oper
);
return
sdbUpdateRow
(
&
row
);
}
static
int32_t
mnodeSetSchemaFromNormalTable
(
SSchema
*
pSchema
,
SCTableObj
*
pTable
)
{
...
...
@@ -2218,12 +2218,12 @@ void mnodeDropAllChildTablesInVgroups(SVgObj *pVgroup) {
if
(
pTable
==
NULL
)
break
;
if
(
pTable
->
vgId
==
pVgroup
->
vgId
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_LOCAL
,
.
t
able
=
tsChildTableSdb
,
.
pT
able
=
tsChildTableSdb
,
.
pObj
=
pTable
,
};
sdbDeleteRow
(
&
oper
);
sdbDeleteRow
(
&
row
);
numOfTables
++
;
}
mnodeDecTableRef
(
pTable
);
...
...
@@ -2251,12 +2251,12 @@ void mnodeDropAllChildTables(SDbObj *pDropDb) {
if
(
pTable
==
NULL
)
break
;
if
(
strncmp
(
prefix
,
pTable
->
info
.
tableId
,
prefixLen
)
==
0
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_LOCAL
,
.
t
able
=
tsChildTableSdb
,
.
pT
able
=
tsChildTableSdb
,
.
pObj
=
pTable
,
};
sdbDeleteRow
(
&
oper
);
sdbDeleteRow
(
&
row
);
numOfTables
++
;
}
mnodeDecTableRef
(
pTable
);
...
...
@@ -2280,12 +2280,12 @@ static void mnodeDropAllChildTablesInStable(SSTableObj *pStable) {
if
(
pTable
==
NULL
)
break
;
if
(
pTable
->
superTable
==
pStable
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_LOCAL
,
.
t
able
=
tsChildTableSdb
,
.
pT
able
=
tsChildTableSdb
,
.
pObj
=
pTable
,
};
sdbDeleteRow
(
&
oper
);
sdbDeleteRow
(
&
row
);
numOfTables
++
;
}
...
...
@@ -2410,15 +2410,15 @@ static void mnodeProcessCreateChildTableRsp(SRpcMsg *rpcMsg) {
}
if
(
rpcMsg
->
code
==
TSDB_CODE_SUCCESS
||
rpcMsg
->
code
==
TSDB_CODE_TDB_TABLE_ALREADY_EXIST
)
{
SSdb
Oper
desc
=
{
SSdb
Row
desc
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
pObj
=
pTable
,
.
t
able
=
tsChildTableSdb
,
.
pT
able
=
tsChildTableSdb
,
.
pMsg
=
mnodeMsg
,
.
writeCb
=
mnodeDoCreateChildTableCb
.
fpRsp
=
mnodeDoCreateChildTableCb
};
int32_t
code
=
sdbInsertRow
Imp
(
&
desc
);
int32_t
code
=
sdbInsertRow
ToQueue
(
&
desc
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mnodeMsg
->
pTable
=
NULL
;
mnodeDestroyChildTable
(
pTable
);
...
...
@@ -2440,8 +2440,8 @@ static void mnodeProcessCreateChildTableRsp(SRpcMsg *rpcMsg) {
mnodeMsg
->
rpcMsg
.
ahandle
,
mnodeMsg
,
pTable
->
info
.
tableId
,
pTable
->
vgId
,
pTable
->
tid
,
pTable
->
uid
,
tstrerror
(
rpcMsg
->
code
),
mnodeMsg
->
rpcMsg
.
handle
,
mnodeMsg
->
incomingTs
,
sec
,
mnodeMsg
->
retry
);
SSdb
Oper
oper
=
{.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsChildTableSdb
,
.
pObj
=
pTable
};
sdbDeleteRow
(
&
oper
);
SSdb
Row
row
=
{.
type
=
SDB_OPER_GLOBAL
,
.
pT
able
=
tsChildTableSdb
,
.
pObj
=
pTable
};
sdbDeleteRow
(
&
row
);
if
(
rpcMsg
->
code
==
TSDB_CODE_APP_NOT_READY
)
{
//Avoid retry again in client
...
...
src/mnode/src/mnodeUser.c
浏览文件 @
ea3aae75
...
...
@@ -42,13 +42,13 @@ static int32_t mnodeProcessAlterUserMsg(SMnodeMsg *pMsg);
static
int32_t
mnodeProcessDropUserMsg
(
SMnodeMsg
*
pMsg
);
static
int32_t
mnodeProcessAuthMsg
(
SMnodeMsg
*
pMsg
);
static
int32_t
mnodeUserActionDestroy
(
SSdb
Oper
*
pOper
)
{
tfree
(
p
Oper
->
pObj
);
static
int32_t
mnodeUserActionDestroy
(
SSdb
Row
*
pRow
)
{
tfree
(
p
Row
->
pObj
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeUserActionInsert
(
SSdb
Oper
*
pOper
)
{
SUserObj
*
pUser
=
p
Oper
->
pObj
;
static
int32_t
mnodeUserActionInsert
(
SSdb
Row
*
pRow
)
{
SUserObj
*
pUser
=
p
Row
->
pObj
;
SAcctObj
*
pAcct
=
mnodeGetAcct
(
pUser
->
acct
);
if
(
pAcct
!=
NULL
)
{
...
...
@@ -62,8 +62,8 @@ static int32_t mnodeUserActionInsert(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeUserActionDelete
(
SSdb
Oper
*
pOper
)
{
SUserObj
*
pUser
=
p
Oper
->
pObj
;
static
int32_t
mnodeUserActionDelete
(
SSdb
Row
*
pRow
)
{
SUserObj
*
pUser
=
p
Row
->
pObj
;
SAcctObj
*
pAcct
=
mnodeGetAcct
(
pUser
->
acct
);
if
(
pAcct
!=
NULL
)
{
...
...
@@ -74,8 +74,8 @@ static int32_t mnodeUserActionDelete(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeUserActionUpdate
(
SSdb
Oper
*
pOper
)
{
SUserObj
*
pUser
=
p
Oper
->
pObj
;
static
int32_t
mnodeUserActionUpdate
(
SSdb
Row
*
pRow
)
{
SUserObj
*
pUser
=
p
Row
->
pObj
;
SUserObj
*
pSaved
=
mnodeGetUser
(
pUser
->
user
);
if
(
pUser
!=
pSaved
)
{
memcpy
(
pSaved
,
pUser
,
tsUserUpdateSize
);
...
...
@@ -85,19 +85,19 @@ static int32_t mnodeUserActionUpdate(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeUserActionEncode
(
SSdb
Oper
*
pOper
)
{
SUserObj
*
pUser
=
p
Oper
->
pObj
;
memcpy
(
p
Oper
->
rowData
,
pUser
,
tsUserUpdateSize
);
p
Oper
->
rowSize
=
tsUserUpdateSize
;
static
int32_t
mnodeUserActionEncode
(
SSdb
Row
*
pRow
)
{
SUserObj
*
pUser
=
p
Row
->
pObj
;
memcpy
(
p
Row
->
rowData
,
pUser
,
tsUserUpdateSize
);
p
Row
->
rowSize
=
tsUserUpdateSize
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeUserActionDecode
(
SSdb
Oper
*
pOper
)
{
static
int32_t
mnodeUserActionDecode
(
SSdb
Row
*
pRow
)
{
SUserObj
*
pUser
=
(
SUserObj
*
)
calloc
(
1
,
sizeof
(
SUserObj
));
if
(
pUser
==
NULL
)
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
memcpy
(
pUser
,
p
Oper
->
rowData
,
tsUserUpdateSize
);
p
Oper
->
pObj
=
pUser
;
memcpy
(
pUser
,
p
Row
->
rowData
,
tsUserUpdateSize
);
p
Row
->
pObj
=
pUser
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -150,25 +150,25 @@ int32_t mnodeInitUsers() {
SUserObj
tObj
;
tsUserUpdateSize
=
(
int8_t
*
)
tObj
.
updateEnd
-
(
int8_t
*
)
&
tObj
;
SSdbTableDesc
tableD
esc
=
{
.
tableId
=
SDB_TABLE_USER
,
.
tableName
=
"users"
,
SSdbTableDesc
d
esc
=
{
.
id
=
SDB_TABLE_USER
,
.
name
=
"users"
,
.
hashSessions
=
TSDB_DEFAULT_USERS_HASH_SIZE
,
.
maxRowSize
=
tsUserUpdateSize
,
.
refCountPos
=
(
int8_t
*
)(
&
tObj
.
refCount
)
-
(
int8_t
*
)
&
tObj
,
.
keyType
=
SDB_KEY_STRING
,
.
insertFp
=
mnodeUserActionInsert
,
.
deleteFp
=
mnodeUserActionDelete
,
.
updateFp
=
mnodeUserActionUpdate
,
.
encodeFp
=
mnodeUserActionEncode
,
.
decodeFp
=
mnodeUserActionDecode
,
.
destroyFp
=
mnodeUserActionDestroy
,
.
restoredFp
=
mnodeUserActionRestored
.
fpInsert
=
mnodeUserActionInsert
,
.
fpDelete
=
mnodeUserActionDelete
,
.
fpUpdate
=
mnodeUserActionUpdate
,
.
fpEncode
=
mnodeUserActionEncode
,
.
fpDecode
=
mnodeUserActionDecode
,
.
fpDestroy
=
mnodeUserActionDestroy
,
.
fpRestored
=
mnodeUserActionRestored
};
tsUserSdb
=
sdbOpenTable
(
&
tableD
esc
);
tsUserSdb
=
sdbOpenTable
(
&
d
esc
);
if
(
tsUserSdb
==
NULL
)
{
mError
(
"table:%s, failed to create hash"
,
tableDesc
.
tableN
ame
);
mError
(
"table:%s, failed to create hash"
,
desc
.
n
ame
);
return
-
1
;
}
...
...
@@ -179,7 +179,7 @@ int32_t mnodeInitUsers() {
mnodeAddShowRetrieveHandle
(
TSDB_MGMT_TABLE_USER
,
mnodeRetrieveUsers
);
mnodeAddPeerMsgHandle
(
TSDB_MSG_TYPE_DM_AUTH
,
mnodeProcessAuthMsg
);
mDebug
(
"table:%s, hash is created"
,
tableDesc
.
tableN
ame
);
mDebug
(
"table:%s, hash is created"
,
desc
.
n
ame
);
return
0
;
}
...
...
@@ -205,14 +205,14 @@ void mnodeDecUserRef(SUserObj *pUser) {
}
static
int32_t
mnodeUpdateUser
(
SUserObj
*
pUser
,
void
*
pMsg
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsUserSdb
,
.
pT
able
=
tsUserSdb
,
.
pObj
=
pUser
,
.
pMsg
=
pMsg
};
int32_t
code
=
sdbUpdateRow
(
&
oper
);
int32_t
code
=
sdbUpdateRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"user:%s, failed to alter by %s, reason:%s"
,
pUser
->
user
,
mnodeGetUserFromMsg
(
pMsg
),
tstrerror
(
code
));
}
else
{
...
...
@@ -259,15 +259,15 @@ int32_t mnodeCreateUser(SAcctObj *pAcct, char *name, char *pass, void *pMsg) {
pUser
->
superAuth
=
1
;
}
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsUserSdb
,
.
pT
able
=
tsUserSdb
,
.
pObj
=
pUser
,
.
rowSize
=
sizeof
(
SUserObj
),
.
pMsg
=
pMsg
};
code
=
sdbInsertRow
(
&
oper
);
code
=
sdbInsertRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"user:%s, failed to create by %s, reason:%s"
,
pUser
->
user
,
mnodeGetUserFromMsg
(
pMsg
),
tstrerror
(
code
));
tfree
(
pUser
);
...
...
@@ -279,14 +279,14 @@ int32_t mnodeCreateUser(SAcctObj *pAcct, char *name, char *pass, void *pMsg) {
}
static
int32_t
mnodeDropUser
(
SUserObj
*
pUser
,
void
*
pMsg
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsUserSdb
,
.
pT
able
=
tsUserSdb
,
.
pObj
=
pUser
,
.
pMsg
=
pMsg
};
int32_t
code
=
sdbDeleteRow
(
&
oper
);
int32_t
code
=
sdbDeleteRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"user:%s, failed to drop by %s, reason:%s"
,
pUser
->
user
,
mnodeGetUserFromMsg
(
pMsg
),
tstrerror
(
code
));
}
else
{
...
...
@@ -562,12 +562,12 @@ void mnodeDropAllUsers(SAcctObj *pAcct) {
if
(
pUser
==
NULL
)
break
;
if
(
strncmp
(
pUser
->
acct
,
pAcct
->
user
,
acctNameLen
)
==
0
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_LOCAL
,
.
t
able
=
tsUserSdb
,
.
pT
able
=
tsUserSdb
,
.
pObj
=
pUser
,
};
sdbDeleteRow
(
&
oper
);
sdbDeleteRow
(
&
row
);
numOfUsers
++
;
}
...
...
src/mnode/src/mnodeVgroup.c
浏览文件 @
ea3aae75
...
...
@@ -72,13 +72,13 @@ static void mnodeDestroyVgroup(SVgObj *pVgroup) {
tfree
(
pVgroup
);
}
static
int32_t
mnodeVgroupActionDestroy
(
SSdb
Oper
*
pOper
)
{
mnodeDestroyVgroup
(
p
Oper
->
pObj
);
static
int32_t
mnodeVgroupActionDestroy
(
SSdb
Row
*
pRow
)
{
mnodeDestroyVgroup
(
p
Row
->
pObj
);
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeVgroupActionInsert
(
SSdb
Oper
*
pOper
)
{
SVgObj
*
pVgroup
=
p
Oper
->
pObj
;
static
int32_t
mnodeVgroupActionInsert
(
SSdb
Row
*
pRow
)
{
SVgObj
*
pVgroup
=
p
Row
->
pObj
;
// refer to db
SDbObj
*
pDb
=
mnodeGetDb
(
pVgroup
->
dbName
);
...
...
@@ -115,8 +115,8 @@ static int32_t mnodeVgroupActionInsert(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeVgroupActionDelete
(
SSdb
Oper
*
pOper
)
{
SVgObj
*
pVgroup
=
p
Oper
->
pObj
;
static
int32_t
mnodeVgroupActionDelete
(
SSdb
Row
*
pRow
)
{
SVgObj
*
pVgroup
=
p
Row
->
pObj
;
if
(
pVgroup
->
pDb
==
NULL
)
{
mError
(
"vgId:%d, db:%s is not exist while insert into hash"
,
pVgroup
->
vgId
,
pVgroup
->
dbName
);
...
...
@@ -137,8 +137,8 @@ static int32_t mnodeVgroupActionDelete(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeVgroupActionUpdate
(
SSdb
Oper
*
pOper
)
{
SVgObj
*
pNew
=
p
Oper
->
pObj
;
static
int32_t
mnodeVgroupActionUpdate
(
SSdb
Row
*
pRow
)
{
SVgObj
*
pNew
=
p
Row
->
pObj
;
SVgObj
*
pVgroup
=
mnodeGetVgroup
(
pNew
->
vgId
);
if
(
pVgroup
!=
pNew
)
{
...
...
@@ -176,25 +176,25 @@ static int32_t mnodeVgroupActionUpdate(SSdbOper *pOper) {
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeVgroupActionEncode
(
SSdb
Oper
*
pOper
)
{
SVgObj
*
pVgroup
=
p
Oper
->
pObj
;
memcpy
(
p
Oper
->
rowData
,
pVgroup
,
tsVgUpdateSize
);
SVgObj
*
pTmpVgroup
=
p
Oper
->
rowData
;
static
int32_t
mnodeVgroupActionEncode
(
SSdb
Row
*
pRow
)
{
SVgObj
*
pVgroup
=
p
Row
->
pObj
;
memcpy
(
p
Row
->
rowData
,
pVgroup
,
tsVgUpdateSize
);
SVgObj
*
pTmpVgroup
=
p
Row
->
rowData
;
for
(
int32_t
i
=
0
;
i
<
TSDB_MAX_REPLICA
;
++
i
)
{
pTmpVgroup
->
vnodeGid
[
i
].
pDnode
=
NULL
;
pTmpVgroup
->
vnodeGid
[
i
].
role
=
0
;
}
p
Oper
->
rowSize
=
tsVgUpdateSize
;
p
Row
->
rowSize
=
tsVgUpdateSize
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
mnodeVgroupActionDecode
(
SSdb
Oper
*
pOper
)
{
static
int32_t
mnodeVgroupActionDecode
(
SSdb
Row
*
pRow
)
{
SVgObj
*
pVgroup
=
(
SVgObj
*
)
calloc
(
1
,
sizeof
(
SVgObj
));
if
(
pVgroup
==
NULL
)
return
TSDB_CODE_MND_OUT_OF_MEMORY
;
memcpy
(
pVgroup
,
p
Oper
->
rowData
,
tsVgUpdateSize
);
p
Oper
->
pObj
=
pVgroup
;
memcpy
(
pVgroup
,
p
Row
->
rowData
,
tsVgUpdateSize
);
p
Row
->
pObj
=
pVgroup
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -206,23 +206,23 @@ int32_t mnodeInitVgroups() {
SVgObj
tObj
;
tsVgUpdateSize
=
(
int8_t
*
)
tObj
.
updateEnd
-
(
int8_t
*
)
&
tObj
;
SSdbTableDesc
tableD
esc
=
{
.
tableId
=
SDB_TABLE_VGROUP
,
.
tableName
=
"vgroups"
,
SSdbTableDesc
d
esc
=
{
.
id
=
SDB_TABLE_VGROUP
,
.
name
=
"vgroups"
,
.
hashSessions
=
TSDB_DEFAULT_VGROUPS_HASH_SIZE
,
.
maxRowSize
=
tsVgUpdateSize
,
.
refCountPos
=
(
int8_t
*
)(
&
tObj
.
refCount
)
-
(
int8_t
*
)
&
tObj
,
.
keyType
=
SDB_KEY_AUTO
,
.
insertFp
=
mnodeVgroupActionInsert
,
.
deleteFp
=
mnodeVgroupActionDelete
,
.
updateFp
=
mnodeVgroupActionUpdate
,
.
encodeFp
=
mnodeVgroupActionEncode
,
.
decodeFp
=
mnodeVgroupActionDecode
,
.
destroyFp
=
mnodeVgroupActionDestroy
,
.
restoredFp
=
mnodeVgroupActionRestored
,
.
fpInsert
=
mnodeVgroupActionInsert
,
.
fpDelete
=
mnodeVgroupActionDelete
,
.
fpUpdate
=
mnodeVgroupActionUpdate
,
.
fpEncode
=
mnodeVgroupActionEncode
,
.
fpDecode
=
mnodeVgroupActionDecode
,
.
fpDestroy
=
mnodeVgroupActionDestroy
,
.
fpRestored
=
mnodeVgroupActionRestored
,
};
tsVgroupSdb
=
sdbOpenTable
(
&
tableD
esc
);
tsVgroupSdb
=
sdbOpenTable
(
&
d
esc
);
if
(
tsVgroupSdb
==
NULL
)
{
mError
(
"failed to init vgroups data"
);
return
-
1
;
...
...
@@ -253,13 +253,13 @@ SVgObj *mnodeGetVgroup(int32_t vgId) {
}
void
mnodeUpdateVgroup
(
SVgObj
*
pVgroup
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsVgroupSdb
,
.
pT
able
=
tsVgroupSdb
,
.
pObj
=
pVgroup
};
int32_t
code
=
sdbUpdateRow
(
&
oper
);
int32_t
code
=
sdbUpdateRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mError
(
"vgId:%d, failed to update vgroup"
,
pVgroup
->
vgId
);
}
...
...
@@ -519,14 +519,14 @@ static int32_t mnodeCreateVgroupCb(SMnodeMsg *pMsg, int32_t code) {
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
mError
(
"app:%p:%p, vgId:%d, failed to create in sdb, reason:%s"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pVgroup
->
vgId
,
tstrerror
(
code
));
SSdb
Oper
desc
=
{.
type
=
SDB_OPER_GLOBAL
,
.
pObj
=
pVgroup
,
.
t
able
=
tsVgroupSdb
};
SSdb
Row
desc
=
{.
type
=
SDB_OPER_GLOBAL
,
.
pObj
=
pVgroup
,
.
pT
able
=
tsVgroupSdb
};
sdbDeleteRow
(
&
desc
);
return
code
;
}
else
{
mInfo
(
"app:%p:%p, vgId:%d, is created in sdb, db:%s replica:%d"
,
pMsg
->
rpcMsg
.
ahandle
,
pMsg
,
pVgroup
->
vgId
,
pDb
->
name
,
pVgroup
->
numOfVnodes
);
pVgroup
->
status
=
TAOS_VG_STATUS_READY
;
SSdb
Oper
desc
=
{.
type
=
SDB_OPER_GLOBAL
,
.
pObj
=
pVgroup
,
.
t
able
=
tsVgroupSdb
};
SSdb
Row
desc
=
{.
type
=
SDB_OPER_GLOBAL
,
.
pObj
=
pVgroup
,
.
pT
able
=
tsVgroupSdb
};
(
void
)
sdbUpdateRow
(
&
desc
);
dnodeReprocessMWriteMsg
(
pMsg
);
...
...
@@ -535,7 +535,7 @@ static int32_t mnodeCreateVgroupCb(SMnodeMsg *pMsg, int32_t code) {
// mInfo("app:%p:%p, vgId:%d, is created in sdb, db:%s replica:%d", pMsg->rpcMsg.ahandle, pMsg, pVgroup->vgId,
// pDb->name, pVgroup->numOfVnodes);
// pVgroup->status = TAOS_VG_STATUS_READY;
// SSdb
Oper desc = {.type = SDB_OPER_GLOBAL, .pObj = pVgroup, .t
able = tsVgroupSdb};
// SSdb
Row desc = {.type = SDB_OPER_GLOBAL, .pObj = pVgroup, .pT
able = tsVgroupSdb};
// (void)sdbUpdateRow(&desc);
// dnodeReprocessMWriteMsg(pMsg);
// return TSDB_CODE_MND_ACTION_IN_PROGRESS;
...
...
@@ -571,16 +571,16 @@ int32_t mnodeCreateVgroup(SMnodeMsg *pMsg) {
pMsg
->
pVgroup
=
pVgroup
;
mnodeIncVgroupRef
(
pVgroup
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsVgroupSdb
,
.
pT
able
=
tsVgroupSdb
,
.
pObj
=
pVgroup
,
.
rowSize
=
sizeof
(
SVgObj
),
.
pMsg
=
pMsg
,
.
reqFp
=
mnodeCreateVgroupFp
.
fpReq
=
mnodeCreateVgroupFp
};
code
=
sdbInsertRow
(
&
oper
);
code
=
sdbInsertRow
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
pMsg
->
pVgroup
=
NULL
;
mnodeDestroyVgroup
(
pVgroup
);
...
...
@@ -595,12 +595,12 @@ void mnodeDropVgroup(SVgObj *pVgroup, void *ahandle) {
}
else
{
mDebug
(
"vgId:%d, replica:%d is deleting from sdb"
,
pVgroup
->
vgId
,
pVgroup
->
numOfVnodes
);
mnodeSendDropVgroupMsg
(
pVgroup
,
NULL
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsVgroupSdb
,
.
pT
able
=
tsVgroupSdb
,
.
pObj
=
pVgroup
};
sdbDeleteRow
(
&
oper
);
sdbDeleteRow
(
&
row
);
}
}
...
...
@@ -770,7 +770,7 @@ static int32_t mnodeRetrieveVgroups(SShowObj *pShow, char *data, int32_t rows, v
SDnodeObj
*
pDnode
=
pVgroup
->
vnodeGid
[
i
].
pDnode
;
const
char
*
role
=
"NULL"
;
if
(
pDnode
!=
NULL
)
{
role
=
mnodeGetMnodeRoleStr
(
pVgroup
->
vnodeGid
[
i
].
role
)
;
role
=
syncRole
[
pVgroup
->
vnodeGid
[
i
].
role
]
;
}
pWrite
=
data
+
pShow
->
offset
[
cols
]
*
rows
+
pShow
->
bytes
[
cols
]
*
numOfRows
;
...
...
@@ -957,28 +957,28 @@ static void mnodeProcessCreateVnodeRsp(SRpcMsg *rpcMsg) {
if
(
mnodeMsg
->
received
!=
mnodeMsg
->
expected
)
return
;
if
(
mnodeMsg
->
received
==
mnodeMsg
->
successed
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
table
=
tsVgroupSdb
,
.
pTable
=
tsVgroupSdb
,
.
pObj
=
pVgroup
,
.
rowSize
=
sizeof
(
SVgObj
),
.
pMsg
=
mnodeMsg
,
.
writeCb
=
mnodeCreateVgroupCb
.
fpRsp
=
mnodeCreateVgroupCb
};
int32_t
code
=
sdbInsertRow
Imp
(
&
oper
);
int32_t
code
=
sdbInsertRow
ToQueue
(
&
row
);
if
(
code
!=
TSDB_CODE_SUCCESS
&&
code
!=
TSDB_CODE_MND_ACTION_IN_PROGRESS
)
{
mnodeMsg
->
pVgroup
=
NULL
;
mnodeDestroyVgroup
(
pVgroup
);
dnodeSendRpcMWriteRsp
(
mnodeMsg
,
code
);
}
}
else
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsVgroupSdb
,
.
pT
able
=
tsVgroupSdb
,
.
pObj
=
pVgroup
};
sdbDeleteRow
(
&
oper
);
sdbDeleteRow
(
&
row
);
dnodeSendRpcMWriteRsp
(
mnodeMsg
,
mnodeMsg
->
code
);
}
}
...
...
@@ -1031,12 +1031,12 @@ static void mnodeProcessDropVnodeRsp(SRpcMsg *rpcMsg) {
if
(
mnodeMsg
->
received
!=
mnodeMsg
->
expected
)
return
;
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_GLOBAL
,
.
t
able
=
tsVgroupSdb
,
.
pT
able
=
tsVgroupSdb
,
.
pObj
=
pVgroup
};
int32_t
code
=
sdbDeleteRow
(
&
oper
);
int32_t
code
=
sdbDeleteRow
(
&
row
);
if
(
code
!=
0
)
{
code
=
TSDB_CODE_MND_SDB_ERROR
;
}
...
...
@@ -1084,12 +1084,12 @@ void mnodeDropAllDnodeVgroups(SDnodeObj *pDropDnode) {
if
(
pVgroup
->
vnodeGid
[
0
].
dnodeId
==
pDropDnode
->
dnodeId
)
{
mnodeDropAllChildTablesInVgroups
(
pVgroup
);
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_LOCAL
,
.
t
able
=
tsVgroupSdb
,
.
pT
able
=
tsVgroupSdb
,
.
pObj
=
pVgroup
,
};
sdbDeleteRow
(
&
oper
);
sdbDeleteRow
(
&
row
);
numOfVgroups
++
;
}
mnodeDecVgroupRef
(
pVgroup
);
...
...
@@ -1135,12 +1135,12 @@ void mnodeDropAllDbVgroups(SDbObj *pDropDb) {
if
(
pVgroup
==
NULL
)
break
;
if
(
pVgroup
->
pDb
==
pDropDb
)
{
SSdb
Oper
oper
=
{
SSdb
Row
row
=
{
.
type
=
SDB_OPER_LOCAL
,
.
t
able
=
tsVgroupSdb
,
.
pT
able
=
tsVgroupSdb
,
.
pObj
=
pVgroup
,
};
sdbDeleteRow
(
&
oper
);
sdbDeleteRow
(
&
row
);
numOfVgroups
++
;
}
...
...
src/plugins/http/inc/httpInt.h
浏览文件 @
ea3aae75
...
...
@@ -118,7 +118,7 @@ typedef struct {
typedef
struct
{
char
*
module
;
bool
(
*
decodeFp
)(
struct
HttpContext
*
pContext
);
bool
(
*
fpDecode
)(
struct
HttpContext
*
pContext
);
}
HttpDecodeMethod
;
typedef
struct
{
...
...
src/plugins/http/src/httpHandle.c
浏览文件 @
ea3aae75
...
...
@@ -21,11 +21,11 @@
#include "httpHandle.h"
bool
httpDecodeRequest
(
HttpContext
*
pContext
)
{
if
(
pContext
->
decodeMethod
->
decodeFp
==
NULL
)
{
if
(
pContext
->
decodeMethod
->
fpDecode
==
NULL
)
{
return
false
;
}
return
(
*
pContext
->
decodeMethod
->
decodeFp
)(
pContext
);
return
(
*
pContext
->
decodeMethod
->
fpDecode
)(
pContext
);
}
/**
...
...
src/sync/inc/syncInt.h
浏览文件 @
ea3aae75
...
...
@@ -27,16 +27,20 @@ extern "C" {
#define sDebug(...) { if (sDebugFlag & DEBUG_DEBUG) { taosPrintLog("SYN ", sDebugFlag, __VA_ARGS__); }}
#define sTrace(...) { if (sDebugFlag & DEBUG_TRACE) { taosPrintLog("SYN ", sDebugFlag, __VA_ARGS__); }}
#define TAOS_SMSG_SYNC_DATA 1
#define TAOS_SMSG_FORWARD 2
#define TAOS_SMSG_FORWARD_RSP 3
#define TAOS_SMSG_SYNC_REQ 4
#define TAOS_SMSG_SYNC_RSP 5
#define TAOS_SMSG_SYNC_MUST 6
#define TAOS_SMSG_STATUS 7
typedef
enum
{
TAOS_SMSG_SYNC_DATA
=
1
,
TAOS_SMSG_FORWARD
=
2
,
TAOS_SMSG_FORWARD_RSP
=
3
,
TAOS_SMSG_SYNC_REQ
=
4
,
TAOS_SMSG_SYNC_RSP
=
5
,
TAOS_SMSG_SYNC_MUST
=
6
,
TAOS_SMSG_STATUS
=
7
}
ESyncMsgType
;
#define SYNC_MAX_SIZE (TSDB_MAX_WAL_SIZE + sizeof(SWalHead) + sizeof(SSyncHead) + 16)
#define SYNC_RECV_BUFFER_SIZE (5*1024*1024)
#define SYNC_FWD_TIMER 300
#define SYNC_ROLE_TIMER 10000
#define nodeRole pNode->peerInfo[pNode->selfIndex]->role
#define nodeVersion pNode->peerInfo[pNode->selfIndex]->version
...
...
@@ -68,6 +72,9 @@ typedef struct {
typedef
struct
{
int8_t
role
;
int8_t
ack
;
int8_t
type
;
int8_t
reserved
[
3
];
uint16_t
tranId
;
uint64_t
version
;
SPeerStatus
peersStatus
[];
}
SPeersStatus
;
...
...
@@ -120,10 +127,10 @@ typedef struct SsyncPeer {
int32_t
nodeId
;
uint32_t
ip
;
uint16_t
port
;
char
fqdn
[
TSDB_FQDN_LEN
];
// peer ip string
char
id
[
TSDB_EP_LEN
+
32
];
// peer vgId + end point
int8_t
role
;
int8_t
sstatus
;
// sync status
char
fqdn
[
TSDB_FQDN_LEN
];
// peer ip string
char
id
[
TSDB_EP_LEN
+
32
];
// peer vgId + end point
uint64_t
version
;
uint64_t
sversion
;
// track the peer version in retrieve process
int32_t
syncFd
;
...
...
@@ -135,7 +142,7 @@ typedef struct SsyncPeer {
int32_t
notifyFd
;
int32_t
watchNum
;
int32_t
*
watchFd
;
int
8_t
refCount
;
// reference count
int
32_t
refCount
;
// reference count
struct
SSyncNode
*
pSyncNode
;
}
SSyncPeer
;
...
...
@@ -143,16 +150,16 @@ typedef struct SSyncNode {
char
path
[
TSDB_FILENAME_LEN
];
int8_t
replica
;
int8_t
quorum
;
int8_t
selfIndex
;
uint32_t
vgId
;
int64_t
rid
;
void
*
ahandle
;
int8_t
selfIndex
;
SSyncPeer
*
peerInfo
[
TAOS_SYNC_MAX_REPLICA
+
1
];
// extra one for arbitrator
SSyncPeer
*
pMaster
;
int8_t
refCount
;
SRecvBuffer
*
pRecv
;
SSyncFwds
*
pSyncFwds
;
// saved forward info if quorum >1
void
*
pFwdTimer
;
void
*
pRoleTimer
;
FGetFileInfo
getFileInfo
;
FGetWalInfo
getWalInfo
;
FWriteToCache
writeToCache
;
...
...
src/sync/src/syncMain.c
浏览文件 @
ea3aae75
...
...
@@ -50,7 +50,7 @@ static int32_t tsSyncRefId = -1;
static
void
syncProcessSyncRequest
(
char
*
pMsg
,
SSyncPeer
*
pPeer
);
static
void
syncRecoverFromMaster
(
SSyncPeer
*
pPeer
);
static
void
syncCheckPeerConnection
(
void
*
param
,
void
*
tmrId
);
static
void
syncSendPeersStatusMsgToPeer
(
SSyncPeer
*
pPeer
,
char
ack
);
static
void
syncSendPeersStatusMsgToPeer
(
SSyncPeer
*
pPeer
,
char
ack
,
int8_t
type
,
uint16_t
tranId
);
static
void
syncProcessBrokenLink
(
void
*
param
);
static
int32_t
syncProcessPeerMsg
(
void
*
param
,
void
*
buffer
);
static
void
syncProcessIncommingConnection
(
int32_t
connFd
,
uint32_t
sourceIp
);
...
...
@@ -59,6 +59,7 @@ static void syncAddArbitrator(SSyncNode *pNode);
static
void
syncFreeNode
(
void
*
);
static
void
syncRemoveConfirmedFwdInfo
(
SSyncNode
*
pNode
);
static
void
syncMonitorFwdInfos
(
void
*
param
,
void
*
tmrId
);
static
void
syncMonitorNodeRole
(
void
*
param
,
void
*
tmrId
);
static
void
syncProcessFwdAck
(
SSyncNode
*
pNode
,
SFwdInfo
*
pFwdInfo
,
int32_t
code
);
static
void
syncSaveFwdInfo
(
SSyncNode
*
pNode
,
uint64_t
version
,
void
*
mhandle
);
static
void
syncRestartPeer
(
SSyncPeer
*
pPeer
);
...
...
@@ -73,6 +74,32 @@ char* syncRole[] = {
"master"
};
typedef
enum
{
SYNC_STATUS_BROADCAST
,
SYNC_STATUS_BROADCAST_RSP
,
SYNC_STATUS_SETUP_CONN
,
SYNC_STATUS_SETUP_CONN_RSP
,
SYNC_STATUS_EXCHANGE_DATA
,
SYNC_STATUS_EXCHANGE_DATA_RSP
,
SYNC_STATUS_CHECK_ROLE
,
SYNC_STATUS_CHECK_ROLE_RSP
}
ESyncStatusType
;
char
*
statusType
[]
=
{
"broadcast"
,
"broadcast-rsp"
,
"setup-conn"
,
"setup-conn-rsp"
,
"exchange-data"
,
"exchange-data-rsp"
,
"check-role"
,
"check-role-rsp"
};
uint16_t
syncGenTranId
()
{
return
taosRand
()
&
0XFFFF
;
}
int32_t
syncInit
()
{
SPoolInfo
info
;
...
...
@@ -145,7 +172,7 @@ void syncCleanUp() {
int64_t
syncStart
(
const
SSyncInfo
*
pInfo
)
{
const
SSyncCfg
*
pCfg
=
&
pInfo
->
syncCfg
;
SSyncNode
*
pNode
=
(
SSyncNode
*
)
calloc
(
sizeof
(
SSyncNode
),
1
);
SSyncNode
*
pNode
=
calloc
(
sizeof
(
SSyncNode
),
1
);
if
(
pNode
==
NULL
)
{
sError
(
"no memory to allocate syncNode"
);
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
...
...
@@ -180,8 +207,8 @@ int64_t syncStart(const SSyncInfo *pInfo) {
const
SNodeInfo
*
pNodeInfo
=
pCfg
->
nodeInfo
+
i
;
pNode
->
peerInfo
[
i
]
=
syncAddPeer
(
pNode
,
pNodeInfo
);
if
(
pNode
->
peerInfo
[
i
]
==
NULL
)
{
sError
(
"vgId:%d, node:%d fqdn:%s port:%u is not configured, stop taosd"
,
pNode
->
vgId
,
pNodeInfo
->
nodeId
,
pNodeInfo
->
nodeFqdn
,
pNodeInfo
->
nodePort
);
sError
(
"vgId:%d, node:%d fqdn:%s port:%u is not configured, stop taosd"
,
pNode
->
vgId
,
pNodeInfo
->
nodeId
,
pNodeInfo
->
node
Fqdn
,
pNodeInfo
->
node
Port
);
syncStop
(
pNode
->
rid
);
exit
(
1
);
}
...
...
@@ -211,9 +238,16 @@ int64_t syncStart(const SSyncInfo *pInfo) {
return
-
1
;
}
pNode
->
pFwdTimer
=
taosTmrStart
(
syncMonitorFwdInfos
,
300
,
(
void
*
)
pNode
->
rid
,
tsSyncTmrCtrl
);
pNode
->
pFwdTimer
=
taosTmrStart
(
syncMonitorFwdInfos
,
SYNC_FWD_TIMER
,
(
void
*
)
pNode
->
rid
,
tsSyncTmrCtrl
);
if
(
pNode
->
pFwdTimer
==
NULL
)
{
sError
(
"vgId:%d, failed to allocate timer"
,
pNode
->
vgId
);
sError
(
"vgId:%d, failed to allocate fwd timer"
,
pNode
->
vgId
);
syncStop
(
pNode
->
rid
);
return
-
1
;
}
pNode
->
pRoleTimer
=
taosTmrStart
(
syncMonitorNodeRole
,
SYNC_ROLE_TIMER
,
(
void
*
)
pNode
->
rid
,
tsSyncTmrCtrl
);
if
(
pNode
->
pRoleTimer
==
NULL
)
{
sError
(
"vgId:%d, failed to allocate role timer"
,
pNode
->
vgId
);
syncStop
(
pNode
->
rid
);
return
-
1
;
}
...
...
@@ -240,6 +274,7 @@ void syncStop(int64_t rid) {
if
(
tsVgIdHash
)
taosHashRemove
(
tsVgIdHash
,
(
const
char
*
)
&
pNode
->
vgId
,
sizeof
(
int32_t
));
if
(
pNode
->
pFwdTimer
)
taosTmrStop
(
pNode
->
pFwdTimer
);
if
(
pNode
->
pRoleTimer
)
taosTmrStop
(
pNode
->
pRoleTimer
);
for
(
int32_t
i
=
0
;
i
<
pNode
->
replica
;
++
i
)
{
pPeer
=
pNode
->
peerInfo
[
i
];
...
...
@@ -319,12 +354,10 @@ int32_t syncReconfig(int64_t rid, const SSyncCfg *pNewCfg) {
pthread_mutex_unlock
(
&
(
pNode
->
mutex
));
sInfo
(
"vgId:%d, %d replicas are configured, quorum:%d role:%s"
,
pNode
->
vgId
,
pNode
->
replica
,
pNode
->
quorum
,
syncRole
[
nodeRole
]);
sInfo
(
"vgId:%d, %d replicas are configured, quorum:%d"
,
pNode
->
vgId
,
pNode
->
replica
,
pNode
->
quorum
);
syncBroadcastStatus
(
pNode
);
taosReleaseRef
(
tsSyncRefId
,
rid
);
return
0
;
}
...
...
@@ -356,7 +389,7 @@ void syncConfirmForward(int64_t rid, uint64_t version, int32_t code) {
pFwdRsp
->
code
=
code
;
int32_t
msgLen
=
sizeof
(
SSyncHead
)
+
sizeof
(
SFwdRsp
);
int32_t
retLen
=
write
(
pPeer
->
peerFd
,
msg
,
msgLen
);
int32_t
retLen
=
taosWriteMsg
(
pPeer
->
peerFd
,
msg
,
msgLen
);
if
(
retLen
==
msgLen
)
{
sDebug
(
"%s, forward-rsp is sent, code:%x hver:%"
PRIu64
,
pPeer
->
id
,
code
,
version
);
...
...
@@ -369,6 +402,7 @@ void syncConfirmForward(int64_t rid, uint64_t version, int32_t code) {
taosReleaseRef
(
tsSyncRefId
,
rid
);
}
#if 0
void syncRecover(int64_t rid) {
SSyncPeer *pPeer;
...
...
@@ -385,7 +419,7 @@ void syncRecover(int64_t rid) {
pthread_mutex_lock(&(pNode->mutex));
for (int32_t i = 0; i < pNode->replica; ++i) {
pPeer
=
(
SSyncPeer
*
)
pNode
->
peerInfo
[
i
];
pPeer = pNode->peerInfo[i];
if (pPeer->peerFd >= 0) {
syncRestartConnection(pPeer);
}
...
...
@@ -395,6 +429,7 @@ void syncRecover(int64_t rid) {
taosReleaseRef(tsSyncRefId, rid);
}
#endif
int32_t
syncGetNodesRole
(
int64_t
rid
,
SNodesRole
*
pNodesRole
)
{
SSyncNode
*
pNode
=
taosAcquireRef
(
tsSyncRefId
,
rid
);
...
...
@@ -449,10 +484,10 @@ static void syncFreeNode(void *param) {
tfree
(
pNode
);
}
void
syncAddPeerRef
(
SSyncPeer
*
pPeer
)
{
atomic_add_fetch_
8
(
&
pPeer
->
refCount
,
1
);
}
void
syncAddPeerRef
(
SSyncPeer
*
pPeer
)
{
atomic_add_fetch_
32
(
&
pPeer
->
refCount
,
1
);
}
int32_t
syncDecPeerRef
(
SSyncPeer
*
pPeer
)
{
if
(
atomic_sub_fetch_
8
(
&
pPeer
->
refCount
,
1
)
==
0
)
{
if
(
atomic_sub_fetch_
32
(
&
pPeer
->
refCount
,
1
)
==
0
)
{
taosReleaseRef
(
tsSyncRefId
,
pPeer
->
pSyncNode
->
rid
);
sDebug
(
"%s, resource is freed"
,
pPeer
->
id
);
...
...
@@ -510,7 +545,7 @@ static SSyncPeer *syncAddPeer(SSyncNode *pNode, const SNodeInfo *pInfo) {
if
(
pPeer
->
nodeId
==
0
||
(
ret
>
0
)
||
(
ret
==
0
&&
pPeer
->
port
>
tsSyncPort
))
{
int32_t
checkMs
=
100
+
(
pNode
->
vgId
*
10
)
%
100
;
if
(
pNode
->
vgId
>
1
)
checkMs
=
tsStatusInterval
*
1000
+
checkMs
;
sDebug
(
"%s,
start to
check peer connection after %d ms"
,
pPeer
->
id
,
checkMs
);
sDebug
(
"%s, check peer connection after %d ms"
,
pPeer
->
id
,
checkMs
);
taosTmrReset
(
syncCheckPeerConnection
,
checkMs
,
pPeer
,
tsSyncTmrCtrl
,
&
pPeer
->
timer
);
}
...
...
@@ -524,7 +559,7 @@ void syncBroadcastStatus(SSyncNode *pNode) {
for
(
int32_t
i
=
0
;
i
<
pNode
->
replica
;
++
i
)
{
if
(
i
==
pNode
->
selfIndex
)
continue
;
pPeer
=
pNode
->
peerInfo
[
i
];
syncSendPeersStatusMsgToPeer
(
pPeer
,
1
);
syncSendPeersStatusMsgToPeer
(
pPeer
,
1
,
SYNC_STATUS_BROADCAST
,
syncGenTranId
()
);
}
}
...
...
@@ -544,8 +579,6 @@ static void syncChooseMaster(SSyncNode *pNode) {
int32_t
index
=
-
1
;
int32_t
replica
=
pNode
->
replica
;
sDebug
(
"vgId:%d, choose master"
,
pNode
->
vgId
);
for
(
int32_t
i
=
0
;
i
<
pNode
->
replica
;
++
i
)
{
if
(
pNode
->
peerInfo
[
i
]
->
role
!=
TAOS_SYNC_ROLE_OFFLINE
)
{
onlineNum
++
;
...
...
@@ -611,11 +644,11 @@ static void syncChooseMaster(SSyncNode *pNode) {
static
SSyncPeer
*
syncCheckMaster
(
SSyncNode
*
pNode
)
{
int32_t
onlineNum
=
0
;
int32_t
i
ndex
=
-
1
;
int32_t
masterI
ndex
=
-
1
;
int32_t
replica
=
pNode
->
replica
;
for
(
int32_t
i
=
0
;
i
<
pNode
->
replica
;
++
i
)
{
if
(
pNode
->
peerInfo
[
i
]
->
role
!=
TAOS_SYNC_ROLE_OFFLINE
)
{
for
(
int32_t
i
ndex
=
0
;
index
<
pNode
->
replica
;
++
index
)
{
if
(
pNode
->
peerInfo
[
i
ndex
]
->
role
!=
TAOS_SYNC_ROLE_OFFLINE
)
{
onlineNum
++
;
}
}
...
...
@@ -630,18 +663,17 @@ static SSyncPeer *syncCheckMaster(SSyncNode *pNode) {
if
(
onlineNum
<=
replica
*
0
.
5
)
{
if
(
nodeRole
!=
TAOS_SYNC_ROLE_UNSYNCED
)
{
nodeRole
=
TAOS_SYNC_ROLE_UNSYNCED
;
// pNode->peerInfo[pNode->selfIndex]->role = nodeRole;
(
*
pNode
->
notifyRole
)(
pNode
->
ahandle
,
nodeRole
);
sInfo
(
"vgId:%d, change to unsynced state, online:%d replica:%d"
,
pNode
->
vgId
,
onlineNum
,
replica
);
sInfo
(
"vgId:%d,
self
change to unsynced state, online:%d replica:%d"
,
pNode
->
vgId
,
onlineNum
,
replica
);
}
}
else
{
for
(
int32_t
i
=
0
;
i
<
pNode
->
replica
;
++
i
)
{
SSyncPeer
*
pTemp
=
pNode
->
peerInfo
[
i
];
for
(
int32_t
i
ndex
=
0
;
index
<
pNode
->
replica
;
++
index
)
{
SSyncPeer
*
pTemp
=
pNode
->
peerInfo
[
i
ndex
];
if
(
pTemp
->
role
!=
TAOS_SYNC_ROLE_MASTER
)
continue
;
if
(
i
ndex
<
0
)
{
index
=
i
;
if
(
masterI
ndex
<
0
)
{
masterIndex
=
index
;
}
else
{
// multiple masters, it shall not happen
if
(
i
==
pNode
->
selfIndex
)
{
if
(
masterIndex
==
pNode
->
selfIndex
)
{
sError
(
"%s, peer is master, work as slave instead"
,
pTemp
->
id
);
nodeRole
=
TAOS_SYNC_ROLE_SLAVE
;
(
*
pNode
->
notifyRole
)(
pNode
->
ahandle
,
nodeRole
);
...
...
@@ -650,7 +682,7 @@ static SSyncPeer *syncCheckMaster(SSyncNode *pNode) {
}
}
SSyncPeer
*
pMaster
=
(
index
>=
0
)
?
pNode
->
peerInfo
[
i
ndex
]
:
NULL
;
SSyncPeer
*
pMaster
=
(
masterIndex
>=
0
)
?
pNode
->
peerInfo
[
masterI
ndex
]
:
NULL
;
return
pMaster
;
}
...
...
@@ -659,68 +691,71 @@ static int32_t syncValidateMaster(SSyncPeer *pPeer) {
int32_t
code
=
0
;
if
(
nodeRole
==
TAOS_SYNC_ROLE_MASTER
&&
nodeVersion
<
pPeer
->
version
)
{
sDebug
(
"%s,
slave has higher version, restart all connections!!!"
,
pPeer
->
id
);
sDebug
(
"%s,
peer has higher sver:%"
PRIu64
", restart all peer connections"
,
pPeer
->
id
,
pPeer
->
version
);
nodeRole
=
TAOS_SYNC_ROLE_UNSYNCED
;
(
*
pNode
->
notifyRole
)(
pNode
->
ahandle
,
nodeRole
);
code
=
-
1
;
for
(
int32_t
i
=
0
;
i
<
pNode
->
replica
;
++
i
)
{
if
(
i
==
pNode
->
selfIndex
)
continue
;
syncRestartPeer
(
pNode
->
peerInfo
[
i
]);
for
(
int32_t
i
ndex
=
0
;
index
<
pNode
->
replica
;
++
index
)
{
if
(
i
ndex
==
pNode
->
selfIndex
)
continue
;
syncRestartPeer
(
pNode
->
peerInfo
[
i
ndex
]);
}
}
return
code
;
}
static
void
syncCheckRole
(
SSyncPeer
*
pPeer
,
SPeerStatus
peersStatus
[],
int8_t
new
Role
)
{
static
void
syncCheckRole
(
SSyncPeer
*
pPeer
,
SPeerStatus
*
peersStatus
,
int8_t
newPeer
Role
)
{
SSyncNode
*
pNode
=
pPeer
->
pSyncNode
;
int8_t
peerOld
Role
=
pPeer
->
role
;
int8_t
selfOld
Role
=
nodeRole
;
int8_t
i
,
syncRequired
=
0
;
int8_t
oldPeer
Role
=
pPeer
->
role
;
int8_t
oldSelf
Role
=
nodeRole
;
int8_t
syncRequired
=
0
;
// pNode->peerInfo[pNode->selfIndex]->version = nodeVersion;
pPeer
->
role
=
newRole
;
sDebug
(
"%s, own role:%s, new peer role:%s"
,
pPeer
->
id
,
syncRole
[
nodeRole
],
syncRole
[
pPeer
->
role
]);
pPeer
->
role
=
newPeerRole
;
sDebug
(
"%s, peer role:%s change to %s"
,
pPeer
->
id
,
syncRole
[
oldPeerRole
],
syncRole
[
newPeerRole
]);
SSyncPeer
*
pMaster
=
syncCheckMaster
(
pNode
);
if
(
pMaster
)
{
// master is there
pNode
->
pMaster
=
pMaster
;
sDebug
(
"%s, it is the master, ver:%"
PRIu64
,
pMaster
->
id
,
pMaster
->
version
);
sDebug
(
"%s, it is the master,
s
ver:%"
PRIu64
,
pMaster
->
id
,
pMaster
->
version
);
if
(
syncValidateMaster
(
pPeer
)
<
0
)
return
;
if
(
nodeRole
==
TAOS_SYNC_ROLE_UNSYNCED
)
{
if
(
nodeVersion
<
pMaster
->
version
)
{
sDebug
(
"%s, is master, sync required, self sver:%"
PRIu64
,
pMaster
->
id
,
nodeVersion
);
syncRequired
=
1
;
}
else
{
sInfo
(
"%s
is master, work as slave, ver:%"
PRIu64
,
pMaster
->
id
,
pMaster
->
v
ersion
);
sInfo
(
"%s
, is master, work as slave, self sver:%"
PRIu64
,
pMaster
->
id
,
nodeV
ersion
);
nodeRole
=
TAOS_SYNC_ROLE_SLAVE
;
(
*
pNode
->
notifyRole
)(
pNode
->
ahandle
,
nodeRole
);
}
}
else
if
(
nodeRole
==
TAOS_SYNC_ROLE_SLAVE
&&
pMaster
==
pPeer
)
{
// nodeVersion = pMaster->version
;
sDebug
(
"%s, is master, continue work as slave, self sver:%"
PRIu64
,
pMaster
->
id
,
nodeVersion
)
;
}
}
else
{
// master not there, if all peer's state and version are consistent, choose the master
int32_t
consistent
=
0
;
if
(
peersStatus
)
{
for
(
i
=
0
;
i
<
pNode
->
replica
;
++
i
)
{
SSyncPeer
*
pTemp
=
pNode
->
peerInfo
[
i
];
if
(
pTemp
->
role
!=
peersStatus
[
i
].
role
)
break
;
if
((
pTemp
->
role
!=
TAOS_SYNC_ROLE_OFFLINE
)
&&
(
pTemp
->
version
!=
peersStatus
[
i
].
version
))
break
;
int32_t
index
=
0
;
if
(
peersStatus
!=
NULL
)
{
for
(
index
=
0
;
index
<
pNode
->
replica
;
++
index
)
{
SSyncPeer
*
pTemp
=
pNode
->
peerInfo
[
index
];
if
(
pTemp
->
role
!=
peersStatus
[
index
].
role
)
break
;
if
((
pTemp
->
role
!=
TAOS_SYNC_ROLE_OFFLINE
)
&&
(
pTemp
->
version
!=
peersStatus
[
index
].
version
))
break
;
}
if
(
i
>=
pNode
->
replica
)
consistent
=
1
;
if
(
i
ndex
>=
pNode
->
replica
)
consistent
=
1
;
}
else
{
if
(
pNode
->
replica
==
2
)
consistent
=
1
;
}
if
(
consistent
)
{
sDebug
(
"vgId:%d, choose master"
,
pNode
->
vgId
);
syncChooseMaster
(
pNode
);
}
else
{
sDebug
(
"vgId:%d, version inconsistent, cannot choose master"
,
pNode
->
vgId
);
}
}
...
...
@@ -728,7 +763,8 @@ static void syncCheckRole(SSyncPeer *pPeer, SPeerStatus peersStatus[], int8_t ne
syncRecoverFromMaster
(
pMaster
);
}
if
(
peerOldRole
!=
newRole
||
nodeRole
!=
selfOldRole
)
{
if
(
oldPeerRole
!=
newPeerRole
||
nodeRole
!=
oldSelfRole
)
{
sDebug
(
"vgId:%d, roles changed, broadcast status"
,
pNode
->
vgId
);
syncBroadcastStatus
(
pNode
);
}
...
...
@@ -738,7 +774,7 @@ static void syncCheckRole(SSyncPeer *pPeer, SPeerStatus peersStatus[], int8_t ne
}
static
void
syncRestartPeer
(
SSyncPeer
*
pPeer
)
{
sDebug
(
"%s, restart connection"
,
pPeer
->
id
);
sDebug
(
"%s, restart
peer
connection"
,
pPeer
->
id
);
syncClosePeerConn
(
pPeer
);
...
...
@@ -746,6 +782,7 @@ static void syncRestartPeer(SSyncPeer *pPeer) {
int32_t
ret
=
strcmp
(
pPeer
->
fqdn
,
tsNodeFqdn
);
if
(
ret
>
0
||
(
ret
==
0
&&
pPeer
->
port
>
tsSyncPort
))
{
sDebug
(
"%s, check peer connection in 1000 ms"
,
pPeer
->
id
);
taosTmrReset
(
syncCheckPeerConnection
,
tsSyncTimer
*
1000
,
pPeer
,
tsSyncTmrCtrl
,
&
pPeer
->
timer
);
}
}
...
...
@@ -840,7 +877,7 @@ static void syncRecoverFromMaster(SSyncPeer *pPeer) {
firstPkt
.
port
=
tsSyncPort
;
taosTmrReset
(
syncNotStarted
,
tsSyncTimer
*
1000
,
pPeer
,
tsSyncTmrCtrl
,
&
pPeer
->
timer
);
if
(
write
(
pPeer
->
peerFd
,
&
firstPkt
,
sizeof
(
firstPkt
))
!=
sizeof
(
firstPkt
))
{
if
(
taosWriteMsg
(
pPeer
->
peerFd
,
&
firstPkt
,
sizeof
(
firstPkt
))
!=
sizeof
(
firstPkt
))
{
sError
(
"%s, failed to send sync-req to peer"
,
pPeer
->
id
);
}
else
{
nodeSStatus
=
TAOS_SYNC_STATUS_START
;
...
...
@@ -854,7 +891,7 @@ static void syncProcessFwdResponse(char *cont, SSyncPeer *pPeer) {
SSyncFwds
*
pSyncFwds
=
pNode
->
pSyncFwds
;
SFwdInfo
*
pFwdInfo
;
sDebug
(
"%s, forward-rsp is received, code:%x ver:%"
PRIu64
,
pPeer
->
id
,
pFwdRsp
->
code
,
pFwdRsp
->
version
);
sDebug
(
"%s, forward-rsp is received, code:%x
h
ver:%"
PRIu64
,
pPeer
->
id
,
pFwdRsp
->
code
,
pFwdRsp
->
version
);
SFwdInfo
*
pFirst
=
pSyncFwds
->
fwdInfo
+
pSyncFwds
->
first
;
if
(
pFirst
->
version
<=
pFwdRsp
->
version
&&
pSyncFwds
->
fwds
>
0
)
{
...
...
@@ -891,14 +928,14 @@ static void syncProcessPeersStatusMsg(char *cont, SSyncPeer *pPeer) {
SSyncNode
*
pNode
=
pPeer
->
pSyncNode
;
SPeersStatus
*
pPeersStatus
=
(
SPeersStatus
*
)
cont
;
sDebug
(
"%s, status msg is received, self:%s
ver:%"
PRIu64
" peer:%s ver:%"
PRIu64
", ack:%d
"
,
pPeer
->
id
,
syncRole
[
nodeRole
],
nodeVersion
,
syncRole
[
pPeersStatus
->
role
],
pPeersStatus
->
version
,
pPeersStatus
->
ack
);
sDebug
(
"%s, status msg is received, self:%s
sver:%"
PRIu64
" peer:%s sver:%"
PRIu64
", ack:%d tranId:%u type:%s
"
,
pPeer
->
id
,
syncRole
[
nodeRole
],
nodeVersion
,
syncRole
[
pPeersStatus
->
role
],
pPeersStatus
->
version
,
pPeersStatus
->
ack
,
pPeersStatus
->
tranId
,
statusType
[
pPeersStatus
->
type
]
);
pPeer
->
version
=
pPeersStatus
->
version
;
syncCheckRole
(
pPeer
,
pPeersStatus
->
peersStatus
,
pPeersStatus
->
role
);
if
(
pPeersStatus
->
ack
)
{
syncSendPeersStatusMsgToPeer
(
pPeer
,
0
);
syncSendPeersStatusMsgToPeer
(
pPeer
,
0
,
pPeersStatus
->
type
+
1
,
pPeersStatus
->
tranId
);
}
}
...
...
@@ -956,7 +993,7 @@ static int32_t syncProcessPeerMsg(void *param, void *buffer) {
#define statusMsgLen sizeof(SSyncHead) + sizeof(SPeersStatus) + sizeof(SPeerStatus) * TAOS_SYNC_MAX_REPLICA
static
void
syncSendPeersStatusMsgToPeer
(
SSyncPeer
*
pPeer
,
char
ack
)
{
static
void
syncSendPeersStatusMsgToPeer
(
SSyncPeer
*
pPeer
,
char
ack
,
int8_t
type
,
uint16_t
tranId
)
{
SSyncNode
*
pNode
=
pPeer
->
pSyncNode
;
char
msg
[
statusMsgLen
]
=
{
0
};
...
...
@@ -971,22 +1008,22 @@ static void syncSendPeersStatusMsgToPeer(SSyncPeer *pPeer, char ack) {
pPeersStatus
->
version
=
nodeVersion
;
pPeersStatus
->
role
=
nodeRole
;
pPeersStatus
->
ack
=
ack
;
pPeersStatus
->
type
=
type
;
pPeersStatus
->
tranId
=
tranId
;
for
(
int32_t
i
=
0
;
i
<
pNode
->
replica
;
++
i
)
{
pPeersStatus
->
peersStatus
[
i
].
role
=
pNode
->
peerInfo
[
i
]
->
role
;
pPeersStatus
->
peersStatus
[
i
].
version
=
pNode
->
peerInfo
[
i
]
->
version
;
}
int32_t
retLen
=
write
(
pPeer
->
peerFd
,
msg
,
statusMsgLen
);
int32_t
retLen
=
taosWriteMsg
(
pPeer
->
peerFd
,
msg
,
statusMsgLen
);
if
(
retLen
==
statusMsgLen
)
{
sDebug
(
"%s, status msg is sent, self:%s
ver:%"
PRIu64
", ack:%d
"
,
pPeer
->
id
,
syncRole
[
pPeersStatus
->
role
],
pPeersStatus
->
version
,
pPeersStatus
->
ack
);
sDebug
(
"%s, status msg is sent, self:%s
sver:%"
PRIu64
", ack:%d tranId:%u type:%s
"
,
pPeer
->
id
,
syncRole
[
pPeersStatus
->
role
],
pPeersStatus
->
version
,
pPeersStatus
->
ack
,
pPeersStatus
->
tranId
,
statusType
[
pPeersStatus
->
type
]
);
}
else
{
sDebug
(
"%s, failed to send status msg, restart"
,
pPeer
->
id
);
syncRestartConnection
(
pPeer
);
}
return
;
}
static
void
syncSetupPeerConnection
(
SSyncPeer
*
pPeer
)
{
...
...
@@ -995,13 +1032,13 @@ static void syncSetupPeerConnection(SSyncPeer *pPeer) {
taosTmrStopA
(
&
pPeer
->
timer
);
if
(
pPeer
->
peerFd
>=
0
)
{
sDebug
(
"%s, send role version to peer"
,
pPeer
->
id
);
syncSendPeersStatusMsgToPeer
(
pPeer
,
1
);
syncSendPeersStatusMsgToPeer
(
pPeer
,
1
,
SYNC_STATUS_SETUP_CONN
,
syncGenTranId
()
);
return
;
}
int32_t
connFd
=
taosOpenTcpClientSocket
(
pPeer
->
ip
,
pPeer
->
port
,
0
);
if
(
connFd
<
0
)
{
sDebug
(
"%s, failed to open tcp socket
(%s)
"
,
pPeer
->
id
,
strerror
(
errno
));
sDebug
(
"%s, failed to open tcp socket
since %s
"
,
pPeer
->
id
,
strerror
(
errno
));
taosTmrReset
(
syncCheckPeerConnection
,
tsSyncTimer
*
1000
,
pPeer
,
tsSyncTmrCtrl
,
&
pPeer
->
timer
);
return
;
}
...
...
@@ -1014,15 +1051,15 @@ static void syncSetupPeerConnection(SSyncPeer *pPeer) {
firstPkt
.
port
=
tsSyncPort
;
firstPkt
.
sourceId
=
pNode
->
vgId
;
// tell arbitrator its vgId
if
(
write
(
connFd
,
&
firstPkt
,
sizeof
(
firstPkt
))
==
sizeof
(
firstPkt
))
{
if
(
taosWriteMsg
(
connFd
,
&
firstPkt
,
sizeof
(
firstPkt
))
==
sizeof
(
firstPkt
))
{
sDebug
(
"%s, connection to peer server is setup"
,
pPeer
->
id
);
pPeer
->
peerFd
=
connFd
;
pPeer
->
role
=
TAOS_SYNC_ROLE_UNSYNCED
;
pPeer
->
pConn
=
taosAllocateTcpConn
(
tsTcpPool
,
pPeer
,
connFd
);
syncAddPeerRef
(
pPeer
);
}
else
{
sDebug
(
"
try later"
);
c
lose
(
connFd
);
sDebug
(
"
%s, failed to setup peer connection to server since %s, try later"
,
pPeer
->
id
,
strerror
(
errno
)
);
taosC
lose
(
connFd
);
taosTmrReset
(
syncCheckPeerConnection
,
tsSyncTimer
*
1000
,
pPeer
,
tsSyncTmrCtrl
,
&
pPeer
->
timer
);
}
}
...
...
@@ -1108,7 +1145,7 @@ static void syncProcessIncommingConnection(int32_t connFd, uint32_t sourceIp) {
pPeer
->
pConn
=
taosAllocateTcpConn
(
tsTcpPool
,
pPeer
,
connFd
);
syncAddPeerRef
(
pPeer
);
sDebug
(
"%s, ready to exchange data"
,
pPeer
->
id
);
syncSendPeersStatusMsgToPeer
(
pPeer
,
1
);
syncSendPeersStatusMsgToPeer
(
pPeer
,
1
,
SYNC_STATUS_EXCHANGE_DATA
,
syncGenTranId
()
);
}
}
...
...
@@ -1154,7 +1191,7 @@ static void syncSaveFwdInfo(SSyncNode *pNode, uint64_t version, void *mhandle) {
pFwdInfo
->
time
=
time
;
pSyncFwds
->
fwds
++
;
sDebug
(
"vgId:%d, fwd info is saved, ver:%"
PRIu64
" fwds:%d "
,
pNode
->
vgId
,
version
,
pSyncFwds
->
fwds
);
sDebug
(
"vgId:%d, fwd info is saved,
h
ver:%"
PRIu64
" fwds:%d "
,
pNode
->
vgId
,
version
,
pSyncFwds
->
fwds
);
}
static
void
syncRemoveConfirmedFwdInfo
(
SSyncNode
*
pNode
)
{
...
...
@@ -1168,7 +1205,7 @@ static void syncRemoveConfirmedFwdInfo(SSyncNode *pNode) {
pSyncFwds
->
first
=
(
pSyncFwds
->
first
+
1
)
%
tsMaxFwdInfo
;
pSyncFwds
->
fwds
--
;
if
(
pSyncFwds
->
fwds
==
0
)
pSyncFwds
->
first
=
pSyncFwds
->
last
;
// sDebug("vgId:%d, fwd info is removed, ver:%d, fwds:%d",
// sDebug("vgId:%d, fwd info is removed,
h
ver:%d, fwds:%d",
// pNode->vgId, pFwdInfo->version, pSyncFwds->fwds);
memset
(
pFwdInfo
,
0
,
sizeof
(
SFwdInfo
));
}
...
...
@@ -1191,14 +1228,32 @@ static void syncProcessFwdAck(SSyncNode *pNode, SFwdInfo *pFwdInfo, int32_t code
}
if
(
confirm
&&
pFwdInfo
->
confirmed
==
0
)
{
sDebug
(
"vgId:%d, forward is confirmed, ver:%"
PRIu64
" code:%x"
,
pNode
->
vgId
,
pFwdInfo
->
version
,
pFwdInfo
->
code
);
sDebug
(
"vgId:%d, forward is confirmed,
h
ver:%"
PRIu64
" code:%x"
,
pNode
->
vgId
,
pFwdInfo
->
version
,
pFwdInfo
->
code
);
(
*
pNode
->
confirmForward
)(
pNode
->
ahandle
,
pFwdInfo
->
mhandle
,
pFwdInfo
->
code
);
pFwdInfo
->
confirmed
=
1
;
}
}
static
void
syncMonitorNodeRole
(
void
*
param
,
void
*
tmrId
)
{
int64_t
rid
=
(
int64_t
)
param
;
SSyncNode
*
pNode
=
taosAcquireRef
(
tsSyncRefId
,
rid
);
if
(
pNode
==
NULL
)
return
;
for
(
int32_t
index
=
0
;
index
<
pNode
->
replica
;
index
++
)
{
if
(
index
==
pNode
->
selfIndex
)
continue
;
SSyncPeer
*
pPeer
=
pNode
->
peerInfo
[
index
];
if
(
pPeer
->
role
<=
TAOS_SYNC_ROLE_UNSYNCED
||
nodeRole
<=
TAOS_SYNC_ROLE_UNSYNCED
)
{
syncSendPeersStatusMsgToPeer
(
pPeer
,
1
,
SYNC_STATUS_CHECK_ROLE
,
syncGenTranId
());
}
}
pNode
->
pRoleTimer
=
taosTmrStart
(
syncMonitorNodeRole
,
SYNC_ROLE_TIMER
,
(
void
*
)
pNode
->
rid
,
tsSyncTmrCtrl
);
taosReleaseRef
(
tsSyncRefId
,
rid
);
}
static
void
syncMonitorFwdInfos
(
void
*
param
,
void
*
tmrId
)
{
int64_t
rid
=
(
int64_t
)
param
;
int64_t
rid
=
(
int64_t
)
param
;
SSyncNode
*
pNode
=
taosAcquireRef
(
tsSyncRefId
,
rid
);
if
(
pNode
==
NULL
)
return
;
...
...
@@ -1222,7 +1277,7 @@ static void syncMonitorFwdInfos(void *param, void *tmrId) {
pthread_mutex_unlock
(
&
(
pNode
->
mutex
));
}
pNode
->
pFwdTimer
=
taosTmrStart
(
syncMonitorFwdInfos
,
300
,
(
void
*
)
pNode
->
rid
,
tsSyncTmrCtrl
);
pNode
->
pFwdTimer
=
taosTmrStart
(
syncMonitorFwdInfos
,
SYNC_FWD_TIMER
,
(
void
*
)
pNode
->
rid
,
tsSyncTmrCtrl
);
}
taosReleaseRef
(
tsSyncRefId
,
rid
);
...
...
@@ -1237,7 +1292,7 @@ static int32_t syncForwardToPeerImpl(SSyncNode *pNode, void *data, void *mhandle
if
(
pWalHead
->
version
>
nodeVersion
+
1
)
{
sError
(
"vgId:%d, hver:%"
PRIu64
", inconsistent with ver:%"
PRIu64
,
pNode
->
vgId
,
pWalHead
->
version
,
nodeVersion
);
sError
(
"vgId:%d, hver:%"
PRIu64
", inconsistent with
s
ver:%"
PRIu64
,
pNode
->
vgId
,
pWalHead
->
version
,
nodeVersion
);
if
(
nodeRole
==
TAOS_SYNC_ROLE_SLAVE
)
{
sInfo
(
"vgId:%d, restart connection"
,
pNode
->
vgId
);
for
(
int32_t
i
=
0
;
i
<
pNode
->
replica
;
++
i
)
{
...
...
@@ -1280,9 +1335,9 @@ static int32_t syncForwardToPeerImpl(SSyncNode *pNode, void *data, void *mhandle
int32_t
retLen
=
write
(
pPeer
->
peerFd
,
pSyncHead
,
fwdLen
);
if
(
retLen
==
fwdLen
)
{
sDebug
(
"%s, forward is sent, ver:%"
PRIu64
" contLen:%d"
,
pPeer
->
id
,
pWalHead
->
version
,
pWalHead
->
len
);
sDebug
(
"%s, forward is sent,
h
ver:%"
PRIu64
" contLen:%d"
,
pPeer
->
id
,
pWalHead
->
version
,
pWalHead
->
len
);
}
else
{
sError
(
"%s, failed to forward, ver:%"
PRIu64
" retLen:%d"
,
pPeer
->
id
,
pWalHead
->
version
,
retLen
);
sError
(
"%s, failed to forward,
h
ver:%"
PRIu64
" retLen:%d"
,
pPeer
->
id
,
pWalHead
->
version
,
retLen
);
syncRestartConnection
(
pPeer
);
}
}
...
...
src/sync/src/syncRestore.c
浏览文件 @
ea3aae75
...
...
@@ -140,6 +140,7 @@ static int32_t syncRestoreWal(SSyncPeer *pPeer) {
if
(
buffer
==
NULL
)
return
-
1
;
SWalHead
*
pHead
=
(
SWalHead
*
)
buffer
;
uint64_t
lastVer
=
0
;
while
(
1
)
{
ret
=
taosReadMsg
(
pPeer
->
syncFd
,
pHead
,
sizeof
(
SWalHead
));
...
...
@@ -153,7 +154,14 @@ static int32_t syncRestoreWal(SSyncPeer *pPeer) {
ret
=
taosReadMsg
(
pPeer
->
syncFd
,
pHead
->
cont
,
pHead
->
len
);
if
(
ret
<
0
)
break
;
sDebug
(
"%s, restore a record, qtype:wal hver:%"
PRIu64
,
pPeer
->
id
,
pHead
->
version
);
sDebug
(
"%s, restore a record, qtype:wal len:%d hver:%"
PRIu64
,
pPeer
->
id
,
pHead
->
len
,
pHead
->
version
);
if
(
lastVer
==
pHead
->
version
)
{
sError
(
"%s, failed to restore record, same hver:%"
PRIu64
", wal sync failed"
PRIu64
,
pPeer
->
id
,
lastVer
);
break
;
}
lastVer
=
pHead
->
version
;
(
*
pNode
->
writeToCache
)(
pNode
->
ahandle
,
pHead
,
TAOS_QTYPE_WAL
,
NULL
);
}
...
...
@@ -214,7 +222,7 @@ int32_t syncSaveIntoBuffer(SSyncPeer *pPeer, SWalHead *pHead) {
memcpy
(
pRecv
->
offset
,
pHead
,
len
);
pRecv
->
offset
+=
len
;
pRecv
->
forwards
++
;
sDebug
(
"%s, fwd is saved into queue, ver:%"
PRIu64
" fwds:%d"
,
pPeer
->
id
,
pHead
->
version
,
pRecv
->
forwards
);
sDebug
(
"%s, fwd is saved into queue,
h
ver:%"
PRIu64
" fwds:%d"
,
pPeer
->
id
,
pHead
->
version
,
pRecv
->
forwards
);
}
else
{
sError
(
"%s, buffer size:%d is too small"
,
pPeer
->
id
,
pRecv
->
bufferSize
);
pRecv
->
code
=
-
1
;
// set error code
...
...
@@ -291,7 +299,7 @@ static int32_t syncRestoreDataStepByStep(SSyncPeer *pPeer) {
}
void
*
syncRestoreData
(
void
*
param
)
{
SSyncPeer
*
pPeer
=
(
SSyncPeer
*
)
param
;
SSyncPeer
*
pPeer
=
param
;
SSyncNode
*
pNode
=
pPeer
->
pSyncNode
;
taosBlockSIGPIPE
();
...
...
@@ -300,7 +308,8 @@ void *syncRestoreData(void *param) {
(
*
pNode
->
notifyRole
)(
pNode
->
ahandle
,
TAOS_SYNC_ROLE_SYNCING
);
if
(
syncOpenRecvBuffer
(
pNode
)
<
0
)
{
sError
(
"%s, failed to allocate recv buffer"
,
pPeer
->
id
);
sError
(
"%s, failed to allocate recv buffer, restart connection"
,
pPeer
->
id
);
syncRestartConnection
(
pPeer
);
}
else
{
if
(
syncRestoreDataStepByStep
(
pPeer
)
==
0
)
{
sInfo
(
"%s, it is synced successfully"
,
pPeer
->
id
);
...
...
src/sync/src/syncRetrieve.c
浏览文件 @
ea3aae75
...
...
@@ -268,7 +268,7 @@ static int32_t syncRetrieveLastWal(SSyncPeer *pPeer, char *name, uint64_t fversi
break
;
}
sDebug
(
"%s, last wal is forwarded, ver:%"
PRIu64
,
pPeer
->
id
,
pHead
->
version
);
sDebug
(
"%s, last wal is forwarded,
h
ver:%"
PRIu64
,
pPeer
->
id
,
pHead
->
version
);
int32_t
ret
=
taosWriteMsg
(
pPeer
->
syncFd
,
pHead
,
wsize
);
if
(
ret
!=
wsize
)
break
;
pPeer
->
sversion
=
pHead
->
version
;
...
...
@@ -418,7 +418,7 @@ static int32_t syncRetrieveWal(SSyncPeer *pPeer) {
}
if
(
code
==
0
)
{
s
Debug
(
"%s, wal retrieve is finished"
,
pPeer
->
id
);
s
Info
(
"%s, wal retrieve is finished"
,
pPeer
->
id
);
pPeer
->
sstatus
=
TAOS_SYNC_STATUS_CACHE
;
SWalHead
walHead
;
memset
(
&
walHead
,
0
,
sizeof
(
walHead
));
...
...
@@ -447,7 +447,7 @@ static int32_t syncRetrieveDataStepByStep(SSyncPeer *pPeer) {
pPeer
->
sversion
=
0
;
pPeer
->
sstatus
=
TAOS_SYNC_STATUS_FILE
;
s
Debug
(
"%s, start to retrieve file"
,
pPeer
->
id
);
s
Info
(
"%s, start to retrieve file"
,
pPeer
->
id
);
if
(
syncRetrieveFile
(
pPeer
)
<
0
)
{
sError
(
"%s, failed to retrieve file"
,
pPeer
->
id
);
return
-
1
;
...
...
@@ -456,7 +456,7 @@ static int32_t syncRetrieveDataStepByStep(SSyncPeer *pPeer) {
// if no files are synced, there must be wal to sync, sversion must be larger than one
if
(
pPeer
->
sversion
==
0
)
pPeer
->
sversion
=
1
;
s
Debug
(
"%s, start to retrieve wal"
,
pPeer
->
id
);
s
Info
(
"%s, start to retrieve wal"
,
pPeer
->
id
);
if
(
syncRetrieveWal
(
pPeer
)
<
0
)
{
sError
(
"%s, failed to retrieve wal"
,
pPeer
->
id
);
return
-
1
;
...
...
@@ -478,7 +478,7 @@ void *syncRetrieveData(void *param) {
sInfo
(
"%s, sync tcp is setup"
,
pPeer
->
id
);
if
(
syncRetrieveDataStepByStep
(
pPeer
)
==
0
)
{
s
Debug
(
"%s, sync retrieve process is successful"
,
pPeer
->
id
);
s
Info
(
"%s, sync retrieve process is successful"
,
pPeer
->
id
);
}
else
{
sError
(
"%s, failed to retrieve data, restart connection"
,
pPeer
->
id
);
syncRestartConnection
(
pPeer
);
...
...
src/sync/src/taosTcpPool.c
浏览文件 @
ea3aae75
...
...
@@ -150,7 +150,7 @@ void *taosAllocateTcpConn(void *param, void *pPeer, int32_t connFd) {
}
void
taosFreeTcpConn
(
void
*
param
)
{
SConnObj
*
pConn
=
(
SConnObj
*
)
param
;
SConnObj
*
pConn
=
param
;
SThreadObj
*
pThread
=
pConn
->
pThread
;
sDebug
(
"%p TCP connection will be closed, fd:%d"
,
pThread
,
pConn
->
fd
);
...
...
src/wal/src/walWrite.c
浏览文件 @
ea3aae75
...
...
@@ -144,9 +144,9 @@ void walFsync(void *handle, bool forceFsync) {
if
(
pWal
==
NULL
||
pWal
->
fd
<
0
)
return
;
if
(
forceFsync
||
(
pWal
->
level
==
TAOS_WAL_FSYNC
&&
pWal
->
fsyncPeriod
==
0
))
{
wTrace
(
"vgId:%d, file
:%s, do fsync"
,
pWal
->
vgId
,
pWal
->
name
);
wTrace
(
"vgId:%d, file
Id:%"
PRId64
", do fsync"
,
pWal
->
vgId
,
pWal
->
fileId
);
if
(
fsync
(
pWal
->
fd
)
<
0
)
{
wError
(
"vgId:%d, file
:%s, fsync failed since %s"
,
pWal
->
vgId
,
pWal
->
name
,
strerror
(
errno
));
wError
(
"vgId:%d, file
Id:%"
PRId64
", fsync failed since %s"
,
pWal
->
vgId
,
pWal
->
fileId
,
strerror
(
errno
));
}
}
}
...
...
tests/script/sh/deploy.sh
浏览文件 @
ea3aae75
...
...
@@ -111,24 +111,24 @@ echo "serverPort ${NODE}" >> $TAOS_CFG
echo
"dataDir
$DATA_DIR
"
>>
$TAOS_CFG
echo
"logDir
$LOG_DIR
"
>>
$TAOS_CFG
echo
"debugFlag 0"
>>
$TAOS_CFG
echo
"mDebugFlag 1
43
"
>>
$TAOS_CFG
echo
"sdbDebugFlag 1
43
"
>>
$TAOS_CFG
echo
"dDebugFlag 1
43
"
>>
$TAOS_CFG
echo
"vDebugFlag 1
43
"
>>
$TAOS_CFG
echo
"tsdbDebugFlag 1
43
"
>>
$TAOS_CFG
echo
"cDebugFlag 1
43
"
>>
$TAOS_CFG
echo
"jnidebugFlag 1
43
"
>>
$TAOS_CFG
echo
"odbcdebugFlag 1
43
"
>>
$TAOS_CFG
echo
"httpDebugFlag 1
43
"
>>
$TAOS_CFG
echo
"monitorDebugFlag 1
43
"
>>
$TAOS_CFG
echo
"mqttDebugFlag 1
43
"
>>
$TAOS_CFG
echo
"qdebugFlag 1
43
"
>>
$TAOS_CFG
echo
"rpcDebugFlag 1
43
"
>>
$TAOS_CFG
echo
"mDebugFlag 1
35
"
>>
$TAOS_CFG
echo
"sdbDebugFlag 1
35
"
>>
$TAOS_CFG
echo
"dDebugFlag 1
35
"
>>
$TAOS_CFG
echo
"vDebugFlag 1
35
"
>>
$TAOS_CFG
echo
"tsdbDebugFlag 1
35
"
>>
$TAOS_CFG
echo
"cDebugFlag 1
35
"
>>
$TAOS_CFG
echo
"jnidebugFlag 1
35
"
>>
$TAOS_CFG
echo
"odbcdebugFlag 1
35
"
>>
$TAOS_CFG
echo
"httpDebugFlag 1
35
"
>>
$TAOS_CFG
echo
"monitorDebugFlag 1
35
"
>>
$TAOS_CFG
echo
"mqttDebugFlag 1
35
"
>>
$TAOS_CFG
echo
"qdebugFlag 1
35
"
>>
$TAOS_CFG
echo
"rpcDebugFlag 1
35
"
>>
$TAOS_CFG
echo
"tmrDebugFlag 131"
>>
$TAOS_CFG
echo
"udebugFlag 1
43
"
>>
$TAOS_CFG
echo
"sdebugFlag 1
43
"
>>
$TAOS_CFG
echo
"wdebugFlag 1
43
"
>>
$TAOS_CFG
echo
"cqdebugFlag 1
43
"
>>
$TAOS_CFG
echo
"udebugFlag 1
35
"
>>
$TAOS_CFG
echo
"sdebugFlag 1
35
"
>>
$TAOS_CFG
echo
"wdebugFlag 1
35
"
>>
$TAOS_CFG
echo
"cqdebugFlag 1
35
"
>>
$TAOS_CFG
echo
"monitor 0"
>>
$TAOS_CFG
echo
"monitorInterval 1"
>>
$TAOS_CFG
echo
"http 0"
>>
$TAOS_CFG
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录