Merge pull request #14246 from taosdata/feature/stream
enh(stream): generate schema only once
This commit is contained in:
commit
c8cca3568a
|
@ -18,57 +18,87 @@
|
||||||
SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, bool createTb, int64_t suid,
|
SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, bool createTb, int64_t suid,
|
||||||
const char* stbFullName, int32_t vgId) {
|
const char* stbFullName, int32_t vgId) {
|
||||||
SSubmitReq* ret = NULL;
|
SSubmitReq* ret = NULL;
|
||||||
|
SArray* schemaReqs = NULL;
|
||||||
|
SArray* schemaReqSz = NULL;
|
||||||
SArray* tagArray = taosArrayInit(1, sizeof(STagVal));
|
SArray* tagArray = taosArrayInit(1, sizeof(STagVal));
|
||||||
if (!tagArray) {
|
if (!tagArray) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// cal size
|
|
||||||
int32_t cap = sizeof(SSubmitReq);
|
|
||||||
int32_t sz = taosArrayGetSize(pBlocks);
|
int32_t sz = taosArrayGetSize(pBlocks);
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
SSDataBlock* pDataBlock = taosArrayGet(pBlocks, i);
|
|
||||||
int32_t rows = pDataBlock->info.rows;
|
|
||||||
// TODO min
|
|
||||||
int32_t rowSize = pDataBlock->info.rowSize;
|
|
||||||
int32_t maxLen = TD_ROW_MAX_BYTES_FROM_SCHEMA(pTSchema);
|
|
||||||
int32_t schemaLen = 0;
|
|
||||||
|
|
||||||
if (createTb) {
|
if (createTb) {
|
||||||
SVCreateTbReq createTbReq = {0};
|
schemaReqs = taosArrayInit(sz, sizeof(void*));
|
||||||
char* cname = buildCtbNameByGroupId(stbFullName, pDataBlock->info.groupId);
|
schemaReqSz = taosArrayInit(sz, sizeof(int32_t));
|
||||||
createTbReq.name = cname;
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
createTbReq.flags = 0;
|
SSDataBlock* pDataBlock = taosArrayGet(pBlocks, i);
|
||||||
createTbReq.type = TSDB_CHILD_TABLE;
|
STagVal tagVal = {
|
||||||
createTbReq.ctb.suid = suid;
|
.cid = taosArrayGetSize(pDataBlock->pDataBlock) + 1,
|
||||||
|
.type = TSDB_DATA_TYPE_UBIGINT,
|
||||||
STagVal tagVal = {
|
.i64 = (int64_t)pDataBlock->info.groupId,
|
||||||
.cid = taosArrayGetSize(pDataBlock->pDataBlock) + 1,
|
|
||||||
.type = TSDB_DATA_TYPE_UBIGINT,
|
|
||||||
.i64 = (int64_t)pDataBlock->info.groupId,
|
|
||||||
};
|
};
|
||||||
STag* pTag = NULL;
|
STag* pTag = NULL;
|
||||||
taosArrayClear(tagArray);
|
taosArrayClear(tagArray);
|
||||||
taosArrayPush(tagArray, &tagVal);
|
taosArrayPush(tagArray, &tagVal);
|
||||||
tTagNew(tagArray, 1, false, &pTag);
|
tTagNew(tagArray, 1, false, &pTag);
|
||||||
if (pTag == NULL) {
|
if (pTag == NULL) {
|
||||||
tdDestroySVCreateTbReq(&createTbReq);
|
taosArrayDestroy(schemaReqs);
|
||||||
taosArrayDestroy(tagArray);
|
taosArrayDestroy(tagArray);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SVCreateTbReq createTbReq = {0};
|
||||||
|
createTbReq.name = buildCtbNameByGroupId(stbFullName, pDataBlock->info.groupId);
|
||||||
|
createTbReq.flags = 0;
|
||||||
|
createTbReq.type = TSDB_CHILD_TABLE;
|
||||||
|
createTbReq.ctb.suid = suid;
|
||||||
createTbReq.ctb.pTag = (uint8_t*)pTag;
|
createTbReq.ctb.pTag = (uint8_t*)pTag;
|
||||||
|
|
||||||
int32_t code;
|
int32_t code;
|
||||||
|
int32_t schemaLen;
|
||||||
tEncodeSize(tEncodeSVCreateTbReq, &createTbReq, schemaLen, code);
|
tEncodeSize(tEncodeSVCreateTbReq, &createTbReq, schemaLen, code);
|
||||||
|
|
||||||
tdDestroySVCreateTbReq(&createTbReq);
|
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
|
tdDestroySVCreateTbReq(&createTbReq);
|
||||||
taosArrayDestroy(tagArray);
|
taosArrayDestroy(tagArray);
|
||||||
|
taosMemoryFreeClear(ret);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
void* schemaStr = taosMemoryMalloc(schemaLen);
|
||||||
|
if (schemaStr == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
taosArrayPush(schemaReqs, &schemaStr);
|
||||||
|
taosArrayPush(schemaReqSz, &schemaLen);
|
||||||
|
|
||||||
|
SEncoder encoder = {0};
|
||||||
|
tEncoderInit(&encoder, schemaStr, schemaLen);
|
||||||
|
code = tEncodeSVCreateTbReq(&encoder, &createTbReq);
|
||||||
|
if (code < 0) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
tdDestroySVCreateTbReq(&createTbReq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taosArrayDestroy(tagArray);
|
||||||
|
|
||||||
|
// cal size
|
||||||
|
int32_t cap = sizeof(SSubmitReq);
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SSDataBlock* pDataBlock = taosArrayGet(pBlocks, i);
|
||||||
|
int32_t rows = pDataBlock->info.rows;
|
||||||
|
// TODO min
|
||||||
|
int32_t rowSize = pDataBlock->info.rowSize;
|
||||||
|
int32_t maxLen = TD_ROW_MAX_BYTES_FROM_SCHEMA(pTSchema);
|
||||||
|
|
||||||
|
int32_t schemaLen = 0;
|
||||||
|
if (createTb) {
|
||||||
|
schemaLen = *(int32_t*)taosArrayGet(schemaReqSz, i);
|
||||||
|
}
|
||||||
cap += sizeof(SSubmitBlk) + schemaLen + rows * maxLen;
|
cap += sizeof(SSubmitBlk) + schemaLen + rows * maxLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,55 +129,13 @@ SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, boo
|
||||||
|
|
||||||
int32_t schemaLen = 0;
|
int32_t schemaLen = 0;
|
||||||
if (createTb) {
|
if (createTb) {
|
||||||
SVCreateTbReq createTbReq = {0};
|
schemaLen = *(int32_t*)taosArrayGet(schemaReqSz, i);
|
||||||
char* cname = buildCtbNameByGroupId(stbFullName, pDataBlock->info.groupId);
|
void* schemaStr = taosArrayGetP(schemaReqs, i);
|
||||||
createTbReq.name = cname;
|
memcpy(blkSchema, schemaStr, schemaLen);
|
||||||
createTbReq.flags = 0;
|
|
||||||
createTbReq.type = TSDB_CHILD_TABLE;
|
|
||||||
createTbReq.ctb.suid = suid;
|
|
||||||
|
|
||||||
STagVal tagVal = {
|
|
||||||
.cid = taosArrayGetSize(pDataBlock->pDataBlock) + 1,
|
|
||||||
.type = TSDB_DATA_TYPE_UBIGINT,
|
|
||||||
.i64 = (int64_t)pDataBlock->info.groupId,
|
|
||||||
};
|
|
||||||
taosArrayClear(tagArray);
|
|
||||||
taosArrayPush(tagArray, &tagVal);
|
|
||||||
STag* pTag = NULL;
|
|
||||||
tTagNew(tagArray, 1, false, &pTag);
|
|
||||||
if (pTag == NULL) {
|
|
||||||
tdDestroySVCreateTbReq(&createTbReq);
|
|
||||||
taosArrayDestroy(tagArray);
|
|
||||||
taosMemoryFreeClear(ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
createTbReq.ctb.pTag = (uint8_t*)pTag;
|
|
||||||
|
|
||||||
int32_t code;
|
|
||||||
tEncodeSize(tEncodeSVCreateTbReq, &createTbReq, schemaLen, code);
|
|
||||||
if (code < 0) {
|
|
||||||
tdDestroySVCreateTbReq(&createTbReq);
|
|
||||||
taosArrayDestroy(tagArray);
|
|
||||||
taosMemoryFreeClear(ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
SEncoder encoder = {0};
|
|
||||||
tEncoderInit(&encoder, blkSchema, schemaLen);
|
|
||||||
code = tEncodeSVCreateTbReq(&encoder, &createTbReq);
|
|
||||||
tEncoderClear(&encoder);
|
|
||||||
tdDestroySVCreateTbReq(&createTbReq);
|
|
||||||
|
|
||||||
if (code < 0) {
|
|
||||||
taosArrayDestroy(tagArray);
|
|
||||||
taosMemoryFreeClear(ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
blkHead->schemaLen = htonl(schemaLen);
|
blkHead->schemaLen = htonl(schemaLen);
|
||||||
|
|
||||||
STSRow* rowData = POINTER_SHIFT(blkSchema, schemaLen);
|
STSRow* rowData = POINTER_SHIFT(blkSchema, schemaLen);
|
||||||
|
|
||||||
for (int32_t j = 0; j < rows; j++) {
|
for (int32_t j = 0; j < rows; j++) {
|
||||||
SRowBuilder rb = {0};
|
SRowBuilder rb = {0};
|
||||||
tdSRowInit(&rb, pTSchema->version);
|
tdSRowInit(&rb, pTSchema->version);
|
||||||
|
@ -175,7 +163,10 @@ SSubmitReq* tdBlockToSubmit(const SArray* pBlocks, const STSchema* pTSchema, boo
|
||||||
}
|
}
|
||||||
|
|
||||||
ret->length = htonl(ret->length);
|
ret->length = htonl(ret->length);
|
||||||
taosArrayDestroy(tagArray);
|
|
||||||
|
if (schemaReqs) taosArrayDestroyP(schemaReqs, taosMemoryFree);
|
||||||
|
taosArrayDestroy(schemaReqSz);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -671,7 +671,7 @@ void taosFprintfFile(TdFilePtr pFile, const char *format, ...) {
|
||||||
fflush(pFile->fp);
|
fflush(pFile->fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosValidFile(TdFilePtr pFile) { return pFile != NULL; }
|
bool taosValidFile(TdFilePtr pFile) { return pFile != NULL && pFile->fd > 0; }
|
||||||
|
|
||||||
int32_t taosUmaskFile(int32_t maskVal) {
|
int32_t taosUmaskFile(int32_t maskVal) {
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
|
|
Loading…
Reference in New Issue