Merge branch '3.0' of https://github.com/taosdata/TDengine into feat/TD-21898
This commit is contained in:
commit
6d2d5823dc
|
@ -39,8 +39,8 @@ void s3DeleteObjectsByPrefix(const char *prefix);
|
||||||
void s3DeleteObjects(const char *object_name[], int nobject);
|
void s3DeleteObjects(const char *object_name[], int nobject);
|
||||||
bool s3Exists(const char *object_name);
|
bool s3Exists(const char *object_name);
|
||||||
bool s3Get(const char *object_name, const char *path);
|
bool s3Get(const char *object_name, const char *path);
|
||||||
int32_t s3GetObjectsByPrefix(const char *prefix, const char* path);
|
int32_t s3GetObjectBlock(const char *object_name, int64_t offset, int64_t size, bool check, uint8_t **ppBlock);
|
||||||
int32_t s3GetObjectBlock(const char *object_name, int64_t offset, int64_t size, uint8_t **ppBlock);
|
int32_t s3GetObjectsByPrefix(const char *prefix, const char *path);
|
||||||
void s3EvictCache(const char *path, long object_size);
|
void s3EvictCache(const char *path, long object_size);
|
||||||
long s3Size(const char *object_name);
|
long s3Size(const char *object_name);
|
||||||
|
|
||||||
|
|
|
@ -249,6 +249,7 @@ typedef struct SQueryTableDataCond {
|
||||||
SColumnInfo* colList;
|
SColumnInfo* colList;
|
||||||
int32_t* pSlotList; // the column output destation slot, and it may be null
|
int32_t* pSlotList; // the column output destation slot, and it may be null
|
||||||
int32_t type; // data block load type:
|
int32_t type; // data block load type:
|
||||||
|
bool skipRollup;
|
||||||
STimeWindow twindows;
|
STimeWindow twindows;
|
||||||
int64_t startVersion;
|
int64_t startVersion;
|
||||||
int64_t endVersion;
|
int64_t endVersion;
|
||||||
|
|
|
@ -49,6 +49,7 @@ typedef struct {
|
||||||
uint64_t checkpointId;
|
uint64_t checkpointId;
|
||||||
bool initTableReader;
|
bool initTableReader;
|
||||||
bool initTqReader;
|
bool initTqReader;
|
||||||
|
bool skipRollup;
|
||||||
int32_t numOfVgroups;
|
int32_t numOfVgroups;
|
||||||
void* sContext; // SSnapContext*
|
void* sContext; // SSnapContext*
|
||||||
void* pStateBackend;
|
void* pStateBackend;
|
||||||
|
|
|
@ -168,7 +168,6 @@ typedef struct {
|
||||||
struct SStreamFileState *pFileState;
|
struct SStreamFileState *pFileState;
|
||||||
int32_t number;
|
int32_t number;
|
||||||
SSHashObj *parNameMap;
|
SSHashObj *parNameMap;
|
||||||
int64_t checkPointId;
|
|
||||||
int32_t taskId;
|
int32_t taskId;
|
||||||
int64_t streamId;
|
int64_t streamId;
|
||||||
int64_t streamBackendRid;
|
int64_t streamBackendRid;
|
||||||
|
|
|
@ -388,6 +388,7 @@ typedef struct SLastRowScanPhysiNode {
|
||||||
SNodeList* pGroupTags;
|
SNodeList* pGroupTags;
|
||||||
bool groupSort;
|
bool groupSort;
|
||||||
bool ignoreNull;
|
bool ignoreNull;
|
||||||
|
SNodeList* pTargets;
|
||||||
} SLastRowScanPhysiNode;
|
} SLastRowScanPhysiNode;
|
||||||
|
|
||||||
typedef SLastRowScanPhysiNode STableCountScanPhysiNode;
|
typedef SLastRowScanPhysiNode STableCountScanPhysiNode;
|
||||||
|
|
|
@ -826,6 +826,7 @@ void streamMetaReleaseTask(SStreamMeta* pMeta, SStreamTask* pTask);
|
||||||
int32_t streamMetaReopen(SStreamMeta* pMeta);
|
int32_t streamMetaReopen(SStreamMeta* pMeta);
|
||||||
int32_t streamMetaCommit(SStreamMeta* pMeta);
|
int32_t streamMetaCommit(SStreamMeta* pMeta);
|
||||||
int32_t streamMetaLoadAllTasks(SStreamMeta* pMeta);
|
int32_t streamMetaLoadAllTasks(SStreamMeta* pMeta);
|
||||||
|
int64_t streamMetaGetLatestCheckpointId(SStreamMeta* pMeta);
|
||||||
void streamMetaNotifyClose(SStreamMeta* pMeta);
|
void streamMetaNotifyClose(SStreamMeta* pMeta);
|
||||||
void streamMetaStartHb(SStreamMeta* pMeta);
|
void streamMetaStartHb(SStreamMeta* pMeta);
|
||||||
void streamMetaInitForSnode(SStreamMeta* pMeta);
|
void streamMetaInitForSnode(SStreamMeta* pMeta);
|
||||||
|
@ -840,6 +841,7 @@ void streamMetaResetStartInfo(STaskStartInfo* pMeta);
|
||||||
// checkpoint
|
// checkpoint
|
||||||
int32_t streamProcessCheckpointSourceReq(SStreamTask* pTask, SStreamCheckpointSourceReq* pReq);
|
int32_t streamProcessCheckpointSourceReq(SStreamTask* pTask, SStreamCheckpointSourceReq* pReq);
|
||||||
int32_t streamProcessCheckpointReadyMsg(SStreamTask* pTask);
|
int32_t streamProcessCheckpointReadyMsg(SStreamTask* pTask);
|
||||||
|
int32_t streamTaskBuildCheckpoint(SStreamTask* pTask);
|
||||||
void streamTaskClearCheckInfo(SStreamTask* pTask);
|
void streamTaskClearCheckInfo(SStreamTask* pTask);
|
||||||
int32_t streamAlignTransferState(SStreamTask* pTask);
|
int32_t streamAlignTransferState(SStreamTask* pTask);
|
||||||
int32_t streamBuildAndSendDropTaskMsg(SMsgCb* pMsgCb, int32_t vgId, SStreamTaskId* pTaskId);
|
int32_t streamBuildAndSendDropTaskMsg(SMsgCb* pMsgCb, int32_t vgId, SStreamTaskId* pTaskId);
|
||||||
|
|
|
@ -25,7 +25,7 @@ static S3UriStyle uriStyleG = S3UriStylePath;
|
||||||
static int retriesG = 5;
|
static int retriesG = 5;
|
||||||
static int timeoutMsG = 0;
|
static int timeoutMsG = 0;
|
||||||
|
|
||||||
static int32_t s3Begin() {
|
int32_t s3Begin() {
|
||||||
S3Status status;
|
S3Status status;
|
||||||
const char *hostname = tsS3Hostname;
|
const char *hostname = tsS3Hostname;
|
||||||
const char *env_hn = getenv("S3_HOSTNAME");
|
const char *env_hn = getenv("S3_HOSTNAME");
|
||||||
|
@ -44,10 +44,12 @@ static int32_t s3Begin() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void s3End() { S3_deinitialize(); }
|
void s3End() { S3_deinitialize(); }
|
||||||
int32_t s3Init() { return s3Begin(); }
|
|
||||||
|
|
||||||
void s3CleanUp() { s3End(); }
|
int32_t s3Init() { return 0; /*s3Begin();*/ }
|
||||||
|
|
||||||
|
void s3CleanUp() { /*s3End();*/
|
||||||
|
}
|
||||||
|
|
||||||
static int should_retry() {
|
static int should_retry() {
|
||||||
/*
|
/*
|
||||||
|
@ -73,8 +75,9 @@ static void s3PrintError(const char *func, S3Status status, char error_details[]
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char err_msg[128];
|
char err_msg[512];
|
||||||
S3Status status;
|
S3Status status;
|
||||||
|
uint64_t content_length;
|
||||||
TdFilePtr file;
|
TdFilePtr file;
|
||||||
} TS3GetData;
|
} TS3GetData;
|
||||||
|
|
||||||
|
@ -83,10 +86,11 @@ typedef struct {
|
||||||
S3Status status;
|
S3Status status;
|
||||||
uint64_t content_length;
|
uint64_t content_length;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
int64_t buf_pos;
|
||||||
} TS3SizeCBD;
|
} TS3SizeCBD;
|
||||||
|
|
||||||
static S3Status responsePropertiesCallbackNull(const S3ResponseProperties *properties, void *callbackData) {
|
static S3Status responsePropertiesCallbackNull(const S3ResponseProperties *properties, void *callbackData) {
|
||||||
// (void)callbackData;
|
// (void)callbackData;
|
||||||
return S3StatusOK;
|
return S3StatusOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,20 +113,22 @@ static void responseCompleteCallback(S3Status status, const S3ErrorDetails *erro
|
||||||
int len = 0;
|
int len = 0;
|
||||||
const int elen = sizeof(cbd->err_msg);
|
const int elen = sizeof(cbd->err_msg);
|
||||||
if (error) {
|
if (error) {
|
||||||
if (error->message) {
|
if (error->message && elen - len > 0) {
|
||||||
len += snprintf(&(cbd->err_msg[len]), elen - len, " Message: %s\n", error->message);
|
len += snprintf(&(cbd->err_msg[len]), elen - len, " Message: %s\n", error->message);
|
||||||
}
|
}
|
||||||
if (error->resource) {
|
if (error->resource && elen - len > 0) {
|
||||||
len += snprintf(&(cbd->err_msg[len]), elen - len, " Resource: %s\n", error->resource);
|
len += snprintf(&(cbd->err_msg[len]), elen - len, " Resource: %s\n", error->resource);
|
||||||
}
|
}
|
||||||
if (error->furtherDetails) {
|
if (error->furtherDetails && elen - len > 0) {
|
||||||
len += snprintf(&(cbd->err_msg[len]), elen - len, " Further Details: %s\n", error->furtherDetails);
|
len += snprintf(&(cbd->err_msg[len]), elen - len, " Further Details: %s\n", error->furtherDetails);
|
||||||
}
|
}
|
||||||
if (error->extraDetailsCount) {
|
if (error->extraDetailsCount && elen - len > 0) {
|
||||||
len += snprintf(&(cbd->err_msg[len]), elen - len, "%s", " Extra Details:\n");
|
len += snprintf(&(cbd->err_msg[len]), elen - len, "%s", " Extra Details:\n");
|
||||||
for (int i = 0; i < error->extraDetailsCount; i++) {
|
for (int i = 0; i < error->extraDetailsCount; i++) {
|
||||||
len += snprintf(&(cbd->err_msg[len]), elen - len, " %s: %s\n", error->extraDetails[i].name,
|
if (elen - len > 0) {
|
||||||
error->extraDetails[i].value);
|
len += snprintf(&(cbd->err_msg[len]), elen - len, " %s: %s\n", error->extraDetails[i].name,
|
||||||
|
error->extraDetails[i].value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -213,8 +219,9 @@ static void growbuffer_destroy(growbuffer *gb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct put_object_callback_data {
|
typedef struct put_object_callback_data {
|
||||||
char err_msg[128];
|
char err_msg[512];
|
||||||
S3Status status;
|
S3Status status;
|
||||||
|
uint64_t content_length;
|
||||||
// FILE *infile;
|
// FILE *infile;
|
||||||
TdFilePtr infileFD;
|
TdFilePtr infileFD;
|
||||||
growbuffer *gb;
|
growbuffer *gb;
|
||||||
|
@ -226,8 +233,9 @@ typedef struct put_object_callback_data {
|
||||||
#define MULTIPART_CHUNK_SIZE (768 << 20) // multipart is 768M
|
#define MULTIPART_CHUNK_SIZE (768 << 20) // multipart is 768M
|
||||||
|
|
||||||
typedef struct UploadManager {
|
typedef struct UploadManager {
|
||||||
char err_msg[128];
|
char err_msg[512];
|
||||||
S3Status status;
|
S3Status status;
|
||||||
|
uint64_t content_length;
|
||||||
// used for initial multipart
|
// used for initial multipart
|
||||||
char *upload_id;
|
char *upload_id;
|
||||||
|
|
||||||
|
@ -241,8 +249,9 @@ typedef struct UploadManager {
|
||||||
} UploadManager;
|
} UploadManager;
|
||||||
|
|
||||||
typedef struct list_parts_callback_data {
|
typedef struct list_parts_callback_data {
|
||||||
char err_msg[128];
|
char err_msg[512];
|
||||||
S3Status status;
|
S3Status status;
|
||||||
|
uint64_t content_length;
|
||||||
int isTruncated;
|
int isTruncated;
|
||||||
char nextPartNumberMarker[24];
|
char nextPartNumberMarker[24];
|
||||||
char initiatorId[256];
|
char initiatorId[256];
|
||||||
|
@ -258,7 +267,7 @@ typedef struct list_parts_callback_data {
|
||||||
} list_parts_callback_data;
|
} list_parts_callback_data;
|
||||||
|
|
||||||
typedef struct MultipartPartData {
|
typedef struct MultipartPartData {
|
||||||
char err_msg[128];
|
char err_msg[512];
|
||||||
S3Status status;
|
S3Status status;
|
||||||
put_object_callback_data put_object_data;
|
put_object_callback_data put_object_data;
|
||||||
int seq;
|
int seq;
|
||||||
|
@ -402,7 +411,8 @@ static int try_get_parts_info(const char *bucketName, const char *key, UploadMan
|
||||||
S3BucketContext bucketContext = {0, tsS3BucketName, protocolG, uriStyleG, tsS3AccessKeyId, tsS3AccessKeySecret,
|
S3BucketContext bucketContext = {0, tsS3BucketName, protocolG, uriStyleG, tsS3AccessKeyId, tsS3AccessKeySecret,
|
||||||
0, awsRegionG};
|
0, awsRegionG};
|
||||||
|
|
||||||
S3ListPartsHandler listPartsHandler = {{&responsePropertiesCallbackNull, &responseCompleteCallback}, &listPartsCallback};
|
S3ListPartsHandler listPartsHandler = {{&responsePropertiesCallbackNull, &responseCompleteCallback},
|
||||||
|
&listPartsCallback};
|
||||||
|
|
||||||
list_parts_callback_data data;
|
list_parts_callback_data data;
|
||||||
|
|
||||||
|
@ -621,7 +631,7 @@ int32_t s3PutObjectFromFile2(const char *file, const char *object) {
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct list_bucket_callback_data {
|
typedef struct list_bucket_callback_data {
|
||||||
char err_msg[128];
|
char err_msg[512];
|
||||||
S3Status status;
|
S3Status status;
|
||||||
int isTruncated;
|
int isTruncated;
|
||||||
char nextMarker[1024];
|
char nextMarker[1024];
|
||||||
|
@ -670,7 +680,7 @@ static void s3FreeObjectKey(void *pItem) {
|
||||||
taosMemoryFree(key);
|
taosMemoryFree(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
static SArray* getListByPrefix(const char *prefix){
|
static SArray *getListByPrefix(const char *prefix) {
|
||||||
S3BucketContext bucketContext = {0, tsS3BucketName, protocolG, uriStyleG, tsS3AccessKeyId, tsS3AccessKeySecret,
|
S3BucketContext bucketContext = {0, tsS3BucketName, protocolG, uriStyleG, tsS3AccessKeyId, tsS3AccessKeySecret,
|
||||||
0, awsRegionG};
|
0, awsRegionG};
|
||||||
S3ListBucketHandler listBucketHandler = {{&responsePropertiesCallbackNull, &responseCompleteCallback},
|
S3ListBucketHandler listBucketHandler = {{&responsePropertiesCallbackNull, &responseCompleteCallback},
|
||||||
|
@ -679,7 +689,7 @@ static SArray* getListByPrefix(const char *prefix){
|
||||||
const char *marker = 0, *delimiter = 0;
|
const char *marker = 0, *delimiter = 0;
|
||||||
int maxkeys = 0, allDetails = 0;
|
int maxkeys = 0, allDetails = 0;
|
||||||
list_bucket_callback_data data;
|
list_bucket_callback_data data;
|
||||||
data.objectArray = taosArrayInit(32, sizeof(void*));
|
data.objectArray = taosArrayInit(32, sizeof(void *));
|
||||||
if (!data.objectArray) {
|
if (!data.objectArray) {
|
||||||
uError("%s: %s", __func__, "out of memoty");
|
uError("%s: %s", __func__, "out of memoty");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -731,23 +741,27 @@ void s3DeleteObjects(const char *object_name[], int nobject) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void s3DeleteObjectsByPrefix(const char *prefix) {
|
void s3DeleteObjectsByPrefix(const char *prefix) {
|
||||||
SArray* objectArray = getListByPrefix(prefix);
|
SArray *objectArray = getListByPrefix(prefix);
|
||||||
if(objectArray == NULL)return;
|
if (objectArray == NULL) return;
|
||||||
s3DeleteObjects(TARRAY_DATA(objectArray), TARRAY_SIZE(objectArray));
|
s3DeleteObjects(TARRAY_DATA(objectArray), TARRAY_SIZE(objectArray));
|
||||||
taosArrayDestroyEx(objectArray, s3FreeObjectKey);
|
taosArrayDestroyEx(objectArray, s3FreeObjectKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
static S3Status getObjectDataCallback(int bufferSize, const char *buffer, void *callbackData) {
|
static S3Status getObjectDataCallback(int bufferSize, const char *buffer, void *callbackData) {
|
||||||
TS3SizeCBD *cbd = callbackData;
|
TS3SizeCBD *cbd = callbackData;
|
||||||
|
/*
|
||||||
if (cbd->content_length != bufferSize) {
|
if (cbd->content_length != bufferSize) {
|
||||||
cbd->status = S3StatusAbortedByCallback;
|
cbd->status = S3StatusAbortedByCallback;
|
||||||
return S3StatusAbortedByCallback;
|
return S3StatusAbortedByCallback;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
if (!cbd->buf) {
|
||||||
|
cbd->buf = taosMemoryCalloc(1, cbd->content_length);
|
||||||
|
}
|
||||||
|
|
||||||
char *buf = taosMemoryCalloc(1, bufferSize);
|
if (cbd->buf) {
|
||||||
if (buf) {
|
memcpy(cbd->buf + cbd->buf_pos, buffer, bufferSize);
|
||||||
memcpy(buf, buffer, bufferSize);
|
cbd->buf_pos += bufferSize;
|
||||||
cbd->buf = buf;
|
|
||||||
cbd->status = S3StatusOK;
|
cbd->status = S3StatusOK;
|
||||||
return S3StatusOK;
|
return S3StatusOK;
|
||||||
} else {
|
} else {
|
||||||
|
@ -756,7 +770,7 @@ static S3Status getObjectDataCallback(int bufferSize, const char *buffer, void *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t s3GetObjectBlock(const char *object_name, int64_t offset, int64_t size, uint8_t **ppBlock) {
|
int32_t s3GetObjectBlock(const char *object_name, int64_t offset, int64_t size, bool check, uint8_t **ppBlock) {
|
||||||
int status = 0;
|
int status = 0;
|
||||||
int64_t ifModifiedSince = -1, ifNotModifiedSince = -1;
|
int64_t ifModifiedSince = -1, ifNotModifiedSince = -1;
|
||||||
const char *ifMatch = 0, *ifNotMatch = 0;
|
const char *ifMatch = 0, *ifNotMatch = 0;
|
||||||
|
@ -769,6 +783,7 @@ int32_t s3GetObjectBlock(const char *object_name, int64_t offset, int64_t size,
|
||||||
|
|
||||||
TS3SizeCBD cbd = {0};
|
TS3SizeCBD cbd = {0};
|
||||||
cbd.content_length = size;
|
cbd.content_length = size;
|
||||||
|
cbd.buf_pos = 0;
|
||||||
do {
|
do {
|
||||||
S3_get_object(&bucketContext, object_name, &getConditions, offset, size, 0, 0, &getObjectHandler, &cbd);
|
S3_get_object(&bucketContext, object_name, &getConditions, offset, size, 0, 0, &getObjectHandler, &cbd);
|
||||||
} while (S3_status_is_retryable(cbd.status) && should_retry());
|
} while (S3_status_is_retryable(cbd.status) && should_retry());
|
||||||
|
@ -778,19 +793,23 @@ int32_t s3GetObjectBlock(const char *object_name, int64_t offset, int64_t size,
|
||||||
return TAOS_SYSTEM_ERROR(EIO);
|
return TAOS_SYSTEM_ERROR(EIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (check && cbd.buf_pos != size) {
|
||||||
|
uError("%s: %d(%s)", __func__, cbd.status, cbd.err_msg);
|
||||||
|
return TAOS_SYSTEM_ERROR(EIO);
|
||||||
|
}
|
||||||
|
|
||||||
*ppBlock = cbd.buf;
|
*ppBlock = cbd.buf;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static S3Status getObjectCallback(int bufferSize, const char *buffer, void *callbackData) {
|
static S3Status getObjectCallback(int bufferSize, const char *buffer, void *callbackData) {
|
||||||
TS3GetData *cbd = (TS3GetData *) callbackData;
|
TS3GetData *cbd = (TS3GetData *)callbackData;
|
||||||
size_t wrote = taosWriteFile(cbd->file, buffer, bufferSize);
|
size_t wrote = taosWriteFile(cbd->file, buffer, bufferSize);
|
||||||
return ((wrote < (size_t) bufferSize) ?
|
return ((wrote < (size_t)bufferSize) ? S3StatusAbortedByCallback : S3StatusOK);
|
||||||
S3StatusAbortedByCallback : S3StatusOK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t s3GetObjectToFile(const char *object_name, char* fileName) {
|
int32_t s3GetObjectToFile(const char *object_name, char *fileName) {
|
||||||
int64_t ifModifiedSince = -1, ifNotModifiedSince = -1;
|
int64_t ifModifiedSince = -1, ifNotModifiedSince = -1;
|
||||||
const char *ifMatch = 0, *ifNotMatch = 0;
|
const char *ifMatch = 0, *ifNotMatch = 0;
|
||||||
|
|
||||||
|
@ -821,21 +840,21 @@ int32_t s3GetObjectToFile(const char *object_name, char* fileName) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t s3GetObjectsByPrefix(const char *prefix, const char* path){
|
int32_t s3GetObjectsByPrefix(const char *prefix, const char *path) {
|
||||||
SArray* objectArray = getListByPrefix(prefix);
|
SArray *objectArray = getListByPrefix(prefix);
|
||||||
if(objectArray == NULL) return -1;
|
if (objectArray == NULL) return -1;
|
||||||
|
|
||||||
for(size_t i = 0; i < taosArrayGetSize(objectArray); i++){
|
for (size_t i = 0; i < taosArrayGetSize(objectArray); i++) {
|
||||||
char* object = taosArrayGetP(objectArray, i);
|
char *object = taosArrayGetP(objectArray, i);
|
||||||
const char* tmp = strchr(object, '/');
|
const char *tmp = strchr(object, '/');
|
||||||
tmp = (tmp == NULL) ? object : tmp + 1;
|
tmp = (tmp == NULL) ? object : tmp + 1;
|
||||||
char fileName[PATH_MAX] = {0};
|
char fileName[PATH_MAX] = {0};
|
||||||
if(path[strlen(path) - 1] != TD_DIRSEP_CHAR){
|
if (path[strlen(path) - 1] != TD_DIRSEP_CHAR) {
|
||||||
snprintf(fileName, PATH_MAX, "%s%s%s", path, TD_DIRSEP, tmp);
|
snprintf(fileName, PATH_MAX, "%s%s%s", path, TD_DIRSEP, tmp);
|
||||||
}else{
|
} else {
|
||||||
snprintf(fileName, PATH_MAX, "%s%s", path, tmp);
|
snprintf(fileName, PATH_MAX, "%s%s", path, tmp);
|
||||||
}
|
}
|
||||||
if(s3GetObjectToFile(object, fileName) != 0){
|
if (s3GetObjectToFile(object, fileName) != 0) {
|
||||||
taosArrayDestroyEx(objectArray, s3FreeObjectKey);
|
taosArrayDestroyEx(objectArray, s3FreeObjectKey);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1122,7 +1141,8 @@ bool s3Get(const char *object_name, const char *path) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t s3GetObjectBlock(const char *object_name, int64_t offset, int64_t block_size, uint8_t **ppBlock) {
|
int32_t s3GetObjectBlock(const char *object_name, int64_t offset, int64_t block_size, bool check, uint8_t **ppBlock) {
|
||||||
|
(void)check;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
cos_pool_t *p = NULL;
|
cos_pool_t *p = NULL;
|
||||||
int is_cname = 0;
|
int is_cname = 0;
|
||||||
|
@ -1314,9 +1334,11 @@ void s3DeleteObjectsByPrefix(const char *prefix) {}
|
||||||
void s3DeleteObjects(const char *object_name[], int nobject) {}
|
void s3DeleteObjects(const char *object_name[], int nobject) {}
|
||||||
bool s3Exists(const char *object_name) { return false; }
|
bool s3Exists(const char *object_name) { return false; }
|
||||||
bool s3Get(const char *object_name, const char *path) { return false; }
|
bool s3Get(const char *object_name, const char *path) { return false; }
|
||||||
int32_t s3GetObjectsByPrefix(const char *prefix, const char* path) { return 0; }
|
int32_t s3GetObjectBlock(const char *object_name, int64_t offset, int64_t size, bool check, uint8_t **ppBlock) {
|
||||||
int32_t s3GetObjectBlock(const char *object_name, int64_t offset, int64_t size, uint8_t **ppBlock) { return 0; }
|
return 0;
|
||||||
|
}
|
||||||
void s3EvictCache(const char *path, long object_size) {}
|
void s3EvictCache(const char *path, long object_size) {}
|
||||||
long s3Size(const char *object_name) { return 0; }
|
long s3Size(const char *object_name) { return 0; }
|
||||||
|
int32_t s3GetObjectsByPrefix(const char *prefix, const char *path) { return 0; }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -94,8 +94,8 @@ int32_t tsMonitorMaxLogs = 100;
|
||||||
bool tsMonitorComp = false;
|
bool tsMonitorComp = false;
|
||||||
|
|
||||||
// audit
|
// audit
|
||||||
bool tsEnableAudit = true;
|
bool tsEnableAudit = true;
|
||||||
bool tsEnableAuditCreateTable = true;
|
bool tsEnableAuditCreateTable = true;
|
||||||
|
|
||||||
// telem
|
// telem
|
||||||
#ifdef TD_ENTERPRISE
|
#ifdef TD_ENTERPRISE
|
||||||
|
@ -128,12 +128,12 @@ char tsSmlAutoChildTableNameDelimiter[TSDB_TABLE_NAME_LEN] = "";
|
||||||
// int32_t tsSmlBatchSize = 10000;
|
// int32_t tsSmlBatchSize = 10000;
|
||||||
|
|
||||||
// checkpoint backup
|
// checkpoint backup
|
||||||
char tsSnodeAddress[TSDB_FQDN_LEN] = {0};
|
char tsSnodeAddress[TSDB_FQDN_LEN] = {0};
|
||||||
int32_t tsRsyncPort = 873;
|
int32_t tsRsyncPort = 873;
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
char tsCheckpointBackupDir[PATH_MAX] = "C:\\TDengine\\data\\backup\\checkpoint\\";
|
char tsCheckpointBackupDir[PATH_MAX] = "C:\\TDengine\\data\\backup\\checkpoint\\";
|
||||||
#else
|
#else
|
||||||
char tsCheckpointBackupDir[PATH_MAX] = "/var/lib/taos/backup/checkpoint/";
|
char tsCheckpointBackupDir[PATH_MAX] = "/var/lib/taos/backup/checkpoint/";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// tmq
|
// tmq
|
||||||
|
@ -231,7 +231,7 @@ char tsCompressor[32] = "ZSTD_COMPRESSOR"; // ZSTD_COMPRESSOR or GZIP_COMPR
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
bool tsStartUdfd = false;
|
bool tsStartUdfd = false;
|
||||||
#else
|
#else
|
||||||
bool tsStartUdfd = true;
|
bool tsStartUdfd = true;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// wal
|
// wal
|
||||||
|
@ -335,7 +335,7 @@ int32_t taosSetS3Cfg(SConfig *pCfg) {
|
||||||
}
|
}
|
||||||
if (tsS3BucketName[0] != '<') {
|
if (tsS3BucketName[0] != '<') {
|
||||||
#if defined(USE_COS) || defined(USE_S3)
|
#if defined(USE_COS) || defined(USE_S3)
|
||||||
if(tsDiskCfgNum > 1) tsS3Enabled = true;
|
if (tsDiskCfgNum > 1) tsS3Enabled = true;
|
||||||
tsS3StreamEnabled = true;
|
tsS3StreamEnabled = true;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -343,7 +343,9 @@ int32_t taosSetS3Cfg(SConfig *pCfg) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SConfig *taosGetCfg() { return tsCfg; }
|
struct SConfig *taosGetCfg() {
|
||||||
|
return tsCfg;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t taosLoadCfg(SConfig *pCfg, const char **envCmd, const char *inputCfgDir, const char *envFile,
|
static int32_t taosLoadCfg(SConfig *pCfg, const char **envCmd, const char *inputCfgDir, const char *envFile,
|
||||||
char *apolloUrl) {
|
char *apolloUrl) {
|
||||||
|
@ -453,8 +455,8 @@ static int32_t taosAddClientCfg(SConfig *pCfg) {
|
||||||
if (cfgAddBool(pCfg, "enableScience", tsEnableScience, CFG_SCOPE_CLIENT, CFG_DYN_NONE) != 0) return -1;
|
if (cfgAddBool(pCfg, "enableScience", tsEnableScience, CFG_SCOPE_CLIENT, CFG_DYN_NONE) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "querySmaOptimize", tsQuerySmaOptimize, 0, 1, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1;
|
if (cfgAddInt32(pCfg, "querySmaOptimize", tsQuerySmaOptimize, 0, 1, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1;
|
||||||
if (cfgAddBool(pCfg, "queryPlannerTrace", tsQueryPlannerTrace, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1;
|
if (cfgAddBool(pCfg, "queryPlannerTrace", tsQueryPlannerTrace, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "queryNodeChunkSize", tsQueryNodeChunkSize, 1024, 128 * 1024, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) !=
|
if (cfgAddInt32(pCfg, "queryNodeChunkSize", tsQueryNodeChunkSize, 1024, 128 * 1024, CFG_SCOPE_CLIENT,
|
||||||
0)
|
CFG_DYN_CLIENT) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (cfgAddBool(pCfg, "queryUseNodeAllocator", tsQueryUseNodeAllocator, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0)
|
if (cfgAddBool(pCfg, "queryUseNodeAllocator", tsQueryUseNodeAllocator, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -470,7 +472,8 @@ static int32_t taosAddClientCfg(SConfig *pCfg) {
|
||||||
// if (cfgAddInt32(pCfg, "smlBatchSize", tsSmlBatchSize, 1, INT32_MAX, CFG_SCOPE_CLIENT, CFG_DYN_NONE) != 0)
|
// if (cfgAddInt32(pCfg, "smlBatchSize", tsSmlBatchSize, 1, INT32_MAX, CFG_SCOPE_CLIENT, CFG_DYN_NONE) != 0)
|
||||||
// return -1;
|
// return -1;
|
||||||
if (cfgAddInt32(pCfg, "maxShellConns", tsMaxShellConns, 10, 50000000, CFG_SCOPE_CLIENT, CFG_DYN_NONE) != 0) return -1;
|
if (cfgAddInt32(pCfg, "maxShellConns", tsMaxShellConns, 10, 50000000, CFG_SCOPE_CLIENT, CFG_DYN_NONE) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "maxInsertBatchRows", tsMaxInsertBatchRows, 1, INT32_MAX, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0)
|
if (cfgAddInt32(pCfg, "maxInsertBatchRows", tsMaxInsertBatchRows, 1, INT32_MAX, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) !=
|
||||||
|
0)
|
||||||
return -1;
|
return -1;
|
||||||
if (cfgAddInt32(pCfg, "maxRetryWaitTime", tsMaxRetryWaitTime, 0, 86400000, CFG_SCOPE_BOTH, CFG_DYN_CLIENT) != 0)
|
if (cfgAddInt32(pCfg, "maxRetryWaitTime", tsMaxRetryWaitTime, 0, 86400000, CFG_SCOPE_BOTH, CFG_DYN_CLIENT) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -557,7 +560,8 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
if (cfgAddInt32(pCfg, "supportVnodes", tsNumOfSupportVnodes, 0, 4096, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
if (cfgAddInt32(pCfg, "supportVnodes", tsNumOfSupportVnodes, 0, 4096, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
||||||
|
|
||||||
if (cfgAddInt32(pCfg, "statusInterval", tsStatusInterval, 1, 30, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
if (cfgAddInt32(pCfg, "statusInterval", tsStatusInterval, 1, 30, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "minSlidingTime", tsMinSlidingTime, 1, 1000000, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0) return -1;
|
if (cfgAddInt32(pCfg, "minSlidingTime", tsMinSlidingTime, 1, 1000000, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0)
|
||||||
|
return -1;
|
||||||
if (cfgAddInt32(pCfg, "minIntervalTime", tsMinIntervalTime, 1, 1000000, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0)
|
if (cfgAddInt32(pCfg, "minIntervalTime", tsMinIntervalTime, 1, 1000000, CFG_SCOPE_CLIENT, CFG_DYN_CLIENT) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -605,7 +609,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
0)
|
0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
tsNumOfVnodeRsmaThreads = tsNumOfCores;
|
tsNumOfVnodeRsmaThreads = tsNumOfCores / 2;
|
||||||
tsNumOfVnodeRsmaThreads = TMAX(tsNumOfVnodeRsmaThreads, 4);
|
tsNumOfVnodeRsmaThreads = TMAX(tsNumOfVnodeRsmaThreads, 4);
|
||||||
if (cfgAddInt32(pCfg, "numOfVnodeRsmaThreads", tsNumOfVnodeRsmaThreads, 1, 1024, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0)
|
if (cfgAddInt32(pCfg, "numOfVnodeRsmaThreads", tsNumOfVnodeRsmaThreads, 1, 1024, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -674,7 +678,8 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
|
|
||||||
if (cfgAddInt32(pCfg, "rsyncPort", tsRsyncPort, 1, 65535, CFG_SCOPE_BOTH, CFG_DYN_SERVER) != 0) return -1;
|
if (cfgAddInt32(pCfg, "rsyncPort", tsRsyncPort, 1, 65535, CFG_SCOPE_BOTH, CFG_DYN_SERVER) != 0) return -1;
|
||||||
if (cfgAddString(pCfg, "snodeAddress", tsSnodeAddress, CFG_SCOPE_SERVER, CFG_DYN_SERVER) != 0) return -1;
|
if (cfgAddString(pCfg, "snodeAddress", tsSnodeAddress, CFG_SCOPE_SERVER, CFG_DYN_SERVER) != 0) return -1;
|
||||||
if (cfgAddString(pCfg, "checkpointBackupDir", tsCheckpointBackupDir, CFG_SCOPE_SERVER, CFG_DYN_SERVER) != 0) return -1;
|
if (cfgAddString(pCfg, "checkpointBackupDir", tsCheckpointBackupDir, CFG_SCOPE_SERVER, CFG_DYN_SERVER) != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (cfgAddInt32(pCfg, "tmqMaxTopicNum", tmqMaxTopicNum, 1, 10000, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER) != 0)
|
if (cfgAddInt32(pCfg, "tmqMaxTopicNum", tmqMaxTopicNum, 1, 10000, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -700,7 +705,8 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
if (cfgAddInt32(pCfg, "uptimeInterval", tsUptimeInterval, 1, 100000, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
if (cfgAddInt32(pCfg, "uptimeInterval", tsUptimeInterval, 1, 100000, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "queryRsmaTolerance", tsQueryRsmaTolerance, 0, 900000, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0)
|
if (cfgAddInt32(pCfg, "queryRsmaTolerance", tsQueryRsmaTolerance, 0, 900000, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (cfgAddInt32(pCfg, "timeseriesThreshold", tsTimeSeriesThreshold, 0, 2000, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER) != 0)
|
if (cfgAddInt32(pCfg, "timeseriesThreshold", tsTimeSeriesThreshold, 0, 2000, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER) !=
|
||||||
|
0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (cfgAddInt64(pCfg, "walFsyncDataSizeLimit", tsWalFsyncDataSizeLimit, 100 * 1024 * 1024, INT64_MAX,
|
if (cfgAddInt64(pCfg, "walFsyncDataSizeLimit", tsWalFsyncDataSizeLimit, 100 * 1024 * 1024, INT64_MAX,
|
||||||
|
@ -743,7 +749,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
if (cfgAddString(pCfg, "s3Accesskey", tsS3AccessKey, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
if (cfgAddString(pCfg, "s3Accesskey", tsS3AccessKey, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
||||||
if (cfgAddString(pCfg, "s3Endpoint", tsS3Endpoint, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
if (cfgAddString(pCfg, "s3Endpoint", tsS3Endpoint, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
||||||
if (cfgAddString(pCfg, "s3BucketName", tsS3BucketName, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
if (cfgAddString(pCfg, "s3BucketName", tsS3BucketName, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "s3BlockSize", tsS3BlockSize, -100, 1024 * 1024, CFG_SCOPE_SERVER, CFG_DYN_NONE) != 0)
|
if (cfgAddInt32(pCfg, "s3BlockSize", tsS3BlockSize, -1, 1024 * 1024, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (cfgAddInt32(pCfg, "s3BlockCacheSize", tsS3BlockCacheSize, 4, 1024 * 1024, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER) !=
|
if (cfgAddInt32(pCfg, "s3BlockCacheSize", tsS3BlockCacheSize, 4, 1024 * 1024, CFG_SCOPE_SERVER, CFG_DYN_ENT_SERVER) !=
|
||||||
0)
|
0)
|
||||||
|
@ -1687,6 +1693,7 @@ void taosCfgDynamicOptions(const char *option, const char *value) {
|
||||||
{"ttlBatchDropNum", &tsTtlBatchDropNum},
|
{"ttlBatchDropNum", &tsTtlBatchDropNum},
|
||||||
{"ttlFlushThreshold", &tsTtlFlushThreshold},
|
{"ttlFlushThreshold", &tsTtlFlushThreshold},
|
||||||
{"ttlPushInterval", &tsTtlPushIntervalSec},
|
{"ttlPushInterval", &tsTtlPushIntervalSec},
|
||||||
|
//{"s3BlockSize", &tsS3BlockSize},
|
||||||
{"s3BlockCacheSize", &tsS3BlockCacheSize},
|
{"s3BlockCacheSize", &tsS3BlockCacheSize},
|
||||||
{"s3PageCacheSize", &tsS3PageCacheSize},
|
{"s3PageCacheSize", &tsS3PageCacheSize},
|
||||||
{"s3UploadDelaySec", &tsS3UploadDelaySec},
|
{"s3UploadDelaySec", &tsS3UploadDelaySec},
|
||||||
|
@ -1710,8 +1717,8 @@ void taosCfgDynamicOptions(const char *option, const char *value) {
|
||||||
|
|
||||||
switch (pItem->dtype) {
|
switch (pItem->dtype) {
|
||||||
case CFG_DTYPE_BOOL: {
|
case CFG_DTYPE_BOOL: {
|
||||||
int32_t flag = atoi(value);
|
int32_t flag = atoi(value);
|
||||||
bool *pVar = options[d].optionVar;
|
bool *pVar = options[d].optionVar;
|
||||||
uInfo("%s set from %d to %d", optName, *pVar, flag);
|
uInfo("%s set from %d to %d", optName, *pVar, flag);
|
||||||
*pVar = flag;
|
*pVar = flag;
|
||||||
} break;
|
} break;
|
||||||
|
|
|
@ -144,6 +144,10 @@ void vmCloseVnode(SVnodeMgmt *pMgmt, SVnodeObj *pVnode, bool commitAndRemoveWal)
|
||||||
char path[TSDB_FILENAME_LEN] = {0};
|
char path[TSDB_FILENAME_LEN] = {0};
|
||||||
bool atExit = true;
|
bool atExit = true;
|
||||||
|
|
||||||
|
if (pVnode->failed) {
|
||||||
|
ASSERT(pVnode->pImpl == NULL);
|
||||||
|
goto _closed;
|
||||||
|
}
|
||||||
if (vnodeIsLeader(pVnode->pImpl)) {
|
if (vnodeIsLeader(pVnode->pImpl)) {
|
||||||
vnodeProposeCommitOnNeed(pVnode->pImpl, atExit);
|
vnodeProposeCommitOnNeed(pVnode->pImpl, atExit);
|
||||||
}
|
}
|
||||||
|
@ -202,6 +206,8 @@ void vmCloseVnode(SVnodeMgmt *pMgmt, SVnodeObj *pVnode, bool commitAndRemoveWal)
|
||||||
|
|
||||||
vnodeClose(pVnode->pImpl);
|
vnodeClose(pVnode->pImpl);
|
||||||
pVnode->pImpl = NULL;
|
pVnode->pImpl = NULL;
|
||||||
|
|
||||||
|
_closed:
|
||||||
dInfo("vgId:%d, vnode is closed", pVnode->vgId);
|
dInfo("vgId:%d, vnode is closed", pVnode->vgId);
|
||||||
|
|
||||||
if (commitAndRemoveWal) {
|
if (commitAndRemoveWal) {
|
||||||
|
@ -386,7 +392,6 @@ static void *vmCloseVnodeInThread(void *param) {
|
||||||
|
|
||||||
for (int32_t v = 0; v < pThread->vnodeNum; ++v) {
|
for (int32_t v = 0; v < pThread->vnodeNum; ++v) {
|
||||||
SVnodeObj *pVnode = pThread->ppVnodes[v];
|
SVnodeObj *pVnode = pThread->ppVnodes[v];
|
||||||
if (pVnode->failed) continue;
|
|
||||||
|
|
||||||
char stepDesc[TSDB_STEP_DESC_LEN] = {0};
|
char stepDesc[TSDB_STEP_DESC_LEN] = {0};
|
||||||
snprintf(stepDesc, TSDB_STEP_DESC_LEN, "vgId:%d, start to close, %d of %d have been closed", pVnode->vgId,
|
snprintf(stepDesc, TSDB_STEP_DESC_LEN, "vgId:%d, start to close, %d of %d have been closed", pVnode->vgId,
|
||||||
|
|
|
@ -3,6 +3,17 @@ add_library(dnode STATIC ${IMPLEMENT_SRC})
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
dnode mgmt_mnode mgmt_qnode mgmt_snode mgmt_vnode mgmt_dnode
|
dnode mgmt_mnode mgmt_qnode mgmt_snode mgmt_vnode mgmt_dnode
|
||||||
)
|
)
|
||||||
|
|
||||||
|
IF (TD_STORAGE)
|
||||||
|
|
||||||
|
IF(${BUILD_WITH_S3})
|
||||||
|
add_definitions(-DUSE_S3)
|
||||||
|
ELSEIF(${BUILD_WITH_COS})
|
||||||
|
add_definitions(-DUSE_COS)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
dnode
|
dnode
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
|
|
|
@ -18,17 +18,17 @@
|
||||||
#include "audit.h"
|
#include "audit.h"
|
||||||
#include "libs/function/tudf.h"
|
#include "libs/function/tudf.h"
|
||||||
|
|
||||||
#define DM_INIT_AUDIT() \
|
#define DM_INIT_AUDIT() \
|
||||||
do { \
|
do { \
|
||||||
auditCfg.port = tsMonitorPort; \
|
auditCfg.port = tsMonitorPort; \
|
||||||
auditCfg.server = tsMonitorFqdn; \
|
auditCfg.server = tsMonitorFqdn; \
|
||||||
auditCfg.comp = tsMonitorComp; \
|
auditCfg.comp = tsMonitorComp; \
|
||||||
if (auditInit(&auditCfg) != 0) { \
|
if (auditInit(&auditCfg) != 0) { \
|
||||||
return -1; \
|
return -1; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static SDnode globalDnode = {0};
|
static SDnode globalDnode = {0};
|
||||||
|
|
||||||
SDnode *dmInstance() { return &globalDnode; }
|
SDnode *dmInstance() { return &globalDnode; }
|
||||||
|
|
||||||
|
@ -146,6 +146,13 @@ static bool dmCheckDataDirVersion() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(USE_S3)
|
||||||
|
|
||||||
|
extern int32_t s3Begin();
|
||||||
|
extern void s3End();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
int32_t dmInit() {
|
int32_t dmInit() {
|
||||||
dInfo("start to init dnode env");
|
dInfo("start to init dnode env");
|
||||||
if (dmDiskInit() != 0) return -1;
|
if (dmDiskInit() != 0) return -1;
|
||||||
|
@ -156,6 +163,9 @@ int32_t dmInit() {
|
||||||
if (dmInitMonitor() != 0) return -1;
|
if (dmInitMonitor() != 0) return -1;
|
||||||
if (dmInitAudit() != 0) return -1;
|
if (dmInitAudit() != 0) return -1;
|
||||||
if (dmInitDnode(dmInstance()) != 0) return -1;
|
if (dmInitDnode(dmInstance()) != 0) return -1;
|
||||||
|
#if defined(USE_S3)
|
||||||
|
if (s3Begin() != 0) return -1;
|
||||||
|
#endif
|
||||||
|
|
||||||
dInfo("dnode env is initialized");
|
dInfo("dnode env is initialized");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -181,6 +191,9 @@ void dmCleanup() {
|
||||||
udfStopUdfd();
|
udfStopUdfd();
|
||||||
taosStopCacheRefreshWorker();
|
taosStopCacheRefreshWorker();
|
||||||
dmDiskClose();
|
dmDiskClose();
|
||||||
|
#if defined(USE_S3)
|
||||||
|
s3End();
|
||||||
|
#endif
|
||||||
dInfo("dnode env is cleaned up");
|
dInfo("dnode env is cleaned up");
|
||||||
|
|
||||||
taosCleanupCfg();
|
taosCleanupCfg();
|
||||||
|
@ -265,19 +278,19 @@ static int32_t dmProcessAlterNodeTypeReq(EDndNodeType ntype, SRpcMsg *pMsg) {
|
||||||
|
|
||||||
pWrapper = &pDnode->wrappers[ntype];
|
pWrapper = &pDnode->wrappers[ntype];
|
||||||
|
|
||||||
if(pWrapper->func.nodeRoleFp != NULL){
|
if (pWrapper->func.nodeRoleFp != NULL) {
|
||||||
ESyncRole role = (*pWrapper->func.nodeRoleFp)(pWrapper->pMgmt);
|
ESyncRole role = (*pWrapper->func.nodeRoleFp)(pWrapper->pMgmt);
|
||||||
dInfo("node:%s, checking node role:%d", pWrapper->name, role);
|
dInfo("node:%s, checking node role:%d", pWrapper->name, role);
|
||||||
if(role == TAOS_SYNC_ROLE_VOTER){
|
if (role == TAOS_SYNC_ROLE_VOTER) {
|
||||||
dError("node:%s, failed to alter node type since node already is role:%d", pWrapper->name, role);
|
dError("node:%s, failed to alter node type since node already is role:%d", pWrapper->name, role);
|
||||||
terrno = TSDB_CODE_MNODE_ALREADY_IS_VOTER;
|
terrno = TSDB_CODE_MNODE_ALREADY_IS_VOTER;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pWrapper->func.isCatchUpFp != NULL){
|
if (pWrapper->func.isCatchUpFp != NULL) {
|
||||||
dInfo("node:%s, checking node catch up", pWrapper->name);
|
dInfo("node:%s, checking node catch up", pWrapper->name);
|
||||||
if((*pWrapper->func.isCatchUpFp)(pWrapper->pMgmt) != 1){
|
if ((*pWrapper->func.isCatchUpFp)(pWrapper->pMgmt) != 1) {
|
||||||
terrno = TSDB_CODE_MNODE_NOT_CATCH_UP;
|
terrno = TSDB_CODE_MNODE_NOT_CATCH_UP;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -394,7 +407,4 @@ void dmReportStartup(const char *pName, const char *pDesc) {
|
||||||
dDebug("step:%s, %s", pStartup->name, pStartup->desc);
|
dDebug("step:%s, %s", pStartup->name, pStartup->desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t dmGetClusterId() {
|
int64_t dmGetClusterId() { return globalDnode.data.clusterId; }
|
||||||
return globalDnode.data.clusterId;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1310,6 +1310,22 @@ static int32_t mndProcessConfigDnodeReq(SRpcMsg *pReq) {
|
||||||
}
|
}
|
||||||
tFreeSMCfgDnodeReq(&cfgReq);
|
tFreeSMCfgDnodeReq(&cfgReq);
|
||||||
return 0;
|
return 0;
|
||||||
|
} else if (strncasecmp(cfgReq.config, "s3blocksize", 11) == 0) {
|
||||||
|
int32_t optLen = strlen("s3blocksize");
|
||||||
|
int32_t flag = -1;
|
||||||
|
int32_t code = mndMCfgGetValInt32(&cfgReq, optLen, &flag);
|
||||||
|
if (code < 0) return code;
|
||||||
|
|
||||||
|
if (flag > 1024 * 1024 || (flag > -1 && flag < 4) || flag < -1) {
|
||||||
|
mError("dnode:%d, failed to config s3blocksize since value:%d. Valid range: -1 or [4, 1024 * 1024]",
|
||||||
|
cfgReq.dnodeId, flag);
|
||||||
|
terrno = TSDB_CODE_INVALID_CFG;
|
||||||
|
tFreeSMCfgDnodeReq(&cfgReq);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(dcfgReq.config, "s3blocksize");
|
||||||
|
snprintf(dcfgReq.value, TSDB_DNODE_VALUE_LEN, "%d", flag);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
mndMCfg2DCfg(&cfgReq, &dcfgReq);
|
mndMCfg2DCfg(&cfgReq, &dcfgReq);
|
||||||
|
|
|
@ -37,23 +37,23 @@
|
||||||
|
|
||||||
typedef struct SNodeEntry {
|
typedef struct SNodeEntry {
|
||||||
int32_t nodeId;
|
int32_t nodeId;
|
||||||
bool stageUpdated; // the stage has been updated due to the leader/follower change or node reboot.
|
bool stageUpdated; // the stage has been updated due to the leader/follower change or node reboot.
|
||||||
SEpSet epset; // compare the epset to identify the vgroup tranferring between different dnodes.
|
SEpSet epset; // compare the epset to identify the vgroup tranferring between different dnodes.
|
||||||
int64_t hbTimestamp; // second
|
int64_t hbTimestamp; // second
|
||||||
} SNodeEntry;
|
} SNodeEntry;
|
||||||
|
|
||||||
typedef struct SStreamExecInfo {
|
typedef struct SStreamExecInfo {
|
||||||
SArray *pNodeEntryList;
|
SArray * pNodeEntryList;
|
||||||
int64_t ts; // snapshot ts
|
int64_t ts; // snapshot ts
|
||||||
int64_t activeCheckpoint; // active check point id
|
int64_t activeCheckpoint; // active check point id
|
||||||
SHashObj *pTaskMap;
|
SHashObj * pTaskMap;
|
||||||
SArray *pTaskList;
|
SArray * pTaskList;
|
||||||
TdThreadMutex lock;
|
TdThreadMutex lock;
|
||||||
} SStreamExecInfo;
|
} SStreamExecInfo;
|
||||||
|
|
||||||
typedef struct SVgroupChangeInfo {
|
typedef struct SVgroupChangeInfo {
|
||||||
SHashObj *pDBMap;
|
SHashObj *pDBMap;
|
||||||
SArray *pUpdateNodeList; // SArray<SNodeUpdateInfo>
|
SArray * pUpdateNodeList; // SArray<SNodeUpdateInfo>
|
||||||
} SVgroupChangeInfo;
|
} SVgroupChangeInfo;
|
||||||
|
|
||||||
static int32_t mndNodeCheckSentinel = 0;
|
static int32_t mndNodeCheckSentinel = 0;
|
||||||
|
@ -78,7 +78,7 @@ static int32_t mndBuildStreamCheckpointSourceReq2(void **pBuf, int32_t *pLen, in
|
||||||
static int32_t mndProcessNodeCheck(SRpcMsg *pReq);
|
static int32_t mndProcessNodeCheck(SRpcMsg *pReq);
|
||||||
static int32_t mndProcessNodeCheckReq(SRpcMsg *pMsg);
|
static int32_t mndProcessNodeCheckReq(SRpcMsg *pMsg);
|
||||||
static SArray *extractNodeListFromStream(SMnode *pMnode);
|
static SArray *extractNodeListFromStream(SMnode *pMnode);
|
||||||
static SArray *mndTakeVgroupSnapshot(SMnode *pMnode, bool* allReady);
|
static SArray *mndTakeVgroupSnapshot(SMnode *pMnode, bool *allReady);
|
||||||
|
|
||||||
static SVgroupChangeInfo mndFindChangedNodeInfo(SMnode *pMnode, const SArray *pPrevNodeList, const SArray *pNodeList);
|
static SVgroupChangeInfo mndFindChangedNodeInfo(SMnode *pMnode, const SArray *pPrevNodeList, const SArray *pNodeList);
|
||||||
|
|
||||||
|
@ -91,7 +91,7 @@ static void removeStreamTasksInBuf(SStreamObj *pStream, SStreamExecInfo *pExe
|
||||||
static void keepStreamTasksInBuf(SStreamObj *pStream, SStreamExecInfo *pExecNode);
|
static void keepStreamTasksInBuf(SStreamObj *pStream, SStreamExecInfo *pExecNode);
|
||||||
static int32_t removeExpirednodeEntryAndTask(SArray *pNodeSnapshot);
|
static int32_t removeExpirednodeEntryAndTask(SArray *pNodeSnapshot);
|
||||||
static int32_t doKillActiveCheckpointTrans(SMnode *pMnode);
|
static int32_t doKillActiveCheckpointTrans(SMnode *pMnode);
|
||||||
static int32_t setNodeEpsetExpiredFlag(const SArray* pNodeList);
|
static int32_t setNodeEpsetExpiredFlag(const SArray *pNodeList);
|
||||||
|
|
||||||
int32_t mndInitStream(SMnode *pMnode) {
|
int32_t mndInitStream(SMnode *pMnode) {
|
||||||
SSdbTable table = {
|
SSdbTable table = {
|
||||||
|
@ -193,9 +193,9 @@ STREAM_ENCODE_OVER:
|
||||||
|
|
||||||
SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) {
|
SSdbRow *mndStreamActionDecode(SSdbRaw *pRaw) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
SSdbRow *pRow = NULL;
|
SSdbRow * pRow = NULL;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
void *buf = NULL;
|
void * buf = NULL;
|
||||||
|
|
||||||
int8_t sver = 0;
|
int8_t sver = 0;
|
||||||
if (sdbGetRawSoftVer(pRaw, &sver) != 0) {
|
if (sdbGetRawSoftVer(pRaw, &sver) != 0) {
|
||||||
|
@ -272,7 +272,7 @@ static int32_t mndStreamActionUpdate(SSdb *pSdb, SStreamObj *pOldStream, SStream
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamObj *mndAcquireStream(SMnode *pMnode, char *streamName) {
|
SStreamObj *mndAcquireStream(SMnode *pMnode, char *streamName) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
SStreamObj *pStream = sdbAcquire(pSdb, SDB_STREAM, streamName);
|
SStreamObj *pStream = sdbAcquire(pSdb, SDB_STREAM, streamName);
|
||||||
if (pStream == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
|
if (pStream == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
|
||||||
terrno = TSDB_CODE_MND_STREAM_NOT_EXIST;
|
terrno = TSDB_CODE_MND_STREAM_NOT_EXIST;
|
||||||
|
@ -325,7 +325,7 @@ static int32_t mndStreamGetPlanString(const char *ast, int8_t triggerType, int64
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SNode *pAst = NULL;
|
SNode * pAst = NULL;
|
||||||
int32_t code = nodesStringToNode(ast, &pAst);
|
int32_t code = nodesStringToNode(ast, &pAst);
|
||||||
|
|
||||||
SQueryPlan *pPlan = NULL;
|
SQueryPlan *pPlan = NULL;
|
||||||
|
@ -350,7 +350,7 @@ static int32_t mndStreamGetPlanString(const char *ast, int8_t triggerType, int64
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndBuildStreamObjFromCreateReq(SMnode *pMnode, SStreamObj *pObj, SCMCreateStreamReq *pCreate) {
|
static int32_t mndBuildStreamObjFromCreateReq(SMnode *pMnode, SStreamObj *pObj, SCMCreateStreamReq *pCreate) {
|
||||||
SNode *pAst = NULL;
|
SNode * pAst = NULL;
|
||||||
SQueryPlan *pPlan = NULL;
|
SQueryPlan *pPlan = NULL;
|
||||||
|
|
||||||
mInfo("stream:%s to create", pCreate->name);
|
mInfo("stream:%s to create", pCreate->name);
|
||||||
|
@ -589,7 +589,7 @@ int32_t mndPersistDropStreamLog(SMnode *pMnode, STrans *pTrans, SStreamObj *pStr
|
||||||
|
|
||||||
static int32_t mndCreateStbForStream(SMnode *pMnode, STrans *pTrans, const SStreamObj *pStream, const char *user) {
|
static int32_t mndCreateStbForStream(SMnode *pMnode, STrans *pTrans, const SStreamObj *pStream, const char *user) {
|
||||||
SStbObj *pStb = NULL;
|
SStbObj *pStb = NULL;
|
||||||
SDbObj *pDb = NULL;
|
SDbObj * pDb = NULL;
|
||||||
|
|
||||||
SMCreateStbReq createReq = {0};
|
SMCreateStbReq createReq = {0};
|
||||||
tstrncpy(createReq.name, pStream->targetSTbName, TSDB_TABLE_FNAME_LEN);
|
tstrncpy(createReq.name, pStream->targetSTbName, TSDB_TABLE_FNAME_LEN);
|
||||||
|
@ -715,10 +715,10 @@ int32_t mndDropStreamTasks(SMnode *pMnode, STrans *pTrans, SStreamObj *pStream)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq) {
|
static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode * pMnode = pReq->info.node;
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj * pStream = NULL;
|
||||||
SDbObj *pDb = NULL;
|
SDbObj * pDb = NULL;
|
||||||
SCMCreateStreamReq createStreamReq = {0};
|
SCMCreateStreamReq createStreamReq = {0};
|
||||||
SStreamObj streamObj = {0};
|
SStreamObj streamObj = {0};
|
||||||
|
|
||||||
|
@ -761,7 +761,7 @@ static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq) {
|
||||||
int32_t numOfStream = 0;
|
int32_t numOfStream = 0;
|
||||||
|
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
void *pIter = NULL;
|
void * pIter = NULL;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = sdbFetch(pMnode->pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
pIter = sdbFetch(pMnode->pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
||||||
|
@ -858,12 +858,12 @@ static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq) {
|
||||||
|
|
||||||
SName name = {0};
|
SName name = {0};
|
||||||
tNameFromString(&name, createStreamReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
tNameFromString(&name, createStreamReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
||||||
//reuse this function for stream
|
// reuse this function for stream
|
||||||
|
|
||||||
//TODO
|
// TODO
|
||||||
if (createStreamReq.sql != NULL) {
|
if (createStreamReq.sql != NULL) {
|
||||||
auditRecord(pReq, pMnode->clusterId, "createStream", name.dbname, name.tname,
|
auditRecord(pReq, pMnode->clusterId, "createStream", name.dbname, name.tname, createStreamReq.sql,
|
||||||
createStreamReq.sql, strlen(createStreamReq.sql));
|
strlen(createStreamReq.sql));
|
||||||
}
|
}
|
||||||
_OVER:
|
_OVER:
|
||||||
if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
|
if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
|
||||||
|
@ -877,15 +877,30 @@ _OVER:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t mndStreamGenChkpId(SMnode *pMnode) {
|
||||||
|
SStreamObj *pStream = NULL;
|
||||||
|
void * pIter = NULL;
|
||||||
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
|
int64_t maxChkpId = 0;
|
||||||
|
while (1) {
|
||||||
|
pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
||||||
|
if (pIter == NULL) break;
|
||||||
|
|
||||||
|
maxChkpId = TMAX(maxChkpId, pStream->checkpointId);
|
||||||
|
sdbRelease(pSdb, pStream);
|
||||||
|
}
|
||||||
|
return maxChkpId + 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndProcessStreamCheckpointTmr(SRpcMsg *pReq) {
|
static int32_t mndProcessStreamCheckpointTmr(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
if (sdbGetSize(pSdb, SDB_STREAM) <= 0) {
|
if (sdbGetSize(pSdb, SDB_STREAM) <= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMStreamDoCheckpointMsg *pMsg = rpcMallocCont(sizeof(SMStreamDoCheckpointMsg));
|
SMStreamDoCheckpointMsg *pMsg = rpcMallocCont(sizeof(SMStreamDoCheckpointMsg));
|
||||||
pMsg->checkpointId = taosGetTimestampMs();
|
pMsg->checkpointId = mndStreamGenChkpId(pMnode);
|
||||||
|
|
||||||
int32_t size = sizeof(SMStreamDoCheckpointMsg);
|
int32_t size = sizeof(SMStreamDoCheckpointMsg);
|
||||||
SRpcMsg rpcMsg = {.msgType = TDMT_MND_STREAM_BEGIN_CHECKPOINT, .pCont = pMsg, .contLen = size};
|
SRpcMsg rpcMsg = {.msgType = TDMT_MND_STREAM_BEGIN_CHECKPOINT, .pCont = pMsg, .contLen = size};
|
||||||
|
@ -919,7 +934,7 @@ static int32_t mndBuildStreamCheckpointSourceReq2(void **pBuf, int32_t *pLen, in
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
void * abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
||||||
SEncoder encoder;
|
SEncoder encoder;
|
||||||
tEncoderInit(&encoder, abuf, tlen);
|
tEncoderInit(&encoder, abuf, tlen);
|
||||||
tEncodeStreamCheckpointSourceReq(&encoder, &req);
|
tEncodeStreamCheckpointSourceReq(&encoder, &req);
|
||||||
|
@ -1042,7 +1057,7 @@ static int32_t mndAddStreamCheckpointToTrans(STrans *pTrans, SStreamObj *pStream
|
||||||
|
|
||||||
int32_t totLevel = taosArrayGetSize(pStream->tasks);
|
int32_t totLevel = taosArrayGetSize(pStream->tasks);
|
||||||
for (int32_t i = 0; i < totLevel; i++) {
|
for (int32_t i = 0; i < totLevel; i++) {
|
||||||
SArray *pLevel = taosArrayGetP(pStream->tasks, i);
|
SArray * pLevel = taosArrayGetP(pStream->tasks, i);
|
||||||
SStreamTask *pTask = taosArrayGetP(pLevel, 0);
|
SStreamTask *pTask = taosArrayGetP(pLevel, 0);
|
||||||
|
|
||||||
if (pTask->info.taskLevel == TASK_LEVEL__SOURCE) {
|
if (pTask->info.taskLevel == TASK_LEVEL__SOURCE) {
|
||||||
|
@ -1059,7 +1074,7 @@ static int32_t mndAddStreamCheckpointToTrans(STrans *pTrans, SStreamObj *pStream
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *buf;
|
void * buf;
|
||||||
int32_t tlen;
|
int32_t tlen;
|
||||||
if (mndBuildStreamCheckpointSourceReq2(&buf, &tlen, pTask->info.nodeId, chkptId, pTask->id.streamId,
|
if (mndBuildStreamCheckpointSourceReq2(&buf, &tlen, pTask->info.nodeId, chkptId, pTask->id.streamId,
|
||||||
pTask->id.taskId) < 0) {
|
pTask->id.taskId) < 0) {
|
||||||
|
@ -1070,7 +1085,8 @@ static int32_t mndAddStreamCheckpointToTrans(STrans *pTrans, SStreamObj *pStream
|
||||||
|
|
||||||
STransAction action = {0};
|
STransAction action = {0};
|
||||||
SEpSet epset = mndGetVgroupEpset(pMnode, pVgObj);
|
SEpSet epset = mndGetVgroupEpset(pMnode, pVgObj);
|
||||||
initTransAction(&action, buf, tlen, TDMT_VND_STREAM_CHECK_POINT_SOURCE, &epset, TSDB_CODE_SYN_PROPOSE_NOT_READY);
|
initTransAction(&action, buf, tlen, TDMT_VND_STREAM_CHECK_POINT_SOURCE, &epset,
|
||||||
|
TSDB_CODE_SYN_PROPOSE_NOT_READY);
|
||||||
mndReleaseVgroup(pMnode, pVgObj);
|
mndReleaseVgroup(pMnode, pVgObj);
|
||||||
|
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
||||||
|
@ -1110,9 +1126,9 @@ static int32_t mndAddStreamCheckpointToTrans(STrans *pTrans, SStreamObj *pStream
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *mndGetStreamDB(SMnode *pMnode) {
|
static const char *mndGetStreamDB(SMnode *pMnode) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
void *pIter = NULL;
|
void * pIter = NULL;
|
||||||
|
|
||||||
pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
||||||
if (pIter == NULL) {
|
if (pIter == NULL) {
|
||||||
|
@ -1126,9 +1142,9 @@ static const char *mndGetStreamDB(SMnode *pMnode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq) {
|
static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode * pMnode = pReq->info.node;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
void *pIter = NULL;
|
void * pIter = NULL;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
@ -1149,19 +1165,18 @@ static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int32_t i = 0; i < taosArrayGetSize(execInfo.pNodeEntryList); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(execInfo.pNodeEntryList); ++i) {
|
||||||
SNodeEntry* pNodeEntry = taosArrayGet(execInfo.pNodeEntryList, i);
|
SNodeEntry *pNodeEntry = taosArrayGet(execInfo.pNodeEntryList, i);
|
||||||
if (pNodeEntry->stageUpdated) {
|
if (pNodeEntry->stageUpdated) {
|
||||||
mDebug("stream task not ready due to node update detected, checkpoint not issued");
|
mDebug("stream task not ready due to node update detected, checkpoint not issued");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool allReady = true;
|
bool allReady = true;
|
||||||
SArray *pNodeSnapshot = mndTakeVgroupSnapshot(pMnode, &allReady);
|
SArray *pNodeSnapshot = mndTakeVgroupSnapshot(pMnode, &allReady);
|
||||||
if (!allReady) {
|
if (!allReady) {
|
||||||
mWarn("not all vnodes are ready, ignore the checkpoint")
|
mWarn("not all vnodes are ready, ignore the checkpoint") taosArrayDestroy(pNodeSnapshot);
|
||||||
taosArrayDestroy(pNodeSnapshot);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1182,15 +1197,15 @@ static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq) {
|
||||||
|
|
||||||
taosThreadMutexLock(&execInfo.lock);
|
taosThreadMutexLock(&execInfo.lock);
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(execInfo.pTaskList); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(execInfo.pTaskList); ++i) {
|
||||||
STaskId *p = taosArrayGet(execInfo.pTaskList, i);
|
STaskId * p = taosArrayGet(execInfo.pTaskList, i);
|
||||||
STaskStatusEntry* pEntry = taosHashGet(execInfo.pTaskMap, p, sizeof(*p));
|
STaskStatusEntry *pEntry = taosHashGet(execInfo.pTaskMap, p, sizeof(*p));
|
||||||
if (pEntry == NULL) {
|
if (pEntry == NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pEntry->status != TASK_STATUS__READY) {
|
if (pEntry->status != TASK_STATUS__READY) {
|
||||||
mDebug("s-task:0x%" PRIx64 "-0x%x (nodeId:%d) status:%s not ready, checkpoint msg not issued",
|
mDebug("s-task:0x%" PRIx64 "-0x%x (nodeId:%d) status:%s not ready, checkpoint msg not issued",
|
||||||
pEntry->id.streamId, (int32_t)pEntry->id.taskId, 0, streamTaskGetStatusStr(pEntry->status));
|
pEntry->id.streamId, (int32_t)pEntry->id.taskId, 0, streamTaskGetStatusStr(pEntry->status));
|
||||||
ready = false;
|
ready = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1250,7 +1265,7 @@ static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndProcessDropStreamReq(SRpcMsg *pReq) {
|
static int32_t mndProcessDropStreamReq(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode * pMnode = pReq->info.node;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
|
|
||||||
SMDropStreamReq dropReq = {0};
|
SMDropStreamReq dropReq = {0};
|
||||||
|
@ -1327,7 +1342,7 @@ static int32_t mndProcessDropStreamReq(SRpcMsg *pReq) {
|
||||||
|
|
||||||
SName name = {0};
|
SName name = {0};
|
||||||
tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
tNameFromString(&name, dropReq.name, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
|
||||||
//reuse this function for stream
|
// reuse this function for stream
|
||||||
|
|
||||||
auditRecord(pReq, pMnode->clusterId, "dropStream", name.dbname, name.tname, dropReq.sql, dropReq.sqlLen);
|
auditRecord(pReq, pMnode->clusterId, "dropStream", name.dbname, name.tname, dropReq.sql, dropReq.sqlLen);
|
||||||
|
|
||||||
|
@ -1379,7 +1394,7 @@ int32_t mndDropStreamByDb(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndGetNumOfStreams(SMnode *pMnode, char *dbName, int32_t *pNumOfStreams) {
|
int32_t mndGetNumOfStreams(SMnode *pMnode, char *dbName, int32_t *pNumOfStreams) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
SDbObj *pDb = mndAcquireDb(pMnode, dbName);
|
SDbObj *pDb = mndAcquireDb(pMnode, dbName);
|
||||||
if (pDb == NULL) {
|
if (pDb == NULL) {
|
||||||
terrno = TSDB_CODE_MND_DB_NOT_SELECTED;
|
terrno = TSDB_CODE_MND_DB_NOT_SELECTED;
|
||||||
|
@ -1387,7 +1402,7 @@ int32_t mndGetNumOfStreams(SMnode *pMnode, char *dbName, int32_t *pNumOfStreams)
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfStreams = 0;
|
int32_t numOfStreams = 0;
|
||||||
void *pIter = NULL;
|
void * pIter = NULL;
|
||||||
while (1) {
|
while (1) {
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
||||||
|
@ -1406,8 +1421,8 @@ int32_t mndGetNumOfStreams(SMnode *pMnode, char *dbName, int32_t *pNumOfStreams)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndRetrieveStream(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
|
static int32_t mndRetrieveStream(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode * pMnode = pReq->info.node;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
int32_t numOfRows = 0;
|
int32_t numOfRows = 0;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
|
|
||||||
|
@ -1483,8 +1498,8 @@ static void mndCancelGetNextStream(SMnode *pMnode, void *pIter) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndRetrieveStreamTask(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity) {
|
static int32_t mndRetrieveStreamTask(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode * pMnode = pReq->info.node;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
int32_t numOfRows = 0;
|
int32_t numOfRows = 0;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
|
|
||||||
|
@ -1573,13 +1588,13 @@ static int32_t mndRetrieveStreamTask(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
|
||||||
// status
|
// status
|
||||||
char status[20 + VARSTR_HEADER_SIZE] = {0};
|
char status[20 + VARSTR_HEADER_SIZE] = {0};
|
||||||
|
|
||||||
STaskId id = {.streamId = pTask->id.streamId, .taskId = pTask->id.taskId};
|
STaskId id = {.streamId = pTask->id.streamId, .taskId = pTask->id.taskId};
|
||||||
STaskStatusEntry* pe = taosHashGet(execInfo.pTaskMap, &id, sizeof(id));
|
STaskStatusEntry *pe = taosHashGet(execInfo.pTaskMap, &id, sizeof(id));
|
||||||
if (pe == NULL) {
|
if (pe == NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* pStatus = streamTaskGetStatusStr(pe->status);
|
const char *pStatus = streamTaskGetStatusStr(pe->status);
|
||||||
STR_TO_VARSTR(status, pStatus);
|
STR_TO_VARSTR(status, pStatus);
|
||||||
|
|
||||||
// status
|
// status
|
||||||
|
@ -1591,24 +1606,24 @@ static int32_t mndRetrieveStreamTask(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
|
||||||
colDataSetVal(pColInfo, numOfRows, (const char *)&pe->stage, false);
|
colDataSetVal(pColInfo, numOfRows, (const char *)&pe->stage, false);
|
||||||
|
|
||||||
// input queue
|
// input queue
|
||||||
char vbuf[30] = {0};
|
char vbuf[30] = {0};
|
||||||
char buf[25] = {0};
|
char buf[25] = {0};
|
||||||
const char* queueInfoStr = "%4.2fMiB (%5.2f%)";
|
const char *queueInfoStr = "%4.2fMiB (%5.2f%)";
|
||||||
sprintf(buf, queueInfoStr, pe->inputQUsed, pe->inputRate);
|
sprintf(buf, queueInfoStr, pe->inputQUsed, pe->inputRate);
|
||||||
STR_TO_VARSTR(vbuf, buf);
|
STR_TO_VARSTR(vbuf, buf);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataSetVal(pColInfo, numOfRows, (const char*)vbuf, false);
|
colDataSetVal(pColInfo, numOfRows, (const char *)vbuf, false);
|
||||||
|
|
||||||
// output queue
|
// output queue
|
||||||
// sprintf(buf, queueInfoStr, pe->outputQUsed, pe->outputRate);
|
// sprintf(buf, queueInfoStr, pe->outputQUsed, pe->outputRate);
|
||||||
// STR_TO_VARSTR(vbuf, buf);
|
// STR_TO_VARSTR(vbuf, buf);
|
||||||
|
|
||||||
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
// colDataSetVal(pColInfo, numOfRows, (const char*)vbuf, false);
|
// colDataSetVal(pColInfo, numOfRows, (const char*)vbuf, false);
|
||||||
|
|
||||||
if (pTask->info.taskLevel == TASK_LEVEL__SINK) {
|
if (pTask->info.taskLevel == TASK_LEVEL__SINK) {
|
||||||
const char* sinkStr = "%.2fMiB";
|
const char *sinkStr = "%.2fMiB";
|
||||||
sprintf(buf, sinkStr, pe->sinkDataSize);
|
sprintf(buf, sinkStr, pe->sinkDataSize);
|
||||||
} else if (pTask->info.taskLevel == TASK_LEVEL__SOURCE) {
|
} else if (pTask->info.taskLevel == TASK_LEVEL__SOURCE) {
|
||||||
// offset info
|
// offset info
|
||||||
|
@ -1619,7 +1634,7 @@ static int32_t mndRetrieveStreamTask(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
|
||||||
STR_TO_VARSTR(vbuf, buf);
|
STR_TO_VARSTR(vbuf, buf);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataSetVal(pColInfo, numOfRows, (const char*)vbuf, false);
|
colDataSetVal(pColInfo, numOfRows, (const char *)vbuf, false);
|
||||||
|
|
||||||
numOfRows++;
|
numOfRows++;
|
||||||
}
|
}
|
||||||
|
@ -1663,7 +1678,7 @@ static int32_t mndPauseStreamTask(STrans *pTrans, SStreamTask *pTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndPauseAllStreamTasks(STrans *pTrans, SStreamObj *pStream) {
|
int32_t mndPauseAllStreamTasks(STrans *pTrans, SStreamObj *pStream) {
|
||||||
SArray* tasks = pStream->tasks;
|
SArray *tasks = pStream->tasks;
|
||||||
|
|
||||||
int32_t size = taosArrayGetSize(tasks);
|
int32_t size = taosArrayGetSize(tasks);
|
||||||
for (int32_t i = 0; i < size; i++) {
|
for (int32_t i = 0; i < size; i++) {
|
||||||
|
@ -1700,7 +1715,7 @@ static int32_t mndPersistStreamLog(STrans *pTrans, const SStreamObj *pStream, in
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndProcessPauseStreamReq(SRpcMsg *pReq) {
|
static int32_t mndProcessPauseStreamReq(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode * pMnode = pReq->info.node;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
|
|
||||||
SMPauseStreamReq pauseReq = {0};
|
SMPauseStreamReq pauseReq = {0};
|
||||||
|
@ -1816,7 +1831,7 @@ int32_t mndResumeAllStreamTasks(STrans *pTrans, SStreamObj *pStream, int8_t igUn
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndProcessResumeStreamReq(SRpcMsg *pReq) {
|
static int32_t mndProcessResumeStreamReq(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode * pMnode = pReq->info.node;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
|
|
||||||
SMResumeStreamReq pauseReq = {0};
|
SMResumeStreamReq pauseReq = {0};
|
||||||
|
@ -1901,7 +1916,7 @@ static void initNodeUpdateMsg(SStreamTaskNodeUpdateMsg *pMsg, const SVgroupChang
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t doBuildStreamTaskUpdateMsg(void **pBuf, int32_t *pLen, SVgroupChangeInfo *pInfo, int32_t nodeId,
|
static int32_t doBuildStreamTaskUpdateMsg(void **pBuf, int32_t *pLen, SVgroupChangeInfo *pInfo, int32_t nodeId,
|
||||||
SStreamTaskId* pId, int32_t transId) {
|
SStreamTaskId *pId, int32_t transId) {
|
||||||
SStreamTaskNodeUpdateMsg req = {0};
|
SStreamTaskNodeUpdateMsg req = {0};
|
||||||
initNodeUpdateMsg(&req, pInfo, pId, transId);
|
initNodeUpdateMsg(&req, pInfo, pId, transId);
|
||||||
|
|
||||||
|
@ -1924,7 +1939,7 @@ static int32_t doBuildStreamTaskUpdateMsg(void **pBuf, int32_t *pLen, SVgroupCha
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
void * abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
||||||
SEncoder encoder;
|
SEncoder encoder;
|
||||||
tEncoderInit(&encoder, abuf, tlen);
|
tEncoderInit(&encoder, abuf, tlen);
|
||||||
tEncodeStreamTaskUpdateMsg(&encoder, &req);
|
tEncodeStreamTaskUpdateMsg(&encoder, &req);
|
||||||
|
@ -1991,7 +2006,7 @@ static int32_t createStreamUpdateTrans(SStreamObj *pStream, SVgroupChangeInfo *p
|
||||||
for (int32_t k = 0; k < numOfTasks; ++k) {
|
for (int32_t k = 0; k < numOfTasks; ++k) {
|
||||||
SStreamTask *pTask = taosArrayGetP(pLevel, k);
|
SStreamTask *pTask = taosArrayGetP(pLevel, k);
|
||||||
|
|
||||||
void *pBuf = NULL;
|
void * pBuf = NULL;
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
streamTaskUpdateEpsetInfo(pTask, pInfo->pUpdateNodeList);
|
streamTaskUpdateEpsetInfo(pTask, pInfo->pUpdateNodeList);
|
||||||
doBuildStreamTaskUpdateMsg(&pBuf, &len, pInfo, pTask->info.nodeId, &pTask->id, pTrans->id);
|
doBuildStreamTaskUpdateMsg(&pBuf, &len, pInfo, pTask->info.nodeId, &pTask->id, pTrans->id);
|
||||||
|
@ -2012,7 +2027,7 @@ static int32_t createStreamUpdateTrans(SStreamObj *pStream, SVgroupChangeInfo *p
|
||||||
|
|
||||||
static bool isNodeEpsetChanged(const SEpSet *pPrevEpset, const SEpSet *pCurrent) {
|
static bool isNodeEpsetChanged(const SEpSet *pPrevEpset, const SEpSet *pCurrent) {
|
||||||
const SEp *pEp = GET_ACTIVE_EP(pPrevEpset);
|
const SEp *pEp = GET_ACTIVE_EP(pPrevEpset);
|
||||||
const SEp* p = GET_ACTIVE_EP(pCurrent);
|
const SEp *p = GET_ACTIVE_EP(pCurrent);
|
||||||
|
|
||||||
if (pEp->port == p->port && strncmp(pEp->fqdn, p->fqdn, TSDB_FQDN_LEN) == 0) {
|
if (pEp->port == p->port && strncmp(pEp->fqdn, p->fqdn, TSDB_FQDN_LEN) == 0) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -2066,9 +2081,9 @@ static SVgroupChangeInfo mndFindChangedNodeInfo(SMnode *pMnode, const SArray *pP
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SArray *mndTakeVgroupSnapshot(SMnode *pMnode, bool* allReady) {
|
static SArray *mndTakeVgroupSnapshot(SMnode *pMnode, bool *allReady) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
void *pIter = NULL;
|
void * pIter = NULL;
|
||||||
SVgObj *pVgroup = NULL;
|
SVgObj *pVgroup = NULL;
|
||||||
|
|
||||||
*allReady = true;
|
*allReady = true;
|
||||||
|
@ -2115,8 +2130,8 @@ static int32_t mndProcessVgroupChange(SMnode *pMnode, SVgroupChangeInfo *pChange
|
||||||
|
|
||||||
// check all streams that involved this vnode should update the epset info
|
// check all streams that involved this vnode should update the epset info
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
void *pIter = NULL;
|
void * pIter = NULL;
|
||||||
STrans *pTrans = NULL;
|
STrans * pTrans = NULL;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
||||||
|
@ -2177,9 +2192,9 @@ static int32_t mndProcessVgroupChange(SMnode *pMnode, SVgroupChangeInfo *pChange
|
||||||
}
|
}
|
||||||
|
|
||||||
static SArray *extractNodeListFromStream(SMnode *pMnode) {
|
static SArray *extractNodeListFromStream(SMnode *pMnode) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
void *pIter = NULL;
|
void * pIter = NULL;
|
||||||
|
|
||||||
SHashObj *pHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
|
SHashObj *pHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -2226,9 +2241,9 @@ static SArray *extractNodeListFromStream(SMnode *pMnode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doExtractTasksFromStream(SMnode *pMnode) {
|
static void doExtractTasksFromStream(SMnode *pMnode) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
void *pIter = NULL;
|
void * pIter = NULL;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
||||||
|
@ -2263,11 +2278,11 @@ static int32_t doRemoveTasks(SStreamExecInfo *pExecNode, STaskId *pRemovedId) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool taskNodeExists(SArray* pList, int32_t nodeId) {
|
static bool taskNodeExists(SArray *pList, int32_t nodeId) {
|
||||||
size_t num = taosArrayGetSize(pList);
|
size_t num = taosArrayGetSize(pList);
|
||||||
|
|
||||||
for(int32_t i = 0; i < num; ++i) {
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
SNodeEntry* pEntry = taosArrayGet(pList, i);
|
SNodeEntry *pEntry = taosArrayGet(pList, i);
|
||||||
if (pEntry->nodeId == nodeId) {
|
if (pEntry->nodeId == nodeId) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2277,12 +2292,12 @@ static bool taskNodeExists(SArray* pList, int32_t nodeId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t removeExpirednodeEntryAndTask(SArray *pNodeSnapshot) {
|
int32_t removeExpirednodeEntryAndTask(SArray *pNodeSnapshot) {
|
||||||
SArray* pRemovedTasks = taosArrayInit(4, sizeof(STaskId));
|
SArray *pRemovedTasks = taosArrayInit(4, sizeof(STaskId));
|
||||||
|
|
||||||
int32_t numOfTask = taosArrayGetSize(execInfo.pTaskList);
|
int32_t numOfTask = taosArrayGetSize(execInfo.pTaskList);
|
||||||
for(int32_t i = 0; i < numOfTask; ++i) {
|
for (int32_t i = 0; i < numOfTask; ++i) {
|
||||||
STaskId* pId = taosArrayGet(execInfo.pTaskList, i);
|
STaskId * pId = taosArrayGet(execInfo.pTaskList, i);
|
||||||
STaskStatusEntry* pEntry = taosHashGet(execInfo.pTaskMap, pId, sizeof(*pId));
|
STaskStatusEntry *pEntry = taosHashGet(execInfo.pTaskMap, pId, sizeof(*pId));
|
||||||
|
|
||||||
bool existed = taskNodeExists(pNodeSnapshot, pEntry->nodeId);
|
bool existed = taskNodeExists(pNodeSnapshot, pEntry->nodeId);
|
||||||
if (!existed) {
|
if (!existed) {
|
||||||
|
@ -2290,21 +2305,21 @@ int32_t removeExpirednodeEntryAndTask(SArray *pNodeSnapshot) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int32_t i = 0; i < taosArrayGetSize(pRemovedTasks); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(pRemovedTasks); ++i) {
|
||||||
STaskId* pId = taosArrayGet(pRemovedTasks, i);
|
STaskId *pId = taosArrayGet(pRemovedTasks, i);
|
||||||
doRemoveTasks(&execInfo, pId);
|
doRemoveTasks(&execInfo, pId);
|
||||||
}
|
}
|
||||||
|
|
||||||
mDebug("remove invalid stream tasks:%d, remain:%d", (int32_t)taosArrayGetSize(pRemovedTasks),
|
mDebug("remove invalid stream tasks:%d, remain:%d", (int32_t)taosArrayGetSize(pRemovedTasks),
|
||||||
(int32_t) taosArrayGetSize(execInfo.pTaskList));
|
(int32_t)taosArrayGetSize(execInfo.pTaskList));
|
||||||
|
|
||||||
int32_t size = taosArrayGetSize(pNodeSnapshot);
|
int32_t size = taosArrayGetSize(pNodeSnapshot);
|
||||||
SArray* pValidNodeEntryList = taosArrayInit(4, sizeof(SNodeEntry));
|
SArray *pValidNodeEntryList = taosArrayInit(4, sizeof(SNodeEntry));
|
||||||
for(int32_t i = 0; i < taosArrayGetSize(execInfo.pNodeEntryList); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(execInfo.pNodeEntryList); ++i) {
|
||||||
SNodeEntry* p = taosArrayGet(execInfo.pNodeEntryList, i);
|
SNodeEntry *p = taosArrayGet(execInfo.pNodeEntryList, i);
|
||||||
|
|
||||||
for(int32_t j = 0; j < size; ++j) {
|
for (int32_t j = 0; j < size; ++j) {
|
||||||
SNodeEntry* pEntry = taosArrayGet(pNodeSnapshot, j);
|
SNodeEntry *pEntry = taosArrayGet(pNodeSnapshot, j);
|
||||||
if (pEntry->nodeId == p->nodeId) {
|
if (pEntry->nodeId == p->nodeId) {
|
||||||
taosArrayPush(pValidNodeEntryList, p);
|
taosArrayPush(pValidNodeEntryList, p);
|
||||||
break;
|
break;
|
||||||
|
@ -2315,7 +2330,7 @@ int32_t removeExpirednodeEntryAndTask(SArray *pNodeSnapshot) {
|
||||||
execInfo.pNodeEntryList = taosArrayDestroy(execInfo.pNodeEntryList);
|
execInfo.pNodeEntryList = taosArrayDestroy(execInfo.pNodeEntryList);
|
||||||
execInfo.pNodeEntryList = pValidNodeEntryList;
|
execInfo.pNodeEntryList = pValidNodeEntryList;
|
||||||
|
|
||||||
mDebug("remain %d valid node entries", (int32_t) taosArrayGetSize(pValidNodeEntryList));
|
mDebug("remain %d valid node entries", (int32_t)taosArrayGetSize(pValidNodeEntryList));
|
||||||
taosArrayDestroy(pRemovedTasks);
|
taosArrayDestroy(pRemovedTasks);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2347,7 +2362,7 @@ static int32_t mndProcessNodeCheckReq(SRpcMsg *pMsg) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool allVnodeReady = true;
|
bool allVnodeReady = true;
|
||||||
SArray *pNodeSnapshot = mndTakeVgroupSnapshot(pMnode, &allVnodeReady);
|
SArray *pNodeSnapshot = mndTakeVgroupSnapshot(pMnode, &allVnodeReady);
|
||||||
if (!allVnodeReady) {
|
if (!allVnodeReady) {
|
||||||
taosArrayDestroy(pNodeSnapshot);
|
taosArrayDestroy(pNodeSnapshot);
|
||||||
|
@ -2361,7 +2376,6 @@ static int32_t mndProcessNodeCheckReq(SRpcMsg *pMsg) {
|
||||||
|
|
||||||
SVgroupChangeInfo changeInfo = mndFindChangedNodeInfo(pMnode, execInfo.pNodeEntryList, pNodeSnapshot);
|
SVgroupChangeInfo changeInfo = mndFindChangedNodeInfo(pMnode, execInfo.pNodeEntryList, pNodeSnapshot);
|
||||||
if (taosArrayGetSize(changeInfo.pUpdateNodeList) > 0) {
|
if (taosArrayGetSize(changeInfo.pUpdateNodeList) > 0) {
|
||||||
|
|
||||||
// kill current active checkpoint transaction, since the transaction is vnode wide.
|
// kill current active checkpoint transaction, since the transaction is vnode wide.
|
||||||
doKillActiveCheckpointTrans(pMnode);
|
doKillActiveCheckpointTrans(pMnode);
|
||||||
code = mndProcessVgroupChange(pMnode, &changeInfo);
|
code = mndProcessVgroupChange(pMnode, &changeInfo);
|
||||||
|
@ -2396,7 +2410,7 @@ typedef struct SMStreamNodeCheckMsg {
|
||||||
|
|
||||||
static int32_t mndProcessNodeCheck(SRpcMsg *pReq) {
|
static int32_t mndProcessNodeCheck(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
if (sdbGetSize(pSdb, SDB_STREAM) <= 0) {
|
if (sdbGetSize(pSdb, SDB_STREAM) <= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2420,7 +2434,7 @@ void keepStreamTasksInBuf(SStreamObj *pStream, SStreamExecInfo *pExecNode) {
|
||||||
SStreamTask *pTask = taosArrayGetP(pLevel, j);
|
SStreamTask *pTask = taosArrayGetP(pLevel, j);
|
||||||
|
|
||||||
STaskId id = {.streamId = pTask->id.streamId, .taskId = pTask->id.taskId};
|
STaskId id = {.streamId = pTask->id.streamId, .taskId = pTask->id.taskId};
|
||||||
void *p = taosHashGet(pExecNode->pTaskMap, &id, sizeof(id));
|
void * p = taosHashGet(pExecNode->pTaskMap, &id, sizeof(id));
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
STaskStatusEntry entry = {0};
|
STaskStatusEntry entry = {0};
|
||||||
streamTaskStatusInit(&entry, pTask);
|
streamTaskStatusInit(&entry, pTask);
|
||||||
|
@ -2434,7 +2448,7 @@ void keepStreamTasksInBuf(SStreamObj *pStream, SStreamExecInfo *pExecNode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeStreamTasksInBuf(SStreamObj* pStream, SStreamExecInfo * pExecNode) {
|
void removeStreamTasksInBuf(SStreamObj *pStream, SStreamExecInfo *pExecNode) {
|
||||||
int32_t level = taosArrayGetSize(pStream->tasks);
|
int32_t level = taosArrayGetSize(pStream->tasks);
|
||||||
for (int32_t i = 0; i < level; i++) {
|
for (int32_t i = 0; i < level; i++) {
|
||||||
SArray *pLevel = taosArrayGetP(pStream->tasks, i);
|
SArray *pLevel = taosArrayGetP(pStream->tasks, i);
|
||||||
|
@ -2444,12 +2458,12 @@ void removeStreamTasksInBuf(SStreamObj* pStream, SStreamExecInfo * pExecNode) {
|
||||||
SStreamTask *pTask = taosArrayGetP(pLevel, j);
|
SStreamTask *pTask = taosArrayGetP(pLevel, j);
|
||||||
|
|
||||||
STaskId id = {.streamId = pTask->id.streamId, .taskId = pTask->id.taskId};
|
STaskId id = {.streamId = pTask->id.streamId, .taskId = pTask->id.taskId};
|
||||||
void *p = taosHashGet(pExecNode->pTaskMap, &id, sizeof(id));
|
void * p = taosHashGet(pExecNode->pTaskMap, &id, sizeof(id));
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
taosHashRemove(pExecNode->pTaskMap, &id, sizeof(id));
|
taosHashRemove(pExecNode->pTaskMap, &id, sizeof(id));
|
||||||
|
|
||||||
for(int32_t k = 0; k < taosArrayGetSize(pExecNode->pTaskList); ++k) {
|
for (int32_t k = 0; k < taosArrayGetSize(pExecNode->pTaskList); ++k) {
|
||||||
STaskId* pId = taosArrayGet(pExecNode->pTaskList, k);
|
STaskId *pId = taosArrayGet(pExecNode->pTaskList, k);
|
||||||
if (pId->taskId == id.taskId && pId->streamId == id.streamId) {
|
if (pId->taskId == id.taskId && pId->streamId == id.streamId) {
|
||||||
taosArrayRemove(pExecNode->pTaskList, k);
|
taosArrayRemove(pExecNode->pTaskList, k);
|
||||||
mInfo("s-task:0x%x removed from buffer, remain:%d", (int32_t)id.taskId,
|
mInfo("s-task:0x%x removed from buffer, remain:%d", (int32_t)id.taskId,
|
||||||
|
@ -2457,7 +2471,6 @@ void removeStreamTasksInBuf(SStreamObj* pStream, SStreamExecInfo * pExecNode) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2487,7 +2500,7 @@ STrans *doCreateTrans(SMnode *pMnode, SStreamObj *pStream, const char *name) {
|
||||||
return pTrans;
|
return pTrans;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t createStreamResetStatusTrans(SMnode* pMnode, SStreamObj* pStream) {
|
int32_t createStreamResetStatusTrans(SMnode *pMnode, SStreamObj *pStream) {
|
||||||
STrans *pTrans = doCreateTrans(pMnode, pStream, "stream-task-reset");
|
STrans *pTrans = doCreateTrans(pMnode, pStream, "stream-task-reset");
|
||||||
if (pTrans == NULL) {
|
if (pTrans == NULL) {
|
||||||
return terrno;
|
return terrno;
|
||||||
|
@ -2504,7 +2517,7 @@ int32_t createStreamResetStatusTrans(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
SStreamTask *pTask = taosArrayGetP(pLevel, k);
|
SStreamTask *pTask = taosArrayGetP(pLevel, k);
|
||||||
|
|
||||||
// todo extract method, with pause stream task
|
// todo extract method, with pause stream task
|
||||||
SVResetStreamTaskReq* pReq = taosMemoryCalloc(1, sizeof(SVResetStreamTaskReq));
|
SVResetStreamTaskReq *pReq = taosMemoryCalloc(1, sizeof(SVResetStreamTaskReq));
|
||||||
if (pReq == NULL) {
|
if (pReq == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
mError("failed to malloc in reset stream, size:%" PRIzu ", code:%s", sizeof(SVResetStreamTaskReq),
|
mError("failed to malloc in reset stream, size:%" PRIzu ", code:%s", sizeof(SVResetStreamTaskReq),
|
||||||
|
@ -2550,9 +2563,9 @@ int32_t createStreamResetStatusTrans(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
|
|
||||||
int32_t doKillActiveCheckpointTrans(SMnode *pMnode) {
|
int32_t doKillActiveCheckpointTrans(SMnode *pMnode) {
|
||||||
int32_t transId = 0;
|
int32_t transId = 0;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
STrans *pTrans = NULL;
|
STrans *pTrans = NULL;
|
||||||
void *pIter = NULL;
|
void * pIter = NULL;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = sdbFetch(pSdb, SDB_TRANS, pIter, (void **)&pTrans);
|
pIter = sdbFetch(pSdb, SDB_TRANS, pIter, (void **)&pTrans);
|
||||||
|
@ -2583,13 +2596,13 @@ int32_t doKillActiveCheckpointTrans(SMnode *pMnode) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndResetFromCheckpoint(SMnode* pMnode) {
|
int32_t mndResetFromCheckpoint(SMnode *pMnode) {
|
||||||
doKillActiveCheckpointTrans(pMnode);
|
doKillActiveCheckpointTrans(pMnode);
|
||||||
|
|
||||||
// set all tasks status to be normal, refactor later to be stream level, instead of vnode level.
|
// set all tasks status to be normal, refactor later to be stream level, instead of vnode level.
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb * pSdb = pMnode->pSdb;
|
||||||
SStreamObj *pStream = NULL;
|
SStreamObj *pStream = NULL;
|
||||||
void *pIter = NULL;
|
void * pIter = NULL;
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
pIter = sdbFetch(pSdb, SDB_STREAM, pIter, (void **)&pStream);
|
||||||
if (pIter == NULL) {
|
if (pIter == NULL) {
|
||||||
|
@ -2608,15 +2621,15 @@ int32_t mndResetFromCheckpoint(SMnode* pMnode) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t setNodeEpsetExpiredFlag(const SArray* pNodeList) {
|
int32_t setNodeEpsetExpiredFlag(const SArray *pNodeList) {
|
||||||
int32_t num = taosArrayGetSize(pNodeList);
|
int32_t num = taosArrayGetSize(pNodeList);
|
||||||
|
|
||||||
for (int k = 0; k < num; ++k) {
|
for (int k = 0; k < num; ++k) {
|
||||||
int32_t* pVgId = taosArrayGet(pNodeList, k);
|
int32_t *pVgId = taosArrayGet(pNodeList, k);
|
||||||
|
|
||||||
int32_t numOfNodes = taosArrayGetSize(execInfo.pNodeEntryList);
|
int32_t numOfNodes = taosArrayGetSize(execInfo.pNodeEntryList);
|
||||||
for (int i = 0; i < numOfNodes; ++i) {
|
for (int i = 0; i < numOfNodes; ++i) {
|
||||||
SNodeEntry* pNodeEntry = taosArrayGet(execInfo.pNodeEntryList, i);
|
SNodeEntry *pNodeEntry = taosArrayGet(execInfo.pNodeEntryList, i);
|
||||||
|
|
||||||
if (pNodeEntry->nodeId == *pVgId) {
|
if (pNodeEntry->nodeId == *pVgId) {
|
||||||
mInfo("vgId:%d expired in stream task, needs update nodeEp", *pVgId);
|
mInfo("vgId:%d expired in stream task, needs update nodeEp", *pVgId);
|
||||||
|
@ -2629,12 +2642,11 @@ int32_t setNodeEpsetExpiredFlag(const SArray* pNodeList) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void updateStageInfo(STaskStatusEntry* pTaskEntry, int32_t stage) {
|
static void updateStageInfo(STaskStatusEntry *pTaskEntry, int32_t stage) {
|
||||||
int32_t numOfNodes = taosArrayGetSize(execInfo.pNodeEntryList);
|
int32_t numOfNodes = taosArrayGetSize(execInfo.pNodeEntryList);
|
||||||
for(int32_t j = 0; j < numOfNodes; ++j) {
|
for (int32_t j = 0; j < numOfNodes; ++j) {
|
||||||
SNodeEntry* pNodeEntry = taosArrayGet(execInfo.pNodeEntryList, j);
|
SNodeEntry *pNodeEntry = taosArrayGet(execInfo.pNodeEntryList, j);
|
||||||
if (pNodeEntry->nodeId == pTaskEntry->nodeId) {
|
if (pNodeEntry->nodeId == pTaskEntry->nodeId) {
|
||||||
|
|
||||||
mInfo("vgId:%d stage updated from %d to %d, nodeUpdate trigger by s-task:0x%" PRIx64, pTaskEntry->nodeId,
|
mInfo("vgId:%d stage updated from %d to %d, nodeUpdate trigger by s-task:0x%" PRIx64, pTaskEntry->nodeId,
|
||||||
pTaskEntry->stage, stage, pTaskEntry->id.taskId);
|
pTaskEntry->stage, stage, pTaskEntry->id.taskId);
|
||||||
|
|
||||||
|
@ -2646,7 +2658,7 @@ static void updateStageInfo(STaskStatusEntry* pTaskEntry, int32_t stage) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndProcessStreamHb(SRpcMsg *pReq) {
|
int32_t mndProcessStreamHb(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode * pMnode = pReq->info.node;
|
||||||
SStreamHbMsg req = {0};
|
SStreamHbMsg req = {0};
|
||||||
|
|
||||||
bool checkpointFailed = false;
|
bool checkpointFailed = false;
|
||||||
|
@ -2699,15 +2711,15 @@ int32_t mndProcessStreamHb(SRpcMsg *pReq) {
|
||||||
|
|
||||||
pTaskEntry->status = p->status;
|
pTaskEntry->status = p->status;
|
||||||
if (p->status != TASK_STATUS__READY) {
|
if (p->status != TASK_STATUS__READY) {
|
||||||
mDebug("received s-task:0x%"PRIx64" not in ready status:%s", p->id.taskId, streamTaskGetStatusStr(p->status));
|
mDebug("received s-task:0x%" PRIx64 " not in ready status:%s", p->id.taskId, streamTaskGetStatusStr(p->status));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// current checkpoint is failed, rollback from the checkpoint trans
|
// current checkpoint is failed, rollback from the checkpoint trans
|
||||||
// kill the checkpoint trans and then set all tasks status to be normal
|
// kill the checkpoint trans and then set all tasks status to be normal
|
||||||
if (checkpointFailed && activeCheckpointId != 0) {
|
if (checkpointFailed && activeCheckpointId != 0) {
|
||||||
bool allReady = true;
|
bool allReady = true;
|
||||||
SArray* p = mndTakeVgroupSnapshot(pMnode, &allReady);
|
SArray *p = mndTakeVgroupSnapshot(pMnode, &allReady);
|
||||||
taosArrayDestroy(p);
|
taosArrayDestroy(p);
|
||||||
|
|
||||||
if (allReady) {
|
if (allReady) {
|
||||||
|
|
|
@ -108,6 +108,7 @@ struct SRSmaStat {
|
||||||
int64_t refId; // shared by fetch tasks
|
int64_t refId; // shared by fetch tasks
|
||||||
volatile int64_t nBufItems; // number of items in queue buffer
|
volatile int64_t nBufItems; // number of items in queue buffer
|
||||||
SRWLatch lock; // r/w lock for rsma fs(e.g. qtaskinfo)
|
SRWLatch lock; // r/w lock for rsma fs(e.g. qtaskinfo)
|
||||||
|
volatile int32_t execStat; // 0 succeed, other failed
|
||||||
volatile int32_t nFetchAll; // active number of fetch all
|
volatile int32_t nFetchAll; // active number of fetch all
|
||||||
volatile int8_t triggerStat; // shared by fetch tasks
|
volatile int8_t triggerStat; // shared by fetch tasks
|
||||||
volatile int8_t commitStat; // 0 not in committing, 1 in committing
|
volatile int8_t commitStat; // 0 not in committing, 1 in committing
|
||||||
|
@ -115,6 +116,7 @@ struct SRSmaStat {
|
||||||
SRSmaFS fs; // for recovery/snapshot r/w
|
SRSmaFS fs; // for recovery/snapshot r/w
|
||||||
SHashObj *infoHash; // key: suid, value: SRSmaInfo
|
SHashObj *infoHash; // key: suid, value: SRSmaInfo
|
||||||
tsem_t notEmpty; // has items in queue buffer
|
tsem_t notEmpty; // has items in queue buffer
|
||||||
|
SArray *blocks; // SArray<SSDataBlock>
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SSmaStat {
|
struct SSmaStat {
|
||||||
|
@ -136,13 +138,18 @@ struct SSmaStat {
|
||||||
#define RSMA_FS_LOCK(r) (&(r)->lock)
|
#define RSMA_FS_LOCK(r) (&(r)->lock)
|
||||||
|
|
||||||
struct SRSmaInfoItem {
|
struct SRSmaInfoItem {
|
||||||
int8_t level : 4;
|
int8_t level;
|
||||||
int8_t fetchLevel : 4;
|
int8_t fetchLevel;
|
||||||
int8_t triggerStat;
|
int8_t triggerStat;
|
||||||
uint16_t nScanned;
|
int32_t nScanned;
|
||||||
int32_t maxDelay; // ms
|
int32_t streamFlushed : 1;
|
||||||
tmr_h tmrId;
|
int32_t maxDelay : 31; // ms
|
||||||
void *pStreamState;
|
int64_t submitReqVer;
|
||||||
|
int64_t fetchResultVer;
|
||||||
|
tmr_h tmrId;
|
||||||
|
void *pStreamState;
|
||||||
|
void *pStreamTask; // SStreamTask
|
||||||
|
SArray *pResList;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SRSmaInfo {
|
struct SRSmaInfo {
|
||||||
|
@ -160,12 +167,10 @@ struct SRSmaInfo {
|
||||||
STaosQall *qall; // buffer qall of SubmitReq
|
STaosQall *qall; // buffer qall of SubmitReq
|
||||||
};
|
};
|
||||||
|
|
||||||
#define RSMA_INFO_HEAD_LEN offsetof(SRSmaInfo, items)
|
#define RSMA_INFO_IS_DEL(r) ((r)->delFlag == 1)
|
||||||
#define RSMA_INFO_IS_DEL(r) ((r)->delFlag == 1)
|
#define RSMA_INFO_SET_DEL(r) ((r)->delFlag = 1)
|
||||||
#define RSMA_INFO_SET_DEL(r) ((r)->delFlag = 1)
|
#define RSMA_INFO_QTASK(r, i) ((r)->taskInfo[i])
|
||||||
#define RSMA_INFO_QTASK(r, i) ((r)->taskInfo[i])
|
#define RSMA_INFO_ITEM(r, i) (&(r)->items[i])
|
||||||
#define RSMA_INFO_IQTASK(r, i) ((r)->iTaskInfo[i])
|
|
||||||
#define RSMA_INFO_ITEM(r, i) (&(r)->items[i])
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
TASK_TRIGGER_STAT_INIT = 0,
|
TASK_TRIGGER_STAT_INIT = 0,
|
||||||
|
@ -214,11 +219,11 @@ static FORCE_INLINE void tdUnRefSmaStat(SSma *pSma, SSmaStat *pStat) {
|
||||||
int32_t smaPreClose(SSma *pSma);
|
int32_t smaPreClose(SSma *pSma);
|
||||||
|
|
||||||
// rsma
|
// rsma
|
||||||
void *tdFreeRSmaInfo(SSma *pSma, SRSmaInfo *pInfo, bool isDeepFree);
|
void *tdFreeRSmaInfo(SSma *pSma, SRSmaInfo *pInfo);
|
||||||
int32_t tdRSmaRestore(SSma *pSma, int8_t type, int64_t committedVer, int8_t rollback);
|
int32_t tdRSmaRestore(SSma *pSma, int8_t type, int64_t committedVer, int8_t rollback);
|
||||||
int32_t tdRSmaProcessCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, const char *tbName);
|
int32_t tdRSmaProcessCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, const char *tbName);
|
||||||
int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type);
|
int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type);
|
||||||
// int32_t tdRSmaPersistExecImpl(SRSmaStat *pRSmaStat, SHashObj *pInfoHash);
|
int32_t tdRSmaPersistExecImpl(SRSmaStat *pRSmaStat, SHashObj *pInfoHash);
|
||||||
int32_t tdRSmaProcessRestoreImpl(SSma *pSma, int8_t type, int64_t qtaskFileVer, int8_t rollback);
|
int32_t tdRSmaProcessRestoreImpl(SSma *pSma, int8_t type, int64_t qtaskFileVer, int8_t rollback);
|
||||||
void tdRSmaQTaskInfoGetFullPath(SVnode *pVnode, tb_uid_t suid, int8_t level, STfs *pTfs, char *outputName);
|
void tdRSmaQTaskInfoGetFullPath(SVnode *pVnode, tb_uid_t suid, int8_t level, STfs *pTfs, char *outputName);
|
||||||
|
|
||||||
|
|
|
@ -209,6 +209,7 @@ int32_t tsdbBegin(STsdb* pTsdb);
|
||||||
// int32_t tsdbCommit(STsdb* pTsdb, SCommitInfo* pInfo);
|
// int32_t tsdbCommit(STsdb* pTsdb, SCommitInfo* pInfo);
|
||||||
int32_t tsdbCacheCommit(STsdb* pTsdb);
|
int32_t tsdbCacheCommit(STsdb* pTsdb);
|
||||||
int32_t tsdbCompact(STsdb* pTsdb, SCompactInfo* pInfo);
|
int32_t tsdbCompact(STsdb* pTsdb, SCompactInfo* pInfo);
|
||||||
|
int32_t tsdbRetention(STsdb *tsdb, int64_t now, int32_t sync);
|
||||||
// int32_t tsdbFinishCommit(STsdb* pTsdb);
|
// int32_t tsdbFinishCommit(STsdb* pTsdb);
|
||||||
// int32_t tsdbRollbackCommit(STsdb* pTsdb);
|
// int32_t tsdbRollbackCommit(STsdb* pTsdb);
|
||||||
int tsdbScanAndConvertSubmitMsg(STsdb* pTsdb, SSubmitReq2* pMsg);
|
int tsdbScanAndConvertSubmitMsg(STsdb* pTsdb, SSubmitReq2* pMsg);
|
||||||
|
@ -279,7 +280,7 @@ int32_t smaPrepareAsyncCommit(SSma* pSma);
|
||||||
int32_t smaCommit(SSma* pSma, SCommitInfo* pInfo);
|
int32_t smaCommit(SSma* pSma, SCommitInfo* pInfo);
|
||||||
int32_t smaFinishCommit(SSma* pSma);
|
int32_t smaFinishCommit(SSma* pSma);
|
||||||
int32_t smaPostCommit(SSma* pSma);
|
int32_t smaPostCommit(SSma* pSma);
|
||||||
int32_t smaDoRetention(SSma* pSma, int64_t now);
|
int32_t smaRetention(SSma* pSma, int64_t now);
|
||||||
|
|
||||||
int32_t tdProcessTSmaCreate(SSma* pSma, int64_t version, const char* msg);
|
int32_t tdProcessTSmaCreate(SSma* pSma, int64_t version, const char* msg);
|
||||||
int32_t tdProcessTSmaInsert(SSma* pSma, int64_t indexUid, const char* msg);
|
int32_t tdProcessTSmaInsert(SSma* pSma, int64_t indexUid, const char* msg);
|
||||||
|
|
|
@ -156,10 +156,10 @@ static int32_t tdProcessRSmaAsyncPreCommitImpl(SSma *pSma, bool isCommit) {
|
||||||
nLoops = 0;
|
nLoops = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
if (atomic_load_32(&pRSmaStat->nFetchAll) <= 0) {
|
if (atomic_load_32(&pRSmaStat->nFetchAll) <= 0) {
|
||||||
smaDebug("vgId:%d, rsma commit:%d, fetch tasks are all finished", SMA_VID(pSma), isCommit);
|
smaDebug("vgId:%d, rsma commit, type:%d, fetch tasks are all finished", SMA_VID(pSma), isCommit);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
smaDebug("vgId:%d, rsma commit%d, fetch tasks are not all finished yet", SMA_VID(pSma), isCommit);
|
smaDebug("vgId:%d, rsma commit, type:%d, fetch tasks are not all finished yet", SMA_VID(pSma), isCommit);
|
||||||
}
|
}
|
||||||
TD_SMA_LOOPS_CHECK(nLoops, 1000);
|
TD_SMA_LOOPS_CHECK(nLoops, 1000);
|
||||||
}
|
}
|
||||||
|
@ -169,22 +169,24 @@ static int32_t tdProcessRSmaAsyncPreCommitImpl(SSma *pSma, bool isCommit) {
|
||||||
* 1) This is high cost task and should not put in asyncPreCommit originally.
|
* 1) This is high cost task and should not put in asyncPreCommit originally.
|
||||||
* 2) But, if put in asyncCommit, would trigger taskInfo cloning frequently.
|
* 2) But, if put in asyncCommit, would trigger taskInfo cloning frequently.
|
||||||
*/
|
*/
|
||||||
smaInfo("vgId:%d, rsma commit:%d, wait for all items to be consumed, TID:%p", SMA_VID(pSma), isCommit,
|
smaInfo("vgId:%d, rsma commit, type:%d, wait for all items to be consumed, TID:%p", SMA_VID(pSma), isCommit,
|
||||||
(void *)taosGetSelfPthreadId());
|
(void *)taosGetSelfPthreadId());
|
||||||
nLoops = 0;
|
nLoops = 0;
|
||||||
while (atomic_load_64(&pRSmaStat->nBufItems) > 0) {
|
while (atomic_load_64(&pRSmaStat->nBufItems) > 0) {
|
||||||
TD_SMA_LOOPS_CHECK(nLoops, 1000);
|
TD_SMA_LOOPS_CHECK(nLoops, 1000);
|
||||||
}
|
}
|
||||||
|
smaInfo("vgId:%d, rsma commit, all items are consumed, TID:%p", SMA_VID(pSma), (void *)taosGetSelfPthreadId());
|
||||||
|
|
||||||
if (!isCommit) goto _exit;
|
if (!isCommit) goto _exit;
|
||||||
|
|
||||||
// code = tdRSmaPersistExecImpl(pRSmaStat, RSMA_INFO_HASH(pRSmaStat));
|
code = atomic_load_32(&pRSmaStat->execStat);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
|
code = tdRSmaPersistExecImpl(pRSmaStat, RSMA_INFO_HASH(pRSmaStat));
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
smaInfo("vgId:%d, rsma commit, operator state committed, TID:%p", SMA_VID(pSma), (void *)taosGetSelfPthreadId());
|
smaInfo("vgId:%d, rsma commit, operator state committed, TID:%p", SMA_VID(pSma), (void *)taosGetSelfPthreadId());
|
||||||
|
|
||||||
smaInfo("vgId:%d, rsma commit, all items are consumed, TID:%p", SMA_VID(pSma), (void *)taosGetSelfPthreadId());
|
|
||||||
|
|
||||||
// all rsma results are written completely
|
// all rsma results are written completely
|
||||||
STsdb *pTsdb = NULL;
|
STsdb *pTsdb = NULL;
|
||||||
if ((pTsdb = VND_RSMA1(pSma->pVnode))) {
|
if ((pTsdb = VND_RSMA1(pSma->pVnode))) {
|
||||||
|
|
|
@ -179,7 +179,7 @@ static void tRSmaInfoHashFreeNode(void *data) {
|
||||||
if ((pItem = RSMA_INFO_ITEM((SRSmaInfo *)pRSmaInfo, 1)) && pItem->level) {
|
if ((pItem = RSMA_INFO_ITEM((SRSmaInfo *)pRSmaInfo, 1)) && pItem->level) {
|
||||||
taosHashRemove(smaMgmt.refHash, &pItem, POINTER_BYTES);
|
taosHashRemove(smaMgmt.refHash, &pItem, POINTER_BYTES);
|
||||||
}
|
}
|
||||||
tdFreeRSmaInfo(pRSmaInfo->pSma, pRSmaInfo, true);
|
tdFreeRSmaInfo(pRSmaInfo->pSma, pRSmaInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,6 +209,12 @@ static int32_t tdInitSmaStat(SSmaStat **pSmaStat, int8_t smaType, const SSma *pS
|
||||||
pRSmaStat->pSma = (SSma *)pSma;
|
pRSmaStat->pSma = (SSma *)pSma;
|
||||||
atomic_store_8(RSMA_TRIGGER_STAT(pRSmaStat), TASK_TRIGGER_STAT_INIT);
|
atomic_store_8(RSMA_TRIGGER_STAT(pRSmaStat), TASK_TRIGGER_STAT_INIT);
|
||||||
tsem_init(&pRSmaStat->notEmpty, 0, 0);
|
tsem_init(&pRSmaStat->notEmpty, 0, 0);
|
||||||
|
if (!(pRSmaStat->blocks = taosArrayInit(1, sizeof(SSDataBlock)))) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
}
|
||||||
|
SSDataBlock datablock = {.info.type = STREAM_CHECKPOINT};
|
||||||
|
taosArrayPush(pRSmaStat->blocks, &datablock);
|
||||||
|
|
||||||
// init smaMgmt
|
// init smaMgmt
|
||||||
smaInit();
|
smaInit();
|
||||||
|
@ -290,6 +296,7 @@ static void tdDestroyRSmaStat(void *pRSmaStat) {
|
||||||
|
|
||||||
// step 5: free pStat
|
// step 5: free pStat
|
||||||
tsem_destroy(&(pStat->notEmpty));
|
tsem_destroy(&(pStat->notEmpty));
|
||||||
|
taosArrayDestroy(pStat->blocks);
|
||||||
taosMemoryFreeClear(pStat);
|
taosMemoryFreeClear(pStat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,12 +15,14 @@
|
||||||
|
|
||||||
#include "sma.h"
|
#include "sma.h"
|
||||||
#include "tq.h"
|
#include "tq.h"
|
||||||
|
#include "tstream.h"
|
||||||
|
|
||||||
#define RSMA_QTASKEXEC_SMOOTH_SIZE (100) // cnt
|
#define RSMA_QTASKEXEC_SMOOTH_SIZE (100) // cnt
|
||||||
#define RSMA_SUBMIT_BATCH_SIZE (1024) // cnt
|
#define RSMA_SUBMIT_BATCH_SIZE (1024) // cnt
|
||||||
#define RSMA_FETCH_DELAY_MAX (120000) // ms
|
#define RSMA_FETCH_DELAY_MAX (120000) // ms
|
||||||
#define RSMA_FETCH_ACTIVE_MAX (1000) // ms
|
#define RSMA_FETCH_ACTIVE_MAX (1000) // ms
|
||||||
#define RSMA_FETCH_INTERVAL (5000) // ms
|
#define RSMA_FETCH_INTERVAL (5000) // ms
|
||||||
|
#define RSMA_TASK_FLAG "rsma"
|
||||||
|
|
||||||
#define RSMA_NEED_FETCH(r) (RSMA_INFO_ITEM((r), 0)->fetchLevel || RSMA_INFO_ITEM((r), 1)->fetchLevel)
|
#define RSMA_NEED_FETCH(r) (RSMA_INFO_ITEM((r), 0)->fetchLevel || RSMA_INFO_ITEM((r), 1)->fetchLevel)
|
||||||
|
|
||||||
|
@ -42,8 +44,8 @@ static SRSmaInfo *tdAcquireRSmaInfoBySuid(SSma *pSma, int64_t suid);
|
||||||
static void tdReleaseRSmaInfo(SSma *pSma, SRSmaInfo *pInfo);
|
static void tdReleaseRSmaInfo(SSma *pSma, SRSmaInfo *pInfo);
|
||||||
static void tdFreeRSmaSubmitItems(SArray *pItems);
|
static void tdFreeRSmaSubmitItems(SArray *pItems);
|
||||||
static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo);
|
static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo);
|
||||||
static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSmaInfoItem *pItem, STSchema *pTSchema,
|
static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSmaInfoItem *pItem, SRSmaInfo *pInfo,
|
||||||
int64_t suid);
|
int32_t execType, int8_t *streamFlushed);
|
||||||
static void tdRSmaFetchTrigger(void *param, void *tmrId);
|
static void tdRSmaFetchTrigger(void *param, void *tmrId);
|
||||||
static void tdRSmaQTaskInfoFree(qTaskInfo_t *taskHandle, int32_t vgId, int32_t level);
|
static void tdRSmaQTaskInfoFree(qTaskInfo_t *taskHandle, int32_t vgId, int32_t level);
|
||||||
static int32_t tdRSmaRestoreQTaskInfoInit(SSma *pSma, int64_t *nTables);
|
static int32_t tdRSmaRestoreQTaskInfoInit(SSma *pSma, int64_t *nTables);
|
||||||
|
@ -72,41 +74,39 @@ static void tdRSmaQTaskInfoFree(qTaskInfo_t *taskHandle, int32_t vgId, int32_t l
|
||||||
*
|
*
|
||||||
* @param pSma
|
* @param pSma
|
||||||
* @param pInfo
|
* @param pInfo
|
||||||
* @param isDeepFree Only stop tmrId and free pTSchema for deep free
|
|
||||||
* @return void*
|
* @return void*
|
||||||
*/
|
*/
|
||||||
void *tdFreeRSmaInfo(SSma *pSma, SRSmaInfo *pInfo, bool isDeepFree) {
|
void *tdFreeRSmaInfo(SSma *pSma, SRSmaInfo *pInfo) {
|
||||||
if (pInfo) {
|
if (pInfo) {
|
||||||
for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) {
|
for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) {
|
||||||
SRSmaInfoItem *pItem = &pInfo->items[i];
|
SRSmaInfoItem *pItem = &pInfo->items[i];
|
||||||
|
|
||||||
if (isDeepFree && pItem->tmrId) {
|
if (pItem->tmrId) {
|
||||||
smaDebug("vgId:%d, stop fetch timer %p for table %" PRIi64 " level %d", SMA_VID(pSma), pItem->tmrId,
|
smaDebug("vgId:%d, stop fetch timer %p for table %" PRIi64 " level %d", SMA_VID(pSma), pItem->tmrId,
|
||||||
pInfo->suid, i + 1);
|
pInfo->suid, i + 1);
|
||||||
taosTmrStopA(&pItem->tmrId);
|
taosTmrStopA(&pItem->tmrId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isDeepFree && pItem->pStreamState) {
|
if (pItem->pStreamState) {
|
||||||
streamStateClose(pItem->pStreamState, false);
|
streamStateClose(pItem->pStreamState, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isDeepFree && pInfo->taskInfo[i]) {
|
if (pItem->pStreamTask) {
|
||||||
tdRSmaQTaskInfoFree(&pInfo->taskInfo[i], SMA_VID(pSma), i + 1);
|
tFreeStreamTask(pItem->pStreamTask);
|
||||||
}
|
}
|
||||||
}
|
taosArrayDestroy(pItem->pResList);
|
||||||
if (isDeepFree) {
|
tdRSmaQTaskInfoFree(&pInfo->taskInfo[i], SMA_VID(pSma), i + 1);
|
||||||
taosMemoryFreeClear(pInfo->pTSchema);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isDeepFree) {
|
taosMemoryFreeClear(pInfo->pTSchema);
|
||||||
if (pInfo->queue) {
|
|
||||||
taosCloseQueue(pInfo->queue);
|
if (pInfo->queue) {
|
||||||
pInfo->queue = NULL;
|
taosCloseQueue(pInfo->queue);
|
||||||
}
|
pInfo->queue = NULL;
|
||||||
if (pInfo->qall) {
|
}
|
||||||
taosFreeQall(pInfo->qall);
|
if (pInfo->qall) {
|
||||||
pInfo->qall = NULL;
|
taosFreeQall(pInfo->qall);
|
||||||
}
|
pInfo->qall = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(pInfo);
|
taosMemoryFree(pInfo);
|
||||||
|
@ -135,7 +135,9 @@ static int32_t tdUpdateTbUidListImpl(SSma *pSma, tb_uid_t *suid, SArray *tbUids,
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!taosArrayGetSize(tbUids)) {
|
int32_t nTables = taosArrayGetSize(tbUids);
|
||||||
|
|
||||||
|
if (0 == nTables) {
|
||||||
smaDebug("vgId:%d, no need to update tbUidList for suid:%" PRIi64 " since Empty tbUids", SMA_VID(pSma), *suid);
|
smaDebug("vgId:%d, no need to update tbUidList for suid:%" PRIi64 " since Empty tbUids", SMA_VID(pSma), *suid);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -156,8 +158,9 @@ static int32_t tdUpdateTbUidListImpl(SSma *pSma, tb_uid_t *suid, SArray *tbUids,
|
||||||
terrstr());
|
terrstr());
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
smaDebug("vgId:%d, update tbUidList succeed for qTaskInfo:%p with suid:%" PRIi64 " uid:%" PRIi64 " level %d",
|
smaDebug("vgId:%d, update tbUidList succeed for qTaskInfo:%p. suid:%" PRIi64 " uid:%" PRIi64
|
||||||
SMA_VID(pSma), pRSmaInfo->taskInfo[i], *suid, *(int64_t *)taosArrayGet(tbUids, 0), i);
|
"nTables:%d level %d",
|
||||||
|
SMA_VID(pSma), pRSmaInfo->taskInfo[i], *suid, *(int64_t *)TARRAY_GET_ELEM(tbUids, 0), nTables, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,8 +177,8 @@ int32_t tdUpdateTbUidList(SSma *pSma, STbUidStore *pStore, bool isAdd) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *pIter = taosHashIterate(pStore->uidHash, NULL);
|
void *pIter = NULL;
|
||||||
while (pIter) {
|
while ((pIter = taosHashIterate(pStore->uidHash, pIter))) {
|
||||||
tb_uid_t *pTbSuid = (tb_uid_t *)taosHashGetKey(pIter, NULL);
|
tb_uid_t *pTbSuid = (tb_uid_t *)taosHashGetKey(pIter, NULL);
|
||||||
SArray *pTbUids = *(SArray **)pIter;
|
SArray *pTbUids = *(SArray **)pIter;
|
||||||
|
|
||||||
|
@ -183,8 +186,6 @@ int32_t tdUpdateTbUidList(SSma *pSma, STbUidStore *pStore, bool isAdd) {
|
||||||
taosHashCancelIterate(pStore->uidHash, pIter);
|
taosHashCancelIterate(pStore->uidHash, pIter);
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
pIter = taosHashIterate(pStore->uidHash, pIter);
|
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -232,14 +233,37 @@ int32_t tdFetchTbUidList(SSma *pSma, STbUidStore **ppStore, tb_uid_t suid, tb_ui
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tdRSmaTaskInit(SStreamMeta *pMeta, SRSmaInfoItem *pItem, SStreamTaskId *pId) {
|
||||||
|
STaskId id = {.streamId = pId->streamId, .taskId = pId->taskId};
|
||||||
|
taosRLockLatch(&pMeta->lock);
|
||||||
|
SStreamTask **ppTask = (SStreamTask **)taosHashGet(pMeta->pTasksMap, &id, sizeof(id));
|
||||||
|
if (ppTask && *ppTask) {
|
||||||
|
pItem->submitReqVer = (*ppTask)->chkInfo.checkpointVer;
|
||||||
|
pItem->fetchResultVer = (*ppTask)->info.triggerParam;
|
||||||
|
}
|
||||||
|
taosRUnLockLatch(&pMeta->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tdRSmaTaskRemove(SStreamMeta *pMeta, int64_t streamId, int32_t taskId) {
|
||||||
|
streamMetaUnregisterTask(pMeta, streamId, taskId);
|
||||||
|
taosWLockLatch(&pMeta->lock);
|
||||||
|
int32_t numOfTasks = streamMetaGetNumOfTasks(pMeta);
|
||||||
|
if (streamMetaCommit(pMeta) < 0) {
|
||||||
|
// persist to disk
|
||||||
|
}
|
||||||
|
taosWUnLockLatch(&pMeta->lock);
|
||||||
|
smaDebug("vgId:%d, rsma task:%" PRIi64 ",%d dropped, remain tasks:%d", pMeta->vgId, streamId, taskId, numOfTasks);
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat *pStat, SRSmaInfo *pRSmaInfo,
|
static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat *pStat, SRSmaInfo *pRSmaInfo,
|
||||||
int8_t idx) {
|
int8_t idx) {
|
||||||
if ((param->qmsgLen > 0) && param->qmsg[idx]) {
|
if ((param->qmsgLen > 0) && param->qmsg[idx]) {
|
||||||
SRetention *pRetention = SMA_RETENTION(pSma);
|
SRSmaInfoItem *pItem = &(pRSmaInfo->items[idx]);
|
||||||
STsdbCfg *pTsdbCfg = SMA_TSDB_CFG(pSma);
|
SRetention *pRetention = SMA_RETENTION(pSma);
|
||||||
SVnode *pVnode = pSma->pVnode;
|
STsdbCfg *pTsdbCfg = SMA_TSDB_CFG(pSma);
|
||||||
char taskInfDir[TSDB_FILENAME_LEN] = {0};
|
SVnode *pVnode = pSma->pVnode;
|
||||||
void *pStreamState = NULL;
|
char taskInfDir[TSDB_FILENAME_LEN] = {0};
|
||||||
|
void *pStreamState = NULL;
|
||||||
|
|
||||||
// set the backend of stream state
|
// set the backend of stream state
|
||||||
tdRSmaQTaskInfoGetFullPath(pVnode, pRSmaInfo->suid, idx + 1, pVnode->pTfs, taskInfDir);
|
tdRSmaQTaskInfoGetFullPath(pVnode, pRSmaInfo->suid, idx + 1, pVnode->pTfs, taskInfDir);
|
||||||
|
@ -254,25 +278,46 @@ static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat
|
||||||
taosMemoryFree(s);
|
taosMemoryFree(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamTask task = {.id.taskId = 0, .id.streamId = 0}; // TODO: assign value
|
SStreamTask *pStreamTask = taosMemoryCalloc(1, sizeof(*pStreamTask));
|
||||||
task.pMeta = pVnode->pTq->pStreamMeta;
|
if (!pStreamTask) {
|
||||||
pStreamState = streamStateOpen(taskInfDir, &task, true, -1, -1);
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
pItem->pStreamTask = pStreamTask;
|
||||||
|
pStreamTask->id.taskId = 0;
|
||||||
|
pStreamTask->id.streamId = pRSmaInfo->suid + idx;
|
||||||
|
pStreamTask->chkInfo.startTs = taosGetTimestampMs();
|
||||||
|
pStreamTask->pMeta = pVnode->pTq->pStreamMeta;
|
||||||
|
pStreamTask->exec.qmsg = taosMemoryMalloc(strlen(RSMA_TASK_FLAG) + 1);
|
||||||
|
sprintf(pStreamTask->exec.qmsg, "%s", RSMA_TASK_FLAG);
|
||||||
|
pStreamTask->chkInfo.checkpointId = streamMetaGetLatestCheckpointId(pStreamTask->pMeta);
|
||||||
|
tdRSmaTaskInit(pStreamTask->pMeta, pItem, &pStreamTask->id);
|
||||||
|
pStreamState = streamStateOpen(taskInfDir, pStreamTask, true, -1, -1);
|
||||||
if (!pStreamState) {
|
if (!pStreamState) {
|
||||||
terrno = TSDB_CODE_RSMA_STREAM_STATE_OPEN;
|
terrno = TSDB_CODE_RSMA_STREAM_STATE_OPEN;
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
pItem->pStreamState = pStreamState;
|
||||||
|
|
||||||
SReadHandle handle = {.vnode = pVnode, .initTqReader = 1, .pStateBackend = pStreamState};
|
tdRSmaTaskRemove(pStreamTask->pMeta, pStreamTask->id.streamId, pStreamTask->id.taskId);
|
||||||
|
|
||||||
|
SReadHandle handle = {.vnode = pVnode, .initTqReader = 1, .skipRollup = 1, .pStateBackend = pStreamState};
|
||||||
initStorageAPI(&handle.api);
|
initStorageAPI(&handle.api);
|
||||||
|
|
||||||
pRSmaInfo->taskInfo[idx] = qCreateStreamExecTaskInfo(param->qmsg[idx], &handle, TD_VID(pVnode), 0);
|
pRSmaInfo->taskInfo[idx] = qCreateStreamExecTaskInfo(param->qmsg[idx], &handle, TD_VID(pVnode), 0);
|
||||||
if (!pRSmaInfo->taskInfo[idx]) {
|
if (!pRSmaInfo->taskInfo[idx]) {
|
||||||
terrno = TSDB_CODE_RSMA_QTASKINFO_CREATE;
|
terrno = TSDB_CODE_RSMA_QTASKINFO_CREATE;
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
SRSmaInfoItem *pItem = &(pRSmaInfo->items[idx]);
|
|
||||||
pItem->triggerStat = TASK_TRIGGER_STAT_ACTIVE; // fetch the data when reboot
|
if (!(pItem->pResList = taosArrayInit(1, POINTER_BYTES))) {
|
||||||
pItem->pStreamState = pStreamState;
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pItem->fetchResultVer < pItem->submitReqVer) {
|
||||||
|
// fetch the data when reboot
|
||||||
|
pItem->triggerStat = TASK_TRIGGER_STAT_ACTIVE;
|
||||||
|
}
|
||||||
|
|
||||||
if (param->maxdelay[idx] < TSDB_MIN_ROLLUP_MAX_DELAY) {
|
if (param->maxdelay[idx] < TSDB_MIN_ROLLUP_MAX_DELAY) {
|
||||||
int64_t msInterval =
|
int64_t msInterval =
|
||||||
convertTimeFromPrecisionToUnit(pRetention[idx + 1].freq, pTsdbCfg->precision, TIME_UNIT_MILLISECOND);
|
convertTimeFromPrecisionToUnit(pRetention[idx + 1].freq, pTsdbCfg->precision, TIME_UNIT_MILLISECOND);
|
||||||
|
@ -291,10 +336,11 @@ static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat
|
||||||
|
|
||||||
taosTmrReset(tdRSmaFetchTrigger, RSMA_FETCH_INTERVAL, pItem, smaMgmt.tmrHandle, &pItem->tmrId);
|
taosTmrReset(tdRSmaFetchTrigger, RSMA_FETCH_INTERVAL, pItem, smaMgmt.tmrHandle, &pItem->tmrId);
|
||||||
|
|
||||||
smaInfo("vgId:%d, item:%p table:%" PRIi64 " level:%" PRIi8 " maxdelay:%" PRIi64 " watermark:%" PRIi64
|
smaInfo("vgId:%d, open rsma task:%p table:%" PRIi64 " level:%" PRIi8 ", checkpointId:%" PRIi64
|
||||||
|
", submitReqVer:%" PRIi64 ", fetchResultVer:%" PRIi64 ", maxdelay:%" PRIi64 " watermark:%" PRIi64
|
||||||
", finally maxdelay:%" PRIi32,
|
", finally maxdelay:%" PRIi32,
|
||||||
TD_VID(pVnode), pItem, pRSmaInfo->suid, (int8_t)(idx + 1), param->maxdelay[idx], param->watermark[idx],
|
TD_VID(pVnode), pItem->pStreamTask, pRSmaInfo->suid, (int8_t)(idx + 1), pStreamTask->chkInfo.checkpointId,
|
||||||
pItem->maxDelay);
|
pItem->submitReqVer, pItem->fetchResultVer, param->maxdelay[idx], param->watermark[idx], pItem->maxDelay);
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -362,7 +408,7 @@ int32_t tdRSmaProcessCreateImpl(SSma *pSma, SRSmaParam *param, int64_t suid, con
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
_err:
|
_err:
|
||||||
tdFreeRSmaInfo(pSma, pRSmaInfo, true);
|
tdFreeRSmaInfo(pSma, pRSmaInfo);
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -498,11 +544,10 @@ static void tdUidStoreDestory(STbUidStore *pStore) {
|
||||||
if (pStore->uidHash) {
|
if (pStore->uidHash) {
|
||||||
if (pStore->tbUids) {
|
if (pStore->tbUids) {
|
||||||
// When pStore->tbUids not NULL, the pStore->uidHash has k/v; otherwise pStore->uidHash only has keys.
|
// When pStore->tbUids not NULL, the pStore->uidHash has k/v; otherwise pStore->uidHash only has keys.
|
||||||
void *pIter = taosHashIterate(pStore->uidHash, NULL);
|
void *pIter = NULL;
|
||||||
while (pIter) {
|
while ((pIter = taosHashIterate(pStore->uidHash, pIter))) {
|
||||||
SArray *arr = *(SArray **)pIter;
|
SArray *arr = *(SArray **)pIter;
|
||||||
taosArrayDestroy(arr);
|
taosArrayDestroy(arr);
|
||||||
pIter = taosHashIterate(pStore->uidHash, pIter);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
taosHashCleanup(pStore->uidHash);
|
taosHashCleanup(pStore->uidHash);
|
||||||
|
@ -562,7 +607,7 @@ static int32_t tdFetchSubmitReqSuids(SSubmitReq2 *pMsg, STbUidStore *pStore) {
|
||||||
* @param now
|
* @param now
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
int32_t smaDoRetention(SSma *pSma, int64_t now) {
|
int32_t smaRetention(SSma *pSma, int64_t now) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (!VND_IS_RSMA(pSma->pVnode)) {
|
if (!VND_IS_RSMA(pSma->pVnode)) {
|
||||||
return code;
|
return code;
|
||||||
|
@ -570,8 +615,8 @@ int32_t smaDoRetention(SSma *pSma, int64_t now) {
|
||||||
|
|
||||||
for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) {
|
for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) {
|
||||||
if (pSma->pRSmaTsdb[i]) {
|
if (pSma->pRSmaTsdb[i]) {
|
||||||
// code = tsdbDoRetention(pSma->pRSmaTsdb[i], now);
|
code = tsdbRetention(pSma->pRSmaTsdb[i], now, pSma->pVnode->config.sttTrigger == 1);
|
||||||
// if (code) goto _end;
|
if (code) goto _end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -579,17 +624,14 @@ _end:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSmaInfoItem *pItem, STSchema *pTSchema,
|
static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSmaInfoItem *pItem, SRSmaInfo *pInfo,
|
||||||
int64_t suid) {
|
int32_t execType, int8_t *streamFlushed) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int32_t lino = 0;
|
int32_t lino = 0;
|
||||||
SSDataBlock *output = NULL;
|
SSDataBlock *output = NULL;
|
||||||
|
SArray *pResList = pItem->pResList;
|
||||||
SArray *pResList = taosArrayInit(1, POINTER_BYTES);
|
STSchema *pTSchema = pInfo->pTSchema;
|
||||||
if (pResList == NULL) {
|
int64_t suid = pInfo->suid;
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
uint64_t ts;
|
uint64_t ts;
|
||||||
|
@ -604,32 +646,46 @@ static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSma
|
||||||
if (taosArrayGetSize(pResList) == 0) {
|
if (taosArrayGetSize(pResList) == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
char flag[10] = {0};
|
|
||||||
snprintf(flag, 10, "level %" PRIi8, pItem->level);
|
|
||||||
blockDebugShowDataBlocks(pResList, flag);
|
|
||||||
#endif
|
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pResList); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(pResList); ++i) {
|
||||||
output = taosArrayGetP(pResList, i);
|
output = taosArrayGetP(pResList, i);
|
||||||
|
if (output->info.type == STREAM_CHECKPOINT) {
|
||||||
|
if (streamFlushed) *streamFlushed = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
smaDebug("vgId:%d, result block, uid:%" PRIu64 ", groupid:%" PRIu64 ", rows:%" PRIi64, SMA_VID(pSma),
|
smaDebug("vgId:%d, result block, uid:%" PRIu64 ", groupid:%" PRIu64 ", rows:%" PRIi64, SMA_VID(pSma),
|
||||||
output->info.id.uid, output->info.id.groupId, output->info.rows);
|
output->info.id.uid, output->info.id.groupId, output->info.rows);
|
||||||
|
|
||||||
STsdb *sinkTsdb = (pItem->level == TSDB_RETENTION_L1 ? pSma->pRSmaTsdb[0] : pSma->pRSmaTsdb[1]);
|
STsdb *sinkTsdb = (pItem->level == TSDB_RETENTION_L1 ? pSma->pRSmaTsdb[0] : pSma->pRSmaTsdb[1]);
|
||||||
SSubmitReq2 *pReq = NULL;
|
SSubmitReq2 *pReq = NULL;
|
||||||
|
|
||||||
// TODO: the schema update should be handled later(TD-17965)
|
|
||||||
if (buildSubmitReqFromDataBlock(&pReq, output, pTSchema, output->info.id.groupId, SMA_VID(pSma), suid) < 0) {
|
if (buildSubmitReqFromDataBlock(&pReq, output, pTSchema, output->info.id.groupId, SMA_VID(pSma), suid) < 0) {
|
||||||
code = terrno ? terrno : TSDB_CODE_RSMA_RESULT;
|
code = terrno ? terrno : TSDB_CODE_RSMA_RESULT;
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reset the output version to handle reboot
|
||||||
|
if (STREAM_GET_ALL == execType && output->info.version == 0) {
|
||||||
|
// the submitReqVer keeps unchanged since tdExecuteRSmaImpl and tdRSmaFetchAllResult are executed synchronously
|
||||||
|
output->info.version = pItem->submitReqVer;
|
||||||
|
}
|
||||||
|
|
||||||
if (pReq && tdProcessSubmitReq(sinkTsdb, output->info.version, pReq) < 0) {
|
if (pReq && tdProcessSubmitReq(sinkTsdb, output->info.version, pReq) < 0) {
|
||||||
code = terrno ? terrno : TSDB_CODE_RSMA_RESULT;
|
if (terrno == TSDB_CODE_TDB_TIMESTAMP_OUT_OF_RANGE) {
|
||||||
|
// TODO: reconfigure SSubmitReq2
|
||||||
|
} else {
|
||||||
|
if (terrno == 0) terrno = TSDB_CODE_RSMA_RESULT;
|
||||||
|
code = terrno;
|
||||||
|
}
|
||||||
tDestroySubmitReq(pReq, TSDB_MSG_FLG_ENCODE);
|
tDestroySubmitReq(pReq, TSDB_MSG_FLG_ENCODE);
|
||||||
taosMemoryFree(pReq);
|
taosMemoryFree(pReq);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (STREAM_GET_ALL == execType) {
|
||||||
|
atomic_store_64(&pItem->fetchResultVer, output->info.version);
|
||||||
|
}
|
||||||
|
|
||||||
smaDebug("vgId:%d, process submit req for rsma suid:%" PRIu64 ",uid:%" PRIu64 ", level %" PRIi8 " ver %" PRIi64,
|
smaDebug("vgId:%d, process submit req for rsma suid:%" PRIu64 ",uid:%" PRIu64 ", level %" PRIi8 " ver %" PRIi64,
|
||||||
SMA_VID(pSma), suid, output->info.id.groupId, pItem->level, output->info.version);
|
SMA_VID(pSma), suid, output->info.id.groupId, pItem->level, output->info.version);
|
||||||
|
|
||||||
|
@ -648,7 +704,6 @@ _exit:
|
||||||
} else {
|
} else {
|
||||||
smaDebug("vgId:%d, %s succeed, suid:%" PRIi64 ", level:%" PRIi8, SMA_VID(pSma), __func__, suid, pItem->level);
|
smaDebug("vgId:%d, %s succeed, suid:%" PRIi64 ", level:%" PRIi8, SMA_VID(pSma), __func__, suid, pItem->level);
|
||||||
}
|
}
|
||||||
taosArrayDestroy(pResList);
|
|
||||||
qCleanExecTaskBlockBuf(taskInfo);
|
qCleanExecTaskBlockBuf(taskInfo);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -743,8 +798,9 @@ static int32_t tdRsmaPrintSubmitReq(SSma *pSma, SSubmitReq *pReq) {
|
||||||
*/
|
*/
|
||||||
static int32_t tdExecuteRSmaImpl(SSma *pSma, const void *pMsg, int32_t msgSize, int32_t inputType, SRSmaInfo *pInfo,
|
static int32_t tdExecuteRSmaImpl(SSma *pSma, const void *pMsg, int32_t msgSize, int32_t inputType, SRSmaInfo *pInfo,
|
||||||
ERsmaExecType type, int8_t level) {
|
ERsmaExecType type, int8_t level) {
|
||||||
int32_t idx = level - 1;
|
int32_t idx = level - 1;
|
||||||
void *qTaskInfo = RSMA_INFO_QTASK(pInfo, idx);
|
void *qTaskInfo = RSMA_INFO_QTASK(pInfo, idx);
|
||||||
|
SRSmaInfoItem *pItem = RSMA_INFO_ITEM(pInfo, idx);
|
||||||
|
|
||||||
if (!qTaskInfo) {
|
if (!qTaskInfo) {
|
||||||
smaDebug("vgId:%d, no qTaskInfo to execute rsma %" PRIi8 " task for suid:%" PRIu64, SMA_VID(pSma), level,
|
smaDebug("vgId:%d, no qTaskInfo to execute rsma %" PRIi8 " task for suid:%" PRIu64, SMA_VID(pSma), level,
|
||||||
|
@ -772,10 +828,14 @@ static int32_t tdExecuteRSmaImpl(SSma *pSma, const void *pMsg, int32_t msgSize,
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRSmaInfoItem *pItem = RSMA_INFO_ITEM(pInfo, idx);
|
if (STREAM_INPUT__MERGED_SUBMIT == inputType) {
|
||||||
tdRSmaExecAndSubmitResult(pSma, qTaskInfo, pItem, pInfo->pTSchema, pInfo->suid);
|
SPackedData *packData = POINTER_SHIFT(pMsg, sizeof(SPackedData) * (msgSize - 1));
|
||||||
|
atomic_store_64(&pItem->submitReqVer, packData->ver);
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
terrno = tdRSmaExecAndSubmitResult(pSma, qTaskInfo, pItem, pInfo, STREAM_NORMAL, NULL);
|
||||||
|
|
||||||
|
return terrno ? TSDB_CODE_FAILED : TDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -881,7 +941,12 @@ int32_t tdProcessRSmaSubmit(SSma *pSma, int64_t version, void *pReq, void *pMsg,
|
||||||
SSmaEnv *pEnv = SMA_RSMA_ENV(pSma);
|
SSmaEnv *pEnv = SMA_RSMA_ENV(pSma);
|
||||||
if (!pEnv) {
|
if (!pEnv) {
|
||||||
// only applicable when rsma env exists
|
// only applicable when rsma env exists
|
||||||
return TSDB_CODE_SUCCESS;
|
return TDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((terrno = atomic_load_32(&SMA_RSMA_STAT(pSma)->execStat))) {
|
||||||
|
smaError("vgId:%d, failed to process rsma submit since invalid exec code: %s", SMA_VID(pSma), terrstr());
|
||||||
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
STbUidStore uidStore = {0};
|
STbUidStore uidStore = {0};
|
||||||
|
@ -913,7 +978,7 @@ int32_t tdProcessRSmaSubmit(SSma *pSma, int64_t version, void *pReq, void *pMsg,
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
_err:
|
_err:
|
||||||
tdUidStoreDestory(&uidStore);
|
tdUidStoreDestory(&uidStore);
|
||||||
return TSDB_CODE_FAILED;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -988,7 +1053,7 @@ static int32_t tdRSmaRestoreQTaskInfoInit(SSma *pSma, int64_t *nTables) {
|
||||||
code = terrno;
|
code = terrno;
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
// reload all ctbUids for suid
|
// reload all ctbUids for suid
|
||||||
uidStore.suid = suid;
|
uidStore.suid = suid;
|
||||||
if (vnodeGetCtbIdList(pVnode, suid, uidStore.tbUids) < 0) {
|
if (vnodeGetCtbIdList(pVnode, suid, uidStore.tbUids) < 0) {
|
||||||
|
@ -1002,7 +1067,7 @@ static int32_t tdRSmaRestoreQTaskInfoInit(SSma *pSma, int64_t *nTables) {
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayClear(uidStore.tbUids);
|
taosArrayClear(uidStore.tbUids);
|
||||||
|
#endif
|
||||||
smaDebug("vgId:%d, rsma restore env success for %" PRIi64, TD_VID(pVnode), suid);
|
smaDebug("vgId:%d, rsma restore env success for %" PRIi64, TD_VID(pVnode), suid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1050,39 +1115,141 @@ _err:
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
int32_t tdRSmaPersistExecImpl(SRSmaStat *pRSmaStat, SHashObj *pInfoHash) {
|
int32_t tdRSmaPersistExecImpl(SRSmaStat *pRSmaStat, SHashObj *pInfoHash) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int32_t lino = 0;
|
int32_t lino = 0;
|
||||||
|
int32_t nTaskInfo = 0;
|
||||||
SSma *pSma = pRSmaStat->pSma;
|
SSma *pSma = pRSmaStat->pSma;
|
||||||
SVnode *pVnode = pSma->pVnode;
|
SVnode *pVnode = pSma->pVnode;
|
||||||
SRSmaFS fs = {0};
|
|
||||||
|
|
||||||
if (taosHashGetSize(pInfoHash) <= 0) {
|
if (taosHashGetSize(pInfoHash) <= 0) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *infoHash = NULL;
|
// stream state: trigger checkpoint
|
||||||
while ((infoHash = taosHashIterate(pInfoHash, infoHash))) {
|
do {
|
||||||
SRSmaInfo *pRSmaInfo = *(SRSmaInfo **)infoHash;
|
void *infoHash = NULL;
|
||||||
|
while ((infoHash = taosHashIterate(pInfoHash, infoHash))) {
|
||||||
if (RSMA_INFO_IS_DEL(pRSmaInfo)) {
|
SRSmaInfo *pRSmaInfo = *(SRSmaInfo **)infoHash;
|
||||||
continue;
|
if (RSMA_INFO_IS_DEL(pRSmaInfo)) {
|
||||||
}
|
continue;
|
||||||
|
}
|
||||||
for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) {
|
for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) {
|
||||||
SRSmaInfoItem *pItem = RSMA_INFO_ITEM(pRSmaInfo, i);
|
if (pRSmaInfo->taskInfo[i]) {
|
||||||
if (pItem && pItem->pStreamState) {
|
code = qSetSMAInput(pRSmaInfo->taskInfo[i], pRSmaStat->blocks, 1, STREAM_INPUT__CHECKPOINT);
|
||||||
if (streamStateCommit(pItem->pStreamState) < 0) {
|
if (code) {
|
||||||
code = TSDB_CODE_RSMA_STREAM_STATE_COMMIT;
|
taosHashCancelIterate(pInfoHash, infoHash);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
}
|
||||||
|
pRSmaInfo->items[i].streamFlushed = 0;
|
||||||
|
++nTaskInfo;
|
||||||
}
|
}
|
||||||
smaDebug("vgId:%d, rsma persist, stream state commit success, table %" PRIi64 ", level %d", TD_VID(pVnode),
|
|
||||||
pRSmaInfo->suid, i + 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} while (0);
|
||||||
|
|
||||||
|
// stream state: wait checkpoint ready in async mode
|
||||||
|
do {
|
||||||
|
int32_t nStreamFlushed = 0;
|
||||||
|
int32_t nSleep = 0;
|
||||||
|
void *infoHash = NULL;
|
||||||
|
while (true) {
|
||||||
|
while ((infoHash = taosHashIterate(pInfoHash, infoHash))) {
|
||||||
|
SRSmaInfo *pRSmaInfo = *(SRSmaInfo **)infoHash;
|
||||||
|
if (RSMA_INFO_IS_DEL(pRSmaInfo)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) {
|
||||||
|
if (pRSmaInfo->taskInfo[i] && (0 == pRSmaInfo->items[i].streamFlushed)) {
|
||||||
|
int8_t streamFlushed = 0;
|
||||||
|
code = tdRSmaExecAndSubmitResult(pSma, pRSmaInfo->taskInfo[i], &pRSmaInfo->items[i], pRSmaInfo,
|
||||||
|
STREAM_CHECKPOINT, &streamFlushed);
|
||||||
|
if (code) {
|
||||||
|
taosHashCancelIterate(pInfoHash, infoHash);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (streamFlushed) {
|
||||||
|
pRSmaInfo->items[i].streamFlushed = 1;
|
||||||
|
if (++nStreamFlushed >= nTaskInfo) {
|
||||||
|
smaInfo("vgId:%d, rsma commit, checkpoint ready, %d us consumed, received/total: %d/%d", TD_VID(pVnode),
|
||||||
|
nSleep * 10, nStreamFlushed, nTaskInfo);
|
||||||
|
taosHashCancelIterate(pInfoHash, infoHash);
|
||||||
|
goto _checkpoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taosUsleep(10);
|
||||||
|
++nSleep;
|
||||||
|
smaDebug("vgId:%d, rsma commit, wait for checkpoint ready, %d us elapsed, received/total: %d/%d", TD_VID(pVnode),
|
||||||
|
nSleep * 10, nStreamFlushed, nTaskInfo);
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
_checkpoint:
|
||||||
|
// stream state: build checkpoint in backend
|
||||||
|
do {
|
||||||
|
SStreamMeta *pMeta = NULL;
|
||||||
|
int64_t checkpointId = taosGetTimestampNs();
|
||||||
|
bool checkpointBuilt = false;
|
||||||
|
void *infoHash = NULL;
|
||||||
|
while ((infoHash = taosHashIterate(pInfoHash, infoHash))) {
|
||||||
|
SRSmaInfo *pRSmaInfo = *(SRSmaInfo **)infoHash;
|
||||||
|
if (RSMA_INFO_IS_DEL(pRSmaInfo)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) {
|
||||||
|
SRSmaInfoItem *pItem = RSMA_INFO_ITEM(pRSmaInfo, i);
|
||||||
|
if (pItem && pItem->pStreamTask) {
|
||||||
|
SStreamTask *pTask = pItem->pStreamTask;
|
||||||
|
atomic_store_32(&pTask->pMeta->chkptNotReadyTasks, 1);
|
||||||
|
pTask->checkpointingId = checkpointId;
|
||||||
|
pTask->chkInfo.checkpointId = pTask->checkpointingId;
|
||||||
|
pTask->chkInfo.checkpointVer = pItem->submitReqVer;
|
||||||
|
pTask->info.triggerParam = pItem->fetchResultVer;
|
||||||
|
|
||||||
|
if (!checkpointBuilt) {
|
||||||
|
// the stream states share one checkpoint
|
||||||
|
code = streamTaskBuildCheckpoint(pTask);
|
||||||
|
if (code) {
|
||||||
|
taosHashCancelIterate(pInfoHash, infoHash);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
}
|
||||||
|
pMeta = pTask->pMeta;
|
||||||
|
checkpointBuilt = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosWLockLatch(&pMeta->lock);
|
||||||
|
if (streamMetaSaveTask(pMeta, pTask)) {
|
||||||
|
taosWUnLockLatch(&pMeta->lock);
|
||||||
|
code = terrno ? terrno : TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
taosHashCancelIterate(pInfoHash, infoHash);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
}
|
||||||
|
taosWUnLockLatch(&pMeta->lock);
|
||||||
|
smaDebug("vgId:%d, rsma commit, succeed to commit task:%p, submitReqVer:%" PRIi64 ", fetchResultVer:%" PRIi64
|
||||||
|
", table:%" PRIi64 ", level:%d",
|
||||||
|
TD_VID(pVnode), pTask, pItem->submitReqVer, pItem->fetchResultVer, pRSmaInfo->suid, i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pMeta) {
|
||||||
|
taosWLockLatch(&pMeta->lock);
|
||||||
|
if (streamMetaCommit(pMeta)) {
|
||||||
|
taosWUnLockLatch(&pMeta->lock);
|
||||||
|
code = terrno ? terrno : TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
}
|
||||||
|
taosWUnLockLatch(&pMeta->lock);
|
||||||
|
}
|
||||||
|
if (checkpointBuilt) {
|
||||||
|
smaInfo("vgId:%d, rsma commit, succeed to commit checkpoint:%" PRIi64, TD_VID(pVnode), checkpointId);
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
_exit:
|
_exit:
|
||||||
if (code) {
|
if (code) {
|
||||||
smaError("vgId:%d, %s failed at line %d since %s", TD_VID(pVnode), __func__, lino, tstrerror(code));
|
smaError("vgId:%d, %s failed at line %d since %s", TD_VID(pVnode), __func__, lino, tstrerror(code));
|
||||||
|
@ -1091,7 +1258,7 @@ _exit:
|
||||||
terrno = code;
|
terrno = code;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
/**
|
/**
|
||||||
* @brief trigger to get rsma result in async mode
|
* @brief trigger to get rsma result in async mode
|
||||||
*
|
*
|
||||||
|
@ -1165,14 +1332,8 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) {
|
||||||
smaDebug("vgId:%d, rsma fetch task planned for level:%" PRIi8 " suid:%" PRIi64 " since stat is active",
|
smaDebug("vgId:%d, rsma fetch task planned for level:%" PRIi8 " suid:%" PRIi64 " since stat is active",
|
||||||
SMA_VID(pSma), pItem->level, pRSmaInfo->suid);
|
SMA_VID(pSma), pItem->level, pRSmaInfo->suid);
|
||||||
// async process
|
// async process
|
||||||
pItem->fetchLevel = pItem->level;
|
atomic_store_8(&pItem->fetchLevel, 1);
|
||||||
#if 0
|
|
||||||
// debugging codes
|
|
||||||
SRSmaInfo *qInfo = tdAcquireRSmaInfoBySuid(pSma, pRSmaInfo->suid);
|
|
||||||
SRSmaInfoItem *qItem = RSMA_INFO_ITEM(qInfo, pItem->level - 1);
|
|
||||||
make sure(qItem->level == pItem->level);
|
|
||||||
make sure(qItem->fetchLevel == pItem->fetchLevel);
|
|
||||||
#endif
|
|
||||||
if (atomic_load_8(&pRSmaInfo->assigned) == 0) {
|
if (atomic_load_8(&pRSmaInfo->assigned) == 0) {
|
||||||
tsem_post(&(pStat->notEmpty));
|
tsem_post(&(pStat->notEmpty));
|
||||||
}
|
}
|
||||||
|
@ -1217,15 +1378,15 @@ static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo) {
|
||||||
SSDataBlock dataBlock = {.info.type = STREAM_GET_ALL};
|
SSDataBlock dataBlock = {.info.type = STREAM_GET_ALL};
|
||||||
for (int8_t i = 1; i <= TSDB_RETENTION_L2; ++i) {
|
for (int8_t i = 1; i <= TSDB_RETENTION_L2; ++i) {
|
||||||
SRSmaInfoItem *pItem = RSMA_INFO_ITEM(pInfo, i - 1);
|
SRSmaInfoItem *pItem = RSMA_INFO_ITEM(pInfo, i - 1);
|
||||||
if (pItem->fetchLevel) {
|
|
||||||
pItem->fetchLevel = 0;
|
if (1 == atomic_val_compare_exchange_8(&pItem->fetchLevel, 1, 0)) {
|
||||||
qTaskInfo_t taskInfo = RSMA_INFO_QTASK(pInfo, i - 1);
|
qTaskInfo_t taskInfo = RSMA_INFO_QTASK(pInfo, i - 1);
|
||||||
if (!taskInfo) {
|
if (!taskInfo) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((++pItem->nScanned * pItem->maxDelay) > RSMA_FETCH_DELAY_MAX) {
|
if ((++pItem->nScanned * pItem->maxDelay) > RSMA_FETCH_DELAY_MAX) {
|
||||||
smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi16 " maxDelay:%d, fetch executed",
|
smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi32 " maxDelay:%d, fetch executed",
|
||||||
SMA_VID(pSma), pInfo->suid, i, pItem->nScanned, pItem->maxDelay);
|
SMA_VID(pSma), pInfo->suid, i, pItem->nScanned, pItem->maxDelay);
|
||||||
} else {
|
} else {
|
||||||
int64_t curMs = taosGetTimestampMs();
|
int64_t curMs = taosGetTimestampMs();
|
||||||
|
@ -1245,14 +1406,15 @@ static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo) {
|
||||||
if ((terrno = qSetSMAInput(taskInfo, &dataBlock, 1, STREAM_INPUT__DATA_BLOCK)) < 0) {
|
if ((terrno = qSetSMAInput(taskInfo, &dataBlock, 1, STREAM_INPUT__DATA_BLOCK)) < 0) {
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
if (tdRSmaExecAndSubmitResult(pSma, taskInfo, pItem, pInfo->pTSchema, pInfo->suid) < 0) {
|
if (tdRSmaExecAndSubmitResult(pSma, taskInfo, pItem, pInfo, STREAM_GET_ALL, NULL) < 0) {
|
||||||
|
atomic_store_32(&SMA_RSMA_STAT(pSma)->execStat, terrno);
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi16 " maxDelay:%d, fetch finished",
|
smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi32 " maxDelay:%d, fetch finished",
|
||||||
SMA_VID(pSma), pInfo->suid, i, pItem->nScanned, pItem->maxDelay);
|
SMA_VID(pSma), pInfo->suid, i, pItem->nScanned, pItem->maxDelay);
|
||||||
} else {
|
} else {
|
||||||
smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi16
|
smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi32
|
||||||
" maxDelay:%d, fetch not executed as fetch level is %" PRIi8,
|
" maxDelay:%d, fetch not executed as fetch level is %" PRIi8,
|
||||||
SMA_VID(pSma), pInfo->suid, i, pItem->nScanned, pItem->maxDelay, pItem->fetchLevel);
|
SMA_VID(pSma), pInfo->suid, i, pItem->nScanned, pItem->maxDelay, pItem->fetchLevel);
|
||||||
}
|
}
|
||||||
|
@ -1275,6 +1437,7 @@ static int32_t tdRSmaBatchExec(SSma *pSma, SRSmaInfo *pInfo, STaosQall *qall, SA
|
||||||
.msgStr = POINTER_SHIFT(msg, sizeof(int32_t) + sizeof(int64_t))};
|
.msgStr = POINTER_SHIFT(msg, sizeof(int32_t) + sizeof(int64_t))};
|
||||||
|
|
||||||
if (!taosArrayPush(pSubmitArr, &packData)) {
|
if (!taosArrayPush(pSubmitArr, &packData)) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
tdFreeRSmaSubmitItems(pSubmitArr);
|
tdFreeRSmaSubmitItems(pSubmitArr);
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
@ -1294,6 +1457,7 @@ static int32_t tdRSmaBatchExec(SSma *pSma, SRSmaInfo *pInfo, STaosQall *qall, SA
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
_err:
|
_err:
|
||||||
|
atomic_store_32(&SMA_RSMA_STAT(pSma)->execStat, terrno);
|
||||||
smaError("vgId:%d, batch exec for suid:%" PRIi64 " execType:%d size:%d failed since %s", SMA_VID(pSma), pInfo->suid,
|
smaError("vgId:%d, batch exec for suid:%" PRIi64 " execType:%d size:%d failed since %s", SMA_VID(pSma), pInfo->suid,
|
||||||
type, (int32_t)taosArrayGetSize(pSubmitArr), terrstr());
|
type, (int32_t)taosArrayGetSize(pSubmitArr), terrstr());
|
||||||
tdFreeRSmaSubmitItems(pSubmitArr);
|
tdFreeRSmaSubmitItems(pSubmitArr);
|
||||||
|
@ -1369,15 +1533,11 @@ int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type) {
|
||||||
|
|
||||||
if (ASSERTS(oldVal >= 0, "oldVal of nFetchAll: %d < 0", oldVal)) {
|
if (ASSERTS(oldVal >= 0, "oldVal of nFetchAll: %d < 0", oldVal)) {
|
||||||
code = TSDB_CODE_APP_ERROR;
|
code = TSDB_CODE_APP_ERROR;
|
||||||
|
taosHashCancelIterate(infoHash, pIter);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t curStat = atomic_load_8(RSMA_COMMIT_STAT(pRSmaStat));
|
tdRSmaFetchAllResult(pSma, pInfo);
|
||||||
if (curStat == 1) {
|
|
||||||
smaDebug("vgId:%d, fetch all not exec as commit stat is %" PRIi8, SMA_VID(pSma), curStat);
|
|
||||||
} else {
|
|
||||||
tdRSmaFetchAllResult(pSma, pInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 == atomic_sub_fetch_32(&pRSmaStat->nFetchAll, 1)) {
|
if (0 == atomic_sub_fetch_32(&pRSmaStat->nFetchAll, 1)) {
|
||||||
atomic_store_8(RSMA_COMMIT_STAT(pRSmaStat), 0);
|
atomic_store_8(RSMA_COMMIT_STAT(pRSmaStat), 0);
|
||||||
|
|
|
@ -3099,7 +3099,7 @@ static int32_t tsdbCacheLoadBlockS3(STsdbFD *pFD, uint8_t **ppBlock) {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
int64_t block_offset = (pFD->blkno - 1) * tsS3BlockSize * pFD->szPage;
|
int64_t block_offset = (pFD->blkno - 1) * tsS3BlockSize * pFD->szPage;
|
||||||
code = s3GetObjectBlock(pFD->objName, block_offset, tsS3BlockSize * pFD->szPage, ppBlock);
|
code = s3GetObjectBlock(pFD->objName, block_offset, tsS3BlockSize * pFD->szPage, 0, ppBlock);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
// taosMemoryFree(pBlock);
|
// taosMemoryFree(pBlock);
|
||||||
// code = TSDB_CODE_OUT_OF_MEMORY;
|
// code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
|
|
@ -30,10 +30,12 @@ static int32_t saveOneRow(SArray* pRow, SSDataBlock* pBlock, SCacheRowsReader* p
|
||||||
if (HASTYPE(pReader->type, CACHESCAN_RETRIEVE_LAST)) {
|
if (HASTYPE(pReader->type, CACHESCAN_RETRIEVE_LAST)) {
|
||||||
uint64_t ts = 0;
|
uint64_t ts = 0;
|
||||||
SFirstLastRes* p;
|
SFirstLastRes* p;
|
||||||
|
col_id_t colId;
|
||||||
for (int32_t i = 0; i < pReader->numOfCols; ++i) {
|
for (int32_t i = 0; i < pReader->numOfCols; ++i) {
|
||||||
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, dstSlotIds[i]);
|
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, dstSlotIds[i]);
|
||||||
int32_t slotId = slotIds[i];
|
int32_t slotId = slotIds[i];
|
||||||
SLastCol* pColVal = (SLastCol*)taosArrayGet(pRow, i);
|
SLastCol* pColVal = (SLastCol*)taosArrayGet(pRow, i);
|
||||||
|
colId = pColVal->colVal.cid;
|
||||||
p = (SFirstLastRes*)varDataVal(pRes[i]);
|
p = (SFirstLastRes*)varDataVal(pRes[i]);
|
||||||
|
|
||||||
p->ts = pColVal->ts;
|
p->ts = pColVal->ts;
|
||||||
|
@ -63,8 +65,7 @@ static int32_t saveOneRow(SArray* pRow, SSDataBlock* pBlock, SCacheRowsReader* p
|
||||||
if (pCol->info.colId == PRIMARYKEY_TIMESTAMP_COL_ID && pCol->info.type == TSDB_DATA_TYPE_TIMESTAMP) {
|
if (pCol->info.colId == PRIMARYKEY_TIMESTAMP_COL_ID && pCol->info.type == TSDB_DATA_TYPE_TIMESTAMP) {
|
||||||
colDataSetVal(pCol, numOfRows, (const char*)&ts, false);
|
colDataSetVal(pCol, numOfRows, (const char*)&ts, false);
|
||||||
continue;
|
continue;
|
||||||
}
|
} else if (pReader->numOfCols == 1 && idx != dstSlotIds[0] && pCol->info.colId == colId) {
|
||||||
if (pReader->numOfCols == 1 && dstSlotIds[0] != idx) {
|
|
||||||
if (!p->isNull) {
|
if (!p->isNull) {
|
||||||
colDataSetVal(pCol, numOfRows, p->buf, false);
|
colDataSetVal(pCol, numOfRows, p->buf, false);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -192,7 +192,7 @@ static int32_t tsdbCommitTombData(SCommitter2 *committer) {
|
||||||
committer->ctx->tbid->uid = record->uid;
|
committer->ctx->tbid->uid = record->uid;
|
||||||
|
|
||||||
if (metaGetInfo(committer->tsdb->pVnode->pMeta, record->uid, &info, NULL) != 0) {
|
if (metaGetInfo(committer->tsdb->pVnode->pMeta, record->uid, &info, NULL) != 0) {
|
||||||
code = tsdbIterMergerSkipTableData(committer->dataIterMerger, committer->ctx->tbid);
|
code = tsdbIterMergerSkipTableData(committer->tombIterMerger, committer->ctx->tbid);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
extern int vnodeScheduleTask(int (*execute)(void *), void *arg);
|
extern int vnodeScheduleTask(int (*execute)(void *), void *arg);
|
||||||
extern int vnodeScheduleTaskEx(int tpid, int (*execute)(void *), void *arg);
|
extern int vnodeScheduleTaskEx(int tpid, int (*execute)(void *), void *arg);
|
||||||
extern void remove_file(const char *fname);
|
extern void remove_file(const char *fname, bool last_level);
|
||||||
|
|
||||||
#define TSDB_FS_EDIT_MIN TSDB_FEDIT_COMMIT
|
#define TSDB_FS_EDIT_MIN TSDB_FEDIT_COMMIT
|
||||||
#define TSDB_FS_EDIT_MAX (TSDB_FEDIT_MERGE + 1)
|
#define TSDB_FS_EDIT_MAX (TSDB_FEDIT_MERGE + 1)
|
||||||
|
@ -532,7 +532,8 @@ static int32_t tsdbFSDoSanAndFix(STFileSystem *fs) {
|
||||||
if (taosIsDir(file->aname)) continue;
|
if (taosIsDir(file->aname)) continue;
|
||||||
|
|
||||||
if (tsdbFSGetFileObjHashEntry(&fobjHash, file->aname) == NULL) {
|
if (tsdbFSGetFileObjHashEntry(&fobjHash, file->aname) == NULL) {
|
||||||
remove_file(file->aname);
|
int32_t nlevel = tfsGetLevel(fs->tsdb->pVnode->pTfs);
|
||||||
|
remove_file(file->aname, nlevel > 1 && file->did.level == nlevel - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tsdbFile2.h"
|
#include "tsdbFile2.h"
|
||||||
|
#include "cos.h"
|
||||||
|
|
||||||
// to_json
|
// to_json
|
||||||
static int32_t head_to_json(const STFile *file, cJSON *json);
|
static int32_t head_to_json(const STFile *file, cJSON *json);
|
||||||
|
@ -41,10 +42,20 @@ static const struct {
|
||||||
[TSDB_FTYPE_STT] = {"stt", stt_to_json, stt_from_json},
|
[TSDB_FTYPE_STT] = {"stt", stt_to_json, stt_from_json},
|
||||||
};
|
};
|
||||||
|
|
||||||
void remove_file(const char *fname) {
|
void remove_file(const char *fname, bool last_level) {
|
||||||
int32_t code = taosRemoveFile(fname);
|
int32_t code = taosRemoveFile(fname);
|
||||||
if (code) {
|
if (code) {
|
||||||
tsdbError("file:%s remove failed", fname);
|
if (tsS3Enabled && last_level) {
|
||||||
|
const char *object_name = taosDirEntryBaseName((char *)fname);
|
||||||
|
long s3_size = tsS3Enabled ? s3Size(object_name) : 0;
|
||||||
|
if (!strncmp(fname + strlen(fname) - 5, ".data", 5) && s3_size > 0) {
|
||||||
|
s3DeleteObjects(&object_name, 1);
|
||||||
|
} else {
|
||||||
|
tsdbError("file:%s remove failed", fname);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tsdbError("file:%s remove failed", fname);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
tsdbInfo("file:%s is removed", fname);
|
tsdbInfo("file:%s is removed", fname);
|
||||||
}
|
}
|
||||||
|
@ -224,6 +235,7 @@ int32_t tsdbTFileObjInit(STsdb *pTsdb, const STFile *f, STFileObj **fobj) {
|
||||||
fobj[0]->state = TSDB_FSTATE_LIVE;
|
fobj[0]->state = TSDB_FSTATE_LIVE;
|
||||||
fobj[0]->ref = 1;
|
fobj[0]->ref = 1;
|
||||||
tsdbTFileName(pTsdb, f, fobj[0]->fname);
|
tsdbTFileName(pTsdb, f, fobj[0]->fname);
|
||||||
|
fobj[0]->nlevel = tfsGetLevel(pTsdb->pVnode->pTfs);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,7 +257,7 @@ int32_t tsdbTFileObjUnref(STFileObj *fobj) {
|
||||||
tsdbTrace("unref file %s, fobj:%p ref %d", fobj->fname, fobj, nRef);
|
tsdbTrace("unref file %s, fobj:%p ref %d", fobj->fname, fobj, nRef);
|
||||||
if (nRef == 0) {
|
if (nRef == 0) {
|
||||||
if (fobj->state == TSDB_FSTATE_DEAD) {
|
if (fobj->state == TSDB_FSTATE_DEAD) {
|
||||||
remove_file(fobj->fname);
|
remove_file(fobj->fname, fobj->nlevel > 1 && fobj->f->did.level == fobj->nlevel - 1);
|
||||||
}
|
}
|
||||||
taosMemoryFree(fobj);
|
taosMemoryFree(fobj);
|
||||||
}
|
}
|
||||||
|
@ -261,7 +273,7 @@ int32_t tsdbTFileObjRemove(STFileObj *fobj) {
|
||||||
taosThreadMutexUnlock(&fobj->mutex);
|
taosThreadMutexUnlock(&fobj->mutex);
|
||||||
tsdbTrace("remove unref file %s, fobj:%p ref %d", fobj->fname, fobj, nRef);
|
tsdbTrace("remove unref file %s, fobj:%p ref %d", fobj->fname, fobj, nRef);
|
||||||
if (nRef == 0) {
|
if (nRef == 0) {
|
||||||
remove_file(fobj->fname);
|
remove_file(fobj->fname, fobj->nlevel > 1 && fobj->f->did.level == fobj->nlevel - 1);
|
||||||
taosMemoryFree(fobj);
|
taosMemoryFree(fobj);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -76,6 +76,7 @@ struct STFileObj {
|
||||||
STFile f[1];
|
STFile f[1];
|
||||||
int32_t state;
|
int32_t state;
|
||||||
int32_t ref;
|
int32_t ref;
|
||||||
|
int32_t nlevel;
|
||||||
char fname[TSDB_FILENAME_LEN];
|
char fname[TSDB_FILENAME_LEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -89,6 +89,8 @@ int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKee
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
|
tsdbCloseFS(&pTsdb->pFS);
|
||||||
|
taosThreadMutexDestroy(&pTsdb->mutex);
|
||||||
taosMemoryFree(pTsdb);
|
taosMemoryFree(pTsdb);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,9 +48,9 @@ static int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScan
|
||||||
static int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key,
|
static int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key,
|
||||||
STsdbReader* pReader);
|
STsdbReader* pReader);
|
||||||
|
|
||||||
static int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, int32_t order, SCostSummary* pCost);
|
static int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, int32_t order, SCostSummary* pCost);
|
||||||
static STsdb* getTsdbByRetentions(SVnode* pVnode, TSKEY winSKey, SRetention* retentions, const char* idstr,
|
static STsdb* getTsdbByRetentions(SVnode* pVnode, SQueryTableDataCond* pCond, SRetention* retentions, const char* idstr,
|
||||||
int8_t* pLevel);
|
int8_t* pLevel);
|
||||||
static SVersionRange getQueryVerRange(SVnode* pVnode, SQueryTableDataCond* pCond, int8_t level);
|
static SVersionRange getQueryVerRange(SVnode* pVnode, SQueryTableDataCond* pCond, int8_t level);
|
||||||
static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader);
|
static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader);
|
||||||
static int32_t doBuildDataBlock(STsdbReader* pReader);
|
static int32_t doBuildDataBlock(STsdbReader* pReader);
|
||||||
|
@ -384,7 +384,7 @@ static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, void
|
||||||
|
|
||||||
initReaderStatus(&pReader->status);
|
initReaderStatus(&pReader->status);
|
||||||
|
|
||||||
pReader->pTsdb = getTsdbByRetentions(pVnode, pCond->twindows.skey, pVnode->config.tsdbCfg.retentions, idstr, &level);
|
pReader->pTsdb = getTsdbByRetentions(pVnode, pCond, pVnode->config.tsdbCfg.retentions, idstr, &level);
|
||||||
pReader->info.suid = pCond->suid;
|
pReader->info.suid = pCond->suid;
|
||||||
pReader->info.order = pCond->order;
|
pReader->info.order = pCond->order;
|
||||||
|
|
||||||
|
@ -3152,9 +3152,9 @@ static int32_t buildBlockFromFiles(STsdbReader* pReader) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static STsdb* getTsdbByRetentions(SVnode* pVnode, TSKEY winSKey, SRetention* retentions, const char* idStr,
|
static STsdb* getTsdbByRetentions(SVnode* pVnode, SQueryTableDataCond* pCond, SRetention* retentions, const char* idStr,
|
||||||
int8_t* pLevel) {
|
int8_t* pLevel) {
|
||||||
if (VND_IS_RSMA(pVnode)) {
|
if (VND_IS_RSMA(pVnode) && !pCond->skipRollup) {
|
||||||
int8_t level = 0;
|
int8_t level = 0;
|
||||||
int8_t precision = pVnode->config.tsdbCfg.precision;
|
int8_t precision = pVnode->config.tsdbCfg.precision;
|
||||||
int64_t now = taosGetTimestamp(precision);
|
int64_t now = taosGetTimestamp(precision);
|
||||||
|
@ -3170,7 +3170,7 @@ static STsdb* getTsdbByRetentions(SVnode* pVnode, TSKEY winSKey, SRetention* ret
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((now - pRetention->keep) <= (winSKey + offset)) {
|
if ((now - pRetention->keep) <= (pCond->twindows.skey + offset)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
++level;
|
++level;
|
||||||
|
|
|
@ -340,7 +340,7 @@ static int32_t tsdbReadFileS3(STsdbFD *pFD, int64_t offset, uint8_t *pBuf, int64
|
||||||
int64_t retrieve_offset = PAGE_OFFSET(pgno, pFD->szPage);
|
int64_t retrieve_offset = PAGE_OFFSET(pgno, pFD->szPage);
|
||||||
int64_t pgnoEnd = pgno - 1 + (size - n + szPgCont - 1) / szPgCont;
|
int64_t pgnoEnd = pgno - 1 + (size - n + szPgCont - 1) / szPgCont;
|
||||||
int64_t retrieve_size = (pgnoEnd - pgno + 1) * pFD->szPage;
|
int64_t retrieve_size = (pgnoEnd - pgno + 1) * pFD->szPage;
|
||||||
code = s3GetObjectBlock(pFD->objName, retrieve_offset, retrieve_size, &pBlock);
|
code = s3GetObjectBlock(pFD->objName, retrieve_offset, retrieve_size, 1, &pBlock);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,9 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "cos.h"
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
#include "tsdbFS2.h"
|
#include "tsdbFS2.h"
|
||||||
#include "cos.h"
|
|
||||||
#include "vnd.h"
|
#include "vnd.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -292,15 +292,15 @@ static int32_t tsdbDoRetentionOnFileSet(SRTNer *rtner, STFileSet *fset) {
|
||||||
if (expLevel < 0) { // remove the fileset
|
if (expLevel < 0) { // remove the fileset
|
||||||
for (int32_t ftype = 0; (ftype < TSDB_FTYPE_MAX) && (fobj = fset->farr[ftype], 1); ++ftype) {
|
for (int32_t ftype = 0; (ftype < TSDB_FTYPE_MAX) && (fobj = fset->farr[ftype], 1); ++ftype) {
|
||||||
if (fobj == NULL) continue;
|
if (fobj == NULL) continue;
|
||||||
|
/*
|
||||||
int32_t nlevel = tfsGetLevel(rtner->tsdb->pVnode->pTfs);
|
int32_t nlevel = tfsGetLevel(rtner->tsdb->pVnode->pTfs);
|
||||||
if (tsS3Enabled && nlevel > 1 && TSDB_FTYPE_DATA == ftype && fobj->f->did.level == nlevel - 1) {
|
if (tsS3Enabled && nlevel > 1 && TSDB_FTYPE_DATA == ftype && fobj->f->did.level == nlevel - 1) {
|
||||||
code = tsdbRemoveFileObjectS3(rtner, fobj);
|
code = tsdbRemoveFileObjectS3(rtner, fobj);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
} else {
|
} else {*/
|
||||||
code = tsdbDoRemoveFileObject(rtner, fobj);
|
code = tsdbDoRemoveFileObject(rtner, fobj);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
SSttLvl *lvl;
|
SSttLvl *lvl;
|
||||||
|
@ -388,6 +388,8 @@ _exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tsdbFreeRtnArg(void *arg) { taosMemoryFree(arg); }
|
||||||
|
|
||||||
static int32_t tsdbDoRetentionSync(void *arg) {
|
static int32_t tsdbDoRetentionSync(void *arg) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int32_t lino = 0;
|
int32_t lino = 0;
|
||||||
|
@ -410,6 +412,7 @@ _exit:
|
||||||
TSDB_ERROR_LOG(TD_VID(rtner->tsdb->pVnode), lino, code);
|
TSDB_ERROR_LOG(TD_VID(rtner->tsdb->pVnode), lino, code);
|
||||||
}
|
}
|
||||||
tsem_post(&((SRtnArg *)arg)->tsdb->pVnode->canCommit);
|
tsem_post(&((SRtnArg *)arg)->tsdb->pVnode->canCommit);
|
||||||
|
tsdbFreeRtnArg(arg);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,7 +442,7 @@ _exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tsdbFreeRtnArg(void *arg) { taosMemoryFree(arg); }
|
|
||||||
|
|
||||||
int32_t tsdbRetention(STsdb *tsdb, int64_t now, int32_t sync) {
|
int32_t tsdbRetention(STsdb *tsdb, int64_t now, int32_t sync) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
|
@ -39,7 +39,7 @@ int tsdbInsertData(STsdb *pTsdb, int64_t version, SSubmitReq2 *pMsg, SSubmitRsp2
|
||||||
arrSize = taosArrayGetSize(pMsg->aSubmitTbData);
|
arrSize = taosArrayGetSize(pMsg->aSubmitTbData);
|
||||||
|
|
||||||
// scan and convert
|
// scan and convert
|
||||||
if (tsdbScanAndConvertSubmitMsg(pTsdb, pMsg) < 0) {
|
if ((terrno = tsdbScanAndConvertSubmitMsg(pTsdb, pMsg)) < 0) {
|
||||||
if (terrno != TSDB_CODE_TDB_TABLE_RECONFIGURE) {
|
if (terrno != TSDB_CODE_TDB_TABLE_RECONFIGURE) {
|
||||||
tsdbError("vgId:%d, failed to insert data since %s", TD_VID(pTsdb->pVnode), tstrerror(terrno));
|
tsdbError("vgId:%d, failed to insert data since %s", TD_VID(pTsdb->pVnode), tstrerror(terrno));
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,12 @@
|
||||||
|
|
||||||
#include "vnd.h"
|
#include "vnd.h"
|
||||||
|
|
||||||
extern int32_t tsdbRetention(STsdb *tsdb, int64_t now, int32_t sync);
|
|
||||||
|
|
||||||
int32_t vnodeDoRetention(SVnode *pVnode, int64_t now) {
|
int32_t vnodeDoRetention(SVnode *pVnode, int64_t now) {
|
||||||
return tsdbRetention(pVnode->pTsdb, now, pVnode->config.sttTrigger == 1);
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
code = tsdbRetention(pVnode->pTsdb, now, pVnode->config.sttTrigger == 1);
|
||||||
|
|
||||||
|
if (TSDB_CODE_SUCCESS == code) code = smaRetention(pVnode->pSma, now);
|
||||||
|
|
||||||
|
return code;
|
||||||
}
|
}
|
|
@ -1669,7 +1669,7 @@ _exit:
|
||||||
atomic_add_fetch_64(&pVnode->statis.nBatchInsert, 1);
|
atomic_add_fetch_64(&pVnode->statis.nBatchInsert, 1);
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
atomic_add_fetch_64(&pVnode->statis.nBatchInsertSuccess, 1);
|
atomic_add_fetch_64(&pVnode->statis.nBatchInsertSuccess, 1);
|
||||||
tdProcessRSmaSubmit(pVnode->pSma, ver, pSubmitReq, pReq, len, STREAM_INPUT__DATA_SUBMIT);
|
code = tdProcessRSmaSubmit(pVnode->pSma, ver, pSubmitReq, pReq, len, STREAM_INPUT__DATA_SUBMIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear
|
// clear
|
||||||
|
|
|
@ -180,7 +180,7 @@ void initExecTimeWindowInfo(SColumnInfoData* pColData, STimeWindow* pQueryWindow
|
||||||
SInterval extractIntervalInfo(const STableScanPhysiNode* pTableScanNode);
|
SInterval extractIntervalInfo(const STableScanPhysiNode* pTableScanNode);
|
||||||
SColumn extractColumnFromColumnNode(SColumnNode* pColNode);
|
SColumn extractColumnFromColumnNode(SColumnNode* pColNode);
|
||||||
|
|
||||||
int32_t initQueryTableDataCond(SQueryTableDataCond* pCond, const STableScanPhysiNode* pTableScanNode);
|
int32_t initQueryTableDataCond(SQueryTableDataCond* pCond, const STableScanPhysiNode* pTableScanNode, const SReadHandle* readHandle);
|
||||||
void cleanupQueryTableDataCond(SQueryTableDataCond* pCond);
|
void cleanupQueryTableDataCond(SQueryTableDataCond* pCond);
|
||||||
|
|
||||||
int32_t convertFillType(int32_t mode);
|
int32_t convertFillType(int32_t mode);
|
||||||
|
|
|
@ -54,6 +54,19 @@ static int32_t removeRedundantTsCol(SLastRowScanPhysiNode* pScanNode, SColM
|
||||||
|
|
||||||
#define SCAN_ROW_TYPE(_t) ((_t) ? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW)
|
#define SCAN_ROW_TYPE(_t) ((_t) ? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW)
|
||||||
|
|
||||||
|
static void setColIdForCacheReadBlock(SSDataBlock* pBlock, SNodeList* pTargets) {
|
||||||
|
SNode* pNode;
|
||||||
|
int32_t idx = 0;
|
||||||
|
FOREACH(pNode, pTargets) {
|
||||||
|
if (nodeType(pNode) == QUERY_NODE_COLUMN) {
|
||||||
|
SColumnNode* pCol = (SColumnNode*)pNode;
|
||||||
|
SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, idx);
|
||||||
|
pColInfo->info.colId = pCol->colId;
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SReadHandle* readHandle,
|
SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SReadHandle* readHandle,
|
||||||
STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo) {
|
STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
@ -114,10 +127,12 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe
|
||||||
capacity = TMIN(totalTables, 4096);
|
capacity = TMIN(totalTables, 4096);
|
||||||
|
|
||||||
pInfo->pBufferredRes = createOneDataBlock(pInfo->pRes, false);
|
pInfo->pBufferredRes = createOneDataBlock(pInfo->pRes, false);
|
||||||
|
setColIdForCacheReadBlock(pInfo->pBufferredRes, pScanNode->pTargets);
|
||||||
blockDataEnsureCapacity(pInfo->pBufferredRes, capacity);
|
blockDataEnsureCapacity(pInfo->pBufferredRes, capacity);
|
||||||
} else { // by tags
|
} else { // by tags
|
||||||
pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_SINGLE | SCAN_ROW_TYPE(pScanNode->ignoreNull);
|
pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_SINGLE | SCAN_ROW_TYPE(pScanNode->ignoreNull);
|
||||||
capacity = 1; // only one row output
|
capacity = 1; // only one row output
|
||||||
|
setColIdForCacheReadBlock(pInfo->pRes, pScanNode->pTargets);
|
||||||
}
|
}
|
||||||
|
|
||||||
initResultSizeInfo(&pOperator->resultInfo, capacity);
|
initResultSizeInfo(&pOperator->resultInfo, capacity);
|
||||||
|
@ -192,7 +207,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
if (pInfo->indexOfBufferedRes < pInfo->pBufferredRes->info.rows) {
|
if (pInfo->indexOfBufferedRes < pInfo->pBufferredRes->info.rows) {
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pInfo->pBufferredRes->pDataBlock); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(pInfo->pBufferredRes->pDataBlock); ++i) {
|
||||||
SColumnInfoData* pCol = taosArrayGet(pInfo->pBufferredRes->pDataBlock, i);
|
SColumnInfoData* pCol = taosArrayGet(pRes->pDataBlock, i);
|
||||||
int32_t slotId = pCol->info.slotId;
|
int32_t slotId = pCol->info.slotId;
|
||||||
|
|
||||||
SColumnInfoData* pSrc = taosArrayGet(pInfo->pBufferredRes->pDataBlock, slotId);
|
SColumnInfoData* pSrc = taosArrayGet(pInfo->pBufferredRes->pDataBlock, slotId);
|
||||||
|
|
|
@ -1713,7 +1713,7 @@ SColumn extractColumnFromColumnNode(SColumnNode* pColNode) {
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t initQueryTableDataCond(SQueryTableDataCond* pCond, const STableScanPhysiNode* pTableScanNode) {
|
int32_t initQueryTableDataCond(SQueryTableDataCond* pCond, const STableScanPhysiNode* pTableScanNode, const SReadHandle* readHandle) {
|
||||||
pCond->order = pTableScanNode->scanSeq[0] > 0 ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
|
pCond->order = pTableScanNode->scanSeq[0] > 0 ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
|
||||||
pCond->numOfCols = LIST_LENGTH(pTableScanNode->scan.pScanCols);
|
pCond->numOfCols = LIST_LENGTH(pTableScanNode->scan.pScanCols);
|
||||||
|
|
||||||
|
@ -1732,6 +1732,7 @@ int32_t initQueryTableDataCond(SQueryTableDataCond* pCond, const STableScanPhysi
|
||||||
pCond->type = TIMEWINDOW_RANGE_CONTAINED;
|
pCond->type = TIMEWINDOW_RANGE_CONTAINED;
|
||||||
pCond->startVersion = -1;
|
pCond->startVersion = -1;
|
||||||
pCond->endVersion = -1;
|
pCond->endVersion = -1;
|
||||||
|
pCond->skipRollup = readHandle->skipRollup;
|
||||||
|
|
||||||
int32_t j = 0;
|
int32_t j = 0;
|
||||||
for (int32_t i = 0; i < pCond->numOfCols; ++i) {
|
for (int32_t i = 0; i < pCond->numOfCols; ++i) {
|
||||||
|
|
|
@ -69,12 +69,14 @@ static int32_t doSetSMABlock(SOperatorInfo* pOperator, void* input, size_t numOf
|
||||||
} else if (type == STREAM_INPUT__DATA_BLOCK) {
|
} else if (type == STREAM_INPUT__DATA_BLOCK) {
|
||||||
for (int32_t i = 0; i < numOfBlocks; ++i) {
|
for (int32_t i = 0; i < numOfBlocks; ++i) {
|
||||||
SSDataBlock* pDataBlock = &((SSDataBlock*)input)[i];
|
SSDataBlock* pDataBlock = &((SSDataBlock*)input)[i];
|
||||||
SPackedData tmp = {
|
SPackedData tmp = {.pDataBlock = pDataBlock};
|
||||||
.pDataBlock = pDataBlock,
|
|
||||||
};
|
|
||||||
taosArrayPush(pInfo->pBlockLists, &tmp);
|
taosArrayPush(pInfo->pBlockLists, &tmp);
|
||||||
}
|
}
|
||||||
pInfo->blockType = STREAM_INPUT__DATA_BLOCK;
|
pInfo->blockType = STREAM_INPUT__DATA_BLOCK;
|
||||||
|
} else if (type == STREAM_INPUT__CHECKPOINT) {
|
||||||
|
SPackedData tmp = {.pDataBlock = input};
|
||||||
|
taosArrayPush(pInfo->pBlockLists, &tmp);
|
||||||
|
pInfo->blockType = STREAM_INPUT__CHECKPOINT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -633,7 +635,7 @@ int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bo
|
||||||
blockIndex += 1;
|
blockIndex += 1;
|
||||||
|
|
||||||
current += p->info.rows;
|
current += p->info.rows;
|
||||||
ASSERT(p->info.rows > 0);
|
ASSERT(p->info.rows > 0 || p->info.type == STREAM_CHECKPOINT);
|
||||||
taosArrayPush(pResList, &p);
|
taosArrayPush(pResList, &p);
|
||||||
|
|
||||||
if (current >= rowsThreshold) {
|
if (current >= rowsThreshold) {
|
||||||
|
|
|
@ -1035,7 +1035,7 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
|
||||||
}
|
}
|
||||||
|
|
||||||
initLimitInfo(pScanNode->node.pLimit, pScanNode->node.pSlimit, &pInfo->base.limitInfo);
|
initLimitInfo(pScanNode->node.pLimit, pScanNode->node.pSlimit, &pInfo->base.limitInfo);
|
||||||
code = initQueryTableDataCond(&pInfo->base.cond, pTableScanNode);
|
code = initQueryTableDataCond(&pInfo->base.cond, pTableScanNode, readHandle);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
@ -3535,7 +3535,7 @@ SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanN
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = initQueryTableDataCond(&pInfo->base.cond, pTableScanNode);
|
code = initQueryTableDataCond(&pInfo->base.cond, pTableScanNode, readHandle);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
taosArrayDestroy(pInfo->base.matchInfo.pList);
|
taosArrayDestroy(pInfo->base.matchInfo.pList);
|
||||||
goto _error;
|
goto _error;
|
||||||
|
|
|
@ -1773,6 +1773,7 @@ static int32_t jsonToPhysiTagScanNode(const SJson* pJson, void* pObj) {
|
||||||
|
|
||||||
static const char* jkLastRowScanPhysiPlanGroupTags = "GroupTags";
|
static const char* jkLastRowScanPhysiPlanGroupTags = "GroupTags";
|
||||||
static const char* jkLastRowScanPhysiPlanGroupSort = "GroupSort";
|
static const char* jkLastRowScanPhysiPlanGroupSort = "GroupSort";
|
||||||
|
static const char* jkLastRowScanPhysiPlanTargets = "Targets";
|
||||||
|
|
||||||
static int32_t physiLastRowScanNodeToJson(const void* pObj, SJson* pJson) {
|
static int32_t physiLastRowScanNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
const SLastRowScanPhysiNode* pNode = (const SLastRowScanPhysiNode*)pObj;
|
const SLastRowScanPhysiNode* pNode = (const SLastRowScanPhysiNode*)pObj;
|
||||||
|
@ -1784,6 +1785,9 @@ static int32_t physiLastRowScanNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tjsonAddBoolToObject(pJson, jkLastRowScanPhysiPlanGroupSort, pNode->groupSort);
|
code = tjsonAddBoolToObject(pJson, jkLastRowScanPhysiPlanGroupSort, pNode->groupSort);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = nodeListToJson(pJson, jkLastRowScanPhysiPlanTargets, pNode->pTargets);
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -1798,6 +1802,9 @@ static int32_t jsonToPhysiLastRowScanNode(const SJson* pJson, void* pObj) {
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tjsonGetBoolValue(pJson, jkLastRowScanPhysiPlanGroupSort, &pNode->groupSort);
|
code = tjsonGetBoolValue(pJson, jkLastRowScanPhysiPlanGroupSort, &pNode->groupSort);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = jsonToNodeList(pJson, jkLastRowScanPhysiPlanTargets, &pNode->pTargets);
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2052,7 +2052,8 @@ enum {
|
||||||
PHY_LAST_ROW_SCAN_CODE_SCAN = 1,
|
PHY_LAST_ROW_SCAN_CODE_SCAN = 1,
|
||||||
PHY_LAST_ROW_SCAN_CODE_GROUP_TAGS,
|
PHY_LAST_ROW_SCAN_CODE_GROUP_TAGS,
|
||||||
PHY_LAST_ROW_SCAN_CODE_GROUP_SORT,
|
PHY_LAST_ROW_SCAN_CODE_GROUP_SORT,
|
||||||
PHY_LAST_ROW_SCAN_CODE_IGNULL
|
PHY_LAST_ROW_SCAN_CODE_IGNULL,
|
||||||
|
PHY_LAST_ROW_SCAN_CODE_TARGETS
|
||||||
};
|
};
|
||||||
|
|
||||||
static int32_t physiLastRowScanNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
|
static int32_t physiLastRowScanNodeToMsg(const void* pObj, STlvEncoder* pEncoder) {
|
||||||
|
@ -2068,6 +2069,9 @@ static int32_t physiLastRowScanNodeToMsg(const void* pObj, STlvEncoder* pEncoder
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tlvEncodeBool(pEncoder, PHY_LAST_ROW_SCAN_CODE_IGNULL, pNode->ignoreNull);
|
code = tlvEncodeBool(pEncoder, PHY_LAST_ROW_SCAN_CODE_IGNULL, pNode->ignoreNull);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = tlvEncodeObj(pEncoder, PHY_LAST_ROW_SCAN_CODE_TARGETS, nodeListToMsg, pNode->pTargets);
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2091,6 +2095,9 @@ static int32_t msgToPhysiLastRowScanNode(STlvDecoder* pDecoder, void* pObj) {
|
||||||
case PHY_LAST_ROW_SCAN_CODE_IGNULL:
|
case PHY_LAST_ROW_SCAN_CODE_IGNULL:
|
||||||
code = tlvDecodeBool(pTlv, &pNode->ignoreNull);
|
code = tlvDecodeBool(pTlv, &pNode->ignoreNull);
|
||||||
break;
|
break;
|
||||||
|
case PHY_LAST_ROW_SCAN_CODE_TARGETS:
|
||||||
|
code = msgToNodeListFromTlv(pTlv, (void**)&pNode->pTargets);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1285,6 +1285,7 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
SLastRowScanPhysiNode* pPhyNode = (SLastRowScanPhysiNode*)pNode;
|
SLastRowScanPhysiNode* pPhyNode = (SLastRowScanPhysiNode*)pNode;
|
||||||
destroyScanPhysiNode((SScanPhysiNode*)pNode);
|
destroyScanPhysiNode((SScanPhysiNode*)pNode);
|
||||||
nodesDestroyList(pPhyNode->pGroupTags);
|
nodesDestroyList(pPhyNode->pGroupTags);
|
||||||
|
nodesDestroyList(pPhyNode->pTargets);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
|
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
|
||||||
|
|
|
@ -552,6 +552,7 @@ static int32_t createLastRowScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSu
|
||||||
if (NULL == pScan) {
|
if (NULL == pScan) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
pScan->pTargets = nodesCloneList(pScanLogicNode->node.pTargets);
|
||||||
|
|
||||||
pScan->pGroupTags = nodesCloneList(pScanLogicNode->pGroupTags);
|
pScan->pGroupTags = nodesCloneList(pScanLogicNode->pGroupTags);
|
||||||
if (NULL != pScanLogicNode->pGroupTags && NULL == pScan->pGroupTags) {
|
if (NULL != pScanLogicNode->pGroupTags && NULL == pScan->pGroupTags) {
|
||||||
|
|
|
@ -106,7 +106,6 @@ int32_t streamBroadcastToChildren(SStreamTask* pTask, const SSDataBlock* pBlock)
|
||||||
int32_t tEncodeStreamRetrieveReq(SEncoder* pEncoder, const SStreamRetrieveReq* pReq);
|
int32_t tEncodeStreamRetrieveReq(SEncoder* pEncoder, const SStreamRetrieveReq* pReq);
|
||||||
|
|
||||||
int32_t streamSaveAllTaskStatus(SStreamMeta* pMeta, int64_t checkpointId);
|
int32_t streamSaveAllTaskStatus(SStreamMeta* pMeta, int64_t checkpointId);
|
||||||
int32_t streamTaskBuildCheckpoint(SStreamTask* pTask);
|
|
||||||
int32_t streamSendCheckMsg(SStreamTask* pTask, const SStreamTaskCheckReq* pReq, int32_t nodeId, SEpSet* pEpSet);
|
int32_t streamSendCheckMsg(SStreamTask* pTask, const SStreamTaskCheckReq* pReq, int32_t nodeId, SEpSet* pEpSet);
|
||||||
|
|
||||||
int32_t streamAddCheckpointReadyMsg(SStreamTask* pTask, int32_t srcTaskId, int32_t index, int64_t checkpointId);
|
int32_t streamAddCheckpointReadyMsg(SStreamTask* pTask, int32_t srcTaskId, int32_t index, int64_t checkpointId);
|
||||||
|
|
|
@ -28,7 +28,6 @@ int32_t streamBackendId = 0;
|
||||||
int32_t streamBackendCfWrapperId = 0;
|
int32_t streamBackendCfWrapperId = 0;
|
||||||
int32_t streamMetaId = 0;
|
int32_t streamMetaId = 0;
|
||||||
|
|
||||||
static int64_t streamGetLatestCheckpointId(SStreamMeta* pMeta);
|
|
||||||
static void metaHbToMnode(void* param, void* tmrId);
|
static void metaHbToMnode(void* param, void* tmrId);
|
||||||
static void streamMetaClear(SStreamMeta* pMeta);
|
static void streamMetaClear(SStreamMeta* pMeta);
|
||||||
static int32_t streamMetaBegin(SStreamMeta* pMeta);
|
static int32_t streamMetaBegin(SStreamMeta* pMeta);
|
||||||
|
@ -191,10 +190,10 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF
|
||||||
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK);
|
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK);
|
||||||
pMeta->chkpSaved = taosArrayInit(4, sizeof(int64_t));
|
pMeta->chkpSaved = taosArrayInit(4, sizeof(int64_t));
|
||||||
pMeta->chkpInUse = taosArrayInit(4, sizeof(int64_t));
|
pMeta->chkpInUse = taosArrayInit(4, sizeof(int64_t));
|
||||||
pMeta->chkpCap = 8;
|
pMeta->chkpCap = 2;
|
||||||
taosInitRWLatch(&pMeta->chkpDirLock);
|
taosInitRWLatch(&pMeta->chkpDirLock);
|
||||||
|
|
||||||
pMeta->chkpId = streamGetLatestCheckpointId(pMeta);
|
pMeta->chkpId = streamMetaGetLatestCheckpointId(pMeta);
|
||||||
pMeta->streamBackend = streamBackendInit(pMeta->path, pMeta->chkpId);
|
pMeta->streamBackend = streamBackendInit(pMeta->path, pMeta->chkpId);
|
||||||
while (pMeta->streamBackend == NULL) {
|
while (pMeta->streamBackend == NULL) {
|
||||||
taosMsleep(100);
|
taosMsleep(100);
|
||||||
|
@ -602,7 +601,7 @@ int32_t streamMetaCommit(SStreamMeta* pMeta) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t streamGetLatestCheckpointId(SStreamMeta* pMeta) {
|
int64_t streamMetaGetLatestCheckpointId(SStreamMeta* pMeta) {
|
||||||
int64_t chkpId = 0;
|
int64_t chkpId = 0;
|
||||||
|
|
||||||
TBC* pCur = NULL;
|
TBC* pCur = NULL;
|
||||||
|
|
|
@ -194,8 +194,8 @@ int32_t streamSnapHandleInit(SStreamSnapHandle* pHandle, char* path, int64_t chk
|
||||||
taosArrayPush(pFile->pSst, &sst);
|
taosArrayPush(pFile->pSst, &sst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
if (qDebugFlag & DEBUG_TRACE) {
|
||||||
char* buf = taosMemoryCalloc(1, 512);
|
char* buf = taosMemoryCalloc(1, 128 + taosArrayGetSize(pFile->pSst) * 16);
|
||||||
sprintf(buf, "[current: %s,", pFile->pCurrent);
|
sprintf(buf, "[current: %s,", pFile->pCurrent);
|
||||||
sprintf(buf + strlen(buf), "MANIFEST: %s,", pFile->pMainfest);
|
sprintf(buf + strlen(buf), "MANIFEST: %s,", pFile->pMainfest);
|
||||||
sprintf(buf + strlen(buf), "options: %s,", pFile->pOptions);
|
sprintf(buf + strlen(buf), "options: %s,", pFile->pOptions);
|
||||||
|
@ -482,8 +482,8 @@ int32_t streamSnapWrite(SStreamSnapWriter* pWriter, uint8_t* pData, uint32_t nDa
|
||||||
}
|
}
|
||||||
int32_t streamSnapWriterClose(SStreamSnapWriter* pWriter, int8_t rollback) {
|
int32_t streamSnapWriterClose(SStreamSnapWriter* pWriter, int8_t rollback) {
|
||||||
SStreamSnapHandle* handle = &pWriter->handle;
|
SStreamSnapHandle* handle = &pWriter->handle;
|
||||||
if (qDebugFlag & DEBUG_DEBUG) {
|
if (qDebugFlag & DEBUG_TRACE) {
|
||||||
char* buf = (char*)taosMemoryMalloc(1024);
|
char* buf = (char*)taosMemoryMalloc(128 + taosArrayGetSize(handle->pFileList) * 16);
|
||||||
int n = sprintf(buf, "[");
|
int n = sprintf(buf, "[");
|
||||||
for (int i = 0; i < taosArrayGetSize(handle->pFileList); i++) {
|
for (int i = 0; i < taosArrayGetSize(handle->pFileList); i++) {
|
||||||
SBackendFileItem* item = taosArrayGet(handle->pFileList, i);
|
SBackendFileItem* item = taosArrayGet(handle->pFileList, i);
|
||||||
|
|
|
@ -221,7 +221,6 @@ SStreamState* streamStateOpen(char* path, void* pTask, bool specPath, int32_t sz
|
||||||
}
|
}
|
||||||
|
|
||||||
pState->pTdbState->pOwner = pTask;
|
pState->pTdbState->pOwner = pTask;
|
||||||
pState->checkPointId = 0;
|
|
||||||
|
|
||||||
return pState;
|
return pState;
|
||||||
|
|
||||||
|
@ -274,7 +273,6 @@ int32_t streamStateCommit(SStreamState* pState) {
|
||||||
SStreamSnapshot* pShot = getSnapshot(pState->pFileState);
|
SStreamSnapshot* pShot = getSnapshot(pState->pFileState);
|
||||||
flushSnapshot(pState->pFileState, pShot, true);
|
flushSnapshot(pState->pFileState, pShot, true);
|
||||||
}
|
}
|
||||||
pState->checkPointId++;
|
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
if (tdbCommit(pState->pTdbState->db, pState->pTdbState->txn) < 0) {
|
if (tdbCommit(pState->pTdbState->db, pState->pTdbState->txn) < 0) {
|
||||||
|
@ -288,7 +286,6 @@ int32_t streamStateCommit(SStreamState* pState) {
|
||||||
TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
|
TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pState->checkPointId++;
|
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,9 @@
|
||||||
#define DEFAULT_MAX_STREAM_BUFFER_SIZE (128 * 1024 * 1024)
|
#define DEFAULT_MAX_STREAM_BUFFER_SIZE (128 * 1024 * 1024)
|
||||||
#define MIN_NUM_OF_ROW_BUFF 10240
|
#define MIN_NUM_OF_ROW_BUFF 10240
|
||||||
|
|
||||||
|
#define TASK_KEY "streamFileState"
|
||||||
|
#define STREAM_STATE_INFO_NAME "StreamStateCheckPoint"
|
||||||
|
|
||||||
struct SStreamFileState {
|
struct SStreamFileState {
|
||||||
SList* usedBuffs;
|
SList* usedBuffs;
|
||||||
SList* freeBuffs;
|
SList* freeBuffs;
|
||||||
|
@ -113,6 +116,15 @@ void* sessionCreateStateKey(SRowBuffPos* pPos, int64_t num) {
|
||||||
return pStateKey;
|
return pStateKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void streamFileStateDecode(TSKEY* pKey, void* pBuff, int32_t len) { pBuff = taosDecodeFixedI64(pBuff, pKey); }
|
||||||
|
|
||||||
|
static void streamFileStateEncode(TSKEY* pKey, void** pVal, int32_t* pLen) {
|
||||||
|
*pLen = sizeof(TSKEY);
|
||||||
|
(*pVal) = taosMemoryCalloc(1, *pLen);
|
||||||
|
void* buff = *pVal;
|
||||||
|
taosEncodeFixedI64(&buff, *pKey);
|
||||||
|
}
|
||||||
|
|
||||||
SStreamFileState* streamFileStateInit(int64_t memSize, uint32_t keySize, uint32_t rowSize, uint32_t selectRowSize,
|
SStreamFileState* streamFileStateInit(int64_t memSize, uint32_t keySize, uint32_t rowSize, uint32_t selectRowSize,
|
||||||
GetTsFun fp, void* pFile, TSKEY delMark, const char* taskId, int64_t checkpointId,
|
GetTsFun fp, void* pFile, TSKEY delMark, const char* taskId, int64_t checkpointId,
|
||||||
int8_t type) {
|
int8_t type) {
|
||||||
|
@ -181,6 +193,15 @@ SStreamFileState* streamFileStateInit(int64_t memSize, uint32_t keySize, uint32_
|
||||||
recoverSesssion(pFileState, checkpointId);
|
recoverSesssion(pFileState, checkpointId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* valBuf = NULL;
|
||||||
|
int32_t len = 0;
|
||||||
|
int32_t code = streamDefaultGet_rocksdb(pFileState->pFileStore, STREAM_STATE_INFO_NAME, &valBuf, &len);
|
||||||
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
|
ASSERT(len == sizeof(TSKEY));
|
||||||
|
streamFileStateDecode(&pFileState->flushMark, valBuf, len);
|
||||||
|
qDebug("===stream===flushMark read:%" PRId64, pFileState->flushMark);
|
||||||
|
}
|
||||||
|
taosMemoryFreeClear(valBuf);
|
||||||
return pFileState;
|
return pFileState;
|
||||||
|
|
||||||
_error:
|
_error:
|
||||||
|
@ -506,15 +527,6 @@ SStreamSnapshot* getSnapshot(SStreamFileState* pFileState) {
|
||||||
return pFileState->usedBuffs;
|
return pFileState->usedBuffs;
|
||||||
}
|
}
|
||||||
|
|
||||||
void streamFileStateDecode(TSKEY* pKey, void* pBuff, int32_t len) { pBuff = taosDecodeFixedI64(pBuff, pKey); }
|
|
||||||
|
|
||||||
void streamFileStateEncode(TSKEY* pKey, void** pVal, int32_t* pLen) {
|
|
||||||
*pLen = sizeof(TSKEY);
|
|
||||||
(*pVal) = taosMemoryCalloc(1, *pLen);
|
|
||||||
void* buff = *pVal;
|
|
||||||
taosEncodeFixedI64(&buff, *pKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot, bool flushState) {
|
int32_t flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot, bool flushState) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SListIter iter = {0};
|
SListIter iter = {0};
|
||||||
|
@ -538,6 +550,7 @@ int32_t flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pPos->beFlushed = true;
|
pPos->beFlushed = true;
|
||||||
|
pFileState->flushMark = TMAX(pFileState->flushMark, pFileState->getTs(pPos->pKey));
|
||||||
|
|
||||||
qDebug("===stream===flushed start:%" PRId64, pFileState->getTs(pPos->pKey));
|
qDebug("===stream===flushed start:%" PRId64, pFileState->getTs(pPos->pKey));
|
||||||
if (streamStateGetBatchSize(batch) >= BATCH_LIMIT) {
|
if (streamStateGetBatchSize(batch) >= BATCH_LIMIT) {
|
||||||
|
@ -565,24 +578,12 @@ int32_t flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot,
|
||||||
pFileState->id, numOfElems, BATCH_LIMIT, elapsed);
|
pFileState->id, numOfElems, BATCH_LIMIT, elapsed);
|
||||||
|
|
||||||
if (flushState) {
|
if (flushState) {
|
||||||
const char* taskKey = "streamFileState";
|
void* valBuf = NULL;
|
||||||
{
|
int32_t len = 0;
|
||||||
char keyBuf[128] = {0};
|
streamFileStateEncode(&pFileState->flushMark, &valBuf, &len);
|
||||||
void* valBuf = NULL;
|
qDebug("===stream===flushMark write:%" PRId64, pFileState->flushMark);
|
||||||
int32_t len = 0;
|
streamStatePutBatch(pFileState->pFileStore, "default", batch, STREAM_STATE_INFO_NAME, valBuf, len, 0);
|
||||||
sprintf(keyBuf, "%s:%" PRId64 "", taskKey, ((SStreamState*)pFileState->pFileStore)->checkPointId);
|
taosMemoryFree(valBuf);
|
||||||
streamFileStateEncode(&pFileState->flushMark, &valBuf, &len);
|
|
||||||
streamStatePutBatch(pFileState->pFileStore, "default", batch, keyBuf, valBuf, len, 0);
|
|
||||||
taosMemoryFree(valBuf);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
char keyBuf[128] = {0};
|
|
||||||
char valBuf[64] = {0};
|
|
||||||
int32_t len = 0;
|
|
||||||
memcpy(keyBuf, taskKey, strlen(taskKey));
|
|
||||||
len = sprintf(valBuf, "%" PRId64 "", ((SStreamState*)pFileState->pFileStore)->checkPointId);
|
|
||||||
code = streamStatePutBatch(pFileState->pFileStore, "default", batch, keyBuf, valBuf, len, 0);
|
|
||||||
}
|
|
||||||
streamStatePutBatch_rocksdb(pFileState->pFileStore, batch);
|
streamStatePutBatch_rocksdb(pFileState->pFileStore, batch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -591,26 +592,23 @@ int32_t flushSnapshot(SStreamFileState* pFileState, SStreamSnapshot* pSnapshot,
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t forceRemoveCheckpoint(SStreamFileState* pFileState, int64_t checkpointId) {
|
int32_t forceRemoveCheckpoint(SStreamFileState* pFileState, int64_t checkpointId) {
|
||||||
const char* taskKey = "streamFileState";
|
|
||||||
char keyBuf[128] = {0};
|
char keyBuf[128] = {0};
|
||||||
sprintf(keyBuf, "%s:%" PRId64 "", taskKey, checkpointId);
|
sprintf(keyBuf, "%s:%" PRId64 "", TASK_KEY, checkpointId);
|
||||||
return streamDefaultDel_rocksdb(pFileState->pFileStore, keyBuf);
|
return streamDefaultDel_rocksdb(pFileState->pFileStore, keyBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getSnapshotIdList(SStreamFileState* pFileState, SArray* list) {
|
int32_t getSnapshotIdList(SStreamFileState* pFileState, SArray* list) {
|
||||||
const char* taskKey = "streamFileState";
|
return streamDefaultIterGet_rocksdb(pFileState->pFileStore, TASK_KEY, NULL, list);
|
||||||
return streamDefaultIterGet_rocksdb(pFileState->pFileStore, taskKey, NULL, list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t deleteExpiredCheckPoint(SStreamFileState* pFileState, TSKEY mark) {
|
int32_t deleteExpiredCheckPoint(SStreamFileState* pFileState, TSKEY mark) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
const char* taskKey = "streamFileState";
|
|
||||||
int64_t maxCheckPointId = 0;
|
int64_t maxCheckPointId = 0;
|
||||||
{
|
{
|
||||||
char buf[128] = {0};
|
char buf[128] = {0};
|
||||||
void* val = NULL;
|
void* val = NULL;
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
memcpy(buf, taskKey, strlen(taskKey));
|
memcpy(buf, TASK_KEY, strlen(TASK_KEY));
|
||||||
code = streamDefaultGet_rocksdb(pFileState->pFileStore, buf, &val, &len);
|
code = streamDefaultGet_rocksdb(pFileState->pFileStore, buf, &val, &len);
|
||||||
if (code != 0 || len == 0 || val == NULL) {
|
if (code != 0 || len == 0 || val == NULL) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
|
@ -624,7 +622,7 @@ int32_t deleteExpiredCheckPoint(SStreamFileState* pFileState, TSKEY mark) {
|
||||||
char buf[128] = {0};
|
char buf[128] = {0};
|
||||||
void* val = 0;
|
void* val = 0;
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
sprintf(buf, "%s:%" PRId64 "", taskKey, i);
|
sprintf(buf, "%s:%" PRId64 "", TASK_KEY, i);
|
||||||
code = streamDefaultGet_rocksdb(pFileState->pFileStore, buf, &val, &len);
|
code = streamDefaultGet_rocksdb(pFileState->pFileStore, buf, &val, &len);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
|
|
|
@ -229,6 +229,7 @@ e
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/ttlChangeOnWrite.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/ttlChangeOnWrite.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compress_tsz1.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compress_tsz1.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compress_tsz2.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/compress_tsz2.py
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/view/non_marterial_view/test_view.py
|
||||||
,,n,system-test,python3 ./test.py -f 0-others/compatibility.py
|
,,n,system-test,python3 ./test.py -f 0-others/compatibility.py
|
||||||
,,n,system-test,python3 ./test.py -f 0-others/tag_index_basic.py
|
,,n,system-test,python3 ./test.py -f 0-others/tag_index_basic.py
|
||||||
,,n,system-test,python3 ./test.py -f 0-others/udfpy_main.py
|
,,n,system-test,python3 ./test.py -f 0-others/udfpy_main.py
|
||||||
|
@ -288,6 +289,7 @@ e
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py -Q 4
|
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/rowlength64k_4.py -Q 4
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/precisionUS.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/precisionUS.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/precisionNS.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/precisionNS.py
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/test_ts4219.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show_tag_index.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/show_tag_index.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/information_schema.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/information_schema.py
|
||||||
|
@ -1181,6 +1183,7 @@ e
|
||||||
,,y,script,./test.sh -f tsim/sma/tsmaCreateInsertQuery.sim
|
,,y,script,./test.sh -f tsim/sma/tsmaCreateInsertQuery.sim
|
||||||
,,y,script,./test.sh -f tsim/sma/rsmaCreateInsertQuery.sim
|
,,y,script,./test.sh -f tsim/sma/rsmaCreateInsertQuery.sim
|
||||||
,,y,script,./test.sh -f tsim/sma/rsmaPersistenceRecovery.sim
|
,,y,script,./test.sh -f tsim/sma/rsmaPersistenceRecovery.sim
|
||||||
|
,,y,script,./test.sh -f tsim/sync/vnodesnapshot-rsma-test.sim
|
||||||
,,n,script,./test.sh -f tsim/valgrind/checkError1.sim
|
,,n,script,./test.sh -f tsim/valgrind/checkError1.sim
|
||||||
,,n,script,./test.sh -f tsim/valgrind/checkError2.sim
|
,,n,script,./test.sh -f tsim/valgrind/checkError2.sim
|
||||||
,,n,script,./test.sh -f tsim/valgrind/checkError3.sim
|
,,n,script,./test.sh -f tsim/valgrind/checkError3.sim
|
||||||
|
|
|
@ -88,7 +88,7 @@ class TDSql:
|
||||||
expectErrNotOccured = False
|
expectErrNotOccured = False
|
||||||
self.errno = e.errno
|
self.errno = e.errno
|
||||||
error_info = repr(e)
|
error_info = repr(e)
|
||||||
self.error_info = error_info[error_info.index('(')+1:-1].split(",")[0].replace("'","")
|
self.error_info = ','.join(error_info[error_info.index('(')+1:-1].split(",")[:-1]).replace("'","")
|
||||||
# self.error_info = (','.join(error_info.split(",")[:-1]).split("(",1)[1:][0]).replace("'","")
|
# self.error_info = (','.join(error_info.split(",")[:-1]).split("(",1)[1:][0]).replace("'","")
|
||||||
if expectErrNotOccured:
|
if expectErrNotOccured:
|
||||||
tdLog.exit("%s(%d) failed: sql:%s, expect error not occured" % (caller.filename, caller.lineno, sql))
|
tdLog.exit("%s(%d) failed: sql:%s, expect error not occured" % (caller.filename, caller.lineno, sql))
|
||||||
|
@ -106,7 +106,7 @@ class TDSql:
|
||||||
tdLog.info("sql:%s, expect error occured" % (sql))
|
tdLog.info("sql:%s, expect error occured" % (sql))
|
||||||
|
|
||||||
if expectErrInfo != None:
|
if expectErrInfo != None:
|
||||||
if expectErrInfo == self.error_info:
|
if expectErrInfo == self.error_info or expectErrInfo in self.error_info:
|
||||||
tdLog.info("sql:%s, expected expectErrInfo %s occured" % (sql, expectErrInfo))
|
tdLog.info("sql:%s, expected expectErrInfo %s occured" % (sql, expectErrInfo))
|
||||||
else:
|
else:
|
||||||
tdLog.exit("%s(%d) failed: sql:%s, expectErrInfo %s occured, but not expected errno %s" % (caller.filename, caller.lineno, sql, self.error_info, expectErrInfo))
|
tdLog.exit("%s(%d) failed: sql:%s, expectErrInfo %s occured, but not expected errno %s" % (caller.filename, caller.lineno, sql, self.error_info, expectErrInfo))
|
||||||
|
|
|
@ -5,7 +5,7 @@ sleep 50
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
#todo wait for streamState checkpoint
|
#todo wait for streamState checkpoint
|
||||||
return 1
|
#return 1
|
||||||
|
|
||||||
print =============== create database with retentions
|
print =============== create database with retentions
|
||||||
sql create database d0 retentions -:7d,5m:21d,15m:365d;
|
sql create database d0 retentions -:7d,5m:21d,15m:365d;
|
||||||
|
|
|
@ -114,7 +114,7 @@ endi
|
||||||
|
|
||||||
vg_ready:
|
vg_ready:
|
||||||
print ====> create stable/child table
|
print ====> create stable/child table
|
||||||
sql create table stb (ts timestamp, c1 int, c2 float, c3 double) tags (t1 int) rollup(sum) watermark 3s,3s max_delay 3s,3s
|
sql create table stb (ts timestamp, c1 float, c2 float, c3 double) tags (t1 int) rollup(sum) watermark 3s,3s max_delay 3s,3s
|
||||||
|
|
||||||
sql show stables
|
sql show stables
|
||||||
if $rows != 1 then
|
if $rows != 1 then
|
||||||
|
@ -167,9 +167,6 @@ system sh/exec.sh -n dnode4 -s start
|
||||||
|
|
||||||
sleep 3000
|
sleep 3000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
print =============== query data of level 1
|
print =============== query data of level 1
|
||||||
sql connect
|
sql connect
|
||||||
sql use db
|
sql use db
|
||||||
|
@ -181,12 +178,21 @@ if $rows != 100 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
print =============== sleep 5s to wait the result
|
||||||
|
sleep 5000
|
||||||
|
|
||||||
print =============== query data of level 2
|
print =============== query data of level 2
|
||||||
sql select * from ct1 where ts > now - 10d
|
sql select * from ct1 where ts > now - 10d
|
||||||
print rows of level 2: $rows
|
|
||||||
print $data00 $data01 $data02
|
print $data00 $data01 $data02
|
||||||
|
print $data10 $data11 $data12
|
||||||
|
if $rows != 100 then
|
||||||
|
print rows of level 2: $rows
|
||||||
|
endi
|
||||||
|
|
||||||
print =============== query data of level 3
|
print =============== query data of level 3
|
||||||
sql select * from ct1
|
sql select * from ct1
|
||||||
print rows of level 3: $rows
|
|
||||||
print $data00 $data01 $data02
|
print $data00 $data01 $data02
|
||||||
|
print $data10 $data11 $data12
|
||||||
|
if $rows != 100 then
|
||||||
|
print rows of level 3: $rows
|
||||||
|
endi
|
|
@ -320,6 +320,7 @@
|
||||||
./test.sh -f tsim/sma/tsmaCreateInsertQuery.sim
|
./test.sh -f tsim/sma/tsmaCreateInsertQuery.sim
|
||||||
./test.sh -f tsim/sma/rsmaCreateInsertQuery.sim
|
./test.sh -f tsim/sma/rsmaCreateInsertQuery.sim
|
||||||
./test.sh -f tsim/sma/rsmaPersistenceRecovery.sim
|
./test.sh -f tsim/sma/rsmaPersistenceRecovery.sim
|
||||||
|
./test.sh -f tsim/sync/vnodesnapshot-rsma-test.sim
|
||||||
./test.sh -f tsim/valgrind/checkError1.sim
|
./test.sh -f tsim/valgrind/checkError1.sim
|
||||||
./test.sh -f tsim/valgrind/checkError2.sim
|
./test.sh -f tsim/valgrind/checkError2.sim
|
||||||
./test.sh -f tsim/valgrind/checkError3.sim
|
./test.sh -f tsim/valgrind/checkError3.sim
|
||||||
|
|
|
@ -0,0 +1,591 @@
|
||||||
|
|
||||||
|
import taos
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
from pathlib import Path
|
||||||
|
sys.path.append(os.path.dirname(Path(__file__).resolve().parent.parent.parent) + "/7-tmq")
|
||||||
|
|
||||||
|
from util.log import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.dnodes import *
|
||||||
|
from util.common import *
|
||||||
|
from util.sqlset import *
|
||||||
|
from tmqCommon import *
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
"""This test case is used to veirfy the tmq consume data from non marterial view
|
||||||
|
"""
|
||||||
|
def init(self, conn, logSql, replicaVar=1):
|
||||||
|
self.replicaVar = int(replicaVar)
|
||||||
|
tdLog.debug(f"start to excute {__file__}")
|
||||||
|
tdSql.init(conn.cursor())
|
||||||
|
self.setsql = TDSetSql()
|
||||||
|
|
||||||
|
# db info
|
||||||
|
self.dbname = "view_db"
|
||||||
|
self.stbname = 'stb'
|
||||||
|
self.ctbname_list = ["ct1", "ct2"]
|
||||||
|
self.stable_column_dict = {
|
||||||
|
'ts': 'timestamp',
|
||||||
|
'col1': 'float',
|
||||||
|
'col2': 'int',
|
||||||
|
}
|
||||||
|
self.tag_dict = {
|
||||||
|
'ctbname': 'binary(10)'
|
||||||
|
}
|
||||||
|
|
||||||
|
def prepare_data(self, conn=None):
|
||||||
|
"""Create the db and data for test
|
||||||
|
"""
|
||||||
|
tdLog.debug("Start to prepare the data")
|
||||||
|
if not conn:
|
||||||
|
conn = tdSql
|
||||||
|
# create datebase
|
||||||
|
conn.execute(f"create database {self.dbname}")
|
||||||
|
conn.execute(f"use {self.dbname}")
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
# create stable
|
||||||
|
conn.execute(self.setsql.set_create_stable_sql(self.stbname, self.stable_column_dict, self.tag_dict))
|
||||||
|
tdLog.debug("Create stable {} successfully".format(self.stbname))
|
||||||
|
|
||||||
|
# create child tables
|
||||||
|
for ctname in self.ctbname_list:
|
||||||
|
conn.execute(f"create table {ctname} using {self.stbname} tags('{ctname}');")
|
||||||
|
tdLog.debug("Create child table {} successfully".format(ctname))
|
||||||
|
|
||||||
|
# insert data into child tables
|
||||||
|
conn.execute(f"insert into {ctname} values(now, 1.1, 1)(now+1s, 2.2, 2)(now+2s, 3.3, 3)(now+3s, 4.4, 4)(now+4s, 5.5, 5)(now+5s, 6.6, 6)(now+6s, 7.7, 7)(now+7s, 8.8, 8)(now+8s, 9.9, 9)(now+9s, 10.1, 10);)")
|
||||||
|
tdLog.debug(f"Insert into data to {ctname} successfully")
|
||||||
|
|
||||||
|
def prepare_tmq_data(self, para_dic):
|
||||||
|
tdLog.debug("Start to prepare the tmq data")
|
||||||
|
tmqCom.initConsumerTable()
|
||||||
|
tdCom.create_database(tdSql, para_dic["dbName"], para_dic["dropFlag"], vgroups=para_dic["vgroups"], replica=1)
|
||||||
|
tdLog.info("create stb")
|
||||||
|
tdCom.create_stable(tdSql, dbname=para_dic["dbName"], stbname=para_dic["stbName"], column_elm_list=para_dic['colSchema'], tag_elm_list=para_dic['tagSchema'])
|
||||||
|
tdLog.info("create ctb")
|
||||||
|
tdCom.create_ctable(tdSql, dbname=para_dic["dbName"], stbname=para_dic["stbName"],tag_elm_list=para_dic['tagSchema'], count=para_dic["ctbNum"], default_ctbname_prefix=para_dic['ctbPrefix'])
|
||||||
|
tdLog.info("insert data")
|
||||||
|
tmqCom.insert_data(tdSql, para_dic["dbName"], para_dic["ctbPrefix"], para_dic["ctbNum"], para_dic["rowsPerTbl"], para_dic["batchNum"], para_dic["startTs"])
|
||||||
|
tdLog.debug("Finish to prepare the tmq data")
|
||||||
|
|
||||||
|
def check_view_num(self, num):
|
||||||
|
tdSql.query("show views;")
|
||||||
|
rows = tdSql.queryRows
|
||||||
|
assert(rows == num)
|
||||||
|
tdLog.debug(f"Verify the view number successfully")
|
||||||
|
|
||||||
|
def create_user(self, username, password):
|
||||||
|
tdSql.execute(f"create user {username} pass '{password}';")
|
||||||
|
tdLog.debug("Create user {} with password {} successfully".format(username, password))
|
||||||
|
|
||||||
|
def check_permissions(self, username, db_name, permission_dict, view_name=None):
|
||||||
|
"""
|
||||||
|
:param permission_dict: {'db': ["read", "write], 'view': ["read", "write", "alter"]}
|
||||||
|
"""
|
||||||
|
tdSql.query("select * from information_schema.ins_user_privileges;")
|
||||||
|
for item in permission_dict.keys():
|
||||||
|
if item == "db":
|
||||||
|
for permission in permission_dict[item]:
|
||||||
|
assert((username, permission, db_name, "", "", "") in tdSql.queryResult)
|
||||||
|
tdLog.debug(f"Verify the {item} {db_name} {permission} permission successfully")
|
||||||
|
elif item == "view":
|
||||||
|
for permission in permission_dict[item]:
|
||||||
|
assert((username, permission, db_name, view_name, "", "view") in tdSql.queryResult)
|
||||||
|
tdLog.debug(f"Verify the {item} {db_name} {view_name} {permission} permission successfully")
|
||||||
|
else:
|
||||||
|
raise Exception(f"Invalid permission type: {item}")
|
||||||
|
|
||||||
|
def test_create_view_from_one_database(self):
|
||||||
|
"""This test case is used to verify the create view from one database
|
||||||
|
"""
|
||||||
|
self.prepare_data()
|
||||||
|
tdSql.execute(f"create view v1 as select * from {self.stbname};")
|
||||||
|
self.check_view_num(1)
|
||||||
|
tdSql.error(f'create view v1 as select * from {self.stbname};', expectErrInfo='view already exists in db')
|
||||||
|
tdSql.error(f'create view db2.v2 as select * from {self.stbname};', expectErrInfo='Fail to get table info, error: Database not exist')
|
||||||
|
tdSql.error(f'create view v2 as select c2 from {self.stbname};', expectErrInfo='Invalid column name: c2')
|
||||||
|
tdSql.error(f'create view v2 as select ts, col1 from tt1;', expectErrInfo='Fail to get table info, error: Table does not exist')
|
||||||
|
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdLog.debug("Finish test case 'test_create_view_from_one_database'")
|
||||||
|
|
||||||
|
def test_create_view_from_multi_database(self):
|
||||||
|
"""This test case is used to verify the create view from multi database
|
||||||
|
"""
|
||||||
|
self.prepare_data()
|
||||||
|
tdSql.execute(f"create view v1 as select * from view_db.{self.stbname};")
|
||||||
|
self.check_view_num(1)
|
||||||
|
|
||||||
|
self.dbname = "view_db2"
|
||||||
|
self.prepare_data()
|
||||||
|
tdSql.execute(f"create view v1 as select * from view_db2.{self.stbname};")
|
||||||
|
tdSql.execute(f"create view v2 as select * from view_db.v1;")
|
||||||
|
self.check_view_num(2)
|
||||||
|
|
||||||
|
self.dbname = "view_db"
|
||||||
|
tdSql.execute(f"drop database view_db;")
|
||||||
|
tdSql.execute(f"drop database view_db2;")
|
||||||
|
tdLog.debug("Finish test case 'test_create_view_from_multi_database'")
|
||||||
|
|
||||||
|
def test_create_view_name_params(self):
|
||||||
|
"""This test case is used to verify the create view with different view name params
|
||||||
|
"""
|
||||||
|
self.prepare_data()
|
||||||
|
tdSql.execute(f"create view v1 as select * from {self.stbname};")
|
||||||
|
self.check_view_num(1)
|
||||||
|
tdSql.error(f"create view v/2 as select * from {self.stbname};", expectErrInfo='syntax error near "/2 as select * from stb;"')
|
||||||
|
tdSql.execute(f"create view v2 as select ts, col1 from {self.stbname};")
|
||||||
|
self.check_view_num(2)
|
||||||
|
view_name_192_characters = "rzuoxoIXilAGgzNjYActiQwgzZK7PZYpDuaOe1lSJMFMVYXaexh1OfMmk3LvJcQbTeXXW7uGJY8IHuweHF73VHgoZgf0waO33YpZiTKfDQbdWtN4YmR2eWjL84ZtkfjM4huCP6lCysbDMj8YNwWksTdUq70LIyNhHp2V8HhhxyYSkREYFLJ1kOE78v61MQT6"
|
||||||
|
tdSql.execute(f"create view {view_name_192_characters} as select * from {self.stbname};")
|
||||||
|
self.check_view_num(3)
|
||||||
|
tdSql.error(f"create view {view_name_192_characters}1 as select * from {self.stbname};", expectErrInfo='Invalid identifier name: rzuoxoixilaggznjyactiqwgzzk7pzypduaoe1lsjmfmvyxaexh1ofmmk3lvjcqbtexxw7ugjy8ihuwehf73vhgozgf0wao33ypzitkfdqbdwtn4ymr2ewjl84ztkfjm4hucp6lcysbdmj8ynwwkstduq70liynhhp2v8hhhxyyskreyflj1koe78v61mqt61 as select * from stb;')
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdLog.debug("Finish test case 'test_create_view_name_params'")
|
||||||
|
|
||||||
|
def test_create_view_query(self):
|
||||||
|
"""This test case is used to verify the create view with different data type in query
|
||||||
|
"""
|
||||||
|
self.prepare_data()
|
||||||
|
# add different data type table
|
||||||
|
tdSql.execute(f"create table tb (ts timestamp, c1 int, c2 int unsigned, c3 bigint, c4 bigint unsigned, c5 float, c6 double, c7 binary(16), c8 smallint, c9 smallint unsigned, c10 tinyint, c11 tinyint unsigned, c12 bool, c13 varchar(16), c14 nchar(8), c15 geometry(21), c16 varbinary(16));")
|
||||||
|
tdSql.execute(f"create view v1 as select ts, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16 from tb;")
|
||||||
|
# check data type in create view sql
|
||||||
|
tdSql.query("desc v1;")
|
||||||
|
res = tdSql.queryResult
|
||||||
|
data_type_list = [res[index][1] for index in range(len(res))]
|
||||||
|
tdLog.debug(data_type_list)
|
||||||
|
assert('TIMESTAMP' in data_type_list and 'INT' in data_type_list and 'INT UNSIGNED' in data_type_list and 'BIGINT' in data_type_list and 'BIGINT UNSIGNED' in data_type_list and 'FLOAT' in data_type_list and 'DOUBLE' in data_type_list and 'VARCHAR' in data_type_list and 'SMALLINT' in data_type_list and 'SMALLINT UNSIGNED' in data_type_list and 'TINYINT' in data_type_list and 'TINYINT UNSIGNED' in data_type_list and 'BOOL' in data_type_list and 'VARCHAR' in data_type_list and 'NCHAR' in data_type_list and 'GEOMETRY' in data_type_list and 'VARBINARY' in data_type_list)
|
||||||
|
tdSql.execute("create view v2 as select * from tb where c1 >5 and c7 like '%ab%';")
|
||||||
|
self.check_view_num(2)
|
||||||
|
tdSql.error("create view v3 as select * from tb where c1 like '%ab%';", expectErrInfo='Invalid value type')
|
||||||
|
tdSql.execute("create view v3 as select first(ts), sum(c1) from tb group by c2 having avg(c4) > 0;")
|
||||||
|
tdSql.execute("create view v4 as select _wstart,sum(c6) from tb interval(10s);")
|
||||||
|
tdSql.execute("create view v5 as select * from tb join v2 on tb.ts = v2.ts;")
|
||||||
|
tdSql.execute("create view v6 as select * from (select ts, c1, c2 from (select * from v2));")
|
||||||
|
self.check_view_num(6)
|
||||||
|
for v in ['v1', 'v2', 'v3', 'v4', 'v5', 'v6']:
|
||||||
|
tdSql.execute(f"drop view {v};")
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdLog.debug("Finish test case 'test_create_view_query'")
|
||||||
|
|
||||||
|
def test_show_view(self):
|
||||||
|
"""This test case is used to verify the show view
|
||||||
|
"""
|
||||||
|
self.prepare_data()
|
||||||
|
tdSql.execute(f"create view v1 as select * from {self.ctbname_list[0]};")
|
||||||
|
|
||||||
|
# query from show sql
|
||||||
|
tdSql.query("show views;")
|
||||||
|
res = tdSql.queryResult
|
||||||
|
assert(res[0][0] == 'v1' and res[0][1] == 'view_db' and res[0][2] == 'root' and res[0][4] == 'NORMAL' and res[0][5] == 'select * from ct1;')
|
||||||
|
|
||||||
|
# show create sql
|
||||||
|
tdSql.query("show create view v1;")
|
||||||
|
res = tdSql.queryResult
|
||||||
|
assert(res[0][1] == 'CREATE VIEW `view_db`.`v1` AS select * from ct1;')
|
||||||
|
|
||||||
|
# query from desc results
|
||||||
|
tdSql.query("desc view_db.v1;")
|
||||||
|
res = tdSql.queryResult
|
||||||
|
assert(res[0][1] == 'TIMESTAMP' and res[1][1] == 'FLOAT' and res[2][1] == 'INT')
|
||||||
|
|
||||||
|
# query from system table
|
||||||
|
tdSql.query("select * from information_schema.ins_views;")
|
||||||
|
res = tdSql.queryResult
|
||||||
|
assert(res[0][0] == 'v1' and res[0][1] == 'view_db' and res[0][2] == 'root' and res[0][4] == 'NORMAL' and res[0][5] == 'select * from ct1;')
|
||||||
|
tdSql.error("show db3.views;", expectErrInfo='Database not exist')
|
||||||
|
tdSql.error("desc viewx;", expectErrInfo='Table does not exist')
|
||||||
|
tdSql.error(f"show create view {self.dbname}.viewx;", expectErrInfo='view not exists in db')
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdSql.error("show views;", expectErrInfo='Database not exist')
|
||||||
|
tdLog.debug("Finish test case 'test_show_view'")
|
||||||
|
|
||||||
|
def test_drop_view(self):
|
||||||
|
"""This test case is used to verify the drop view
|
||||||
|
"""
|
||||||
|
self.prepare_data()
|
||||||
|
self.dbname = "view_db2"
|
||||||
|
self.prepare_data()
|
||||||
|
tdSql.execute("create view view_db.v1 as select * from view_db.stb;")
|
||||||
|
tdSql.execute("create view view_db2.v1 as select * from view_db2.stb;")
|
||||||
|
# delete view without database name
|
||||||
|
tdSql.execute("drop view v1;")
|
||||||
|
# delete view with database name
|
||||||
|
tdSql.execute("drop view view_db.v1;")
|
||||||
|
# delete non exist view
|
||||||
|
tdSql.error("drop view view_db.v11;", expectErrInfo='view not exists in db')
|
||||||
|
tdSql.execute("drop database view_db")
|
||||||
|
tdSql.execute("drop database view_db2;")
|
||||||
|
self.dbname = "view_db"
|
||||||
|
tdLog.debug("Finish test case 'test_drop_view'")
|
||||||
|
|
||||||
|
def test_view_permission_db_all_view_all(self):
|
||||||
|
"""This test case is used to verify the view permission with db all and view all,
|
||||||
|
the time sleep to wait the permission take effect
|
||||||
|
"""
|
||||||
|
self.prepare_data()
|
||||||
|
username = "view_test"
|
||||||
|
password = "test"
|
||||||
|
self.create_user(username, password)
|
||||||
|
# grant all db permission to user
|
||||||
|
tdSql.execute("grant all on view_db.* to view_test;")
|
||||||
|
|
||||||
|
conn = taos.connect(user=username, password=password)
|
||||||
|
conn.execute(f"use {self.dbname};")
|
||||||
|
conn.execute("create view v1 as select * from stb;")
|
||||||
|
res = conn.query("show views;")
|
||||||
|
assert(len(res.fetch_all()) == 1)
|
||||||
|
tdLog.debug(f"Verify the show view permission of user '{username}' with db all and view all successfully")
|
||||||
|
self.check_permissions("view_test", "view_db", {"db": ["read", "write"], "view": ["read", "write", "alter"]}, "v1")
|
||||||
|
tdLog.debug(f"Verify the view permission from system table successfully")
|
||||||
|
time.sleep(2)
|
||||||
|
conn.execute("drop view v1;")
|
||||||
|
tdSql.execute("revoke all on view_db.* from view_test;")
|
||||||
|
tdSql.execute(f"drop database {self.dbname};")
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
# prepare data by user 'view_test'
|
||||||
|
self.prepare_data(conn)
|
||||||
|
|
||||||
|
conn.execute("create view v1 as select * from stb;")
|
||||||
|
res = conn.query("show views;")
|
||||||
|
assert(len(res.fetch_all()) == 1)
|
||||||
|
tdLog.debug(f"Verify the view permission of user '{username}' with db all and view all successfully")
|
||||||
|
self.check_permissions("view_test", "view_db", {"db": ["read", "write"], "view": ["read", "write", "alter"]}, "v1")
|
||||||
|
tdLog.debug(f"Verify the view permission from system table successfully")
|
||||||
|
time.sleep(2)
|
||||||
|
conn.execute("drop view v1;")
|
||||||
|
tdSql.execute("revoke all on view_db.* from view_test;")
|
||||||
|
tdSql.execute("revoke all on view_db.v1 from view_test;")
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdSql.execute("drop user view_test;")
|
||||||
|
tdLog.debug("Finish test case 'test_view_permission_db_all_view_all'")
|
||||||
|
|
||||||
|
def test_view_permission_db_write_view_all(self):
|
||||||
|
"""This test case is used to verify the view permission with db write and view all
|
||||||
|
"""
|
||||||
|
username = "view_test"
|
||||||
|
password = "test"
|
||||||
|
self.create_user(username, password)
|
||||||
|
conn = taos.connect(user=username, password=password)
|
||||||
|
self.prepare_data(conn)
|
||||||
|
conn.execute("create view v1 as select * from stb;")
|
||||||
|
tdSql.execute("revoke read on view_db.* from view_test;")
|
||||||
|
self.check_permissions("view_test", "view_db", {"db": ["write"], "view": ["read", "write", "alter"]}, "v1")
|
||||||
|
# create view permission error
|
||||||
|
try:
|
||||||
|
conn.execute("create view v2 as select * from v1;")
|
||||||
|
except Exception as ex:
|
||||||
|
assert("[0x2644]: Permission denied or target object not exist" in str(ex))
|
||||||
|
# query from view permission error
|
||||||
|
try:
|
||||||
|
conn.query("select * from v1;")
|
||||||
|
except Exception as ex:
|
||||||
|
assert("[0x2644]: Permission denied or target object not exist" in str(ex))
|
||||||
|
# view query permission
|
||||||
|
res = conn.query("show views;")
|
||||||
|
assert(len(res.fetch_all()) == 1)
|
||||||
|
time.sleep(2)
|
||||||
|
conn.execute("drop view v1;")
|
||||||
|
tdSql.execute("revoke write on view_db.* from view_test;")
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdSql.execute("drop user view_test;")
|
||||||
|
tdLog.debug("Finish test case 'test_view_permission_db_write_view_all'")
|
||||||
|
|
||||||
|
def test_view_permission_db_write_view_read(self):
|
||||||
|
"""This test case is used to verify the view permission with db write and view read
|
||||||
|
"""
|
||||||
|
username = "view_test"
|
||||||
|
password = "test"
|
||||||
|
self.create_user(username, password)
|
||||||
|
conn = taos.connect(user=username, password=password)
|
||||||
|
self.prepare_data()
|
||||||
|
|
||||||
|
tdSql.execute("create view v1 as select * from stb;")
|
||||||
|
tdSql.execute("grant write on view_db.* to view_test;")
|
||||||
|
tdSql.execute("grant read on view_db.v1 to view_test;")
|
||||||
|
|
||||||
|
conn.execute(f"use {self.dbname};")
|
||||||
|
time.sleep(2)
|
||||||
|
res = conn.query("select * from v1;")
|
||||||
|
assert(len(res.fetch_all()) == 20)
|
||||||
|
|
||||||
|
conn.execute("create view v2 as select * from v1;")
|
||||||
|
# create view from super table of database
|
||||||
|
try:
|
||||||
|
conn.execute("create view v3 as select * from stb;")
|
||||||
|
except Exception as ex:
|
||||||
|
assert("[0x2644]: Permission denied or target object not exist" in str(ex))
|
||||||
|
time.sleep(2)
|
||||||
|
conn.execute("drop view v2;")
|
||||||
|
try:
|
||||||
|
conn.execute("drop view v1;")
|
||||||
|
except Exception as ex:
|
||||||
|
assert("[0x2644]: Permission denied or target object not exist" in str(ex))
|
||||||
|
tdSql.execute("revoke read on view_db.v1 from view_test;")
|
||||||
|
tdSql.execute("revoke write on view_db.* from view_test;")
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdSql.execute("drop user view_test;")
|
||||||
|
tdLog.debug("Finish test case 'test_view_permission_db_write_view_read'")
|
||||||
|
|
||||||
|
def test_view_permission_db_write_view_alter(self):
|
||||||
|
"""This test case is used to verify the view permission with db write and view alter
|
||||||
|
"""
|
||||||
|
username = "view_test"
|
||||||
|
password = "test"
|
||||||
|
self.create_user(username, password)
|
||||||
|
conn = taos.connect(user=username, password=password)
|
||||||
|
self.prepare_data()
|
||||||
|
|
||||||
|
tdSql.execute("create view v1 as select * from stb;")
|
||||||
|
tdSql.execute("grant write on view_db.* to view_test;")
|
||||||
|
tdSql.execute("grant alter on view_db.v1 to view_test;")
|
||||||
|
try:
|
||||||
|
conn.execute(f"use {self.dbname};")
|
||||||
|
conn.execute("select * from v1;")
|
||||||
|
except Exception as ex:
|
||||||
|
assert("[0x2644]: Permission denied or target object not exist" in str(ex))
|
||||||
|
time.sleep(2)
|
||||||
|
conn.execute("drop view v1;")
|
||||||
|
tdSql.execute("revoke write on view_db.* from view_test;")
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdSql.execute("drop user view_test;")
|
||||||
|
tdLog.debug("Finish test case 'test_view_permission_db_write_view_alter'")
|
||||||
|
|
||||||
|
def test_view_permission_db_read_view_all(self):
|
||||||
|
"""This test case is used to verify the view permission with db read and view all
|
||||||
|
"""
|
||||||
|
username = "view_test"
|
||||||
|
password = "test"
|
||||||
|
self.create_user(username, password)
|
||||||
|
conn = taos.connect(user=username, password=password)
|
||||||
|
self.prepare_data()
|
||||||
|
|
||||||
|
tdSql.execute("create view v1 as select * from stb;")
|
||||||
|
tdSql.execute("grant read on view_db.* to view_test;")
|
||||||
|
tdSql.execute("grant all on view_db.v1 to view_test;")
|
||||||
|
try:
|
||||||
|
conn.execute(f"use {self.dbname};")
|
||||||
|
conn.execute("create view v2 as select * from v1;")
|
||||||
|
except Exception as ex:
|
||||||
|
assert("[0x2644]: Permission denied or target object not exist" in str(ex))
|
||||||
|
time.sleep(2)
|
||||||
|
res = conn.query("select * from v1;")
|
||||||
|
assert(len(res.fetch_all()) == 20)
|
||||||
|
conn.execute("drop view v1;")
|
||||||
|
tdSql.execute("revoke read on view_db.* from view_test;")
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdSql.execute("drop user view_test;")
|
||||||
|
tdLog.debug("Finish test case 'test_view_permission_db_read_view_all'")
|
||||||
|
|
||||||
|
def test_view_permission_db_read_view_alter(self):
|
||||||
|
"""This test case is used to verify the view permission with db read and view alter
|
||||||
|
"""
|
||||||
|
username = "view_test"
|
||||||
|
password = "test"
|
||||||
|
self.create_user(username, password)
|
||||||
|
conn = taos.connect(user=username, password=password)
|
||||||
|
self.prepare_data()
|
||||||
|
|
||||||
|
tdSql.execute("create view v1 as select * from stb;")
|
||||||
|
tdSql.execute("grant read on view_db.* to view_test;")
|
||||||
|
tdSql.execute("grant alter on view_db.v1 to view_test;")
|
||||||
|
try:
|
||||||
|
conn.execute(f"use {self.dbname};")
|
||||||
|
conn.execute("select * from v1;")
|
||||||
|
except Exception as ex:
|
||||||
|
assert("[0x2644]: Permission denied or target object not exist" in str(ex))
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
conn.execute("drop view v1;")
|
||||||
|
tdSql.execute("revoke read on view_db.* from view_test;")
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdSql.execute("drop user view_test;")
|
||||||
|
tdLog.debug("Finish test case 'test_view_permission_db_read_view_alter'")
|
||||||
|
|
||||||
|
def test_view_permission_db_read_view_read(self):
|
||||||
|
"""This test case is used to verify the view permission with db read and view read
|
||||||
|
"""
|
||||||
|
username = "view_test"
|
||||||
|
password = "test"
|
||||||
|
self.create_user(username, password)
|
||||||
|
conn = taos.connect(user=username, password=password)
|
||||||
|
self.prepare_data()
|
||||||
|
|
||||||
|
tdSql.execute("create view v1 as select * from stb;")
|
||||||
|
tdSql.execute("grant read on view_db.* to view_test;")
|
||||||
|
tdSql.execute("grant read on view_db.v1 to view_test;")
|
||||||
|
conn.execute(f"use {self.dbname};")
|
||||||
|
time.sleep(2)
|
||||||
|
res = conn.query("select * from v1;")
|
||||||
|
assert(len(res.fetch_all()) == 20)
|
||||||
|
try:
|
||||||
|
conn.execute("drop view v1;")
|
||||||
|
except Exception as ex:
|
||||||
|
assert("[0x2644]: Permission denied or target object not exist" in str(ex))
|
||||||
|
tdSql.execute("revoke read on view_db.* from view_test;")
|
||||||
|
tdSql.execute("revoke read on view_db.v1 from view_test;")
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdSql.execute("drop user view_test;")
|
||||||
|
tdLog.debug("Finish test case 'test_view_permission_db_read_view_read'")
|
||||||
|
|
||||||
|
def test_query_from_view(self):
|
||||||
|
"""This test case is used to verify the query from view
|
||||||
|
"""
|
||||||
|
self.prepare_data()
|
||||||
|
view_name_list = []
|
||||||
|
|
||||||
|
# common query from super table
|
||||||
|
tdSql.execute(f"create view v1 as select * from {self.stbname};")
|
||||||
|
tdSql.query(f"select * from v1;")
|
||||||
|
rows = tdSql.queryRows
|
||||||
|
assert(rows == 20)
|
||||||
|
view_name_list.append("v1")
|
||||||
|
tdLog.debug("Verify the query from super table successfully")
|
||||||
|
|
||||||
|
# common query from child table
|
||||||
|
tdSql.execute(f"create view v2 as select * from {self.ctbname_list[0]};")
|
||||||
|
tdSql.query(f"select * from v2;")
|
||||||
|
rows = tdSql.queryRows
|
||||||
|
assert(rows == 10)
|
||||||
|
view_name_list.append("v2")
|
||||||
|
tdLog.debug("Verify the query from child table successfully")
|
||||||
|
|
||||||
|
# join query
|
||||||
|
tdSql.execute(f"create view v3 as select * from {self.stbname} join {self.ctbname_list[1]} on {self.ctbname_list[1]}.ts = {self.stbname}.ts;")
|
||||||
|
tdSql.query(f"select * from v3;")
|
||||||
|
rows = tdSql.queryRows
|
||||||
|
assert(rows == 10)
|
||||||
|
view_name_list.append("v3")
|
||||||
|
tdLog.debug("Verify the join query successfully")
|
||||||
|
|
||||||
|
# group by query
|
||||||
|
tdSql.execute(f"create view v4 as select count(*) from {self.stbname} group by tbname;")
|
||||||
|
tdSql.query(f"select * from v4;")
|
||||||
|
rows = tdSql.queryRows
|
||||||
|
assert(rows == 2)
|
||||||
|
res = tdSql.queryResult
|
||||||
|
assert(res[0][0] == 10)
|
||||||
|
view_name_list.append("v4")
|
||||||
|
tdLog.debug("Verify the group by query successfully")
|
||||||
|
|
||||||
|
# partition by query
|
||||||
|
tdSql.execute(f"create view v5 as select sum(col1) from {self.stbname} where col2 > 4 partition by tbname interval(3s);")
|
||||||
|
tdSql.query(f"select * from v5;")
|
||||||
|
rows = tdSql.queryRows
|
||||||
|
assert(rows >= 4)
|
||||||
|
view_name_list.append("v5")
|
||||||
|
tdLog.debug("Verify the partition by query successfully")
|
||||||
|
|
||||||
|
# query from nested view
|
||||||
|
tdSql.execute(f"create view v6 as select * from v5;")
|
||||||
|
tdSql.query(f"select * from v6;")
|
||||||
|
rows = tdSql.queryRows
|
||||||
|
assert(rows >= 4)
|
||||||
|
view_name_list.append("v6")
|
||||||
|
tdLog.debug("Verify the query from nested view successfully")
|
||||||
|
|
||||||
|
# delete view
|
||||||
|
for view in view_name_list:
|
||||||
|
tdSql.execute(f"drop view {view};")
|
||||||
|
tdLog.debug(f"Drop view {view} successfully")
|
||||||
|
tdSql.execute(f"drop database {self.dbname}")
|
||||||
|
tdLog.debug("Finish test case 'test_query_from_view'")
|
||||||
|
|
||||||
|
def test_tmq_from_view(self):
|
||||||
|
"""This test case is used to verify the tmq consume data from view
|
||||||
|
"""
|
||||||
|
# params for db
|
||||||
|
paraDict = {'dbName': 'view_db',
|
||||||
|
'dropFlag': 1,
|
||||||
|
'event': '',
|
||||||
|
'vgroups': 4,
|
||||||
|
'stbName': 'stb',
|
||||||
|
'colPrefix': 'c',
|
||||||
|
'tagPrefix': 't',
|
||||||
|
'colSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}],
|
||||||
|
'tagSchema': [{'type': 'INT', 'count':1}, {'type': 'binary', 'len':20, 'count':1}],
|
||||||
|
'ctbPrefix': 'ctb',
|
||||||
|
'ctbNum': 1,
|
||||||
|
'rowsPerTbl': 10000,
|
||||||
|
'batchNum': 10,
|
||||||
|
'startTs': 1640966400000, # 2022-01-01 00:00:00.000
|
||||||
|
'pollDelay': 10,
|
||||||
|
'showMsg': 1,
|
||||||
|
'showRow': 1}
|
||||||
|
# topic info
|
||||||
|
topic_name_list = ['topic1']
|
||||||
|
view_name_list = ['view1']
|
||||||
|
expectRowsList = []
|
||||||
|
|
||||||
|
self.prepare_tmq_data(paraDict)
|
||||||
|
|
||||||
|
# init consume info, and start tmq_sim, then check consume result
|
||||||
|
tmqCom.initConsumerTable()
|
||||||
|
queryString = "select * from %s.%s"%(paraDict['dbName'], paraDict['stbName'])
|
||||||
|
tdSql.execute(f"create view {view_name_list[0]} as {queryString}")
|
||||||
|
sqlString = "create topic %s as %s" %(topic_name_list[0], "select * from %s"%view_name_list[0])
|
||||||
|
tdLog.info("create topic sql: %s"%sqlString)
|
||||||
|
tdSql.execute(sqlString)
|
||||||
|
tdSql.query(queryString)
|
||||||
|
expectRowsList.append(tdSql.getRows())
|
||||||
|
|
||||||
|
consumerId = 1
|
||||||
|
topicList = topic_name_list[0]
|
||||||
|
expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"]
|
||||||
|
keyList = 'group.id:cgrp1, enable.auto.commit:false, auto.commit.interval.ms:6000, auto.offset.reset:earliest'
|
||||||
|
ifcheckdata = 1
|
||||||
|
ifManualCommit = 1
|
||||||
|
tmqCom.insertConsumerInfo(consumerId, expectrowcnt, topicList, keyList, ifcheckdata, ifManualCommit)
|
||||||
|
|
||||||
|
tdLog.info("start consume processor")
|
||||||
|
tmqCom.startTmqSimProcess(paraDict['pollDelay'], paraDict["dbName"], paraDict['showMsg'], paraDict['showRow'])
|
||||||
|
|
||||||
|
tdLog.info("wait the consume result")
|
||||||
|
expectRows = 1
|
||||||
|
resultList = tmqCom.selectConsumeResult(expectRows)
|
||||||
|
if expectRowsList[0] != resultList[0]:
|
||||||
|
tdLog.info("expect consume rows: %d, act consume rows: %d"%(expectRowsList[0], resultList[0]))
|
||||||
|
tdLog.exit("1 tmq consume rows error!")
|
||||||
|
|
||||||
|
tmqCom.checkFileContent(consumerId, queryString)
|
||||||
|
|
||||||
|
time.sleep(10)
|
||||||
|
for i in range(len(topic_name_list)):
|
||||||
|
tdSql.query("drop topic %s"%topic_name_list[i])
|
||||||
|
for i in range(len(view_name_list)):
|
||||||
|
tdSql.query("drop view %s"%view_name_list[i])
|
||||||
|
|
||||||
|
# drop database
|
||||||
|
tdSql.execute(f"drop database {paraDict['dbName']}")
|
||||||
|
tdSql.execute("drop database cdb;")
|
||||||
|
tdLog.debug("Finish test case 'test_tmq_from_view'")
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self.test_create_view_from_one_database()
|
||||||
|
self.test_create_view_from_multi_database()
|
||||||
|
self.test_create_view_name_params()
|
||||||
|
self.test_create_view_query()
|
||||||
|
self.test_show_view()
|
||||||
|
self.test_drop_view()
|
||||||
|
self.test_view_permission_db_all_view_all()
|
||||||
|
self.test_view_permission_db_write_view_all()
|
||||||
|
self.test_view_permission_db_write_view_read()
|
||||||
|
self.test_view_permission_db_write_view_alter()
|
||||||
|
self.test_view_permission_db_read_view_all()
|
||||||
|
self.test_view_permission_db_read_view_alter()
|
||||||
|
self.test_view_permission_db_read_view_read()
|
||||||
|
self.test_query_from_view()
|
||||||
|
self.test_tmq_from_view()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -0,0 +1,27 @@
|
||||||
|
import sys
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.dnodes import tdDnodes
|
||||||
|
from math import inf
|
||||||
|
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
def init(self, conn, logSql, replicaVer=1):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor(), True)
|
||||||
|
|
||||||
|
def prepare_data(self):
|
||||||
|
tdSql.execute("create database db;")
|
||||||
|
tdSql.execute("use db;")
|
||||||
|
tdSql.execute("create stable st(ts timestamp, c1 int, c2 float) tags(groupname binary(32));")
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.error("insert into ct1 using st tags('group name 1') values(now, 1, 1.1)(now+1s, 2, 2.2) ct1 using st tags('group 1) values(now+2s, 3, 3.3); ")
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -283,6 +283,42 @@ class TDTestCase:
|
||||||
tdSql.checkData(0, 3, 1001)
|
tdSql.checkData(0, 3, 1001)
|
||||||
tdSql.checkData(0, 4, "2018-11-25 19:30:00.000")
|
tdSql.checkData(0, 4, "2018-11-25 19:30:00.000")
|
||||||
|
|
||||||
|
sql_template = 'select %s from meters partition by tbname'
|
||||||
|
select_items = ["ts, last(c10), c10, ts", "ts, ts, last(c10), c10, tbname", "last(c10), c10, ts"]
|
||||||
|
has_last_row_scan_res = [1,1,1]
|
||||||
|
sqls = self.format_sqls(sql_template, select_items)
|
||||||
|
self.explain_and_check_res(sqls, has_last_row_scan_res)
|
||||||
|
tdSql.query(sqls[0], queryTimes=1)
|
||||||
|
tdSql.checkRows(10)
|
||||||
|
tdSql.checkData(0,0, '2018-11-25 19:30:00.000')
|
||||||
|
tdSql.checkData(0,1, '2018-11-25 19:30:01.000')
|
||||||
|
tdSql.checkData(0,2, '2018-11-25 19:30:01.000')
|
||||||
|
tdSql.checkData(0,3, '2018-11-25 19:30:00.000')
|
||||||
|
|
||||||
|
tdSql.query(sqls[1], queryTimes=1)
|
||||||
|
tdSql.checkRows(10)
|
||||||
|
tdSql.checkData(0,0, '2018-11-25 19:30:00.000')
|
||||||
|
tdSql.checkData(0,1, '2018-11-25 19:30:00.000')
|
||||||
|
tdSql.checkData(0,2, '2018-11-25 19:30:01.000')
|
||||||
|
tdSql.checkData(0,3, '2018-11-25 19:30:01.000')
|
||||||
|
|
||||||
|
sql_template = 'select %s from meters partition by t1'
|
||||||
|
select_items = ["ts, last(c10), c10, ts", "ts, ts, last(c10), c10, t1", "last(c10), c10, ts"]
|
||||||
|
has_last_row_scan_res = [1,1,1]
|
||||||
|
sqls = self.format_sqls(sql_template, select_items)
|
||||||
|
self.explain_and_check_res(sqls, has_last_row_scan_res)
|
||||||
|
tdSql.query(sqls[0], queryTimes=1)
|
||||||
|
tdSql.checkRows(5)
|
||||||
|
tdSql.checkData(0,0, '2018-11-25 19:30:00.000')
|
||||||
|
tdSql.checkData(0,1, '2018-11-25 19:30:01.000')
|
||||||
|
tdSql.checkData(0,2, '2018-11-25 19:30:01.000')
|
||||||
|
tdSql.checkData(0,3, '2018-11-25 19:30:00.000')
|
||||||
|
|
||||||
|
tdSql.query("select ts, last(c10), t1, t2 from meters partition by t1, t2")
|
||||||
|
tdSql.checkRows(10)
|
||||||
|
tdSql.checkData(0, 0, '2018-11-25 19:30:00.000')
|
||||||
|
tdSql.checkData(0, 1, '2018-11-25 19:30:01.000')
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.prepareTestEnv()
|
self.prepareTestEnv()
|
||||||
#time.sleep(99999999)
|
#time.sleep(99999999)
|
||||||
|
|
Loading…
Reference in New Issue