diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index 84a119193f..9c95a22739 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -1196,6 +1196,7 @@ static int metaAddTagIndex(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTb int64_t oversion; const void *pData = NULL; int nData = 0; + SDecoder dc = {0}; if (pAlterTbReq->tagName == NULL) { terrno = TSDB_CODE_INVALID_MSG; @@ -1208,82 +1209,147 @@ static int metaAddTagIndex(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTb terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; return -1; } - uid = *(tb_uid_t *)pVal; tdbFree(pVal); pVal = NULL; - // search uid index - TBC *pUidIdxc = NULL; - - tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, &pMeta->txn); - tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c); - ASSERT(c == 0); - - tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData); - oversion = ((SUidIdxVal *)pData)[0].version; - - // search table.db - TBC *pTbDbc = NULL; - SDecoder dc1 = {0}; - SDecoder dc2 = {0}; - - /* get ctbEntry */ - tdbTbcOpen(pMeta->pTbDb, &pTbDbc, &pMeta->txn); - tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c); - ASSERT(c == 0); - tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData); - - ctbEntry.pBuf = taosMemoryMalloc(nData); - memcpy(ctbEntry.pBuf, pData, nData); - tDecoderInit(&dc1, ctbEntry.pBuf, nData); - metaDecodeEntry(&dc1, &ctbEntry); - - /* get stbEntry*/ - tdbTbGet(pMeta->pUidIdx, &ctbEntry.ctbEntry.suid, sizeof(tb_uid_t), &pVal, &nVal); - if (!pVal) { - terrno = TSDB_CODE_INVALID_MSG; + if (tdbTbGet(pMeta->pUidIdx, &uid, sizeof(tb_uid_t), &pVal, &nVal) == -1) { + ret = -1; goto _err; } - tdbTbGet(pMeta->pTbDb, &((STbDbKey){.uid = ctbEntry.ctbEntry.suid, .version = ((SUidIdxVal *)pVal)[0].version}), - sizeof(STbDbKey), (void **)&stbEntry.pBuf, &nVal); - tdbFree(pVal); - tDecoderInit(&dc2, stbEntry.pBuf, nVal); - metaDecodeEntry(&dc2, &stbEntry); + STbDbKey tbDbKey = {0}; + tbDbKey.uid = uid; + tbDbKey.version = ((SUidIdxVal *)pVal)[0].version; + tdbTbGet(pMeta->pTbDb, &tbDbKey, sizeof(tbDbKey), &pVal, &nVal); + + tDecoderInit(&dc, pVal, nVal); + ret = metaDecodeEntry(&dc, &stbEntry); + if (ret < 0) { + goto _err; + } SSchemaWrapper *pTagSchema = &stbEntry.stbEntry.schemaTag; - SSchema *pColumn = NULL; - int32_t iCol = 0; + + if (pTagSchema->nCols == 1 && pTagSchema->pSchema[0].type == TSDB_DATA_TYPE_JSON) { + terrno = TSDB_CODE_VND_COL_ALREADY_EXISTS; + goto _err; + } + + SSchema *pCol = NULL; + int32_t iCol = 0; for (;;) { - pColumn = NULL; + pCol = NULL; if (iCol >= pTagSchema->nCols) break; - pColumn = &pTagSchema->pSchema[iCol]; + pCol = &pTagSchema->pSchema[iCol]; - if (strcmp(pColumn->name, pAlterTbReq->tagName) == 0) break; + if (strcmp(pCol->name, pAlterTbReq->tagName) == 0) break; iCol++; } - if (pColumn == NULL) { + if (iCol == 0) { + terrno = TSDB_CODE_VND_COL_ALREADY_EXISTS; + goto _err; + } + if (pCol == NULL) { terrno = TSDB_CODE_VND_COL_NOT_EXISTS; goto _err; } - - ctbEntry.version = version; - if (pTagSchema->nCols == 1 && pTagSchema->pSchema[0].type == TSDB_DATA_TYPE_JSON) { - terrno = TSDB_CODE_INVALID_MSG; + /* + * iterator all pTdDbc by uid and version + */ + // drop all child tables + TBC *pCtbIdxc = NULL; + tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL); + int rc = tdbTbcMoveTo(pCtbIdxc, &(SCtbIdxKey){.suid = uid, .uid = INT64_MIN}, sizeof(SCtbIdxKey), &c); + if (rc < 0) { + tdbTbcClose(pCtbIdxc); goto _err; } - - const STag *pOldTag = (const STag *)ctbEntry.ctbEntry.pTags; - STag *pNewTag = NULL; - SArray *pTagArray = taosArrayInit(pTagSchema->nCols, sizeof(STagVal)); - if (!pTagArray) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + for (;;) { + void *pKey, *pVal; + int nKey, nVal; + rc = tdbTbcNext(pCtbIdxc, &pKey, &nKey, &pVal, &nVal); + if (rc < 0) break; + if (((SCtbIdxKey *)pKey)->suid != uid) { + tdbFree(pVal); + continue; + } + STag *pTag = pVal; } + // search uid index + // TBC *pUidIdxc = NULL; + + // tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, pMeta->txn); + // tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c); + // ASSERT(c == 0); + + // tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData); + // oversion = ((SUidIdxVal *)pData)[0].version; + + // search table.db + // TBC *pTbDbc = NULL; + // SDecoder dc1 = {0}; + // SDecoder dc2 = {0}; + + ///* get ctbEntry */ + // tdbTbcOpen(pMeta->pTbDb, &pTbDbc, pMeta->txn); + // tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c); + // ASSERT(c == 0); + // tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData); + + // ctbEntry.pBuf = taosMemoryMalloc(nData); + // memcpy(ctbEntry.pBuf, pData, nData); + // tDecoderInit(&dc1, ctbEntry.pBuf, nData); + // metaDecodeEntry(&dc1, &ctbEntry); + + /* get stbEntry*/ + // tdbTbGet(pMeta->pUidIdx, &ctbEntry.ctbEntry.suid, sizeof(tb_uid_t), &pVal, &nVal); + // if (!pVal) { + // terrno = TSDB_CODE_INVALID_MSG; + // goto _err; + // } + + // tdbTbGet(pMeta->pTbDb, &((STbDbKey){.uid = ctbEntry.ctbEntry.suid, .version = ((SUidIdxVal *)pVal)[0].version}), + // sizeof(STbDbKey), (void **)&stbEntry.pBuf, &nVal); + // tdbFree(pVal); + // tDecoderInit(&dc2, stbEntry.pBuf, nVal); + // metaDecodeEntry(&dc2, &stbEntry); + + // SSchemaWrapper *pTagSchema = &stbEntry.stbEntry.schemaTag; + // SSchema *pColumn = NULL; + // int32_t iCol = 0; + // for (;;) { + // pColumn = NULL; + + // if (iCol >= pTagSchema->nCols) break; + // pColumn = &pTagSchema->pSchema[iCol]; + + // if (strcmp(pColumn->name, pAlterTbReq->tagName) == 0) break; + // iCol++; + //} + + // if (pColumn == NULL) { + // terrno = TSDB_CODE_VND_COL_NOT_EXISTS; + // goto _err; + // } + + // ctbEntry.version = version; + // if (pTagSchema->nCols == 1 && pTagSchema->pSchema[0].type == TSDB_DATA_TYPE_JSON) { + // terrno = TSDB_CODE_INVALID_MSG; + // goto _err; + // } + + // const STag *pOldTag = (const STag *)ctbEntry.ctbEntry.pTags; + // STag *pNewTag = NULL; + // SArray *pTagArray = taosArrayInit(pTagSchema->nCols, sizeof(STagVal)); + // if (!pTagArray) { + // terrno = TSDB_CODE_OUT_OF_MEMORY; + // goto _err; + // } + // for (int32_t i = 0; i < pTagSchema->nCols; i++) { // SSchema *pCol = &pTagSchema->pSchema[i]; // if (iCol == i) { @@ -1315,43 +1381,43 @@ static int metaAddTagIndex(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTb // ctbEntry.ctbEntry.pTags = (uint8_t *)pNewTag; // taosArrayDestroy(pTagArray); - metaWLock(pMeta); + // metaWLock(pMeta); // save to table.db - metaSaveToTbDb(pMeta, &ctbEntry); + // metaSaveToTbDb(pMeta, &ctbEntry); // save to uid.idx - metaUpdateUidIdx(pMeta, &ctbEntry); + // metaUpdateUidIdx(pMeta, &ctbEntry); - if (iCol == 0) { - metaUpdateTagIdx(pMeta, &ctbEntry); - } + // if (iCol == 0) { + // metaUpdateTagIdx(pMeta, &ctbEntry); + // } - ASSERT(ctbEntry.ctbEntry.pTags); - SCtbIdxKey ctbIdxKey = {.suid = ctbEntry.ctbEntry.suid, .uid = uid}; - tdbTbUpsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), ctbEntry.ctbEntry.pTags, - ((STag *)(ctbEntry.ctbEntry.pTags))->len, &pMeta->txn); + // ASSERT(ctbEntry.ctbEntry.pTags); + // SCtbIdxKey ctbIdxKey = {.suid = ctbEntry.ctbEntry.suid, .uid = uid}; + // tdbTbUpsert(pMeta->pCtbIdx, &ctbIdxKey, sizeof(ctbIdxKey), ctbEntry.ctbEntry.pTags, + // ((STag *)(ctbEntry.ctbEntry.pTags))->len, pMeta->txn); - metaUidCacheClear(pMeta, ctbEntry.ctbEntry.suid); + // metaUidCacheClear(pMeta, ctbEntry.ctbEntry.suid); - metaULock(pMeta); + // metaULock(pMeta); - tDecoderClear(&dc1); - tDecoderClear(&dc2); - taosMemoryFree((void *)ctbEntry.ctbEntry.pTags); - if (ctbEntry.pBuf) taosMemoryFree(ctbEntry.pBuf); - if (stbEntry.pBuf) tdbFree(stbEntry.pBuf); - tdbTbcClose(pTbDbc); - tdbTbcClose(pUidIdxc); + // tDecoderClear(&dc1); + // tDecoderClear(&dc2); + // taosMemoryFree((void *)ctbEntry.ctbEntry.pTags); + // if (ctbEntry.pBuf) taosMemoryFree(ctbEntry.pBuf); + // if (stbEntry.pBuf) tdbFree(stbEntry.pBuf); + // tdbTbcClose(pTbDbc); + // tdbTbcClose(pUidIdxc); return 0; _err: - tDecoderClear(&dc1); - tDecoderClear(&dc2); - if (ctbEntry.pBuf) taosMemoryFree(ctbEntry.pBuf); - if (stbEntry.pBuf) tdbFree(stbEntry.pBuf); - tdbTbcClose(pTbDbc); - tdbTbcClose(pUidIdxc); + // tDecoderClear(&dc1); + // tDecoderClear(&dc2); + // if (ctbEntry.pBuf) taosMemoryFree(ctbEntry.pBuf); + // if (stbEntry.pBuf) tdbFree(stbEntry.pBuf); + // tdbTbcClose(pTbDbc); + // tdbTbcClose(pUidIdxc); return -1; }