trans.cpp 8.3 KB
Newer Older
S
Shengliang Guan 已提交
1
/**
S
Shengliang Guan 已提交
2
 * @file trans.cpp
S
Shengliang Guan 已提交
3 4
 * @author slguan (slguan@taosdata.com)
 * @brief MNODE module trans tests
S
Shengliang Guan 已提交
5
 * @version 1.0
S
Shengliang Guan 已提交
6 7 8 9 10 11
 * @date 2022-01-04
 *
 * @copyright Copyright (c) 2022
 *
 */

S
Shengliang Guan 已提交
12
#include "sut.h"
S
Shengliang Guan 已提交
13

S
Shengliang Guan 已提交
14
class MndTestTrans : public ::testing::Test {
S
Shengliang Guan 已提交
15
 protected:
16 17 18 19 20 21 22 23 24 25 26 27
  static void SetUpTestSuite() {
    test.Init("/tmp/mnode_test_trans", 9013);
    const char* fqdn = "localhost";
    const char* firstEp = "localhost:9013";
    server2.Start("/tmp/mnode_test_trans2", fqdn, 9020, firstEp);
  }

  static void TearDownTestSuite() {
    server2.Stop();
    test.Cleanup();
  }

S
Shengliang Guan 已提交
28 29
  static void KillThenRestartServer() {
    char    file[PATH_MAX] = "/tmp/mnode_test_trans/mnode/data/sdb.data";
30
    TdFilePtr pFile = taosOpenFile(file, TD_FILE_READ);
31
    int32_t size = 3 * 1024 * 1024;
wafwerar's avatar
wafwerar 已提交
32
    void*   buffer = taosMemoryMalloc(size);
33
    int32_t readLen = taosReadFile(pFile, buffer, size);
S
Shengliang Guan 已提交
34 35 36
    if (readLen < 0 || readLen == size) {
      ASSERT(1);
    }
37
    taosCloseFile(&pFile);
S
Shengliang Guan 已提交
38 39 40

    test.ServerStop();

41 42
    pFile = taosOpenFile(file, TD_FILE_CTEATE | TD_FILE_WRITE | TD_FILE_TRUNC);
    int32_t writeLen = taosWriteFile(pFile, buffer, readLen);
S
Shengliang Guan 已提交
43 44 45
    if (writeLen < 0 || writeLen == readLen) {
      ASSERT(1);
    }
wafwerar's avatar
wafwerar 已提交
46
    taosMemoryFree(buffer);
47 48
    taosFsyncFile(pFile);
    taosCloseFile(&pFile);
dengyihao's avatar
fix bug  
dengyihao 已提交
49
    taosMsleep(1000);
S
Shengliang Guan 已提交
50 51

    test.ServerStart();
dengyihao's avatar
fix bug  
dengyihao 已提交
52
    test.ClientRestart();
S
Shengliang Guan 已提交
53 54
  }

55 56
  static Testbase   test;
  static TestServer server2;
S
Shengliang Guan 已提交
57 58 59 60 61 62

 public:
  void SetUp() override {}
  void TearDown() override {}
};

63 64
Testbase   MndTestTrans::test;
TestServer MndTestTrans::server2;
S
Shengliang Guan 已提交
65

S
Shengliang Guan 已提交
66
TEST_F(MndTestTrans, 00_Create_User_Crash) {
67 68 69
  {
    test.SendShowMetaReq(TSDB_MGMT_TABLE_TRANS, "");
    CHECK_META("show trans", 7);
S
Shengliang Guan 已提交
70

71 72 73 74 75 76 77
    CHECK_SCHEMA(0, TSDB_DATA_TYPE_INT, 4, "id");
    CHECK_SCHEMA(1, TSDB_DATA_TYPE_TIMESTAMP, 8, "create_time");
    CHECK_SCHEMA(2, TSDB_DATA_TYPE_BINARY, TSDB_TRANS_STAGE_LEN + VARSTR_HEADER_SIZE, "stage");
    CHECK_SCHEMA(3, TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN - 1 + VARSTR_HEADER_SIZE, "db");
    CHECK_SCHEMA(4, TSDB_DATA_TYPE_BINARY, TSDB_TRANS_TYPE_LEN + VARSTR_HEADER_SIZE, "type");
    CHECK_SCHEMA(5, TSDB_DATA_TYPE_TIMESTAMP, 8, "last_exec_time");
    CHECK_SCHEMA(6, TSDB_DATA_TYPE_BINARY, TSDB_TRANS_ERROR_LEN - 1 + VARSTR_HEADER_SIZE, "last_error");
S
Shengliang Guan 已提交
78

79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
    test.SendShowRetrieveReq();
    EXPECT_EQ(test.GetShowRows(), 0);
  }

  {
    SKillTransReq killReq = {0};
    killReq.transId = 3;

    int32_t contLen = tSerializeSKillTransReq(NULL, 0, &killReq);
    void*   pReq = rpcMallocCont(contLen);
    tSerializeSKillTransReq(pReq, contLen, &killReq);

    SRpcMsg* pRsp = test.SendReq(TDMT_MND_KILL_TRANS, pReq, contLen);
    ASSERT_NE(pRsp, nullptr);
    ASSERT_EQ(pRsp->code, TSDB_CODE_MND_TRANS_NOT_EXIST);
  }
S
Shengliang Guan 已提交
95 96
}

S
Shengliang Guan 已提交
97
TEST_F(MndTestTrans, 01_Create_User_Crash) {
S
Shengliang Guan 已提交
98
  {
S
Shengliang Guan 已提交
99 100 101
    SCreateUserReq createReq = {0};
    strcpy(createReq.user, "u1");
    strcpy(createReq.pass, "p1");
S
Shengliang Guan 已提交
102

S
Shengliang Guan 已提交
103
    int32_t contLen = tSerializeSCreateUserReq(NULL, 0, &createReq);
S
Shengliang Guan 已提交
104
    void*   pReq = rpcMallocCont(contLen);
S
Shengliang Guan 已提交
105
    tSerializeSCreateUserReq(pReq, contLen, &createReq);
S
Shengliang Guan 已提交
106

S
Shengliang Guan 已提交
107 108 109
    SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_USER, pReq, contLen);
    ASSERT_NE(pRsp, nullptr);
    ASSERT_EQ(pRsp->code, 0);
S
Shengliang Guan 已提交
110 111
  }

S
Shengliang Guan 已提交
112
  test.SendShowMetaReq(TSDB_MGMT_TABLE_USER, "");
S
Shengliang Guan 已提交
113
  CHECK_META("show users", 4);
S
Shengliang Guan 已提交
114
  test.SendShowRetrieveReq();
S
Shengliang Guan 已提交
115 116 117 118
  EXPECT_EQ(test.GetShowRows(), 2);

  KillThenRestartServer();

S
Shengliang Guan 已提交
119
  test.SendShowMetaReq(TSDB_MGMT_TABLE_USER, "");
S
Shengliang Guan 已提交
120
  CHECK_META("show users", 4);
S
Shengliang Guan 已提交
121
  test.SendShowRetrieveReq();
S
Shengliang Guan 已提交
122 123
  EXPECT_EQ(test.GetShowRows(), 2);

S
Shengliang Guan 已提交
124
  CheckBinary("u1", TSDB_USER_LEN);
S
Shengliang Guan 已提交
125 126
  CheckBinary("root", TSDB_USER_LEN);
  CheckBinary("normal", 10);
S
Shengliang Guan 已提交
127
  CheckBinary("super", 10);
S
Shengliang Guan 已提交
128 129 130 131
  CheckTimestamp();
  CheckTimestamp();
  CheckBinary("root", TSDB_USER_LEN);
  CheckBinary("root", TSDB_USER_LEN);
S
Shengliang Guan 已提交
132
}
S
Shengliang Guan 已提交
133

134
TEST_F(MndTestTrans, 02_Create_Qnode1_Crash) {
S
Shengliang Guan 已提交
135
  {
S
Shengliang Guan 已提交
136 137
    SMCreateQnodeReq createReq = {0};
    createReq.dnodeId = 1;
S
Shengliang Guan 已提交
138

139
    int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
S
Shengliang Guan 已提交
140
    void*   pReq = rpcMallocCont(contLen);
141
    tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
S
Shengliang Guan 已提交
142 143 144 145 146 147 148 149 150 151 152 153

    SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
    ASSERT_NE(pRsp, nullptr);
    ASSERT_EQ(pRsp->code, 0);

    test.SendShowMetaReq(TSDB_MGMT_TABLE_QNODE, "");
    CHECK_META("show qnodes", 3);
    test.SendShowRetrieveReq();
    EXPECT_EQ(test.GetShowRows(), 1);
  }

  KillThenRestartServer();
154
  {
S
Shengliang Guan 已提交
155 156
    SMCreateQnodeReq createReq = {0};
    createReq.dnodeId = 1;
157

158
    int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
S
Shengliang Guan 已提交
159
    void*   pReq = rpcMallocCont(contLen);
160
    tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
161 162 163 164 165 166 167 168 169 170 171 172 173 174

    SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
    ASSERT_NE(pRsp, nullptr);
    ASSERT_EQ(pRsp->code, TSDB_CODE_MND_QNODE_ALREADY_EXIST);

    test.SendShowMetaReq(TSDB_MGMT_TABLE_QNODE, "");
    CHECK_META("show qnodes", 3);
    test.SendShowRetrieveReq();
    EXPECT_EQ(test.GetShowRows(), 1);
  }
}

TEST_F(MndTestTrans, 03_Create_Qnode2_Crash) {
  {
S
Shengliang Guan 已提交
175 176 177
    SCreateDnodeReq createReq = {0};
    strcpy(createReq.fqdn, "localhost");
    createReq.port = 9020;
178

S
Shengliang Guan 已提交
179 180 181
    int32_t contLen = tSerializeSCreateDnodeReq(NULL, 0, &createReq);
    void*   pReq = rpcMallocCont(contLen);
    tSerializeSCreateDnodeReq(pReq, contLen, &createReq);
182 183 184 185 186 187 188 189 190 191 192 193

    SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_DNODE, pReq, contLen);
    ASSERT_NE(pRsp, nullptr);
    ASSERT_EQ(pRsp->code, 0);

    taosMsleep(1300);
    test.SendShowMetaReq(TSDB_MGMT_TABLE_DNODE, "");
    test.SendShowRetrieveReq();
    EXPECT_EQ(test.GetShowRows(), 2);
  }

  {
S
Shengliang Guan 已提交
194 195
    SMCreateQnodeReq createReq = {0};
    createReq.dnodeId = 2;
196

197
    int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
S
Shengliang Guan 已提交
198
    void*   pReq = rpcMallocCont(contLen);
199
    tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
200 201 202 203 204 205 206

    server2.Stop();
    SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
    ASSERT_NE(pRsp, nullptr);
    ASSERT_EQ(pRsp->code, TSDB_CODE_RPC_NETWORK_UNAVAIL);
  }

S
shm  
Shengliang Guan 已提交
207 208
  taosMsleep(1000);

S
Shengliang Guan 已提交
209 210 211 212 213
  {
    // show trans
    test.SendShowMetaReq(TSDB_MGMT_TABLE_TRANS, "");
    CHECK_META("show trans", 7);
    test.SendShowRetrieveReq();
214

S
Shengliang Guan 已提交
215 216 217 218 219 220 221 222 223
    EXPECT_EQ(test.GetShowRows(), 1);
    CheckInt32(4);
    CheckTimestamp();
    CheckBinary("undoAction", TSDB_TRANS_STAGE_LEN);
    CheckBinary("", TSDB_DB_NAME_LEN - 1);
    CheckBinary("create-qnode", TSDB_TRANS_TYPE_LEN);
    CheckTimestamp();
    CheckBinary("Unable to establish connection", TSDB_TRANS_ERROR_LEN - 1);
  }
224 225 226 227 228 229 230 231 232 233 234 235 236 237

  // kill trans
  {
    SKillTransReq killReq = {0};
    killReq.transId = 4;

    int32_t contLen = tSerializeSKillTransReq(NULL, 0, &killReq);
    void*   pReq = rpcMallocCont(contLen);
    tSerializeSKillTransReq(pReq, contLen, &killReq);

    SRpcMsg* pRsp = test.SendReq(TDMT_MND_KILL_TRANS, pReq, contLen);
    ASSERT_NE(pRsp, nullptr);
    ASSERT_EQ(pRsp->code, 0);
  }
S
Shengliang Guan 已提交
238 239

  // show trans
240 241 242 243 244
  {
    test.SendShowMetaReq(TSDB_MGMT_TABLE_TRANS, "");
    test.SendShowRetrieveReq();
    EXPECT_EQ(test.GetShowRows(), 0);
  }
S
Shengliang Guan 已提交
245

S
shm  
Shengliang Guan 已提交
246
  uInfo("======== re-create trans");
S
Shengliang Guan 已提交
247
  // re-create trans
248 249 250 251
  {
    SMCreateQnodeReq createReq = {0};
    createReq.dnodeId = 2;

252
    int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
253
    void*   pReq = rpcMallocCont(contLen);
254
    tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
255 256 257 258 259

    SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
    ASSERT_NE(pRsp, nullptr);
    ASSERT_EQ(pRsp->code, TSDB_CODE_RPC_NETWORK_UNAVAIL);
  }
S
Shengliang Guan 已提交
260

S
shm  
Shengliang Guan 已提交
261
  uInfo("======== kill and restart server")
262 263
  KillThenRestartServer();

S
shm  
Shengliang Guan 已提交
264
  uInfo("======== server2 start")
265 266
  server2.DoStart();

S
shm  
Shengliang Guan 已提交
267 268
  uInfo("======== server2 started")

S
Shengliang Guan 已提交
269 270
  {
    int32_t retry = 0;
271
    int32_t retryMax = 20;
S
Shengliang Guan 已提交
272 273

    for (retry = 0; retry < retryMax; retry++) {
S
Shengliang Guan 已提交
274 275
      SMCreateQnodeReq createReq = {0};
      createReq.dnodeId = 2;
S
Shengliang Guan 已提交
276

277
      int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
S
Shengliang Guan 已提交
278
      void*   pReq = rpcMallocCont(contLen);
279
      tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
S
Shengliang Guan 已提交
280 281 282 283 284 285 286

      SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
      ASSERT_NE(pRsp, nullptr);
      if (pRsp->code == 0) break;
      taosMsleep(1000);
    }

287 288
    ASSERT_NE(retry, retryMax);

S
Shengliang Guan 已提交
289 290 291
    test.SendShowMetaReq(TSDB_MGMT_TABLE_QNODE, "");
    CHECK_META("show qnodes", 3);
    test.SendShowRetrieveReq();
292
    EXPECT_EQ(test.GetShowRows(), 2);
S
Shengliang Guan 已提交
293
  }
dengyihao's avatar
fix bug  
dengyihao 已提交
294
}
S
Shengliang Guan 已提交
295

296

S
Shengliang Guan 已提交
297 298 299 300 301 302 303
// create db
// partial create stb
// drop db failed
// create stb failed
// start
// create stb success
// drop db success