Merge pull request #9745 from taosdata/feature/dnode3
fix invalid write in mnode
This commit is contained in:
commit
18b0e91454
|
@ -94,6 +94,7 @@ typedef struct {
|
||||||
pthread_t *threadId;
|
pthread_t *threadId;
|
||||||
SRWLatch latch;
|
SRWLatch latch;
|
||||||
SDnodeWorker mgmtWorker;
|
SDnodeWorker mgmtWorker;
|
||||||
|
SDnodeWorker statusWorker;
|
||||||
} SDnodeMgmt;
|
} SDnodeMgmt;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -536,6 +536,11 @@ int32_t dndInitMgmt(SDnode *pDnode) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dndInitWorker(pDnode, &pMgmt->statusWorker, DND_WORKER_SINGLE, "dnode-status", 1, 1, dndProcessMgmtQueue) != 0) {
|
||||||
|
dError("failed to start dnode mgmt worker since %s", terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
pMgmt->threadId = taosCreateThread(dnodeThreadRoutine, pDnode);
|
pMgmt->threadId = taosCreateThread(dnodeThreadRoutine, pDnode);
|
||||||
if (pMgmt->threadId == NULL) {
|
if (pMgmt->threadId == NULL) {
|
||||||
dError("failed to init dnode thread");
|
dError("failed to init dnode thread");
|
||||||
|
@ -550,6 +555,7 @@ int32_t dndInitMgmt(SDnode *pDnode) {
|
||||||
void dndStopMgmt(SDnode *pDnode) {
|
void dndStopMgmt(SDnode *pDnode) {
|
||||||
SDnodeMgmt *pMgmt = &pDnode->dmgmt;
|
SDnodeMgmt *pMgmt = &pDnode->dmgmt;
|
||||||
dndCleanupWorker(&pMgmt->mgmtWorker);
|
dndCleanupWorker(&pMgmt->mgmtWorker);
|
||||||
|
dndCleanupWorker(&pMgmt->statusWorker);
|
||||||
|
|
||||||
if (pMgmt->threadId != NULL) {
|
if (pMgmt->threadId != NULL) {
|
||||||
taosDestoryThread(pMgmt->threadId);
|
taosDestoryThread(pMgmt->threadId);
|
||||||
|
@ -587,7 +593,12 @@ void dndProcessMgmtMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
dndUpdateMnodeEpSet(pDnode, pEpSet);
|
dndUpdateMnodeEpSet(pDnode, pEpSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndWriteMsgToWorker(&pMgmt->mgmtWorker, pMsg, sizeof(SRpcMsg)) != 0) {
|
SDnodeWorker *pWorker = &pMgmt->mgmtWorker;
|
||||||
|
if (pMsg->msgType == TDMT_MND_STATUS_RSP) {
|
||||||
|
pWorker = &pMgmt->statusWorker;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dndWriteMsgToWorker(pWorker, pMsg, sizeof(SRpcMsg)) != 0) {
|
||||||
if (pMsg->msgType & 1u) {
|
if (pMsg->msgType & 1u) {
|
||||||
SRpcMsg rsp = {.handle = pMsg->handle, .code = TSDB_CODE_OUT_OF_MEMORY};
|
SRpcMsg rsp = {.handle = pMsg->handle, .code = TSDB_CODE_OUT_OF_MEMORY};
|
||||||
rpcSendResponse(&rsp);
|
rpcSendResponse(&rsp);
|
||||||
|
|
|
@ -740,7 +740,7 @@ static int32_t mndBuildDropVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *
|
||||||
if (pReq == NULL) return -1;
|
if (pReq == NULL) return -1;
|
||||||
|
|
||||||
action.pCont = pReq;
|
action.pCont = pReq;
|
||||||
action.contLen = sizeof(SCreateVnodeReq);
|
action.contLen = sizeof(SDropVnodeReq);
|
||||||
action.msgType = TDMT_DND_DROP_VNODE;
|
action.msgType = TDMT_DND_DROP_VNODE;
|
||||||
action.acceptableCode = TSDB_CODE_DND_VNODE_NOT_DEPLOYED;
|
action.acceptableCode = TSDB_CODE_DND_VNODE_NOT_DEPLOYED;
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
||||||
|
|
|
@ -319,6 +319,14 @@ static int32_t mndGetAvailableDnode(SMnode *pMnode, SVgObj *pVgroup, SArray *pAr
|
||||||
|
|
||||||
taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes);
|
taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes);
|
||||||
|
|
||||||
|
int32_t size = taosArrayGetSize(pArray);
|
||||||
|
if (size < pVgroup->replica) {
|
||||||
|
mError("db:%s, vgId:%d, no enough online dnodes:%d to alloc %d replica", pVgroup->dbName, pVgroup->vgId, size,
|
||||||
|
pVgroup->replica);
|
||||||
|
terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
for (int32_t v = 0; v < pVgroup->replica; ++v) {
|
for (int32_t v = 0; v < pVgroup->replica; ++v) {
|
||||||
SVnodeGid *pVgid = &pVgroup->vnodeGid[v];
|
SVnodeGid *pVgid = &pVgroup->vnodeGid[v];
|
||||||
SDnodeObj *pDnode = taosArrayGet(pArray, v);
|
SDnodeObj *pDnode = taosArrayGet(pArray, v);
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
class MndTestProfile : public ::testing::Test {
|
class MndTestProfile : public ::testing::Test {
|
||||||
protected:
|
protected:
|
||||||
static void SetUpTestSuite() { test.Init("/tmp/mnode_test_profile", 9022); }
|
static void SetUpTestSuite() { test.Init("/tmp/mnode_test_profile", 9031); }
|
||||||
static void TearDownTestSuite() { test.Cleanup(); }
|
static void TearDownTestSuite() { test.Cleanup(); }
|
||||||
|
|
||||||
static Testbase test;
|
static Testbase test;
|
||||||
|
@ -53,7 +53,7 @@ TEST_F(MndTestProfile, 01_ConnectMsg) {
|
||||||
|
|
||||||
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
||||||
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
||||||
EXPECT_EQ(pRsp->epSet.port[0], 9022);
|
EXPECT_EQ(pRsp->epSet.port[0], 9031);
|
||||||
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
||||||
|
|
||||||
connId = pRsp->connId;
|
connId = pRsp->connId;
|
||||||
|
@ -127,7 +127,7 @@ TEST_F(MndTestProfile, 04_HeartBeatMsg) {
|
||||||
|
|
||||||
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
||||||
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
||||||
EXPECT_EQ(pRsp->epSet.port[0], 9022);
|
EXPECT_EQ(pRsp->epSet.port[0], 9031);
|
||||||
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ TEST_F(MndTestProfile, 05_KillConnMsg) {
|
||||||
|
|
||||||
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
||||||
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
||||||
EXPECT_EQ(pRsp->epSet.port[0], 9022);
|
EXPECT_EQ(pRsp->epSet.port[0], 9031);
|
||||||
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
||||||
|
|
||||||
connId = pRsp->connId;
|
connId = pRsp->connId;
|
||||||
|
@ -249,7 +249,7 @@ TEST_F(MndTestProfile, 07_KillQueryMsg) {
|
||||||
|
|
||||||
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
||||||
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
||||||
EXPECT_EQ(pRsp->epSet.port[0], 9022);
|
EXPECT_EQ(pRsp->epSet.port[0], 9031);
|
||||||
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,9 @@
|
||||||
./test.sh -f sim/user/basic1.sim
|
./test.sh -f sim/user/basic1.sim
|
||||||
|
|
||||||
# ---- db
|
# ---- db
|
||||||
./test.sh -f sim/db/basic1.sim
|
./test.sh -f sim/db/basic1.sim
|
||||||
./test.sh -f sim/db/error1.sim
|
./test.sh -f sim/db/basic6.sim
|
||||||
|
./test.sh -f sim/db/error1.sim
|
||||||
|
|
||||||
# ---- table
|
# ---- table
|
||||||
./test.sh -f sim/table/basic1.sim
|
./test.sh -f sim/table/basic1.sim
|
||||||
|
|
|
@ -30,7 +30,7 @@ do
|
||||||
CLEAR_OPTION="clear"
|
CLEAR_OPTION="clear"
|
||||||
;;
|
;;
|
||||||
v)
|
v)
|
||||||
SHELL_OPTION="true"
|
VALGRIND_OPTION="true"
|
||||||
;;
|
;;
|
||||||
u)
|
u)
|
||||||
USERS=$OPTARG
|
USERS=$OPTARG
|
||||||
|
@ -99,7 +99,7 @@ fi
|
||||||
if [ "$EXEC_OPTON" = "start" ]; then
|
if [ "$EXEC_OPTON" = "start" ]; then
|
||||||
echo "ExcuteCmd:" $EXE_DIR/taosd -c $CFG_DIR
|
echo "ExcuteCmd:" $EXE_DIR/taosd -c $CFG_DIR
|
||||||
|
|
||||||
if [ "$SHELL_OPTION" = "true" ]; then
|
if [ "$VALGRIND_OPTION" = "true" ]; then
|
||||||
TT=`date +%s`
|
TT=`date +%s`
|
||||||
mkdir ${LOG_DIR}/${TT}
|
mkdir ${LOG_DIR}/${TT}
|
||||||
nohup valgrind --log-file=${LOG_DIR}/${TT}/valgrind.log --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all -v --workaround-gcc296-bugs=yes $EXE_DIR/taosd -c $CFG_DIR > /dev/null 2>&1 &
|
nohup valgrind --log-file=${LOG_DIR}/${TT}/valgrind.log --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all -v --workaround-gcc296-bugs=yes $EXE_DIR/taosd -c $CFG_DIR > /dev/null 2>&1 &
|
||||||
|
|
|
@ -1,29 +1,24 @@
|
||||||
system sh/stop_dnodes.sh
|
system sh/stop_dnodes.sh
|
||||||
system sh/deploy.sh -n dnode1 -i 1
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
system sh/cfg.sh -n dnode1 -c wallevel -v 0
|
|
||||||
system sh/cfg.sh -n dnode1 -c maxVgroupsPerDb -v 4
|
|
||||||
system sh/cfg.sh -n dnode1 -c maxTablesPerVnode -v 1000
|
|
||||||
|
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
|
||||||
sleep 2000
|
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
print ============================ dnode1 start
|
print ============================ dnode1 start
|
||||||
|
|
||||||
$i = 0
|
$i = 0
|
||||||
$dbPrefix = ob_db_db
|
$dbPrefix = db
|
||||||
$tbPrefix = ob_db_tb
|
$tbPrefix = tb
|
||||||
$db = $dbPrefix . $i
|
$db = $dbPrefix . $i
|
||||||
$tb = $tbPrefix . $i
|
$tb = $tbPrefix . $i
|
||||||
|
|
||||||
print =============== step1
|
print =============== step1
|
||||||
sql create database $db replica 1 days 20 keep 2000 cache 16
|
sql create database $db replica 1 days 20 keep 2000 cache 16 vgroups 4
|
||||||
sql show databases
|
sql show databases
|
||||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07
|
print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07
|
||||||
if $data00 != $db then
|
if $data00 != $db then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data02 != 0 then
|
if $data02 != 4 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data03 != 0 then
|
if $data03 != 0 then
|
||||||
|
@ -63,9 +58,6 @@ print $data00 $data01 $data02 $data03 $data04 $data05 $data06 $data07
|
||||||
if $data00 != $db then
|
if $data00 != $db then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data02 != 0 then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
if $data03 != 0 then
|
if $data03 != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
@ -77,30 +69,14 @@ if $data06 != 15 then
|
||||||
endi
|
endi
|
||||||
|
|
||||||
print =============== step6
|
print =============== step6
|
||||||
sql use $db
|
$i = $i + 1
|
||||||
sql create table $tb (ts timestamp, speed int)
|
while $i < 5
|
||||||
$i = 1
|
|
||||||
while $i < 4
|
|
||||||
$db = $dbPrefix . $i
|
$db = $dbPrefix . $i
|
||||||
$tb = $tbPrefix . $i
|
|
||||||
sql create database $db
|
sql create database $db
|
||||||
sql use $db
|
sql use $db
|
||||||
sql create table $tb (ts timestamp, speed int)
|
|
||||||
$i = $i + 1
|
$i = $i + 1
|
||||||
endw
|
endw
|
||||||
|
|
||||||
sql show databases
|
|
||||||
if $rows != 4 then
|
|
||||||
return -1
|
|
||||||
endi
|
|
||||||
|
|
||||||
$i = 4
|
|
||||||
$db = $dbPrefix . $i
|
|
||||||
$tb = $tbPrefix . $i
|
|
||||||
sql create database $db
|
|
||||||
sql use $db
|
|
||||||
sql create table $tb (ts timestamp, speed int)
|
|
||||||
|
|
||||||
print =============== step7
|
print =============== step7
|
||||||
$i = 0
|
$i = 0
|
||||||
while $i < 5
|
while $i < 5
|
||||||
|
@ -115,7 +91,12 @@ $db = $dbPrefix . $i
|
||||||
$tb = $tbPrefix . $i
|
$tb = $tbPrefix . $i
|
||||||
sql create database $db
|
sql create database $db
|
||||||
sql use $db
|
sql use $db
|
||||||
sql create table $tb (ts timestamp, speed int)
|
sql create table st (ts timestamp, i int) tags (j int)
|
||||||
|
sql create table $tb using st tags(1)
|
||||||
|
|
||||||
|
return
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
|
||||||
sql show tables
|
sql show tables
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
|
@ -133,7 +114,8 @@ if $rows != 0 then
|
||||||
endi
|
endi
|
||||||
|
|
||||||
print =============== step11
|
print =============== step11
|
||||||
sql create table $tb (ts timestamp, speed int)
|
sql create table st (ts timestamp, i int) tags (j int)
|
||||||
|
sql create table $tb using st tags(1)
|
||||||
sql show tables
|
sql show tables
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
|
@ -149,16 +131,23 @@ sql show tables
|
||||||
if $rows != 0 then
|
if $rows != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
sql create table $tb (ts timestamp, speed int)
|
|
||||||
|
sql create table st (ts timestamp, i int) tags (j int)
|
||||||
|
sql create table $tb using st tags(1)
|
||||||
sql show tables
|
sql show tables
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql insert into $tb values (now+1a, 0)
|
sql insert into $tb values (now+1a, 0)
|
||||||
sql insert into $tb values (now+2a, 1)
|
sql insert into $tb values (now+2a, 1)
|
||||||
sql insert into $tb values (now+3a, 2)
|
sql insert into $tb values (now+3a, 2)
|
||||||
sql insert into $tb values (now+4a, 3)
|
sql insert into $tb values (now+4a, 3)
|
||||||
sql insert into $tb values (now+5a, 4)
|
sql insert into $tb values (now+5a, 4)
|
||||||
|
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
sql select * from $tb
|
sql select * from $tb
|
||||||
if $rows != 5 then
|
if $rows != 5 then
|
||||||
return -1
|
return -1
|
||||||
|
@ -176,7 +165,8 @@ if $rows != 0 then
|
||||||
endi
|
endi
|
||||||
|
|
||||||
print =============== step16
|
print =============== step16
|
||||||
sql create table $tb (ts timestamp, speed int)
|
sql create table st (ts timestamp, i int) tags (j int)
|
||||||
|
sql create table $tb using st tags(1)
|
||||||
sql show tables
|
sql show tables
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
return -1
|
return -1
|
||||||
|
|
Loading…
Reference in New Issue