mirror of
https://github.com/taosdata/TDengine
synced 2026-05-24 10:09:01 +00:00
* feat: support TDAcoreOS * chore: cmake options for TD_ACORE * chore: disable lemon for TD_ACORE * chore: add lzma2 and msvcregex * chore: cmake for lzma2 * chore: adapt for TD_ACORE * chore: adapt strcasecmp for TD_ACORE * chore: adapt for geos/threadName * chore: build adapt for TD_ACORE * chore: build adapt for TD_ACORE * chore: build adapt for TD_ACORE * chore: build adapt for TD_ACORE * chore: build adapt for TD_ACORE termio * chore: refact transComm.h for TD_ACORE * chore: refact transportInt.h for TD_ACORE * chore: refact trans.c for TD_ACORE * chore: refact trpc.h for TD_ACORE * chore: refact transCli.c/transComm.c/transSvr.c for TD_ACORE * chore: refact uv.h for TD_ACORE * chore: refact geosWrapper.h for TD_ACORE * chore: refact token/builtins/udf for TD_ACORE * chore: refact rocks for TD_ACORE * chore: refact tsdbCache.c for TD_ACORE, use LRU cache for last/last_row, not use rocksdb * chore: refact FAIL to _ERR to solve conflicts for TD_ACORE * chore: restore lemon.c/lempar.c * chore: support build lemon for TD_ACORE * chore: refact trpc and siginfo_t for TD_ACORE * chore: refact timezone for TD_ACORE * chore: refact lz4 for TD_ACORE * chore: refact TD_ACORE to make compile pass * chore: code optimization for TD_ASTRA * feat: support run taos with taosd integrated * feat: support invoke taos shell * feat: support invoke taos shell * feat: support invoke taos shell * chore: code optimization * chore: fix undefined reference problem os TD_ASTRA * chore: resolve compile problem for TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix undefined reference problem os TD_ASTRA * chore: fix getpid * chore: fix typo * chore: set stack size and ajust min pack size for TD_ASTRA * chore: fix pthread create parameters * chore: chmod adapt for TD_ASTRA * chore: fix trans compile problem * chore: adapt chmod for TD_ASTRA * chore: byte alignment for TD_ASTRA * chore: more code for adaption of TD_ASTRA * chore: more code for adaption of TD_ASTRA * chore: more code for adaption of TD_ASTRA * chore: byte alignment for TD_ASTRA * chore: conditional compile option * chore: adapt for TD_ASTRA * chore: adjust taosPId and msvcregex for TD_ASTRA * chore: log dir separator for wal build name * chore: fix type of pointer parameter * chore: fix compile problem of tsdbGetS3Size * enh: get last ver from wal log for TD_ASTRA * enh: refact wal meta ver * enh: refact wal meta ver * fix: typo of taosUcs4Compare * enh: process return value of CI * chore: more code for TD_ASTRA adaption * chore: return value of taosCloseFile in walMeta.c * chore: fix compile problem * chore: fix compile problem of TD_ASTRA * fix: update macro for tq and stream task * chore: code optimization for TD_ASTRA * chore: restore create log and init cfg interface * chore: restore strncasecmp and strcasecmp * fix: adjust the field position of SDataBlockInfo * fix: pragma pack min size * fix: pragma pack min size * chore: more code for TD_ASTRA adaption * fix: type of parameters * chore: adapt strncasecmp and strcasecmp for TD_ASTRA * chore: restore interface of init log * enh: pack push optimization * fix: taos init cfg * add astra support * fix: fetch the value of suid * chore: switch of build with udf * add temp code * chore: more code for TD_ASTRA adaption * chore: add macro ERRNO to replace errno * chore: bytes align for TD_ASTRA * fix: remove obsolete codes * enh: support USE_UDF macro * fix compile error * fix: resolve redefinition problem * fix: compile problem of log.cpp * fix: compile problem of osTimezone * fix: resolve compile problem of udf * fix: pragma definition on windows * fix: ucs4 and stpncpy for TD_ASTRA * fix: memory align problem for TD_ASTRA * enh: solve memory leak for TD_ASTRA_RPC * fix: compile problem of taosSetInt64Aligned * fix: restore mndSubscribe.c * fix: scalar for udf * chore: code adaption for TD_ASTRA * chore: code optimization for TD_ASTRA * fix: typo of add definition * fix: typo of macro in tudf.h * chore: remove void to make CI pass * enh: move macro from cmake.platform to cmake.options * enh: byte align for hash node and error code * chore: restore the size for lru cache * enh: restore some code about pack push * chore: restore the pack push in tmsg.h * fix: add macro of pack pop for windows --------- Co-authored-by: yihaoDeng <luomoxyz@126.com>
210 lines
6.2 KiB
C
210 lines
6.2 KiB
C
/*
|
|
* 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/>.
|
|
*/
|
|
|
|
#define _DEFAULT_SOURCE
|
|
#include "sdb.h"
|
|
|
|
static int32_t sdbCreateDir(SSdb *pSdb);
|
|
|
|
SSdb *sdbInit(SSdbOpt *pOption) {
|
|
mInfo("start to init sdb in %s", pOption->path);
|
|
|
|
SSdb *pSdb = taosMemoryCalloc(1, sizeof(SSdb));
|
|
if (pSdb == NULL) {
|
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
mError("failed to init sdb since %s", terrstr());
|
|
return NULL;
|
|
}
|
|
|
|
char path[PATH_MAX + 100] = {0};
|
|
snprintf(path, sizeof(path), "%s%sdata", pOption->path, TD_DIRSEP);
|
|
pSdb->currDir = taosStrdup(path);
|
|
snprintf(path, sizeof(path), "%s%stmp", pOption->path, TD_DIRSEP);
|
|
pSdb->tmpDir = taosStrdup(path);
|
|
if (pSdb->currDir == NULL || pSdb->tmpDir == NULL) {
|
|
sdbCleanup(pSdb);
|
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
mError("failed to init sdb since %s", terrstr());
|
|
return NULL;
|
|
}
|
|
|
|
if (sdbCreateDir(pSdb) != 0) {
|
|
sdbCleanup(pSdb);
|
|
return NULL;
|
|
}
|
|
|
|
for (ESdbType i = 0; i < SDB_MAX; ++i) {
|
|
(void)taosThreadRwlockInit(&pSdb->locks[i], NULL);
|
|
pSdb->maxId[i] = 0;
|
|
pSdb->tableVer[i] = 0;
|
|
pSdb->keyTypes[i] = SDB_KEY_INT32;
|
|
}
|
|
|
|
pSdb->pWal = pOption->pWal;
|
|
pSdb->applyIndex = -1;
|
|
pSdb->applyTerm = -1;
|
|
pSdb->applyConfig = -1;
|
|
pSdb->commitIndex = -1;
|
|
pSdb->commitTerm = -1;
|
|
pSdb->commitConfig = -1;
|
|
pSdb->pMnode = pOption->pMnode;
|
|
(void)taosThreadMutexInit(&pSdb->filelock, NULL);
|
|
mInfo("sdb init success");
|
|
return pSdb;
|
|
}
|
|
|
|
void sdbCleanup(SSdb *pSdb) {
|
|
mInfo("start to cleanup sdb");
|
|
|
|
int32_t code = 0;
|
|
|
|
if ((code = sdbWriteFile(pSdb, 0)) != 0) {
|
|
mError("failed to write sdb file since %s", tstrerror(code));
|
|
}
|
|
|
|
if (pSdb->currDir != NULL) {
|
|
taosMemoryFreeClear(pSdb->currDir);
|
|
}
|
|
|
|
if (pSdb->tmpDir != NULL) {
|
|
taosRemoveDir(pSdb->tmpDir);
|
|
taosMemoryFreeClear(pSdb->tmpDir);
|
|
}
|
|
|
|
for (ESdbType i = 0; i < SDB_MAX; ++i) {
|
|
SHashObj *hash = pSdb->hashObjs[i];
|
|
if (hash == NULL) continue;
|
|
|
|
SSdbRow **ppRow = taosHashIterate(hash, NULL);
|
|
while (ppRow != NULL) {
|
|
SSdbRow *pRow = *ppRow;
|
|
if (pRow == NULL) continue;
|
|
|
|
sdbFreeRow(pSdb, pRow, true);
|
|
ppRow = taosHashIterate(hash, ppRow);
|
|
}
|
|
}
|
|
|
|
for (ESdbType i = 0; i < SDB_MAX; ++i) {
|
|
SHashObj *hash = pSdb->hashObjs[i];
|
|
if (hash == NULL) continue;
|
|
|
|
taosHashClear(hash);
|
|
taosHashCleanup(hash);
|
|
(void)taosThreadRwlockDestroy(&pSdb->locks[i]);
|
|
pSdb->hashObjs[i] = NULL;
|
|
memset(&pSdb->locks[i], 0, sizeof(pSdb->locks[i]));
|
|
|
|
mInfo("sdb table:%s is cleaned up", sdbTableName(i));
|
|
}
|
|
|
|
(void)taosThreadMutexDestroy(&pSdb->filelock);
|
|
taosMemoryFree(pSdb);
|
|
mInfo("sdb is cleaned up");
|
|
}
|
|
|
|
int32_t sdbSetTable(SSdb *pSdb, SSdbTable table) {
|
|
int32_t code = 0;
|
|
|
|
ESdbType sdbType = table.sdbType;
|
|
EKeyType keyType = table.keyType;
|
|
pSdb->keyTypes[sdbType] = table.keyType;
|
|
pSdb->insertFps[sdbType] = table.insertFp;
|
|
pSdb->updateFps[sdbType] = table.updateFp;
|
|
pSdb->deleteFps[sdbType] = table.deleteFp;
|
|
pSdb->deployFps[sdbType] = table.deployFp;
|
|
pSdb->encodeFps[sdbType] = table.encodeFp;
|
|
pSdb->decodeFps[sdbType] = table.decodeFp;
|
|
pSdb->afterRestoredFps[sdbType] = table.afterRestoredFp;
|
|
pSdb->validateFps[sdbType] = table.validateFp;
|
|
|
|
int32_t hashType = 0;
|
|
if (keyType == SDB_KEY_INT32) {
|
|
hashType = TSDB_DATA_TYPE_INT;
|
|
} else if (keyType == SDB_KEY_INT64) {
|
|
hashType = TSDB_DATA_TYPE_BIGINT;
|
|
} else {
|
|
hashType = TSDB_DATA_TYPE_BINARY;
|
|
}
|
|
|
|
SHashObj *hash = taosHashInit(64, taosGetDefaultHashFunction(hashType), true, HASH_ENTRY_LOCK);
|
|
if (hash == NULL) {
|
|
TAOS_RETURN(terrno);
|
|
}
|
|
|
|
pSdb->maxId[sdbType] = 0;
|
|
pSdb->hashObjs[sdbType] = hash;
|
|
mInfo("sdb table:%s is initialized", sdbTableName(sdbType));
|
|
|
|
TAOS_RETURN(0);
|
|
}
|
|
|
|
static int32_t sdbCreateDir(SSdb *pSdb) {
|
|
int32_t code = 0;
|
|
if (taosMulMkDir(pSdb->currDir) != 0) {
|
|
code = TAOS_SYSTEM_ERROR(ERRNO);
|
|
mError("failed to create dir:%s since %s", pSdb->currDir, tstrerror(code));
|
|
TAOS_RETURN(code);
|
|
}
|
|
|
|
if (taosMkDir(pSdb->tmpDir) != 0) {
|
|
code = TAOS_SYSTEM_ERROR(ERRNO);
|
|
mError("failed to create dir:%s since %s", pSdb->tmpDir, tstrerror(code));
|
|
TAOS_RETURN(code);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void sdbSetApplyInfo(SSdb *pSdb, int64_t index, int64_t term, int64_t config) {
|
|
mInfo("vgId:1, mnode apply info changed from index:%" PRId64 " term:%" PRId64 " config:%" PRId64 " to index:%" PRId64
|
|
" term:%" PRId64 " config:%" PRId64,
|
|
pSdb->applyIndex, pSdb->applyTerm, pSdb->applyConfig, index, term, config);
|
|
|
|
pSdb->applyIndex = index;
|
|
pSdb->applyTerm = term;
|
|
pSdb->applyConfig = config;
|
|
}
|
|
|
|
void sdbGetCommitInfo(SSdb *pSdb, int64_t *index, int64_t *term, int64_t *config) {
|
|
*index = pSdb->commitIndex;
|
|
*term = pSdb->commitTerm;
|
|
*config = pSdb->commitConfig;
|
|
#if 1
|
|
mTrace("mnode current info, apply index:%" PRId64 " term:%" PRId64 " config:%" PRId64 ", commit index:%" PRId64
|
|
" term:%" PRId64 " config:%" PRId64,
|
|
pSdb->applyIndex, pSdb->applyTerm, pSdb->applyConfig, *index, *term, *config);
|
|
#endif
|
|
}
|
|
|
|
void sdbWriteLock(SSdb *pSdb, int32_t type) {
|
|
TdThreadRwlock *pLock = &pSdb->locks[type];
|
|
// mTrace("sdb table:%d start write lock:%p", type, pLock);
|
|
(void)taosThreadRwlockWrlock(pLock);
|
|
// mTrace("sdb table:%d stop write lock:%p", type, pLock);
|
|
}
|
|
|
|
void sdbReadLock(SSdb *pSdb, int32_t type) {
|
|
TdThreadRwlock *pLock = &pSdb->locks[type];
|
|
// mTrace("sdb table:%d start read lock:%p", type, pLock);
|
|
(void)taosThreadRwlockRdlock(pLock);
|
|
// mTrace("sdb table:%d stop read lock:%p", type, pLock);
|
|
}
|
|
|
|
void sdbUnLock(SSdb *pSdb, int32_t type) {
|
|
TdThreadRwlock *pLock = &pSdb->locks[type];
|
|
// mTrace("sdb table:%d unlock:%p", type, pLock);
|
|
(void)taosThreadRwlockUnlock(pLock);
|
|
}
|