dmTransport.c 14.4 KB
Newer Older
S
Shengliang Guan 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
15

S
Shengliang Guan 已提交
16
#define _DEFAULT_SOURCE
S
Shengliang Guan 已提交
17
#include "dmMgmt.h"
18 19
#include "qworker.h"

20 21
#define INTERNAL_USER   "_dnd"
#define INTERNAL_CKEY   "_key"
S
Shengliang 已提交
22
#define INTERNAL_SECRET "_pwd"
S
Shengliang Guan 已提交
23

S
Shengliang Guan 已提交
24
static void dmGetMnodeEpSet(SDnode *pDnode, SEpSet *pEpSet) {
S
Shengliang Guan 已提交
25 26 27 28
  SDnodeData *pData = &pDnode->data;
  taosRLockLatch(&pData->latch);
  *pEpSet = pData->mnodeEps;
  taosRUnLockLatch(&pData->latch);
S
Shengliang Guan 已提交
29 30
}

S
Shengliang Guan 已提交
31
static void dmSetMnodeEpSet(SDnode *pDnode, SEpSet *pEpSet) {
S
Shengliang Guan 已提交
32
  dInfo("mnode is changed, num:%d use:%d", pEpSet->numOfEps, pEpSet->inUse);
S
Shengliang Guan 已提交
33
  SDnodeData *pData = &pDnode->data;
S
Shengliang Guan 已提交
34

S
Shengliang Guan 已提交
35 36
  taosWLockLatch(&pData->latch);
  pData->mnodeEps = *pEpSet;
S
Shengliang Guan 已提交
37 38 39 40
  for (int32_t i = 0; i < pEpSet->numOfEps; ++i) {
    dInfo("mnode index:%d %s:%u", i, pEpSet->eps[i].fqdn, pEpSet->eps[i].port);
  }

S
Shengliang Guan 已提交
41
  taosWUnLockLatch(&pData->latch);
S
Shengliang Guan 已提交
42
}
43

S
Shengliang Guan 已提交
44
static inline int32_t dmBuildNodeMsg(SNodeMsg *pMsg, SRpcMsg *pRpc) {
S
Shengliang Guan 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58
  SRpcConnInfo connInfo = {0};
  if ((pRpc->msgType & 1U) && rpcGetConnInfo(pRpc->handle, &connInfo) != 0) {
    terrno = TSDB_CODE_MND_NO_USER_FROM_CONN;
    dError("failed to build msg since %s, app:%p handle:%p", terrstr(), pRpc->ahandle, pRpc->handle);
    return -1;
  }

  memcpy(pMsg->user, connInfo.user, TSDB_USER_LEN);
  pMsg->clientIp = connInfo.clientIp;
  pMsg->clientPort = connInfo.clientPort;
  memcpy(&pMsg->rpcMsg, pRpc, sizeof(SRpcMsg));
  return 0;
}

S
Shengliang Guan 已提交
59
int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
S
Shengliang Guan 已提交
60 61 62 63 64
  NodeMsgFp msgFp = pWrapper->msgFps[TMSG_INDEX(pMsg->rpcMsg.msgType)];
  if (msgFp == NULL) {
    terrno = TSDB_CODE_MSG_NOT_PROCESSED;
    return -1;
  }
S
Shengliang Guan 已提交
65

S
Shengliang Guan 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
  dTrace("msg:%p, will be processed, handle:%p", pMsg, pMsg->rpcMsg.handle);
  return (*msgFp)(pWrapper->pMgmt, pMsg);
}

static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
  SDnodeTrans  *pTrans = &pDnode->trans;
  int32_t       code = -1;
  SNodeMsg     *pMsg = NULL;
  tmsg_t        msgType = pRpc->msgType;
  bool          isReq = msgType & 1u;
  bool          needRelease = false;
  SMsgHandle   *pHandle = &pTrans->msgHandles[TMSG_INDEX(msgType)];
  SMgmtWrapper *pWrapper = NULL;

  if (msgType == TDMT_DND_NET_TEST) {
    dmProcessNetTestReq(pDnode, pRpc);
    code = 0;
    goto _OVER;
  } else if (msgType == TDMT_MND_SYSTABLE_RETRIEVE_RSP || msgType == TDMT_VND_FETCH_RSP) {
    code = qWorkerProcessFetchRsp(NULL, NULL, pRpc);
    pRpc->pCont = NULL;  // will be freed in qworker
    code = 0;
    goto _OVER;
S
Shengliang Guan 已提交
89 90 91
  } else {
  }

S
Shengliang Guan 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
  if (pDnode->status != DND_STAT_RUNNING) {
    if (msgType == TDMT_DND_SERVER_STATUS) {
      dmProcessServerStartupStatus(pDnode, pRpc);
      code = 0;
    } else {
      terrno = TSDB_CODE_APP_NOT_READY;
    }
    goto _OVER;
  }

  if (isReq && pRpc->pCont == NULL) {
    terrno = TSDB_CODE_INVALID_MSG_LEN;
    goto _OVER;
  }

  if (pHandle->defaultNtype == NODE_END) {
    terrno = TSDB_CODE_MSG_NOT_PROCESSED;
    goto _OVER;
  } else {
    pWrapper = &pDnode->wrappers[pHandle->defaultNtype];
    if (pHandle->needCheckVgId) {
      SMsgHead *pHead = pRpc->pCont;
      int32_t   vgId = ntohl(pHead->vgId);
      if (vgId == QNODE_HANDLE) {
        pWrapper = &pDnode->wrappers[QNODE];
      } else if (vgId == MNODE_HANDLE) {
        pWrapper = &pDnode->wrappers[MNODE];
      } else {
      }
    }
  }
S
Shengliang Guan 已提交
123

S
Shengliang Guan 已提交
124
  dTrace("msg:%s is received, handle:%p app:%p", TMSG_INFO(msgType), pRpc->handle, pRpc->ahandle);
S
Shengliang Guan 已提交
125 126 127 128 129
  if (dmMarkWrapper(pWrapper) != 0) {
    goto _OVER;
  } else {
    needRelease = true;
  }
S
Shengliang Guan 已提交
130

S
Shengliang Guan 已提交
131 132 133 134
  pMsg = taosAllocateQitem(sizeof(SNodeMsg), RPC_QITEM);
  if (pMsg == NULL) {
    goto _OVER;
  }
S
Shengliang Guan 已提交
135

S
Shengliang Guan 已提交
136 137 138 139 140
  if (dmBuildNodeMsg(pMsg, pRpc) != 0) {
    goto _OVER;
  }

  if (InParentProc(pWrapper->proc.ptype)) {
S
Shengliang Guan 已提交
141
    dTrace("msg:%p, put into cqueue, handle:%p refId:%" PRId64, pMsg, pRpc->handle, pRpc->refId);
S
Shengliang Guan 已提交
142
    code = dmPutToProcCQueue(&pWrapper->proc, pMsg, sizeof(SNodeMsg), pRpc->pCont, pRpc->contLen,
S
Shengliang Guan 已提交
143
                             (isReq && (pRpc->code == 0)) ? pRpc->handle : NULL, pRpc->refId, DND_FUNC_REQ);
S
Shengliang Guan 已提交
144 145 146
  } else {
    code = dmProcessNodeMsg(pWrapper, pMsg);
  }
S
Shengliang Guan 已提交
147 148 149

_OVER:
  if (code == 0) {
S
Shengliang Guan 已提交
150
    if (pWrapper != NULL && InParentProc(pWrapper->proc.ptype)) {
S
Shengliang Guan 已提交
151
      dTrace("msg:%p, is freed after push to cqueue", pMsg);
S
Shengliang Guan 已提交
152 153 154 155
      taosFreeQitem(pMsg);
      rpcFreeCont(pRpc->pCont);
    }
  } else {
S
Shengliang Guan 已提交
156 157 158
    dError("msg:%p, failed to process since %s", pMsg, terrstr());
    if (terrno != 0) code = terrno;

159
    if (isReq) {
160 161 162 163 164
      if (code == TSDB_CODE_NODE_NOT_DEPLOYED || code == TSDB_CODE_NODE_OFFLINE) {
        if (msgType > TDMT_MND_MSG && msgType < TDMT_VND_MSG) {
          code = TSDB_CODE_NODE_REDIRECT;
        }
      }
S
Shengliang Guan 已提交
165 166 167 168 169 170 171
      SRpcMsg rspMsg = {
          .handle = pRpc->handle,
          .code = code,
          .ahandle = pRpc->ahandle,
          .refId = pRpc->refId,
      };
      tmsgSendRsp(&rspMsg);
S
Shengliang Guan 已提交
172
    }
S
Shengliang Guan 已提交
173

S
Shengliang Guan 已提交
174 175 176 177 178
    dTrace("msg:%p, is freed", pMsg);
    taosFreeQitem(pMsg);
    rpcFreeCont(pRpc->pCont);
  }

179 180 181
  if (needRelease) {
    dmReleaseWrapper(pWrapper);
  }
S
Shengliang Guan 已提交
182 183
}

S
Shengliang Guan 已提交
184
int32_t dmInitMsgHandle(SDnode *pDnode) {
S
Shengliang Guan 已提交
185
  SDnodeTrans *pTrans = &pDnode->trans;
S
shm  
Shengliang Guan 已提交
186

S
Shengliang 已提交
187 188
  for (EDndNodeType ntype = DNODE; ntype < NODE_END; ++ntype) {
    SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
S
Shengliang Guan 已提交
189 190 191 192 193 194 195 196 197 198
    SArray       *pArray = (*pWrapper->func.getHandlesFp)();
    if (pArray == NULL) return -1;

    for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
      SMgmtHandle *pMgmt = taosArrayGet(pArray, i);
      SMsgHandle  *pHandle = &pTrans->msgHandles[TMSG_INDEX(pMgmt->msgType)];
      if (pMgmt->needCheckVgId) {
        pHandle->needCheckVgId = pMgmt->needCheckVgId;
      }
      if (!pMgmt->needCheckVgId) {
S
Shengliang 已提交
199
        pHandle->defaultNtype = ntype;
S
shm  
Shengliang Guan 已提交
200
      }
S
Shengliang Guan 已提交
201
      pWrapper->msgFps[TMSG_INDEX(pMgmt->msgType)] = pMgmt->msgFp;
S
shm  
Shengliang Guan 已提交
202
    }
S
Shengliang Guan 已提交
203 204

    taosArrayDestroy(pArray);
S
shm  
Shengliang Guan 已提交
205 206 207 208 209
  }

  return 0;
}

S
Shengliang Guan 已提交
210
static void dmSendRpcRedirectRsp(SDnode *pDnode, const SRpcMsg *pReq) {
S
Shengliang Guan 已提交
211
  SEpSet epSet = {0};
S
Shengliang Guan 已提交
212
  dmGetMnodeEpSet(pDnode, &epSet);
S
Shengliang Guan 已提交
213 214 215 216

  dDebug("RPC %p, req is redirected, num:%d use:%d", pReq->handle, epSet.numOfEps, epSet.inUse);
  for (int32_t i = 0; i < epSet.numOfEps; ++i) {
    dDebug("mnode index:%d %s:%u", i, epSet.eps[i].fqdn, epSet.eps[i].port);
S
Shengliang Guan 已提交
217
    if (strcmp(epSet.eps[i].fqdn, pDnode->data.localFqdn) == 0 && epSet.eps[i].port == pDnode->data.serverPort) {
S
Shengliang Guan 已提交
218 219 220 221 222
      epSet.inUse = (i + 1) % epSet.numOfEps;
    }

    epSet.eps[i].port = htons(epSet.eps[i].port);
  }
S
Shengliang Guan 已提交
223

dengyihao's avatar
dengyihao 已提交
224 225
  SMEpSet msg = {.epSet = epSet};
  int32_t len = tSerializeSMEpSet(NULL, 0, &msg);
S
Shengliang Guan 已提交
226 227 228 229 230 231 232 233 234 235

  SRpcMsg rsp = {
      .code = TSDB_CODE_RPC_REDIRECT,
      .handle = pReq->handle,
      .refId = pReq->refId,
      .contLen = len,
  };
  rsp.pCont = rpcMallocCont(len);
  tSerializeSMEpSet(rsp.pCont, len, &msg);
  rpcSendResponse(&rsp);
S
Shengliang Guan 已提交
236 237
}

S
Shengliang Guan 已提交
238
static inline void dmSendRpcRsp(SDnode *pDnode, const SRpcMsg *pRsp) {
239
  if (pRsp->code == TSDB_CODE_NODE_REDIRECT) {
S
Shengliang Guan 已提交
240
    dmSendRpcRedirectRsp(pDnode, pRsp);
241 242
  } else {
    rpcSendResponse(pRsp);
S
shm  
Shengliang Guan 已提交
243 244 245
  }
}

S
Shengliang Guan 已提交
246
static inline void dmSendRecv(SDnode *pDnode, SEpSet *pEpSet, SRpcMsg *pReq, SRpcMsg *pRsp) {
S
Shengliang Guan 已提交
247 248
  if (pDnode->status != DND_STAT_RUNNING) {
    pRsp->code = TSDB_CODE_NODE_OFFLINE;
249 250
    rpcFreeCont(pReq->pCont);
    pReq->pCont = NULL;
S
Shengliang Guan 已提交
251 252 253
  } else {
    rpcSendRecv(pDnode->trans.clientRpc, pEpSet, pReq, pRsp);
  }
S
Shengliang Guan 已提交
254 255
}

S
Shengliang Guan 已提交
256
static inline void dmSendToMnodeRecv(SMgmtWrapper *pWrapper, SRpcMsg *pReq, SRpcMsg *pRsp) {
257 258 259
  SEpSet epSet = {0};
  dmGetMnodeEpSet(pWrapper->pDnode, &epSet);
  dmSendRecv(pWrapper->pDnode, &epSet, pReq, pRsp);
S
Shengliang Guan 已提交
260 261
}

S
Shengliang Guan 已提交
262
static inline int32_t dmSendReq(SMgmtWrapper *pWrapper, const SEpSet *pEpSet, SRpcMsg *pReq) {
263
  SDnode *pDnode = pWrapper->pDnode;
264 265 266
  if (pDnode->status != DND_STAT_RUNNING || pDnode->trans.clientRpc == NULL) {
    rpcFreeCont(pReq->pCont);
    pReq->pCont = NULL;
267
    terrno = TSDB_CODE_NODE_OFFLINE;
S
shm  
Shengliang Guan 已提交
268 269 270 271
    dError("failed to send rpc msg since %s, handle:%p", terrstr(), pReq->handle);
    return -1;
  }

272 273
  rpcSendRequest(pDnode->trans.clientRpc, pEpSet, pReq, NULL);
  return 0;
S
shm  
Shengliang Guan 已提交
274 275
}

S
Shengliang Guan 已提交
276
static inline void dmSendRsp(SMgmtWrapper *pWrapper, const SRpcMsg *pRsp) {
S
Shengliang Guan 已提交
277
  if (!InChildProc(pWrapper->proc.ptype)) {
S
Shengliang Guan 已提交
278
    dmSendRpcRsp(pWrapper->pDnode, pRsp);
S
shm  
Shengliang Guan 已提交
279
  } else {
S
Shengliang Guan 已提交
280
    dmPutToProcPQueue(&pWrapper->proc, pRsp, sizeof(SRpcMsg), pRsp->pCont, pRsp->contLen, DND_FUNC_RSP);
S
shm  
Shengliang Guan 已提交
281
  }
D
dapan1121 已提交
282
}
S
Shengliang Guan 已提交
283

M
Minghao Li 已提交
284
static inline void dmSendRedirectRsp(SMgmtWrapper *pWrapper, const SRpcMsg *pRsp, const SEpSet *pNewEpSet) {
S
Shengliang Guan 已提交
285
  if (!InChildProc(pWrapper->proc.ptype)) {
S
Shengliang Guan 已提交
286
    SRpcMsg rsp = {0};
M
Minghao Li 已提交
287 288
    SMEpSet msg = {.epSet = *pNewEpSet};
    int32_t len = tSerializeSMEpSet(NULL, 0, &msg);
S
Shengliang Guan 已提交
289 290 291 292 293 294 295 296
    rsp.pCont = rpcMallocCont(len);
    rsp.contLen = len;
    tSerializeSMEpSet(rsp.pCont, len, &msg);

    rsp.code = TSDB_CODE_RPC_REDIRECT;
    rsp.handle = pRsp->handle;
    rsp.refId = pRsp->refId;
    rpcSendResponse(&rsp);
M
Minghao Li 已提交
297
  } else {
S
Shengliang Guan 已提交
298
    dmPutToProcPQueue(&pWrapper->proc, pRsp, sizeof(SRpcMsg), pRsp->pCont, pRsp->contLen, DND_FUNC_RSP);
M
Minghao Li 已提交
299 300 301
  }
}

S
Shengliang Guan 已提交
302
static inline void dmRegisterBrokenLinkArg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg) {
S
Shengliang Guan 已提交
303
  if (!InChildProc(pWrapper->proc.ptype)) {
S
Shengliang Guan 已提交
304
    rpcRegisterBrokenLinkArg(pMsg);
S
shm  
Shengliang Guan 已提交
305
  } else {
S
Shengliang Guan 已提交
306
    dmPutToProcPQueue(&pWrapper->proc, pMsg, sizeof(SRpcMsg), pMsg->pCont, pMsg->contLen, DND_FUNC_REGIST);
S
shm  
Shengliang Guan 已提交
307 308 309
  }
}

S
Shengliang Guan 已提交
310
static inline void dmReleaseHandle(SMgmtWrapper *pWrapper, void *handle, int8_t type) {
S
Shengliang Guan 已提交
311
  if (!InChildProc(pWrapper->proc.ptype)) {
S
shm  
Shengliang Guan 已提交
312 313 314
    rpcReleaseHandle(handle, type);
  } else {
    SRpcMsg msg = {.handle = handle, .code = type};
S
Shengliang Guan 已提交
315
    dmPutToProcPQueue(&pWrapper->proc, &msg, sizeof(SRpcMsg), NULL, 0, DND_FUNC_RELEASE);
S
Shengliang Guan 已提交
316
  }
S
shm  
Shengliang Guan 已提交
317 318
}

319
static bool rpcRfp(int32_t code) {
M
Minghao Li 已提交
320 321 322 323 324 325 326
  if (code == TSDB_CODE_RPC_REDIRECT) {
    return true;
  } else {
    return false;
  }
}

327
int32_t dmInitClient(SDnode *pDnode) {
S
Shengliang Guan 已提交
328 329 330 331 332
  SDnodeTrans *pTrans = &pDnode->trans;

  SRpcInit rpcInit = {0};
  rpcInit.label = "DND";
  rpcInit.numOfThreads = 1;
S
Shengliang Guan 已提交
333
  rpcInit.cfp = (RpcCfp)dmProcessRpcMsg;
S
Shengliang Guan 已提交
334 335 336 337 338 339 340
  rpcInit.sessions = 1024;
  rpcInit.connType = TAOS_CONN_CLIENT;
  rpcInit.idleTime = tsShellActivityTimer * 1000;
  rpcInit.user = INTERNAL_USER;
  rpcInit.ckey = INTERNAL_CKEY;
  rpcInit.spi = 1;
  rpcInit.parent = pDnode;
M
Minghao Li 已提交
341
  rpcInit.rfp = rpcRfp;
S
Shengliang Guan 已提交
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356

  char pass[TSDB_PASSWORD_LEN + 1] = {0};
  taosEncryptPass_c((uint8_t *)(INTERNAL_SECRET), strlen(INTERNAL_SECRET), pass);
  rpcInit.secret = pass;

  pTrans->clientRpc = rpcOpen(&rpcInit);
  if (pTrans->clientRpc == NULL) {
    dError("failed to init dnode rpc client");
    return -1;
  }

  dDebug("dnode rpc client is initialized");
  return 0;
}

357
void dmCleanupClient(SDnode *pDnode) {
S
Shengliang Guan 已提交
358 359 360 361 362 363 364 365
  SDnodeTrans *pTrans = &pDnode->trans;
  if (pTrans->clientRpc) {
    rpcClose(pTrans->clientRpc);
    pTrans->clientRpc = NULL;
    dDebug("dnode rpc client is closed");
  }
}

S
Shengliang Guan 已提交
366 367
static inline int32_t dmGetHideUserAuth(SDnode *pDnode, char *user, char *spi, char *encrypt, char *secret,
                                        char *ckey) {
S
Shengliang Guan 已提交
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388
  int32_t code = 0;
  char    pass[TSDB_PASSWORD_LEN + 1] = {0};

  if (strcmp(user, INTERNAL_USER) == 0) {
    taosEncryptPass_c((uint8_t *)(INTERNAL_SECRET), strlen(INTERNAL_SECRET), pass);
  } else if (strcmp(user, TSDB_NETTEST_USER) == 0) {
    taosEncryptPass_c((uint8_t *)(TSDB_NETTEST_USER), strlen(TSDB_NETTEST_USER), pass);
  } else {
    code = -1;
  }

  if (code == 0) {
    memcpy(secret, pass, TSDB_PASSWORD_LEN);
    *spi = 1;
    *encrypt = 0;
    *ckey = 0;
  }

  return code;
}

S
Shengliang Guan 已提交
389 390 391
static inline int32_t dmRetrieveUserAuthInfo(SDnode *pDnode, char *user, char *spi, char *encrypt, char *secret,
                                             char *ckey) {
  if (dmGetHideUserAuth(pDnode, user, spi, encrypt, secret, ckey) == 0) {
S
Shengliang Guan 已提交
392 393 394 395 396 397 398
    dTrace("user:%s, get auth from mnode, spi:%d encrypt:%d", user, *spi, *encrypt);
    return 0;
  }

  SAuthReq authReq = {0};
  tstrncpy(authReq.user, user, TSDB_USER_LEN);
  int32_t contLen = tSerializeSAuthReq(NULL, 0, &authReq);
399
  void   *pReq = rpcMallocCont(contLen);
S
Shengliang Guan 已提交
400 401 402 403
  tSerializeSAuthReq(pReq, contLen, &authReq);

  SRpcMsg rpcMsg = {.pCont = pReq, .contLen = contLen, .msgType = TDMT_MND_AUTH, .ahandle = (void *)9528};
  SRpcMsg rpcRsp = {0};
S
Shengliang Guan 已提交
404
  SEpSet  epSet = {0};
S
Shengliang Guan 已提交
405
  dTrace("user:%s, send user auth req to other mnodes, spi:%d encrypt:%d", user, authReq.spi, authReq.encrypt);
S
Shengliang Guan 已提交
406 407
  dmGetMnodeEpSet(pDnode, &epSet);
  dmSendRecv(pDnode, &epSet, &rpcMsg, &rpcRsp);
S
Shengliang Guan 已提交
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426

  if (rpcRsp.code != 0) {
    terrno = rpcRsp.code;
    dError("user:%s, failed to get user auth from other mnodes since %s", user, terrstr());
  } else {
    SAuthRsp authRsp = {0};
    tDeserializeSAuthReq(rpcRsp.pCont, rpcRsp.contLen, &authRsp);
    memcpy(secret, authRsp.secret, TSDB_PASSWORD_LEN);
    memcpy(ckey, authRsp.ckey, TSDB_PASSWORD_LEN);
    *spi = authRsp.spi;
    *encrypt = authRsp.encrypt;
    dTrace("user:%s, success to get user auth from other mnodes, spi:%d encrypt:%d", user, authRsp.spi,
           authRsp.encrypt);
  }

  rpcFreeCont(rpcRsp.pCont);
  return rpcRsp.code;
}

427
int32_t dmInitServer(SDnode *pDnode) {
S
Shengliang Guan 已提交
428 429 430
  SDnodeTrans *pTrans = &pDnode->trans;

  SRpcInit rpcInit = {0};
431

S
Shengliang Guan 已提交
432 433
  strncpy(rpcInit.localFqdn, pDnode->data.localFqdn, strlen(pDnode->data.localFqdn));
  rpcInit.localPort = pDnode->data.serverPort;
S
Shengliang Guan 已提交
434 435
  rpcInit.label = "DND";
  rpcInit.numOfThreads = tsNumOfRpcThreads;
S
Shengliang Guan 已提交
436
  rpcInit.cfp = (RpcCfp)dmProcessRpcMsg;
S
Shengliang Guan 已提交
437 438 439
  rpcInit.sessions = tsMaxShellConns;
  rpcInit.connType = TAOS_CONN_SERVER;
  rpcInit.idleTime = tsShellActivityTimer * 1000;
S
Shengliang Guan 已提交
440
  rpcInit.afp = (RpcAfp)dmRetrieveUserAuthInfo;
S
Shengliang Guan 已提交
441 442 443 444 445 446 447 448 449 450 451 452
  rpcInit.parent = pDnode;

  pTrans->serverRpc = rpcOpen(&rpcInit);
  if (pTrans->serverRpc == NULL) {
    dError("failed to init dnode rpc server");
    return -1;
  }

  dDebug("dnode rpc server is initialized");
  return 0;
}

453
void dmCleanupServer(SDnode *pDnode) {
S
Shengliang Guan 已提交
454 455 456 457 458 459 460 461
  SDnodeTrans *pTrans = &pDnode->trans;
  if (pTrans->serverRpc) {
    rpcClose(pTrans->serverRpc);
    pTrans->serverRpc = NULL;
    dDebug("dnode rpc server is closed");
  }
}

S
Shengliang Guan 已提交
462 463
SMsgCb dmGetMsgcb(SMgmtWrapper *pWrapper) {
  SMsgCb msgCb = {
S
Shengliang Guan 已提交
464 465
      .pWrapper = pWrapper,
      .clientRpc = pWrapper->pDnode->trans.clientRpc,
S
Shengliang Guan 已提交
466 467
      .sendReqFp = dmSendReq,
      .sendRspFp = dmSendRsp,
S
Shengliang Guan 已提交
468
      .sendMnodeRecvFp = dmSendToMnodeRecv,
M
Minghao Li 已提交
469
      .sendRedirectRspFp = dmSendRedirectRsp,
S
Shengliang Guan 已提交
470 471
      .registerBrokenLinkArgFp = dmRegisterBrokenLinkArg,
      .releaseHandleFp = dmReleaseHandle,
S
Shengliang Guan 已提交
472
      .reportStartupFp = dmReportStartupByWrapper,
S
Shengliang Guan 已提交
473 474
  };
  return msgCb;
dengyihao's avatar
dengyihao 已提交
475
}