diff --git a/CMakeLists.txt b/CMakeLists.txt index 588526c28614f753f6ff70e898f13f3fd65318db..d96c8da57715631344a971caa30bd81c6fdbcb4f 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ SET(TD_GRANT FALSE) SET(TD_SYNC TRUE) SET(TD_MQTT TRUE) SET(TD_TSDB_PLUGINS FALSE) +SET(TD_DNODE_PLUGINS FALSE) SET(TD_COVER FALSE) SET(TD_MEM_CHECK FALSE) diff --git a/cmake/define.inc b/cmake/define.inc index 6e64c2709abee366856a61916c6905363ea2002d..3bd1520065f886a56b95f89875fac7977bc396ce 100755 --- a/cmake/define.inc +++ b/cmake/define.inc @@ -25,6 +25,10 @@ IF (TD_TSDB_PLUGINS) ADD_DEFINITIONS(-D_TSDB_PLUGINS) ENDIF () +IF (TD_DNODE_PLUGINS) + ADD_DEFINITIONS(-D_DNODE_PLUGINS) +ENDIF () + IF (TD_GODLL) ADD_DEFINITIONS(-D_TD_GO_DLL_) ENDIF () diff --git a/src/dnode/inc/dnodeTier.h b/src/dnode/inc/dnodeTier.h new file mode 100644 index 0000000000000000000000000000000000000000..019a4a21121eba0ded46d9730c3068c56784728d --- /dev/null +++ b/src/dnode/inc/dnodeTier.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * 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 . + */ + +#ifndef TDENGINE_DNODE_TIER_H +#define TDENGINE_DNODE_TIER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "hash.h" +#include "taoserror.h" + +#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 { + 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); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/dnode/src/dnodeTier.c b/src/dnode/src/dnodeTier.c new file mode 100644 index 0000000000000000000000000000000000000000..0bd1a38911661a7a9781662d5e971ba2ad24ce2e --- /dev/null +++ b/src/dnode/src/dnodeTier.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * 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 . + */ + +#include "os.h" +#include "dnodeTier.h" + +#ifndef _DNODE_PLUGINS + +SDnodeTier *dnodeNewTier() { return NULL; } +void * dnodeCloseTier(SDnodeTier *pDnodeTier) { return NULL; } +int dnodeAddDisk(SDnodeTier *pDnodeTier, char *dir, int level) { return 0; } +int dnodeUpdateTiersInfo(SDnodeTier *pDnodeTier) { return 0; } +int dnodeCheckTiers(SDnodeTier *pDnodeTier) { return 0; } +SDisk * dnodeAssignDisk(SDnodeTier *pDnodeTier, int level) { return NULL; } +SDisk * dnodeGetDiskByName(SDnodeTier *pDnodeTier, char *dirName) { return NULL; } + +#endif \ No newline at end of file