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

#ifndef TDENGINE_DNODE_H
#define TDENGINE_DNODE_H

#ifdef __cplusplus
extern "C" {
#endif

H
Hongze Cheng 已提交
23 24
#include "hash.h"
#include "taoserror.h"
J
jtao1735 已提交
25 26
#include "trpc.h"

S
slguan 已提交
27
typedef struct {
S
slguan 已提交
28 29
  int32_t queryReqNum;
  int32_t submitReqNum;
S
slguan 已提交
30 31
  int32_t httpReqNum;
} SDnodeStatisInfo;
S
#1177  
slguan 已提交
32

S
slguan 已提交
33 34 35 36 37
typedef enum {
  TSDB_DNODE_RUN_STATUS_INITIALIZE,
  TSDB_DNODE_RUN_STATUS_RUNING,
  TSDB_DNODE_RUN_STATUS_STOPPED
} SDnodeRunStatus;
S
slguan 已提交
38

S
slguan 已提交
39
SDnodeRunStatus dnodeGetRunStatus();
S
slguan 已提交
40 41
SDnodeStatisInfo dnodeGetStatisInfo();

42 43
bool    dnodeIsFirstDeploy();
char *  dnodeGetMnodeMasterEp();
44 45
void    dnodeGetMnodeEpSetForPeer(void *epSet);
void    dnodeGetMnodeEpSetForShell(void *epSet);
46 47
void *  dnodeGetMnodeInfos();
int32_t dnodeGetDnodeId();
S
TD-1671  
Shengliang Guan 已提交
48
bool    dnodeStartMnode(void *pModes);
49

S
Shengliang Guan 已提交
50
void  dnodeAddClientRspHandle(uint8_t msgType, void (*fp)(SRpcMsg *rpcMsg));
51
void  dnodeSendMsgToDnode(SRpcEpSet *epSet, SRpcMsg *rpcMsg);
S
TD-1671  
Shengliang Guan 已提交
52 53
void  dnodeSendMsgToMnodeRecv(SRpcMsg *rpcMsg, SRpcMsg *rpcRsp);
void  dnodeSendMsgToDnodeRecv(SRpcMsg *rpcMsg, SRpcMsg *rpcRsp, SRpcEpSet *epSet);
S
Shengliang Guan 已提交
54
void *dnodeSendCfgTableToRecv(int32_t vgId, int32_t sid);
55

S
Shengliang Guan 已提交
56 57 58 59 60 61
void *dnodeAllocateVnodeWqueue(void *pVnode);
void  dnodeFreeVnodeWqueue(void *queue);
void *dnodeAllocateVnodeRqueue(void *pVnode);
void  dnodeFreeVnodeRqueue(void *rqueue);
void  dnodeSendRpcVnodeWriteRsp(void *pVnode, void *param, int32_t code);

S
Shengliang Guan 已提交
62 63
int32_t dnodeAllocateMnodePqueue();
void    dnodeFreeMnodePqueue();
S
Shengliang Guan 已提交
64 65 66 67 68 69 70
int32_t dnodeAllocateMnodeRqueue();
void    dnodeFreeMnodeRqueue();
int32_t dnodeAllocateMnodeWqueue();
void    dnodeFreeMnodeWqueue();
void    dnodeSendRpcMnodeWriteRsp(void *pMsg, int32_t code);
void    dnodeReprocessMnodeWriteMsg(void *pMsg);
void    dnodeDelayReprocessMnodeWriteMsg(void *pMsg);
J
jtao1735 已提交
71

72 73
void    dnodeSendStatusMsgToMnode();

H
Hongze Cheng 已提交
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
// DNODE TIER
#define DNODE_MAX_TIERS 3
#define DNODE_MAX_DISKS_PER_TIER 16

typedef struct {
  int level;
  int did;
} SDiskID;

typedef struct {
  uint64_t size;
  uint64_t free;
  uint64_t nfiles;
} SDiskMeta;

typedef struct {
  char      dir[TSDB_FILENAME_LEN];
  SDiskMeta dmeta;
} SDisk;

typedef struct {
  int   level;
  int   nDisks;
  SDisk disks[DNODE_MAX_DISKS_PER_TIER];
} STier;

typedef struct SDnodeTier {
  pthread_rwlock_t rwlock;
  int              nTiers;
  STier            tiers[DNODE_MAX_TIERS];
  SHashObj *       map;
} SDnodeTier;

#define DNODE_PRIMARY_DISK(pDnodeTier) (&(pDnodeTier)->tiers[0].disks[0])

static FORCE_INLINE int dnodeRLockTiers(SDnodeTier *pDnodeTier) {
  int code = pthread_rwlock_rdlock(&(pDnodeTier->rwlock));
  if (code != 0) {
    terrno = TAOS_SYSTEM_ERROR(code);
    return -1;
  }
  return 0;
}

static FORCE_INLINE int dnodeWLockTiers(SDnodeTier *pDnodeTier) {
  int code = pthread_rwlock_wrlock(&(pDnodeTier->rwlock));
  if (code != 0) {
    terrno = TAOS_SYSTEM_ERROR(code);
    return -1;
  }
  return 0;
}

static FORCE_INLINE int dnodeUnLockTiers(SDnodeTier *pDnodeTier) {
  int code = pthread_rwlock_unlock(&(pDnodeTier->rwlock));
  if (code != 0) {
    terrno = TAOS_SYSTEM_ERROR(code);
    return -1;
  }
  return 0;
}

static FORCE_INLINE SDisk *dnodeGetDisk(SDnodeTier *pDnodeTier, int level, int did) {
  if (level < 0 || level >= pDnodeTier->nTiers) return NULL;

  if (did < 0 || did >= pDnodeTier->tiers[level].nDisks) return NULL;

  return &(pDnodeTier->tiers[level].disks[did]);
}

SDnodeTier *dnodeNewTier();
void *      dnodeCloseTier(SDnodeTier *pDnodeTier);
int         dnodeAddDisk(SDnodeTier *pDnodeTier, char *dir, int level);
int         dnodeUpdateTiersInfo(SDnodeTier *pDnodeTier);
int         dnodeCheckTiers(SDnodeTier *pDnodeTier);
SDisk *     dnodeAssignDisk(SDnodeTier *pDnodeTier, int level);
SDisk *     dnodeGetDiskByName(SDnodeTier *pDnodeTier, char *dirName);


S
#1177  
slguan 已提交
153 154 155 156 157
#ifdef __cplusplus
}
#endif

#endif