TD-13037 merge 3.0
This commit is contained in:
commit
0a9675e454
|
@ -29,6 +29,12 @@ typedef struct SIndexOpts SIndexOpts;
|
||||||
typedef struct SIndexMultiTermQuery SIndexMultiTermQuery;
|
typedef struct SIndexMultiTermQuery SIndexMultiTermQuery;
|
||||||
typedef struct SArray SIndexMultiTerm;
|
typedef struct SArray SIndexMultiTerm;
|
||||||
|
|
||||||
|
typedef struct SIndex SIndexJson;
|
||||||
|
typedef struct SIndexTerm SIndexJsonTerm;
|
||||||
|
typedef struct SIndexOpts SIndexJsonOpts;
|
||||||
|
typedef struct SIndexMultiTermQuery SIndexJsonMultiTermQuery;
|
||||||
|
typedef struct SArray SIndexJsonMultiTerm;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ADD_VALUE, // add index colume value
|
ADD_VALUE, // add index colume value
|
||||||
DEL_VALUE, // delete index column value
|
DEL_VALUE, // delete index column value
|
||||||
|
@ -39,24 +45,108 @@ typedef enum {
|
||||||
} SIndexOperOnColumn;
|
} SIndexOperOnColumn;
|
||||||
|
|
||||||
typedef enum { MUST = 0, SHOULD = 1, NOT = 2 } EIndexOperatorType;
|
typedef enum { MUST = 0, SHOULD = 1, NOT = 2 } EIndexOperatorType;
|
||||||
typedef enum { QUERY_TERM = 0, QUERY_PREFIX = 1, QUERY_SUFFIX = 2, QUERY_REGEX = 3 } EIndexQueryType;
|
typedef enum { QUERY_TERM = 0, QUERY_PREFIX = 1, QUERY_SUFFIX = 2, QUERY_REGEX = 3, QUERY_RANGE = 4 } EIndexQueryType;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @param: oper
|
* create multi query
|
||||||
*
|
* @param oper (input, relation between querys)
|
||||||
*/
|
*/
|
||||||
SIndexMultiTermQuery* indexMultiTermQueryCreate(EIndexOperatorType oper);
|
SIndexMultiTermQuery* indexMultiTermQueryCreate(EIndexOperatorType oper);
|
||||||
void indexMultiTermQueryDestroy(SIndexMultiTermQuery* pQuery);
|
|
||||||
int indexMultiTermQueryAdd(SIndexMultiTermQuery* pQuery, SIndexTerm* term, EIndexQueryType type);
|
|
||||||
/*
|
/*
|
||||||
* @param:
|
* destroy multi query
|
||||||
* @param:
|
* @param pQuery (input, multi-query-object to be destory)
|
||||||
|
*/
|
||||||
|
|
||||||
|
void indexMultiTermQueryDestroy(SIndexMultiTermQuery* pQuery);
|
||||||
|
/*
|
||||||
|
* add query to multi query
|
||||||
|
* @param pQuery (input, multi-query-object)
|
||||||
|
* @param term (input, single query term)
|
||||||
|
* @param type (input, single query type)
|
||||||
|
* @return error code
|
||||||
|
*/
|
||||||
|
int indexMultiTermQueryAdd(SIndexMultiTermQuery* pQuery, SIndexTerm* term, EIndexQueryType type);
|
||||||
|
/*
|
||||||
|
* open index
|
||||||
|
* @param opt (input, index opt)
|
||||||
|
* @param path (input, index path)
|
||||||
|
* @param index (output, index object)
|
||||||
|
* @return error code
|
||||||
|
*/
|
||||||
|
int indexOpen(SIndexOpts* opt, const char* path, SIndex** index);
|
||||||
|
/*
|
||||||
|
* close index
|
||||||
|
* @param index (input, index to be closed)
|
||||||
|
* @return error code
|
||||||
*/
|
*/
|
||||||
int indexOpen(SIndexOpts* opt, const char* path, SIndex** index);
|
|
||||||
void indexClose(SIndex* index);
|
void indexClose(SIndex* index);
|
||||||
int indexPut(SIndex* index, SIndexMultiTerm* terms, uint64_t uid);
|
|
||||||
int indexDelete(SIndex* index, SIndexMultiTermQuery* query);
|
/*
|
||||||
int indexSearch(SIndex* index, SIndexMultiTermQuery* query, SArray* result);
|
* insert terms into index
|
||||||
int indexRebuild(SIndex* index, SIndexOpts* opt);
|
* @param index (input, index object)
|
||||||
|
* @param term (input, terms inserted into index)
|
||||||
|
* @param uid (input, uid of terms)
|
||||||
|
* @return error code
|
||||||
|
*/
|
||||||
|
int indexPut(SIndex* index, SIndexMultiTerm* terms, uint64_t uid);
|
||||||
|
/*
|
||||||
|
* delete terms that meet query condition
|
||||||
|
* @param index (input, index object)
|
||||||
|
* @param query (input, condition query to deleted)
|
||||||
|
* @return error code
|
||||||
|
*/
|
||||||
|
|
||||||
|
int indexDelete(SIndex* index, SIndexMultiTermQuery* query);
|
||||||
|
/*
|
||||||
|
* search index
|
||||||
|
* @param index (input, index object)
|
||||||
|
* @param query (input, multi query condition)
|
||||||
|
* @param result(output, query result)
|
||||||
|
* @return error code
|
||||||
|
*/
|
||||||
|
int indexSearch(SIndex* index, SIndexMultiTermQuery* query, SArray* result);
|
||||||
|
/*
|
||||||
|
* rebuild index
|
||||||
|
* @param index (input, index object)
|
||||||
|
* @parma opt (input, rebuild index opts)
|
||||||
|
* @return error code
|
||||||
|
*/
|
||||||
|
int indexRebuild(SIndex* index, SIndexOpts* opt);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* open index
|
||||||
|
* @param opt (input,index json opt)
|
||||||
|
* @param path (input, index json path)
|
||||||
|
* @param index (output, index json object)
|
||||||
|
* @return error code
|
||||||
|
*/
|
||||||
|
int tIndexJsonOpen(SIndexJsonOpts* opts, const char* path, SIndexJson** index);
|
||||||
|
/*
|
||||||
|
* close index
|
||||||
|
* @param index (input, index to be closed)
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
|
||||||
|
void tIndexJsonClose(SIndexJson* index);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* insert terms into index
|
||||||
|
* @param index (input, index object)
|
||||||
|
* @param term (input, terms inserted into index)
|
||||||
|
* @param uid (input, uid of terms)
|
||||||
|
* @return error code
|
||||||
|
*/
|
||||||
|
int tIndexJsonPut(SIndexJson* index, SIndexJsonMultiTerm* terms, uint64_t uid);
|
||||||
|
/*
|
||||||
|
* search index
|
||||||
|
* @param index (input, index object)
|
||||||
|
* @param query (input, multi query condition)
|
||||||
|
* @param result(output, query result)
|
||||||
|
* @return error code
|
||||||
|
*/
|
||||||
|
|
||||||
|
int tIndexJsonSearch(SIndexJson* index, SIndexJsonMultiTermQuery* query, SArray* result);
|
||||||
/*
|
/*
|
||||||
* @param
|
* @param
|
||||||
* @param
|
* @param
|
||||||
|
|
|
@ -23,6 +23,11 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MON_STATUS_LEN 8
|
||||||
|
#define MON_ROLE_LEN 9
|
||||||
|
#define MON_VER_LEN 12
|
||||||
|
#define MON_LOG_LEN 1024
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t dnode_id;
|
int32_t dnode_id;
|
||||||
char dnode_ep[TSDB_EP_LEN];
|
char dnode_ep[TSDB_EP_LEN];
|
||||||
|
@ -31,19 +36,19 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t dnode_id;
|
int32_t dnode_id;
|
||||||
char dnode_ep[TSDB_EP_LEN];
|
char dnode_ep[TSDB_EP_LEN];
|
||||||
char status[8];
|
char status[MON_STATUS_LEN];
|
||||||
} SMonDnodeDesc;
|
} SMonDnodeDesc;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t mnode_id;
|
int32_t mnode_id;
|
||||||
char mnode_ep[TSDB_EP_LEN];
|
char mnode_ep[TSDB_EP_LEN];
|
||||||
char role[8];
|
char role[MON_ROLE_LEN];
|
||||||
} SMonMnodeDesc;
|
} SMonMnodeDesc;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char first_ep[TSDB_EP_LEN];
|
char first_ep[TSDB_EP_LEN];
|
||||||
int32_t first_ep_dnode_id;
|
int32_t first_ep_dnode_id;
|
||||||
char version[12];
|
char version[MON_VER_LEN];
|
||||||
float master_uptime; // day
|
float master_uptime; // day
|
||||||
int32_t monitor_interval; // sec
|
int32_t monitor_interval; // sec
|
||||||
int32_t vgroups_total;
|
int32_t vgroups_total;
|
||||||
|
@ -57,19 +62,18 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t dnode_id;
|
int32_t dnode_id;
|
||||||
int8_t vnode_online;
|
char vnode_role[MON_ROLE_LEN];
|
||||||
char vnode_role[8];
|
|
||||||
} SMonVnodeDesc;
|
} SMonVnodeDesc;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t vgroup_id;
|
int32_t vgroup_id;
|
||||||
|
char database_name[TSDB_DB_NAME_LEN];
|
||||||
|
int32_t tables_num;
|
||||||
|
char status[MON_STATUS_LEN];
|
||||||
SMonVnodeDesc vnodes[TSDB_MAX_REPLICA];
|
SMonVnodeDesc vnodes[TSDB_MAX_REPLICA];
|
||||||
} SMonVgroupDesc;
|
} SMonVgroupDesc;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char database_name[TSDB_DB_NAME_LEN];
|
|
||||||
int32_t tables_num;
|
|
||||||
int8_t status;
|
|
||||||
SArray *vgroups; // array of SMonVgroupDesc
|
SArray *vgroups; // array of SMonVgroupDesc
|
||||||
} SMonVgroupInfo;
|
} SMonVgroupInfo;
|
||||||
|
|
||||||
|
@ -84,18 +88,18 @@ typedef struct {
|
||||||
float cpu_engine;
|
float cpu_engine;
|
||||||
float cpu_system;
|
float cpu_system;
|
||||||
float cpu_cores;
|
float cpu_cores;
|
||||||
float mem_engine; // MB
|
int64_t mem_engine; // KB
|
||||||
float mem_system; // MB
|
int64_t mem_system; // KB
|
||||||
float mem_total; // MB
|
int64_t mem_total; // KB
|
||||||
float disk_engine; // GB
|
float disk_engine; // GB
|
||||||
float disk_used; // GB
|
float disk_used; // GB
|
||||||
float disk_total; // GB
|
float disk_total; // GB
|
||||||
float net_in; // Kb/s
|
int64_t net_in;
|
||||||
float net_out; // Kb/s
|
int64_t net_out;
|
||||||
float io_read; // Mb/s
|
float io_read;
|
||||||
float io_write; // Mb/s
|
float io_write;
|
||||||
float io_read_disk; // Mb/s
|
float io_read_disk;
|
||||||
float io_write_disk; // Mb/s
|
float io_write_disk;
|
||||||
int32_t req_select;
|
int32_t req_select;
|
||||||
float req_select_rate;
|
float req_select_rate;
|
||||||
int32_t req_insert;
|
int32_t req_insert;
|
||||||
|
@ -107,7 +111,7 @@ typedef struct {
|
||||||
int32_t errors;
|
int32_t errors;
|
||||||
int32_t vnodes_num;
|
int32_t vnodes_num;
|
||||||
int32_t masters;
|
int32_t masters;
|
||||||
int32_t has_mnode;
|
int8_t has_mnode;
|
||||||
} SMonDnodeInfo;
|
} SMonDnodeInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -117,13 +121,15 @@ typedef struct {
|
||||||
} SMonDiskDesc;
|
} SMonDiskDesc;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SArray *disks; // array of SMonDiskDesc
|
SArray *datadirs; // array of SMonDiskDesc
|
||||||
|
SMonDiskDesc logdir;
|
||||||
|
SMonDiskDesc tempdir;
|
||||||
} SMonDiskInfo;
|
} SMonDiskInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t ts;
|
int64_t ts;
|
||||||
int8_t level;
|
int8_t level;
|
||||||
char content[1024];
|
char content[MON_LOG_LEN];
|
||||||
} SMonLogItem;
|
} SMonLogItem;
|
||||||
|
|
||||||
typedef struct SMonInfo SMonInfo;
|
typedef struct SMonInfo SMonInfo;
|
||||||
|
|
|
@ -34,9 +34,7 @@ typedef enum {
|
||||||
TAOS_SYNC_STATE_FOLLOWER = 0,
|
TAOS_SYNC_STATE_FOLLOWER = 0,
|
||||||
TAOS_SYNC_STATE_CANDIDATE = 1,
|
TAOS_SYNC_STATE_CANDIDATE = 1,
|
||||||
TAOS_SYNC_STATE_LEADER = 2,
|
TAOS_SYNC_STATE_LEADER = 2,
|
||||||
} ESyncRole;
|
} ESyncState;
|
||||||
|
|
||||||
typedef ESyncRole ESyncState;
|
|
||||||
|
|
||||||
typedef struct SSyncBuffer {
|
typedef struct SSyncBuffer {
|
||||||
void* data;
|
void* data;
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#define _TD_TFS_H_
|
#define _TD_TFS_H_
|
||||||
|
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
|
#include "monitor.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -237,6 +238,14 @@ const STfsFile *tfsReaddir(STfsDir *pDir);
|
||||||
*/
|
*/
|
||||||
void tfsClosedir(STfsDir *pDir);
|
void tfsClosedir(STfsDir *pDir);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get disk info of tfs.
|
||||||
|
*
|
||||||
|
* @param pTfs The fs object.
|
||||||
|
* @param pInfo The info object.
|
||||||
|
*/
|
||||||
|
int32_t tfsGetMonitorInfo(STfs *pTfs, SMonDiskInfo *pInfo);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,7 +21,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void taosRemoveDir(const char *dirname);
|
void taosRemoveDir(const char *dirname);
|
||||||
int32_t taosDirExist(char *dirname);
|
bool taosDirExist(char *dirname);
|
||||||
int32_t taosMkDir(const char *dirname);
|
int32_t taosMkDir(const char *dirname);
|
||||||
void taosRemoveOldFiles(const char *dirname, int32_t keepDays);
|
void taosRemoveOldFiles(const char *dirname, int32_t keepDays);
|
||||||
int32_t taosExpandDir(const char *dirname, char *outname, int32_t maxlen);
|
int32_t taosExpandDir(const char *dirname, char *outname, int32_t maxlen);
|
||||||
|
|
|
@ -28,11 +28,11 @@ extern char tsCharset[];
|
||||||
extern char tsLocale[];
|
extern char tsLocale[];
|
||||||
extern int8_t tsDaylight;
|
extern int8_t tsDaylight;
|
||||||
extern bool tsEnableCoreFile;
|
extern bool tsEnableCoreFile;
|
||||||
extern int64_t tsPageSize;
|
extern int64_t tsPageSizeKB;
|
||||||
extern int64_t tsOpenMax;
|
extern int64_t tsOpenMax;
|
||||||
extern int64_t tsStreamMax;
|
extern int64_t tsStreamMax;
|
||||||
extern int32_t tsNumOfCores;
|
extern float tsNumOfCores;
|
||||||
extern int32_t tsTotalMemoryMB;
|
extern int64_t tsTotalMemoryKB;
|
||||||
|
|
||||||
extern char configDir[];
|
extern char configDir[];
|
||||||
extern char tsDataDir[];
|
extern char tsDataDir[];
|
||||||
|
|
|
@ -25,8 +25,12 @@ extern "C" {
|
||||||
#ifndef ALLOW_FORBID_FUNC
|
#ifndef ALLOW_FORBID_FUNC
|
||||||
#define open OPEN_FUNC_TAOS_FORBID
|
#define open OPEN_FUNC_TAOS_FORBID
|
||||||
#define fopen FOPEN_FUNC_TAOS_FORBID
|
#define fopen FOPEN_FUNC_TAOS_FORBID
|
||||||
// #define close CLOSE_FUNC_TAOS_FORBID
|
#define access ACCESS_FUNC_TAOS_FORBID
|
||||||
// #define fclose FCLOSE_FUNC_TAOS_FORBID
|
#define stat STAT_FUNC_TAOS_FORBID
|
||||||
|
#define lstat LSTAT_FUNC_TAOS_FORBID
|
||||||
|
#define fstat FSTAT_FUNC_TAOS_FORBID
|
||||||
|
#define close CLOSE_FUNC_TAOS_FORBID
|
||||||
|
#define fclose FCLOSE_FUNC_TAOS_FORBID
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef PATH_MAX
|
#ifndef PATH_MAX
|
||||||
|
@ -44,6 +48,12 @@ typedef struct TdFile *TdFilePtr;
|
||||||
#define TD_FILE_AUTO_DEL 0x0040
|
#define TD_FILE_AUTO_DEL 0x0040
|
||||||
#define TD_FILE_EXCL 0x0080
|
#define TD_FILE_EXCL 0x0080
|
||||||
#define TD_FILE_STREAM 0x0100 // Only support taosFprintfFile, taosGetLineFile, taosGetLineFile, taosEOFFile
|
#define TD_FILE_STREAM 0x0100 // Only support taosFprintfFile, taosGetLineFile, taosGetLineFile, taosEOFFile
|
||||||
|
TdFilePtr taosOpenFile(const char *path,int32_t tdFileOptions);
|
||||||
|
|
||||||
|
#define TD_FILE_ACCESS_EXIST_OK 0x1
|
||||||
|
#define TD_FILE_ACCESS_READ_OK 0x2
|
||||||
|
#define TD_FILE_ACCESS_WRITE_OK 0x4
|
||||||
|
bool taosCheckAccessFile(const char *pathname, int mode);
|
||||||
|
|
||||||
int32_t taosLockFile(TdFilePtr pFile);
|
int32_t taosLockFile(TdFilePtr pFile);
|
||||||
int32_t taosUnLockFile(TdFilePtr pFile);
|
int32_t taosUnLockFile(TdFilePtr pFile);
|
||||||
|
@ -51,9 +61,9 @@ int32_t taosUnLockFile(TdFilePtr pFile);
|
||||||
int32_t taosUmaskFile(int32_t maskVal);
|
int32_t taosUmaskFile(int32_t maskVal);
|
||||||
|
|
||||||
int32_t taosStatFile(const char *path, int64_t *size, int32_t *mtime);
|
int32_t taosStatFile(const char *path, int64_t *size, int32_t *mtime);
|
||||||
|
int32_t taosDevInoFile(const char *path, int64_t *stDev, int64_t *stIno);
|
||||||
int32_t taosFStatFile(TdFilePtr pFile, int64_t *size, int32_t *mtime);
|
int32_t taosFStatFile(TdFilePtr pFile, int64_t *size, int32_t *mtime);
|
||||||
|
bool taosCheckExistFile(const char *pathname);
|
||||||
TdFilePtr taosOpenFile(const char *path,int32_t tdFileOptions);
|
|
||||||
|
|
||||||
int64_t taosLSeekFile(TdFilePtr pFile, int64_t offset, int32_t whence);
|
int64_t taosLSeekFile(TdFilePtr pFile, int64_t offset, int32_t whence);
|
||||||
int32_t taosFtruncateFile(TdFilePtr pFile, int64_t length);
|
int32_t taosFtruncateFile(TdFilePtr pFile, int64_t length);
|
||||||
|
@ -62,7 +72,7 @@ int32_t taosFsyncFile(TdFilePtr pFile);
|
||||||
int64_t taosReadFile(TdFilePtr pFile, void *buf, int64_t count);
|
int64_t taosReadFile(TdFilePtr pFile, void *buf, int64_t count);
|
||||||
int64_t taosPReadFile(TdFilePtr pFile, void *buf, int64_t count, int64_t offset);
|
int64_t taosPReadFile(TdFilePtr pFile, void *buf, int64_t count, int64_t offset);
|
||||||
int64_t taosWriteFile(TdFilePtr pFile, const void *buf, int64_t count);
|
int64_t taosWriteFile(TdFilePtr pFile, const void *buf, int64_t count);
|
||||||
void taosFprintfFile(TdFilePtr pFile, const char *format, ...);
|
void taosFprintfFile(TdFilePtr pFile, const char *format, ...);
|
||||||
int64_t taosGetLineFile(TdFilePtr pFile, char ** __restrict__ ptrBuf);
|
int64_t taosGetLineFile(TdFilePtr pFile, char ** __restrict__ ptrBuf);
|
||||||
int32_t taosEOFFile(TdFilePtr pFile);
|
int32_t taosEOFFile(TdFilePtr pFile);
|
||||||
|
|
||||||
|
@ -71,7 +81,7 @@ int64_t taosCloseFile(TdFilePtr *ppFile);
|
||||||
int32_t taosRenameFile(const char *oldName, const char *newName);
|
int32_t taosRenameFile(const char *oldName, const char *newName);
|
||||||
int64_t taosCopyFile(const char *from, const char *to);
|
int64_t taosCopyFile(const char *from, const char *to);
|
||||||
|
|
||||||
void taosGetTmpfilePath(const char *inputTmpDir, const char *fileNamePrefix, char *dstPath);
|
void taosGetTmpfilePath(const char *inputTmpDir, const char *fileNamePrefix, char *dstPath);
|
||||||
|
|
||||||
int64_t taosSendFile(SocketFd fdDst, TdFilePtr pFileSrc, int64_t *offset, int64_t size);
|
int64_t taosSendFile(SocketFd fdDst, TdFilePtr pFileSrc, int64_t *offset, int64_t size);
|
||||||
int64_t taosFSendFile(TdFilePtr pFileOut, TdFilePtr pFileIn, int64_t *offset, int64_t size);
|
int64_t taosFSendFile(TdFilePtr pFileOut, TdFilePtr pFileIn, int64_t *offset, int64_t size);
|
||||||
|
@ -79,7 +89,7 @@ int64_t taosFSendFile(TdFilePtr pFileOut, TdFilePtr pFileIn, int64_t *offset, in
|
||||||
void *taosMmapReadOnlyFile(TdFilePtr pFile, int64_t length);
|
void *taosMmapReadOnlyFile(TdFilePtr pFile, int64_t length);
|
||||||
bool taosValidFile(TdFilePtr pFile);
|
bool taosValidFile(TdFilePtr pFile);
|
||||||
|
|
||||||
int taosGetErrorFile(TdFilePtr pFile);
|
int32_t taosGetErrorFile(TdFilePtr pFile);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,19 +34,19 @@ typedef struct {
|
||||||
} SDiskSpace;
|
} SDiskSpace;
|
||||||
|
|
||||||
void taosGetSystemInfo();
|
void taosGetSystemInfo();
|
||||||
bool taosGetEmail(char *email, int32_t maxLen);
|
int32_t taosGetEmail(char *email, int32_t maxLen);
|
||||||
bool taosGetOsReleaseName(char *releaseName, int32_t maxLen);
|
int32_t taosGetOsReleaseName(char *releaseName, int32_t maxLen);
|
||||||
bool taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores);
|
int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores);
|
||||||
int32_t taosGetCpuCores();
|
int32_t taosGetCpuCores(float *numOfCores);
|
||||||
bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage);
|
int32_t taosGetCpuUsage(float *cpu_system, float *cpu_engine);
|
||||||
bool taosGetTotalSysMemoryKB(uint64_t *kb);
|
int32_t taosGetTotalMemory(int64_t *totalKB);
|
||||||
bool taosGetProcMemory(float *memoryUsedMB); //
|
int32_t taosGetProcMemory(int64_t *usedKB);
|
||||||
bool taosGetSysMemory(float *memoryUsedMB); //
|
int32_t taosGetSysMemory(int64_t *usedKB);
|
||||||
int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize);
|
int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize);
|
||||||
bool taosReadProcIO(int64_t *rchars, int64_t *wchars);
|
int32_t taosReadProcIO(int64_t *rchars, int64_t *wchars);
|
||||||
bool taosGetProcIO(float *readKB, float *writeKB);
|
int32_t taosGetProcIO(float *readKB, float *writeKB);
|
||||||
bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes);
|
int32_t taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes);
|
||||||
bool taosGetBandSpeed(float *bandSpeedKb);
|
int32_t taosGetBandSpeed(float *bandSpeedKb);
|
||||||
|
|
||||||
int32_t taosSystem(const char *cmd);
|
int32_t taosSystem(const char *cmd);
|
||||||
void taosKillSystem();
|
void taosKillSystem();
|
||||||
|
|
|
@ -279,11 +279,11 @@ static int32_t taosAddSystemCfg(SConfig *pCfg) {
|
||||||
if (cfgAddLocale(pCfg, "locale", tsLocale) != 0) return -1;
|
if (cfgAddLocale(pCfg, "locale", tsLocale) != 0) return -1;
|
||||||
if (cfgAddCharset(pCfg, "charset", tsCharset) != 0) return -1;
|
if (cfgAddCharset(pCfg, "charset", tsCharset) != 0) return -1;
|
||||||
if (cfgAddBool(pCfg, "enableCoreFile", 1, 1) != 0) return -1;
|
if (cfgAddBool(pCfg, "enableCoreFile", 1, 1) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "numOfCores", tsNumOfCores, 1, 100000, 1) != 0) return -1;
|
if (cfgAddFloat(pCfg, "numOfCores", tsNumOfCores, 0, 100000, 1) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "pageSize(KB)", tsPageSize, 0, INT64_MAX, 1) != 0) return -1;
|
|
||||||
if (cfgAddInt64(pCfg, "openMax", tsOpenMax, 0, INT64_MAX, 1) != 0) return -1;
|
if (cfgAddInt64(pCfg, "openMax", tsOpenMax, 0, INT64_MAX, 1) != 0) return -1;
|
||||||
if (cfgAddInt64(pCfg, "streamMax", tsStreamMax, 0, INT64_MAX, 1) != 0) return -1;
|
if (cfgAddInt64(pCfg, "streamMax", tsStreamMax, 0, INT64_MAX, 1) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "totalMemory(MB)", tsTotalMemoryMB, 0, INT32_MAX, 1) != 0) return -1;
|
if (cfgAddInt32(pCfg, "pageSize(KB)", tsPageSizeKB, 0, INT64_MAX, 1) != 0) return -1;
|
||||||
|
if (cfgAddInt64(pCfg, "totalMemory(KB)", tsTotalMemoryKB, 0, INT64_MAX, 1) != 0) return -1;
|
||||||
if (cfgAddString(pCfg, "os sysname", info.sysname, 1) != 0) return -1;
|
if (cfgAddString(pCfg, "os sysname", info.sysname, 1) != 0) return -1;
|
||||||
if (cfgAddString(pCfg, "os nodename", info.nodename, 1) != 0) return -1;
|
if (cfgAddString(pCfg, "os nodename", info.nodename, 1) != 0) return -1;
|
||||||
if (cfgAddString(pCfg, "os release", info.release, 1) != 0) return -1;
|
if (cfgAddString(pCfg, "os release", info.release, 1) != 0) return -1;
|
||||||
|
@ -404,10 +404,6 @@ static void taosSetSystemCfg(SConfig *pCfg) {
|
||||||
const char *charset = cfgGetItem(pCfg, "charset")->str;
|
const char *charset = cfgGetItem(pCfg, "charset")->str;
|
||||||
taosSetSystemLocale(locale, charset);
|
taosSetSystemLocale(locale, charset);
|
||||||
|
|
||||||
if (tsNumOfCores <= 1) {
|
|
||||||
tsNumOfCores = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool enableCore = cfgGetItem(pCfg, "enableCoreFile")->bval;
|
bool enableCore = cfgGetItem(pCfg, "enableCoreFile")->bval;
|
||||||
taosSetConsoleEcho(enableCore);
|
taosSetConsoleEcho(enableCore);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
#include "tcommon.h"
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <tep.h>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
|
@ -10,6 +8,8 @@
|
||||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "tep.h"
|
||||||
|
#include "tcommon.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "tvariant.h"
|
#include "tvariant.h"
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ typedef struct {
|
||||||
SDnode *pDnode;
|
SDnode *pDnode;
|
||||||
STaosQueue *queue;
|
STaosQueue *queue;
|
||||||
union {
|
union {
|
||||||
SQWorkerPool pool;
|
SQWorkerPool pool;
|
||||||
SWWorkerPool mpool;
|
SWWorkerPool mpool;
|
||||||
};
|
};
|
||||||
} SDnodeWorker;
|
} SDnodeWorker;
|
||||||
|
@ -137,6 +137,8 @@ typedef struct SDnode {
|
||||||
SStartupReq startup;
|
SStartupReq startup;
|
||||||
} SDnode;
|
} SDnode;
|
||||||
|
|
||||||
|
int32_t dndGetMonitorDiskInfo(SDnode *pDnode, SMonDiskInfo *pInfo);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,6 +34,7 @@ int32_t dndProcessDropMnodeReq(SDnode *pDnode, SRpcMsg *pRpcMsg);
|
||||||
|
|
||||||
int32_t dndGetMnodeMonitorInfo(SDnode *pDnode, SMonClusterInfo *pClusterInfo, SMonVgroupInfo *pVgroupInfo,
|
int32_t dndGetMnodeMonitorInfo(SDnode *pDnode, SMonClusterInfo *pClusterInfo, SMonVgroupInfo *pVgroupInfo,
|
||||||
SMonGrantInfo *pGrantInfo);
|
SMonGrantInfo *pGrantInfo);
|
||||||
|
int8_t dndIsMnode(SDnode *pDnode);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -323,3 +323,12 @@ void dndCleanup() {
|
||||||
taosStopCacheRefreshWorker();
|
taosStopCacheRefreshWorker();
|
||||||
dInfo("dnode env is cleaned up");
|
dInfo("dnode env is cleaned up");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t dndGetMonitorDiskInfo(SDnode *pDnode, SMonDiskInfo *pInfo) {
|
||||||
|
tstrncpy(pInfo->logdir.name, tsLogDir, sizeof(pInfo->logdir.name));
|
||||||
|
pInfo->logdir.size = tsLogSpace.size;
|
||||||
|
tstrncpy(pInfo->tempdir.name, tsTempDir, sizeof(pInfo->tempdir.name));
|
||||||
|
pInfo->tempdir.size = tsTempSpace.size;
|
||||||
|
|
||||||
|
return tfsGetMonitorInfo(pDnode->pTfs, pInfo);
|
||||||
|
}
|
|
@ -474,20 +474,48 @@ void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pReq) {
|
||||||
rpcSendResponse(&rpcRsp);
|
rpcSendResponse(&rpcRsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dndGetBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) {
|
static void dndGetMonitorBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) {
|
||||||
pInfo->dnode_id = dndGetDnodeId(pDnode);
|
pInfo->dnode_id = dndGetDnodeId(pDnode);
|
||||||
tstrncpy(pInfo->dnode_ep, tsLocalEp, TSDB_EP_LEN);
|
tstrncpy(pInfo->dnode_ep, tsLocalEp, TSDB_EP_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dndGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) {
|
||||||
|
pInfo->uptime = (taosGetTimestampMs() - pDnode->dmgmt.rebootTime) / (86400000.0f);
|
||||||
|
taosGetCpuUsage(&pInfo->cpu_engine, &pInfo->cpu_system);
|
||||||
|
pInfo->cpu_cores = tsNumOfCores;
|
||||||
|
taosGetProcMemory(&pInfo->mem_engine);
|
||||||
|
taosGetSysMemory(&pInfo->mem_system);
|
||||||
|
pInfo->mem_total = tsTotalMemoryKB;
|
||||||
|
pInfo->disk_engine = 0;
|
||||||
|
pInfo->disk_used = tsDataSpace.size.used / (1024 * 1024 * 1024.0);
|
||||||
|
pInfo->disk_total = tsDataSpace.size.avail / (1024 * 1024 * 1024.0);
|
||||||
|
taosGetCardInfo(NULL, &pInfo->net_in, &pInfo->net_out);
|
||||||
|
taosGetProcIO(&pInfo->io_read, &pInfo->io_write);
|
||||||
|
pInfo->io_read_disk = 0;
|
||||||
|
pInfo->io_write_disk = 0;
|
||||||
|
pInfo->req_select = 0;
|
||||||
|
pInfo->req_select_rate = 0;
|
||||||
|
pInfo->req_insert = 0;
|
||||||
|
pInfo->req_insert_success = 0;
|
||||||
|
pInfo->req_insert_rate = 0;
|
||||||
|
pInfo->req_insert_batch = 0;
|
||||||
|
pInfo->req_insert_batch_success = 0;
|
||||||
|
pInfo->req_insert_batch_rate = 0;
|
||||||
|
pInfo->errors = 0;
|
||||||
|
pInfo->vnodes_num = 0;
|
||||||
|
pInfo->masters = 0;
|
||||||
|
pInfo->has_mnode = dndIsMnode(pDnode);
|
||||||
|
}
|
||||||
|
|
||||||
static void dndSendMonitorReport(SDnode *pDnode) {
|
static void dndSendMonitorReport(SDnode *pDnode) {
|
||||||
if (!tsEnableMonitor || tsMonitorFqdn[0] == 0) return;
|
if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return;
|
||||||
|
dTrace("pDnode:%p, send monitor report to %s:%u", pDnode, tsMonitorFqdn, tsMonitorPort);
|
||||||
|
|
||||||
SMonInfo *pMonitor = monCreateMonitorInfo();
|
SMonInfo *pMonitor = monCreateMonitorInfo();
|
||||||
if (pMonitor == NULL) return;
|
if (pMonitor == NULL) return;
|
||||||
|
|
||||||
dTrace("pDnode:%p, send monitor report to %s:%u", pDnode, tsMonitorFqdn, tsMonitorPort);
|
|
||||||
|
|
||||||
SMonBasicInfo basicInfo = {0};
|
SMonBasicInfo basicInfo = {0};
|
||||||
dndGetBasicInfo(pDnode, &basicInfo);
|
dndGetMonitorBasicInfo(pDnode, &basicInfo);
|
||||||
monSetBasicInfo(pMonitor, &basicInfo);
|
monSetBasicInfo(pMonitor, &basicInfo);
|
||||||
|
|
||||||
SMonClusterInfo clusterInfo = {0};
|
SMonClusterInfo clusterInfo = {0};
|
||||||
|
@ -499,6 +527,20 @@ static void dndSendMonitorReport(SDnode *pDnode) {
|
||||||
monSetGrantInfo(pMonitor, &grantInfo);
|
monSetGrantInfo(pMonitor, &grantInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SMonDnodeInfo dnodeInfo = {0};
|
||||||
|
dndGetMonitorDnodeInfo(pDnode, &dnodeInfo);
|
||||||
|
monSetDnodeInfo(pMonitor, &dnodeInfo);
|
||||||
|
|
||||||
|
SMonDiskInfo diskInfo = {0};
|
||||||
|
if (dndGetMonitorDiskInfo(pDnode, &diskInfo) == 0) {
|
||||||
|
monSetDiskInfo(pMonitor, &diskInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(clusterInfo.dnodes);
|
||||||
|
taosArrayDestroy(clusterInfo.mnodes);
|
||||||
|
taosArrayDestroy(vgroupInfo.vgroups);
|
||||||
|
taosArrayDestroy(diskInfo.datadirs);
|
||||||
|
|
||||||
monSendReport(pMonitor);
|
monSendReport(pMonitor);
|
||||||
monCleanupMonitorInfo(pMonitor);
|
monCleanupMonitorInfo(pMonitor);
|
||||||
}
|
}
|
||||||
|
|
|
@ -639,4 +639,11 @@ int32_t dndGetMnodeMonitorInfo(SDnode *pDnode, SMonClusterInfo *pClusterInfo, SM
|
||||||
int32_t code = mndGetMonitorInfo(pMnode, pClusterInfo, pVgroupInfo, pGrantInfo);
|
int32_t code = mndGetMonitorInfo(pMnode, pClusterInfo, pVgroupInfo, pGrantInfo);
|
||||||
dndReleaseMnode(pDnode, pMnode);
|
dndReleaseMnode(pDnode, pMnode);
|
||||||
return code;
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t dndIsMnode(SDnode *pDnode) {
|
||||||
|
SMnode *pMnode = dndAcquireMnode(pDnode);
|
||||||
|
if (pMnode == NULL) return 0;
|
||||||
|
dndReleaseMnode(pDnode, pMnode);
|
||||||
|
return 1;
|
||||||
}
|
}
|
|
@ -52,23 +52,20 @@ static char* mndBuildTelemetryReport(SMnode* pMnode) {
|
||||||
tjsonAddStringToObject(pJson, "instanceId", clusterName);
|
tjsonAddStringToObject(pJson, "instanceId", clusterName);
|
||||||
tjsonAddDoubleToObject(pJson, "reportVersion", 1);
|
tjsonAddDoubleToObject(pJson, "reportVersion", 1);
|
||||||
|
|
||||||
if (taosGetOsReleaseName(tmp, sizeof(tmp))) {
|
if (taosGetOsReleaseName(tmp, sizeof(tmp)) == 0) {
|
||||||
tjsonAddStringToObject(pJson, "os", tmp);
|
tjsonAddStringToObject(pJson, "os", tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfCores = 0;
|
float numOfCores = 0;
|
||||||
if (taosGetCpuInfo(tmp, sizeof(tmp), &numOfCores)) {
|
if (taosGetCpuInfo(tmp, sizeof(tmp), &numOfCores) == 0) {
|
||||||
tjsonAddStringToObject(pJson, "cpuModel", tmp);
|
tjsonAddStringToObject(pJson, "cpuModel", tmp);
|
||||||
tjsonAddDoubleToObject(pJson, "numOfCpu", numOfCores);
|
tjsonAddDoubleToObject(pJson, "numOfCpu", numOfCores);
|
||||||
} else {
|
} else {
|
||||||
tjsonAddDoubleToObject(pJson, "numOfCpu", taosGetCpuCores());
|
tjsonAddDoubleToObject(pJson, "numOfCpu", tsNumOfCores);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t memoryKB = 0;
|
snprintf(tmp, sizeof(tmp), "%" PRId64 " kB", tsTotalMemoryKB);
|
||||||
if (taosGetTotalSysMemoryKB(&memoryKB)) {
|
tjsonAddStringToObject(pJson, "memory", tmp);
|
||||||
snprintf(tmp, sizeof(tmp), "%" PRIu64 " kB", memoryKB);
|
|
||||||
tjsonAddStringToObject(pJson, "memory", tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
tjsonAddStringToObject(pJson, "version", version);
|
tjsonAddStringToObject(pJson, "version", version);
|
||||||
tjsonAddStringToObject(pJson, "buildInfo", buildinfo);
|
tjsonAddStringToObject(pJson, "buildInfo", buildinfo);
|
||||||
|
|
|
@ -90,7 +90,7 @@ STqMetaStore* tqStoreOpen(STQ* pTq, const char* path, FTqSerialize serializer, F
|
||||||
char name[pathLen + 10];
|
char name[pathLen + 10];
|
||||||
|
|
||||||
strcpy(name, path);
|
strcpy(name, path);
|
||||||
if (taosDirExist(name) != 0 && taosMkDir(name) != 0) {
|
if (!taosDirExist(name) && taosMkDir(name) != 0) {
|
||||||
terrno = TSDB_CODE_TQ_FAILED_TO_CREATE_DIR;
|
terrno = TSDB_CODE_TQ_FAILED_TO_CREATE_DIR;
|
||||||
tqError("failed to create dir:%s since %s ", name, terrstr());
|
tqError("failed to create dir:%s since %s ", name, terrstr());
|
||||||
}
|
}
|
||||||
|
|
|
@ -580,7 +580,7 @@ static int tsdbSetAndOpenCommitFile(SCommitH *pCommith, SDFileSet *pSet, int fid
|
||||||
SDFile *pRSmadF = TSDB_READ_SMAD_FILE(&(pCommith->readh));
|
SDFile *pRSmadF = TSDB_READ_SMAD_FILE(&(pCommith->readh));
|
||||||
SDFile *pWSmadF = TSDB_COMMIT_SMAD_FILE(pCommith);
|
SDFile *pWSmadF = TSDB_COMMIT_SMAD_FILE(pCommith);
|
||||||
|
|
||||||
if (access(TSDB_FILE_FULL_NAME(pRSmadF), F_OK) != 0) {
|
if (!taosCheckExistFile(TSDB_FILE_FULL_NAME(pRSmadF))) {
|
||||||
tsdbDebug("vgId:%d create data file %s as not exist", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pRSmadF));
|
tsdbDebug("vgId:%d create data file %s as not exist", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pRSmadF));
|
||||||
tsdbInitDFile(pRepo, pWSmadF, did, fid, FS_TXN_VERSION(REPO_FS(pRepo)), TSDB_FILE_SMAD);
|
tsdbInitDFile(pRepo, pWSmadF, did, fid, FS_TXN_VERSION(REPO_FS(pRepo)), TSDB_FILE_SMAD);
|
||||||
|
|
||||||
|
@ -614,7 +614,7 @@ static int tsdbSetAndOpenCommitFile(SCommitH *pCommith, SDFileSet *pSet, int fid
|
||||||
SDFile *pRSmalF = TSDB_READ_SMAL_FILE(&(pCommith->readh));
|
SDFile *pRSmalF = TSDB_READ_SMAL_FILE(&(pCommith->readh));
|
||||||
SDFile *pWSmalF = TSDB_COMMIT_SMAL_FILE(pCommith);
|
SDFile *pWSmalF = TSDB_COMMIT_SMAL_FILE(pCommith);
|
||||||
|
|
||||||
if ((pCommith->isLFileSame) && access(TSDB_FILE_FULL_NAME(pRSmalF), F_OK) == 0) {
|
if ((pCommith->isLFileSame) && taosCheckExistFile(TSDB_FILE_FULL_NAME(pRSmalF))) {
|
||||||
tsdbInitDFileEx(pWSmalF, pRSmalF);
|
tsdbInitDFileEx(pWSmalF, pRSmalF);
|
||||||
if (tsdbOpenDFile(pWSmalF, O_RDWR) < 0) {
|
if (tsdbOpenDFile(pWSmalF, O_RDWR) < 0) {
|
||||||
tsdbError("vgId:%d failed to open file %s to commit since %s", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pWSmalF),
|
tsdbError("vgId:%d failed to open file %s to commit since %s", REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pWSmalF),
|
||||||
|
|
|
@ -314,7 +314,7 @@ int tsdbOpenFS(STsdb *pRepo) {
|
||||||
tsdbGetTxnFname(pRepo, TSDB_TXN_CURR_FILE, current);
|
tsdbGetTxnFname(pRepo, TSDB_TXN_CURR_FILE, current);
|
||||||
|
|
||||||
tsdbGetRtnSnap(pRepo, &pRepo->rtn);
|
tsdbGetRtnSnap(pRepo, &pRepo->rtn);
|
||||||
if (access(current, F_OK) == 0) {
|
if (taosCheckExistFile(current)) {
|
||||||
if (tsdbOpenFSFromCurrent(pRepo) < 0) {
|
if (tsdbOpenFSFromCurrent(pRepo) < 0) {
|
||||||
tsdbError("vgId:%d failed to open FS since %s", REPO_ID(pRepo), tstrerror(terrno));
|
tsdbError("vgId:%d failed to open FS since %s", REPO_ID(pRepo), tstrerror(terrno));
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -443,25 +443,24 @@ int tsdbLoadDFileHeader(SDFile *pDFile, SDFInfo *pInfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tsdbScanAndTryFixDFile(STsdb *pRepo, SDFile *pDFile) {
|
static int tsdbScanAndTryFixDFile(STsdb *pRepo, SDFile *pDFile) {
|
||||||
struct stat dfstat;
|
|
||||||
SDFile df;
|
SDFile df;
|
||||||
|
|
||||||
tsdbInitDFileEx(&df, pDFile);
|
tsdbInitDFileEx(&df, pDFile);
|
||||||
|
|
||||||
if (access(TSDB_FILE_FULL_NAME(pDFile), F_OK) != 0) {
|
if (!taosCheckExistFile(TSDB_FILE_FULL_NAME(pDFile))) {
|
||||||
tsdbError("vgId:%d data file %s not exit, report to upper layer to fix it", REPO_ID(pRepo),
|
tsdbError("vgId:%d data file %s not exit, report to upper layer to fix it", REPO_ID(pRepo),
|
||||||
TSDB_FILE_FULL_NAME(pDFile));
|
TSDB_FILE_FULL_NAME(pDFile));
|
||||||
// pRepo->state |= TSDB_STATE_BAD_DATA;
|
// pRepo->state |= TSDB_STATE_BAD_DATA;
|
||||||
TSDB_FILE_SET_STATE(pDFile, TSDB_FILE_STATE_BAD);
|
TSDB_FILE_SET_STATE(pDFile, TSDB_FILE_STATE_BAD);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
int64_t file_size = 0;
|
||||||
if (stat(TSDB_FILE_FULL_NAME(&df), &dfstat) < 0) {
|
if (taosStatFile(TSDB_FILE_FULL_NAME(&df), &file_size, NULL) < 0) {
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pDFile->info.size < dfstat.st_size) {
|
if (pDFile->info.size < file_size) {
|
||||||
// if (tsdbOpenDFile(&df, O_WRONLY) < 0) {
|
// if (tsdbOpenDFile(&df, O_WRONLY) < 0) {
|
||||||
if (tsdbOpenDFile(&df, TD_FILE_WRITE) < 0) {
|
if (tsdbOpenDFile(&df, TD_FILE_WRITE) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -480,10 +479,10 @@ static int tsdbScanAndTryFixDFile(STsdb *pRepo, SDFile *pDFile) {
|
||||||
|
|
||||||
tsdbCloseDFile(&df);
|
tsdbCloseDFile(&df);
|
||||||
tsdbInfo("vgId:%d file %s is truncated from %" PRId64 " to %" PRId64, REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pDFile),
|
tsdbInfo("vgId:%d file %s is truncated from %" PRId64 " to %" PRId64, REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pDFile),
|
||||||
dfstat.st_size, pDFile->info.size);
|
file_size, pDFile->info.size);
|
||||||
} else if (pDFile->info.size > dfstat.st_size) {
|
} else if (pDFile->info.size > file_size) {
|
||||||
tsdbError("vgId:%d data file %s has wrong size %" PRId64 " expected %" PRId64 ", report to upper layer to fix it",
|
tsdbError("vgId:%d data file %s has wrong size %" PRId64 " expected %" PRId64 ", report to upper layer to fix it",
|
||||||
REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pDFile), dfstat.st_size, pDFile->info.size);
|
REPO_ID(pRepo), TSDB_FILE_FULL_NAME(pDFile), file_size, pDFile->info.size);
|
||||||
// pRepo->state |= TSDB_STATE_BAD_DATA;
|
// pRepo->state |= TSDB_STATE_BAD_DATA;
|
||||||
TSDB_FILE_SET_STATE(pDFile, TSDB_FILE_STATE_BAD);
|
TSDB_FILE_SET_STATE(pDFile, TSDB_FILE_STATE_BAD);
|
||||||
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
add_definitions("-D ALLOW_FORBID_FUNC")
|
|
||||||
add_subdirectory(transport)
|
add_subdirectory(transport)
|
||||||
add_subdirectory(sync)
|
add_subdirectory(sync)
|
||||||
add_subdirectory(tdb)
|
add_subdirectory(tdb)
|
||||||
|
|
|
@ -14,9 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <tglobal.h>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "os.h"
|
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
||||||
|
@ -24,8 +22,10 @@
|
||||||
#pragma GCC diagnostic ignored "-Wunused-variable"
|
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
#pragma GCC diagnostic ignored "-Wformat"
|
#pragma GCC diagnostic ignored "-Wformat"
|
||||||
|
#include <addr_any.h>
|
||||||
|
|
||||||
#include "addr_any.h"
|
#include "os.h"
|
||||||
|
#include "tglobal.h"
|
||||||
#include "catalog.h"
|
#include "catalog.h"
|
||||||
#include "stub.h"
|
#include "stub.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
|
|
@ -2215,10 +2215,10 @@ static void destroyTsComp(STaskRuntimeEnv *pRuntimeEnv, STaskAttr *pQueryAttr) {
|
||||||
if (pQueryAttr->tsCompQuery && pRuntimeEnv->outputBuf && pRuntimeEnv->outputBuf->pDataBlock && taosArrayGetSize(pRuntimeEnv->outputBuf->pDataBlock) > 0) {
|
if (pQueryAttr->tsCompQuery && pRuntimeEnv->outputBuf && pRuntimeEnv->outputBuf->pDataBlock && taosArrayGetSize(pRuntimeEnv->outputBuf->pDataBlock) > 0) {
|
||||||
SColumnInfoData* pColInfoData = taosArrayGet(pRuntimeEnv->outputBuf->pDataBlock, 0);
|
SColumnInfoData* pColInfoData = taosArrayGet(pRuntimeEnv->outputBuf->pDataBlock, 0);
|
||||||
if (pColInfoData) {
|
if (pColInfoData) {
|
||||||
FILE *f = *(FILE **)pColInfoData->pData; // TODO refactor
|
TdFilePtr pFile = *(TdFilePtr *)pColInfoData->pData; // TODO refactor
|
||||||
if (f) {
|
if (pFile != NULL) {
|
||||||
fclose(f);
|
taosCloseFile(&pFile);
|
||||||
*(FILE **)pColInfoData->pData = NULL;
|
*(TdFilePtr *)pColInfoData->pData = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,10 +13,7 @@
|
||||||
* 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 <executorimpl.h>
|
|
||||||
#include <function.h>
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <tglobal.h>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
|
@ -26,6 +23,9 @@
|
||||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "executorimpl.h"
|
||||||
|
#include "function.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
#include "tvariant.h"
|
#include "tvariant.h"
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
* 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 <executorimpl.h>
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <tglobal.h>
|
#include <tglobal.h>
|
||||||
#include <tsort.h>
|
#include <tsort.h>
|
||||||
|
@ -26,6 +25,7 @@
|
||||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "executorimpl.h"
|
||||||
#include "executor.h"
|
#include "executor.h"
|
||||||
#include "stub.h"
|
#include "stub.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
|
|
@ -122,30 +122,53 @@ typedef struct TFileCacheKey {
|
||||||
int indexFlushCacheToTFile(SIndex* sIdx, void*);
|
int indexFlushCacheToTFile(SIndex* sIdx, void*);
|
||||||
|
|
||||||
int32_t indexSerialCacheKey(ICacheKey* key, char* buf);
|
int32_t indexSerialCacheKey(ICacheKey* key, char* buf);
|
||||||
|
// int32_t indexSerialKey(ICacheKey* key, char* buf);
|
||||||
|
// int32_t indexSerialTermKey(SIndexTerm* itm, char* buf);
|
||||||
|
|
||||||
#define indexFatal(...) \
|
#define indexFatal(...) \
|
||||||
do { \
|
do { \
|
||||||
if (sDebugFlag & DEBUG_FATAL) { taosPrintLog("index FATAL ", 255, __VA_ARGS__); } \
|
if (sDebugFlag & DEBUG_FATAL) { \
|
||||||
|
taosPrintLog("index FATAL ", 255, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define indexError(...) \
|
#define indexError(...) \
|
||||||
do { \
|
do { \
|
||||||
if (sDebugFlag & DEBUG_ERROR) { taosPrintLog("index ERROR ", 255, __VA_ARGS__); } \
|
if (sDebugFlag & DEBUG_ERROR) { \
|
||||||
|
taosPrintLog("index ERROR ", 255, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define indexWarn(...) \
|
#define indexWarn(...) \
|
||||||
do { \
|
do { \
|
||||||
if (sDebugFlag & DEBUG_WARN) { taosPrintLog("index WARN ", 255, __VA_ARGS__); } \
|
if (sDebugFlag & DEBUG_WARN) { \
|
||||||
|
taosPrintLog("index WARN ", 255, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define indexInfo(...) \
|
#define indexInfo(...) \
|
||||||
do { \
|
do { \
|
||||||
if (sDebugFlag & DEBUG_INFO) { taosPrintLog("index ", 255, __VA_ARGS__); } \
|
if (sDebugFlag & DEBUG_INFO) { \
|
||||||
|
taosPrintLog("index ", 255, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define indexDebug(...) \
|
#define indexDebug(...) \
|
||||||
do { \
|
do { \
|
||||||
if (sDebugFlag & DEBUG_DEBUG) { taosPrintLog("index ", sDebugFlag, __VA_ARGS__); } \
|
if (sDebugFlag & DEBUG_DEBUG) { \
|
||||||
|
taosPrintLog("index ", sDebugFlag, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define indexTrace(...) \
|
#define indexTrace(...) \
|
||||||
do { \
|
do { \
|
||||||
if (sDebugFlag & DEBUG_TRACE) { taosPrintLog("index ", sDebugFlag, __VA_ARGS__); } \
|
if (sDebugFlag & DEBUG_TRACE) { \
|
||||||
|
taosPrintLog("index ", sDebugFlag, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define INDEX_TYPE_CONTAIN_EXTERN_TYPE(ty, exTy) (((ty >> 4) & (exTy)) != 0)
|
||||||
|
#define INDEX_TYPE_GET_TYPE(ty) (ty & 0x0F)
|
||||||
|
#define INDEX_TYPE_ADD_EXTERN_TYPE(ty, exTy) \
|
||||||
|
do { \
|
||||||
|
uint8_t oldTy = ty; \
|
||||||
|
ty = (ty >> 4) | exTy; \
|
||||||
|
ty = (ty << 4) | oldTy; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _TD_INDEX_COMM_H_
|
||||||
|
#define _TD_INDEX_COMM_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern char JSON_COLUMN[];
|
||||||
|
extern char JSON_VALUE_DELIM;
|
||||||
|
|
||||||
|
char* indexPackJsonData(SIndexTerm* itm);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -2,8 +2,8 @@
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
*
|
*
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
* it under the terms of the GNU Affero General Public License, version 3 * or later ("AGPL"), as published by the Free
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
* Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
@ -30,6 +30,8 @@
|
||||||
|
|
||||||
void* indexQhandle = NULL;
|
void* indexQhandle = NULL;
|
||||||
|
|
||||||
|
static char JSON_COLUMN[] = "JSON";
|
||||||
|
|
||||||
void indexInit() {
|
void indexInit() {
|
||||||
// refactor later
|
// refactor later
|
||||||
indexQhandle = taosInitScheduler(INDEX_QUEUE_SIZE, INDEX_NUM_OF_THREADS, "index");
|
indexQhandle = taosInitScheduler(INDEX_QUEUE_SIZE, INDEX_NUM_OF_THREADS, "index");
|
||||||
|
@ -63,6 +65,9 @@ static int indexGenTFile(SIndex* index, IndexCache* cache, SArray* batch);
|
||||||
static void indexMergeCacheAndTFile(SArray* result, IterateValue* icache, IterateValue* iTfv);
|
static void indexMergeCacheAndTFile(SArray* result, IterateValue* icache, IterateValue* iTfv);
|
||||||
static void indexMergeSameKey(SArray* result, TFileValue* tv);
|
static void indexMergeSameKey(SArray* result, TFileValue* tv);
|
||||||
|
|
||||||
|
// static int32_t indexSerialTermKey(SIndexTerm* itm, char* buf);
|
||||||
|
// int32_t indexSerialKey(ICacheKey* key, char* buf);
|
||||||
|
|
||||||
int indexOpen(SIndexOpts* opts, const char* path, SIndex** index) {
|
int indexOpen(SIndexOpts* opts, const char* path, SIndex** index) {
|
||||||
pthread_once(&isInit, indexInit);
|
pthread_once(&isInit, indexInit);
|
||||||
SIndex* sIdx = calloc(1, sizeof(SIndex));
|
SIndex* sIdx = calloc(1, sizeof(SIndex));
|
||||||
|
@ -148,7 +153,7 @@ int indexPut(SIndex* index, SIndexMultiTerm* fVals, uint64_t uid) {
|
||||||
SIndexTerm* p = taosArrayGetP(fVals, i);
|
SIndexTerm* p = taosArrayGetP(fVals, i);
|
||||||
|
|
||||||
char buf[128] = {0};
|
char buf[128] = {0};
|
||||||
ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName)};
|
ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName), .colType = p->colType};
|
||||||
int32_t sz = indexSerialCacheKey(&key, buf);
|
int32_t sz = indexSerialCacheKey(&key, buf);
|
||||||
|
|
||||||
IndexCache** cache = taosHashGet(index->colObj, buf, sz);
|
IndexCache** cache = taosHashGet(index->colObj, buf, sz);
|
||||||
|
@ -163,7 +168,7 @@ int indexPut(SIndex* index, SIndexMultiTerm* fVals, uint64_t uid) {
|
||||||
SIndexTerm* p = taosArrayGetP(fVals, i);
|
SIndexTerm* p = taosArrayGetP(fVals, i);
|
||||||
|
|
||||||
char buf[128] = {0};
|
char buf[128] = {0};
|
||||||
ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName)};
|
ICacheKey key = {.suid = p->suid, .colName = p->colName, .nColName = strlen(p->colName), .colType = p->colType};
|
||||||
int32_t sz = indexSerialCacheKey(&key, buf);
|
int32_t sz = indexSerialCacheKey(&key, buf);
|
||||||
|
|
||||||
IndexCache** cache = taosHashGet(index->colObj, buf, sz);
|
IndexCache** cache = taosHashGet(index->colObj, buf, sz);
|
||||||
|
@ -330,8 +335,9 @@ static int indexTermSearch(SIndex* sIdx, SIndexTermQuery* query, SArray** result
|
||||||
IndexCache* cache = NULL;
|
IndexCache* cache = NULL;
|
||||||
|
|
||||||
char buf[128] = {0};
|
char buf[128] = {0};
|
||||||
ICacheKey key = {.suid = term->suid, .colName = term->colName, .nColName = strlen(term->colName)};
|
ICacheKey key = {
|
||||||
int32_t sz = indexSerialCacheKey(&key, buf);
|
.suid = term->suid, .colName = term->colName, .nColName = strlen(term->colName), .colType = term->colType};
|
||||||
|
int32_t sz = indexSerialCacheKey(&key, buf);
|
||||||
|
|
||||||
pthread_mutex_lock(&sIdx->mtx);
|
pthread_mutex_lock(&sIdx->mtx);
|
||||||
IndexCache** pCache = taosHashGet(sIdx->colObj, buf, sz);
|
IndexCache** pCache = taosHashGet(sIdx->colObj, buf, sz);
|
||||||
|
@ -555,11 +561,17 @@ END:
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t indexSerialCacheKey(ICacheKey* key, char* buf) {
|
int32_t indexSerialCacheKey(ICacheKey* key, char* buf) {
|
||||||
|
bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(key->colType, TSDB_DATA_TYPE_JSON);
|
||||||
|
|
||||||
char* p = buf;
|
char* p = buf;
|
||||||
SERIALIZE_MEM_TO_BUF(buf, key, suid);
|
SERIALIZE_MEM_TO_BUF(buf, key, suid);
|
||||||
SERIALIZE_VAR_TO_BUF(buf, '_', char);
|
SERIALIZE_VAR_TO_BUF(buf, '_', char);
|
||||||
// SERIALIZE_MEM_TO_BUF(buf, key, colType);
|
// SERIALIZE_MEM_TO_BUF(buf, key, colType);
|
||||||
// SERIALIZE_VAR_TO_BUF(buf, '_', char);
|
// SERIALIZE_VAR_TO_BUF(buf, '_', char);
|
||||||
SERIALIZE_STR_MEM_TO_BUF(buf, key, colName, key->nColName);
|
if (hasJson) {
|
||||||
|
SERIALIZE_STR_VAR_TO_BUF(buf, JSON_COLUMN, strlen(JSON_COLUMN));
|
||||||
|
} else {
|
||||||
|
SERIALIZE_STR_MEM_TO_BUF(buf, key, colName, key->nColName);
|
||||||
|
}
|
||||||
return buf - p;
|
return buf - p;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "index_cache.h"
|
#include "index_cache.h"
|
||||||
|
#include "index_comm.h"
|
||||||
#include "index_util.h"
|
#include "index_util.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "tsched.h"
|
#include "tsched.h"
|
||||||
|
@ -44,8 +45,9 @@ IndexCache* indexCacheCreate(SIndex* idx, uint64_t suid, const char* colName, in
|
||||||
indexError("failed to create index cache");
|
indexError("failed to create index cache");
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
cache->mem = indexInternalCacheCreate(type);
|
cache->mem = indexInternalCacheCreate(type);
|
||||||
cache->colName = tstrdup(colName);
|
cache->colName = INDEX_TYPE_CONTAIN_EXTERN_TYPE(type, TSDB_DATA_TYPE_JSON) ? tstrdup(JSON_COLUMN) : tstrdup(colName);
|
||||||
cache->type = type;
|
cache->type = type;
|
||||||
cache->index = idx;
|
cache->index = idx;
|
||||||
cache->version = 0;
|
cache->version = 0;
|
||||||
|
@ -207,11 +209,11 @@ static void indexCacheMakeRoomForWrite(IndexCache* cache) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int indexCachePut(void* cache, SIndexTerm* term, uint64_t uid) {
|
int indexCachePut(void* cache, SIndexTerm* term, uint64_t uid) {
|
||||||
if (cache == NULL) {
|
if (cache == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(term->colType, TSDB_DATA_TYPE_JSON);
|
||||||
|
|
||||||
IndexCache* pCache = cache;
|
IndexCache* pCache = cache;
|
||||||
indexCacheRef(pCache);
|
indexCacheRef(pCache);
|
||||||
|
@ -222,8 +224,12 @@ int indexCachePut(void* cache, SIndexTerm* term, uint64_t uid) {
|
||||||
}
|
}
|
||||||
// set up key
|
// set up key
|
||||||
ct->colType = term->colType;
|
ct->colType = term->colType;
|
||||||
ct->colVal = (char*)calloc(1, sizeof(char) * (term->nColVal + 1));
|
if (hasJson) {
|
||||||
memcpy(ct->colVal, term->colVal, term->nColVal);
|
ct->colVal = indexPackJsonData(term);
|
||||||
|
} else {
|
||||||
|
ct->colVal = (char*)calloc(1, sizeof(char) * (term->nColVal + 1));
|
||||||
|
memcpy(ct->colVal, term->colVal, term->nColVal);
|
||||||
|
}
|
||||||
ct->version = atomic_add_fetch_32(&pCache->version, 1);
|
ct->version = atomic_add_fetch_32(&pCache->version, 1);
|
||||||
// set value
|
// set value
|
||||||
ct->uid = uid;
|
ct->uid = uid;
|
||||||
|
@ -294,13 +300,22 @@ int indexCacheSearch(void* cache, SIndexTermQuery* query, SArray* result, STermV
|
||||||
|
|
||||||
SIndexTerm* term = query->term;
|
SIndexTerm* term = query->term;
|
||||||
EIndexQueryType qtype = query->qType;
|
EIndexQueryType qtype = query->qType;
|
||||||
CacheTerm ct = {.colVal = term->colVal, .version = atomic_load_32(&pCache->version)};
|
|
||||||
|
bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(term->colType, TSDB_DATA_TYPE_JSON);
|
||||||
|
char* p = term->colVal;
|
||||||
|
if (hasJson) {
|
||||||
|
p = indexPackJsonData(term);
|
||||||
|
}
|
||||||
|
CacheTerm ct = {.colVal = p, .version = atomic_load_32(&pCache->version)};
|
||||||
|
|
||||||
int ret = indexQueryMem(mem, &ct, qtype, result, s);
|
int ret = indexQueryMem(mem, &ct, qtype, result, s);
|
||||||
if (ret == 0 && *s != kTypeDeletion) {
|
if (ret == 0 && *s != kTypeDeletion) {
|
||||||
// continue search in imm
|
// continue search in imm
|
||||||
ret = indexQueryMem(imm, &ct, qtype, result, s);
|
ret = indexQueryMem(imm, &ct, qtype, result, s);
|
||||||
}
|
}
|
||||||
|
if (hasJson) {
|
||||||
|
tfree(p);
|
||||||
|
}
|
||||||
|
|
||||||
indexMemUnRef(mem);
|
indexMemUnRef(mem);
|
||||||
indexMemUnRef(imm);
|
indexMemUnRef(imm);
|
||||||
|
@ -367,6 +382,8 @@ static int32_t indexCacheTermCompare(const void* l, const void* r) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static MemTable* indexInternalCacheCreate(int8_t type) {
|
static MemTable* indexInternalCacheCreate(int8_t type) {
|
||||||
|
type = INDEX_TYPE_CONTAIN_EXTERN_TYPE(type, TSDB_DATA_TYPE_JSON) ? TSDB_DATA_TYPE_BINARY : type;
|
||||||
|
|
||||||
MemTable* tbl = calloc(1, sizeof(MemTable));
|
MemTable* tbl = calloc(1, sizeof(MemTable));
|
||||||
indexMemRef(tbl);
|
indexMemRef(tbl);
|
||||||
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
@ -389,9 +406,6 @@ static bool indexCacheIteratorNext(Iterate* itera) {
|
||||||
IterateValue* iv = &itera->val;
|
IterateValue* iv = &itera->val;
|
||||||
iterateValueDestroy(iv, false);
|
iterateValueDestroy(iv, false);
|
||||||
|
|
||||||
// IterateValue* iv = &itera->val;
|
|
||||||
// IterateValue tIterVal = {.colVal = NULL, .val = taosArrayInit(1, sizeof(uint64_t))};
|
|
||||||
|
|
||||||
bool next = tSkipListIterNext(iter);
|
bool next = tSkipListIterNext(iter);
|
||||||
if (next) {
|
if (next) {
|
||||||
SSkipListNode* node = tSkipListIterGet(iter);
|
SSkipListNode* node = tSkipListIterGet(iter);
|
||||||
|
@ -411,10 +425,6 @@ static bool indexCacheIteratorNext(Iterate* itera) {
|
||||||
|
|
||||||
taosArrayPush(iv->val, &ct->uid);
|
taosArrayPush(iv->val, &ct->uid);
|
||||||
}
|
}
|
||||||
// IterateValue* iv = &itera->val;
|
|
||||||
// iterateValueDestroy(iv, true);
|
|
||||||
//*iv = tIterVal;
|
|
||||||
|
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3 * or later ("AGPL"), as published by the Free
|
||||||
|
* Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "index.h"
|
||||||
|
#include "indexInt.h"
|
||||||
|
|
||||||
|
char JSON_COLUMN[] = "JSON";
|
||||||
|
char JSON_VALUE_DELIM = '&';
|
||||||
|
|
||||||
|
char* indexPackJsonData(SIndexTerm* itm) {
|
||||||
|
/*
|
||||||
|
* |<-----colname---->|<-----dataType---->|<--------colVal---------->|
|
||||||
|
* |<-----string----->|<-----uint8_t----->|<----depend on dataType-->|
|
||||||
|
*/
|
||||||
|
uint8_t ty = INDEX_TYPE_GET_TYPE(itm->colType);
|
||||||
|
|
||||||
|
int32_t sz = itm->nColName + itm->nColVal + sizeof(uint8_t) + sizeof(JSON_VALUE_DELIM) * 2 + 1;
|
||||||
|
char* buf = (char*)calloc(1, sz);
|
||||||
|
char* p = buf;
|
||||||
|
|
||||||
|
memcpy(p, itm->colName, itm->nColName);
|
||||||
|
p += itm->nColName;
|
||||||
|
|
||||||
|
memcpy(p, &JSON_VALUE_DELIM, sizeof(JSON_VALUE_DELIM));
|
||||||
|
p += sizeof(JSON_VALUE_DELIM);
|
||||||
|
|
||||||
|
memcpy(p, &ty, sizeof(ty));
|
||||||
|
p += sizeof(ty);
|
||||||
|
|
||||||
|
memcpy(p, &JSON_VALUE_DELIM, sizeof(JSON_VALUE_DELIM));
|
||||||
|
p += sizeof(JSON_VALUE_DELIM);
|
||||||
|
|
||||||
|
memcpy(p, itm->colVal, itm->nColVal);
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
|
@ -63,9 +63,9 @@ static int writeCtxDoReadFrom(WriterCtx* ctx, uint8_t* buf, int len, int32_t off
|
||||||
}
|
}
|
||||||
static int writeCtxGetSize(WriterCtx* ctx) {
|
static int writeCtxGetSize(WriterCtx* ctx) {
|
||||||
if (ctx->type == TFile) {
|
if (ctx->type == TFile) {
|
||||||
struct stat fstat;
|
int64_t file_size = 0;
|
||||||
stat(ctx->file.buf, &fstat);
|
taosStatFile(ctx->file.buf, &file_size, NULL);
|
||||||
return fstat.st_size;
|
return (int)file_size;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -99,9 +99,9 @@ WriterCtx* writerCtxCreate(WriterType type, const char* path, bool readOnly, int
|
||||||
// ctx->file.pFile = open(path, O_RDONLY, S_IRWXU | S_IRWXG | S_IRWXO);
|
// ctx->file.pFile = open(path, O_RDONLY, S_IRWXU | S_IRWXG | S_IRWXO);
|
||||||
ctx->file.pFile = taosOpenFile(path, TD_FILE_READ);
|
ctx->file.pFile = taosOpenFile(path, TD_FILE_READ);
|
||||||
|
|
||||||
struct stat fstat;
|
int64_t file_size = 0;
|
||||||
stat(path, &fstat);
|
taosFStatFile(ctx->file.pFile, &file_size, NULL);
|
||||||
ctx->file.size = fstat.st_size;
|
ctx->file.size = (int)file_size;
|
||||||
#ifdef USE_MMAP
|
#ifdef USE_MMAP
|
||||||
ctx->file.ptr = (char*)tfMmapReadOnly(ctx->file.pFile, ctx->file.size);
|
ctx->file.ptr = (char*)tfMmapReadOnly(ctx->file.pFile, ctx->file.size);
|
||||||
#endif
|
#endif
|
||||||
|
@ -142,8 +142,10 @@ void writerCtxDestroy(WriterCtx* ctx, bool remove) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (ctx->file.readOnly == false) {
|
if (ctx->file.readOnly == false) {
|
||||||
struct stat fstat;
|
int64_t file_size = 0;
|
||||||
stat(ctx->file.buf, &fstat);
|
taosStatFile(ctx->file.buf, &file_size, NULL);
|
||||||
|
// struct stat fstat;
|
||||||
|
// stat(ctx->file.buf, &fstat);
|
||||||
// indexError("write file size: %d", (int)(fstat.st_size));
|
// indexError("write file size: %d", (int)(fstat.st_size));
|
||||||
}
|
}
|
||||||
if (remove) { unlink(ctx->file.buf); }
|
if (remove) { unlink(ctx->file.buf); }
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3 * or later ("AGPL"), as published by the Free
|
||||||
|
* Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "index.h"
|
||||||
|
#include "indexInt.h"
|
||||||
|
|
||||||
|
int tIndexJsonOpen(SIndexJsonOpts *opts, const char *path, SIndexJson **index) {
|
||||||
|
// handle
|
||||||
|
return indexOpen(opts, path, index);
|
||||||
|
}
|
||||||
|
int tIndexJsonPut(SIndexJson *index, SIndexJsonMultiTerm *terms, uint64_t uid) {
|
||||||
|
for (int i = 0; i < taosArrayGetSize(terms); i++) {
|
||||||
|
SIndexJsonTerm *p = taosArrayGetP(terms, i);
|
||||||
|
INDEX_TYPE_ADD_EXTERN_TYPE(p->colType, TSDB_DATA_TYPE_JSON);
|
||||||
|
}
|
||||||
|
return indexPut(index, terms, uid);
|
||||||
|
// handle put
|
||||||
|
}
|
||||||
|
|
||||||
|
int tIndexJsonSearch(SIndexJson *index, SIndexJsonMultiTermQuery *tq, SArray *result) {
|
||||||
|
SArray *terms = tq->query;
|
||||||
|
for (int i = 0; i < taosArrayGetSize(terms); i++) {
|
||||||
|
SIndexJsonTerm *p = taosArrayGetP(terms, i);
|
||||||
|
INDEX_TYPE_ADD_EXTERN_TYPE(p->colType, TSDB_DATA_TYPE_JSON);
|
||||||
|
}
|
||||||
|
return indexSearch(index, tq, result);
|
||||||
|
// handle search
|
||||||
|
}
|
||||||
|
|
||||||
|
void tIndexJsonClose(SIndexJson *index) {
|
||||||
|
return indexClose(index);
|
||||||
|
// handle close
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ p *
|
||||||
|
|
||||||
#include "index_tfile.h"
|
#include "index_tfile.h"
|
||||||
#include "index.h"
|
#include "index.h"
|
||||||
|
#include "index_comm.h"
|
||||||
#include "index_fst.h"
|
#include "index_fst.h"
|
||||||
#include "index_fst_counting_writer.h"
|
#include "index_fst_counting_writer.h"
|
||||||
#include "index_util.h"
|
#include "index_util.h"
|
||||||
|
@ -186,13 +187,20 @@ void tfileReaderDestroy(TFileReader* reader) {
|
||||||
|
|
||||||
int tfileReaderSearch(TFileReader* reader, SIndexTermQuery* query, SArray* result) {
|
int tfileReaderSearch(TFileReader* reader, SIndexTermQuery* query, SArray* result) {
|
||||||
SIndexTerm* term = query->term;
|
SIndexTerm* term = query->term;
|
||||||
|
bool hasJson = INDEX_TYPE_CONTAIN_EXTERN_TYPE(term->colType, TSDB_DATA_TYPE_JSON);
|
||||||
EIndexQueryType qtype = query->qType;
|
EIndexQueryType qtype = query->qType;
|
||||||
|
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
// refactor to callback later
|
// refactor to callback later
|
||||||
if (qtype == QUERY_TERM) {
|
if (qtype == QUERY_TERM) {
|
||||||
uint64_t offset;
|
uint64_t offset;
|
||||||
FstSlice key = fstSliceCreate(term->colVal, term->nColVal);
|
char* p = term->colVal;
|
||||||
|
uint64_t sz = term->nColVal;
|
||||||
|
if (hasJson) {
|
||||||
|
p = indexPackJsonData(term);
|
||||||
|
sz = strlen(p);
|
||||||
|
}
|
||||||
|
FstSlice key = fstSliceCreate(p, sz);
|
||||||
if (fstGet(reader->fst, &key, &offset)) {
|
if (fstGet(reader->fst, &key, &offset)) {
|
||||||
indexInfo("index: %" PRIu64 ", col: %s, colVal: %s, found table info in tindex", term->suid, term->colName,
|
indexInfo("index: %" PRIu64 ", col: %s, colVal: %s, found table info in tindex", term->suid, term->colName,
|
||||||
term->colVal);
|
term->colVal);
|
||||||
|
@ -202,10 +210,17 @@ int tfileReaderSearch(TFileReader* reader, SIndexTermQuery* query, SArray* resul
|
||||||
term->colVal);
|
term->colVal);
|
||||||
}
|
}
|
||||||
fstSliceDestroy(&key);
|
fstSliceDestroy(&key);
|
||||||
|
if (hasJson) {
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
} else if (qtype == QUERY_PREFIX) {
|
} else if (qtype == QUERY_PREFIX) {
|
||||||
// handle later
|
// handle later
|
||||||
//
|
//
|
||||||
} else {
|
} else if (qtype == QUERY_SUFFIX) {
|
||||||
|
// handle later
|
||||||
|
} else if (qtype == QUERY_REGEX) {
|
||||||
|
// handle later
|
||||||
|
} else if (qtype == QUERY_RANGE) {
|
||||||
// handle later
|
// handle later
|
||||||
}
|
}
|
||||||
tfileReaderUnRef(reader);
|
tfileReaderUnRef(reader);
|
||||||
|
@ -260,6 +275,7 @@ int tfileWriterPut(TFileWriter* tw, void* data, bool order) {
|
||||||
__compar_fn_t fn;
|
__compar_fn_t fn;
|
||||||
|
|
||||||
int8_t colType = tw->header.colType;
|
int8_t colType = tw->header.colType;
|
||||||
|
colType = INDEX_TYPE_GET_TYPE(colType);
|
||||||
if (colType == TSDB_DATA_TYPE_BINARY || colType == TSDB_DATA_TYPE_NCHAR) {
|
if (colType == TSDB_DATA_TYPE_BINARY || colType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
fn = tfileStrCompare;
|
fn = tfileStrCompare;
|
||||||
} else {
|
} else {
|
||||||
|
@ -557,6 +573,8 @@ static int tfileWriteHeader(TFileWriter* writer) {
|
||||||
static int tfileWriteData(TFileWriter* write, TFileValue* tval) {
|
static int tfileWriteData(TFileWriter* write, TFileValue* tval) {
|
||||||
TFileHeader* header = &write->header;
|
TFileHeader* header = &write->header;
|
||||||
uint8_t colType = header->colType;
|
uint8_t colType = header->colType;
|
||||||
|
|
||||||
|
colType = INDEX_TYPE_GET_TYPE(colType);
|
||||||
if (colType == TSDB_DATA_TYPE_BINARY || colType == TSDB_DATA_TYPE_NCHAR) {
|
if (colType == TSDB_DATA_TYPE_BINARY || colType == TSDB_DATA_TYPE_NCHAR) {
|
||||||
FstSlice key = fstSliceCreate((uint8_t*)(tval->colVal), (size_t)strlen(tval->colVal));
|
FstSlice key = fstSliceCreate((uint8_t*)(tval->colVal), (size_t)strlen(tval->colVal));
|
||||||
if (fstBuilderInsert(write->fb, key, tval->offset)) {
|
if (fstBuilderInsert(write->fb, key, tval->offset)) {
|
||||||
|
@ -586,11 +604,10 @@ static int tfileReaderLoadHeader(TFileReader* reader) {
|
||||||
|
|
||||||
int64_t nread = reader->ctx->readFrom(reader->ctx, buf, sizeof(buf), 0);
|
int64_t nread = reader->ctx->readFrom(reader->ctx, buf, sizeof(buf), 0);
|
||||||
if (nread == -1) {
|
if (nread == -1) {
|
||||||
indexError("actual Read: %d, to read: %d, errno: %d, filename: %s", (int)(nread), (int)sizeof(buf),
|
indexError("actual Read: %d, to read: %d, errno: %d, filename: %s", (int)(nread), (int)sizeof(buf), errno,
|
||||||
errno, reader->ctx->file.buf);
|
reader->ctx->file.buf);
|
||||||
} else {
|
} else {
|
||||||
indexInfo("actual Read: %d, to read: %d, filename: %s", (int)(nread), (int)sizeof(buf),
|
indexInfo("actual Read: %d, to read: %d, filename: %s", (int)(nread), (int)sizeof(buf), reader->ctx->file.buf);
|
||||||
reader->ctx->file.buf);
|
|
||||||
}
|
}
|
||||||
// assert(nread == sizeof(buf));
|
// assert(nread == sizeof(buf));
|
||||||
memcpy(&reader->header, buf, sizeof(buf));
|
memcpy(&reader->header, buf, sizeof(buf));
|
||||||
|
|
|
@ -2,6 +2,7 @@ add_executable(indexTest "")
|
||||||
add_executable(fstTest "")
|
add_executable(fstTest "")
|
||||||
add_executable(fstUT "")
|
add_executable(fstUT "")
|
||||||
add_executable(UtilUT "")
|
add_executable(UtilUT "")
|
||||||
|
add_executable(jsonUT "")
|
||||||
|
|
||||||
target_sources(indexTest
|
target_sources(indexTest
|
||||||
PRIVATE
|
PRIVATE
|
||||||
|
@ -21,6 +22,10 @@ target_sources(UtilUT
|
||||||
"utilUT.cc"
|
"utilUT.cc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
target_sources(jsonUT
|
||||||
|
PRIVATE
|
||||||
|
"jsonUT.cc"
|
||||||
|
)
|
||||||
target_include_directories ( indexTest
|
target_include_directories ( indexTest
|
||||||
PUBLIC
|
PUBLIC
|
||||||
"${CMAKE_SOURCE_DIR}/include/libs/index"
|
"${CMAKE_SOURCE_DIR}/include/libs/index"
|
||||||
|
@ -43,6 +48,12 @@ target_include_directories ( UtilUT
|
||||||
"${CMAKE_SOURCE_DIR}/include/libs/index"
|
"${CMAKE_SOURCE_DIR}/include/libs/index"
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
target_include_directories (jsonUT
|
||||||
|
PUBLIC
|
||||||
|
"${CMAKE_SOURCE_DIR}/include/libs/index"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||||
|
)
|
||||||
target_link_libraries (indexTest
|
target_link_libraries (indexTest
|
||||||
os
|
os
|
||||||
util
|
util
|
||||||
|
@ -73,6 +84,13 @@ target_link_libraries (UtilUT
|
||||||
index
|
index
|
||||||
)
|
)
|
||||||
|
|
||||||
|
target_link_libraries (jsonUT
|
||||||
|
os
|
||||||
|
util
|
||||||
|
common
|
||||||
|
gtest_main
|
||||||
|
index
|
||||||
|
)
|
||||||
|
|
||||||
#add_test(
|
#add_test(
|
||||||
# NAME index_test
|
# NAME index_test
|
||||||
|
|
|
@ -301,13 +301,18 @@ void validateTFile(char* arg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void iterTFileReader(char* path, char* ver) {
|
void iterTFileReader(char* path, char* uid, char* colName, char* ver) {
|
||||||
int version = atoi(ver);
|
// tfInit();
|
||||||
TFileReader* reader = tfileReaderOpen(path, 0, version, "tag1");
|
|
||||||
Iterate* iter = tfileIteratorCreate(reader);
|
uint64_t suid = atoi(uid);
|
||||||
bool tn = iter ? iter->next(iter) : false;
|
int version = atoi(ver);
|
||||||
int count = 0;
|
|
||||||
int termCount = 0;
|
TFileReader* reader = tfileReaderOpen(path, suid, version, colName);
|
||||||
|
|
||||||
|
Iterate* iter = tfileIteratorCreate(reader);
|
||||||
|
bool tn = iter ? iter->next(iter) : false;
|
||||||
|
int count = 0;
|
||||||
|
int termCount = 0;
|
||||||
while (tn == true) {
|
while (tn == true) {
|
||||||
count++;
|
count++;
|
||||||
IterateValue* cv = iter->getValue(iter);
|
IterateValue* cv = iter->getValue(iter);
|
||||||
|
@ -323,9 +328,9 @@ void iterTFileReader(char* path, char* ver) {
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
// tool to check all kind of fst test
|
// tool to check all kind of fst test
|
||||||
// if (argc > 1) { validateTFile(argv[1]); }
|
// if (argc > 1) { validateTFile(argv[1]); }
|
||||||
if (argc > 2) {
|
if (argc > 4) {
|
||||||
// opt
|
// path suid colName ver
|
||||||
iterTFileReader(argv[1], argv[2]);
|
iterTFileReader(argv[1], argv[2], argv[3], argv[4]);
|
||||||
}
|
}
|
||||||
// checkFstCheckIterator();
|
// checkFstCheckIterator();
|
||||||
// checkFstLongTerm();
|
// checkFstLongTerm();
|
||||||
|
|
|
@ -213,21 +213,21 @@ class FstEnv : public ::testing::Test {
|
||||||
|
|
||||||
TEST_F(FstEnv, writeNormal) {
|
TEST_F(FstEnv, writeNormal) {
|
||||||
fst->CreateWriter();
|
fst->CreateWriter();
|
||||||
std::string str("aa");
|
std::string str("11");
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
str[0] = 'a' + i;
|
str[0] = '1' + i;
|
||||||
str.resize(2);
|
str.resize(2);
|
||||||
assert(fst->Put(str, i) == true);
|
assert(fst->Put(str, i) == true);
|
||||||
}
|
}
|
||||||
// order failed
|
// order failed
|
||||||
assert(fst->Put("aa", 1) == false);
|
assert(fst->Put("11", 1) == false);
|
||||||
|
|
||||||
fst->DestroyWriter();
|
fst->DestroyWriter();
|
||||||
|
|
||||||
fst->CreateReader();
|
fst->CreateReader();
|
||||||
uint64_t val;
|
uint64_t val;
|
||||||
assert(fst->Get("a", &val) == false);
|
assert(fst->Get("1", &val) == false);
|
||||||
assert(fst->Get("aa", &val) == true);
|
assert(fst->Get("11", &val) == true);
|
||||||
assert(val == 0);
|
assert(val == 0);
|
||||||
|
|
||||||
std::vector<uint64_t> rlt;
|
std::vector<uint64_t> rlt;
|
||||||
|
@ -235,3 +235,19 @@ TEST_F(FstEnv, writeNormal) {
|
||||||
assert(fst->Search(ctx, rlt) == true);
|
assert(fst->Search(ctx, rlt) == true);
|
||||||
}
|
}
|
||||||
TEST_F(FstEnv, WriteMillonrRecord) {}
|
TEST_F(FstEnv, WriteMillonrRecord) {}
|
||||||
|
TEST_F(FstEnv, writeAbNormal) {
|
||||||
|
fst->CreateWriter();
|
||||||
|
std::string str1("voltage&\b&ab");
|
||||||
|
std::string str2("voltbge&\b&ab");
|
||||||
|
|
||||||
|
fst->Put(str1, 1);
|
||||||
|
fst->Put(str2, 2);
|
||||||
|
|
||||||
|
fst->DestroyWriter();
|
||||||
|
|
||||||
|
fst->CreateReader();
|
||||||
|
uint64_t val;
|
||||||
|
assert(fst->Get("1", &val) == false);
|
||||||
|
assert(fst->Get("voltage&\b&ab", &val) == true);
|
||||||
|
assert(val == 1);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,135 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
#include <vector>
|
||||||
|
#include "index.h"
|
||||||
|
#include "indexInt.h"
|
||||||
|
#include "index_cache.h"
|
||||||
|
#include "index_fst.h"
|
||||||
|
#include "index_fst_counting_writer.h"
|
||||||
|
#include "index_fst_util.h"
|
||||||
|
#include "index_tfile.h"
|
||||||
|
#include "index_util.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "tskiplist.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
|
static std::string dir = "/tmp/json";
|
||||||
|
class JsonEnv : public ::testing::Test {
|
||||||
|
protected:
|
||||||
|
virtual void SetUp() {
|
||||||
|
taosRemoveDir(dir.c_str());
|
||||||
|
taosMkDir(dir.c_str());
|
||||||
|
printf("set up\n");
|
||||||
|
opts = indexOptsCreate();
|
||||||
|
int ret = tIndexJsonOpen(opts, dir.c_str(), &index);
|
||||||
|
assert(ret == 0);
|
||||||
|
}
|
||||||
|
virtual void TearDown() {
|
||||||
|
tIndexJsonClose(index);
|
||||||
|
indexOptsDestroy(opts);
|
||||||
|
printf("destory\n");
|
||||||
|
}
|
||||||
|
SIndexJsonOpts* opts;
|
||||||
|
SIndexJson* index;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(JsonEnv, testWrite) {
|
||||||
|
{
|
||||||
|
std::string colName("test");
|
||||||
|
std::string colVal("ab");
|
||||||
|
SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
|
colVal.c_str(), colVal.size());
|
||||||
|
|
||||||
|
SIndexMultiTerm* terms = indexMultiTermCreate();
|
||||||
|
indexMultiTermAdd(terms, term);
|
||||||
|
for (size_t i = 0; i < 100; i++) {
|
||||||
|
tIndexJsonPut(index, terms, i);
|
||||||
|
}
|
||||||
|
indexMultiTermDestroy(terms);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::string colName("voltage");
|
||||||
|
std::string colVal("ab1");
|
||||||
|
SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
|
colVal.c_str(), colVal.size());
|
||||||
|
|
||||||
|
SIndexMultiTerm* terms = indexMultiTermCreate();
|
||||||
|
indexMultiTermAdd(terms, term);
|
||||||
|
for (size_t i = 0; i < 100; i++) {
|
||||||
|
tIndexJsonPut(index, terms, i);
|
||||||
|
}
|
||||||
|
indexMultiTermDestroy(terms);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::string colName("voltage");
|
||||||
|
std::string colVal("123");
|
||||||
|
SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
|
colVal.c_str(), colVal.size());
|
||||||
|
|
||||||
|
SIndexMultiTerm* terms = indexMultiTermCreate();
|
||||||
|
indexMultiTermAdd(terms, term);
|
||||||
|
for (size_t i = 0; i < 100; i++) {
|
||||||
|
tIndexJsonPut(index, terms, i);
|
||||||
|
}
|
||||||
|
indexMultiTermDestroy(terms);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::string colName("test");
|
||||||
|
std::string colVal("ab");
|
||||||
|
|
||||||
|
SIndexMultiTermQuery* mq = indexMultiTermQueryCreate(MUST);
|
||||||
|
SIndexTerm* q = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
|
colVal.c_str(), colVal.size());
|
||||||
|
|
||||||
|
SArray* result = taosArrayInit(1, sizeof(uint64_t));
|
||||||
|
indexMultiTermQueryAdd(mq, q, QUERY_TERM);
|
||||||
|
tIndexJsonSearch(index, mq, result);
|
||||||
|
assert(100 == taosArrayGetSize(result));
|
||||||
|
indexMultiTermQueryDestroy(mq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TEST_F(JsonEnv, testWriteMillonData) {
|
||||||
|
{
|
||||||
|
std::string colName("test");
|
||||||
|
std::string colVal("ab");
|
||||||
|
SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
|
colVal.c_str(), colVal.size());
|
||||||
|
|
||||||
|
SIndexMultiTerm* terms = indexMultiTermCreate();
|
||||||
|
indexMultiTermAdd(terms, term);
|
||||||
|
for (size_t i = 0; i < 100; i++) {
|
||||||
|
tIndexJsonPut(index, terms, i);
|
||||||
|
}
|
||||||
|
indexMultiTermDestroy(terms);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::string colName("voltagefdadfa");
|
||||||
|
std::string colVal("abxxxxxxxxxxxx");
|
||||||
|
SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
|
colVal.c_str(), colVal.size());
|
||||||
|
|
||||||
|
SIndexMultiTerm* terms = indexMultiTermCreate();
|
||||||
|
indexMultiTermAdd(terms, term);
|
||||||
|
for (size_t i = 0; i < 1000000; i++) {
|
||||||
|
tIndexJsonPut(index, terms, i);
|
||||||
|
}
|
||||||
|
indexMultiTermDestroy(terms);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::string colName("test");
|
||||||
|
std::string colVal("ab");
|
||||||
|
|
||||||
|
SIndexMultiTermQuery* mq = indexMultiTermQueryCreate(MUST);
|
||||||
|
SIndexTerm* q = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
|
colVal.c_str(), colVal.size());
|
||||||
|
|
||||||
|
SArray* result = taosArrayInit(1, sizeof(uint64_t));
|
||||||
|
indexMultiTermQueryAdd(mq, q, QUERY_TERM);
|
||||||
|
tIndexJsonSearch(index, mq, result);
|
||||||
|
assert(100 == taosArrayGetSize(result));
|
||||||
|
indexMultiTermQueryDestroy(mq);
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,7 +23,7 @@
|
||||||
static SMonitor tsMonitor = {0};
|
static SMonitor tsMonitor = {0};
|
||||||
|
|
||||||
int32_t monInit(const SMonCfg *pCfg) {
|
int32_t monInit(const SMonCfg *pCfg) {
|
||||||
tsMonitor.logs = taosArrayInit(16, sizeof(SMonInfo));
|
tsMonitor.logs = taosArrayInit(16, sizeof(SMonLogItem));
|
||||||
if (tsMonitor.logs == NULL) {
|
if (tsMonitor.logs == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -44,7 +44,7 @@ void monCleanup() {
|
||||||
void monAddLogItem(SMonLogItem *pItem) {
|
void monAddLogItem(SMonLogItem *pItem) {
|
||||||
taosWLockLatch(&tsMonitor.lock);
|
taosWLockLatch(&tsMonitor.lock);
|
||||||
int32_t size = taosArrayGetSize(tsMonitor.logs);
|
int32_t size = taosArrayGetSize(tsMonitor.logs);
|
||||||
if (size > tsMonitor.maxLogs) {
|
if (size >= tsMonitor.maxLogs) {
|
||||||
uInfo("too many logs for monitor");
|
uInfo("too many logs for monitor");
|
||||||
} else {
|
} else {
|
||||||
taosArrayPush(tsMonitor.logs, pItem);
|
taosArrayPush(tsMonitor.logs, pItem);
|
||||||
|
@ -54,7 +54,10 @@ void monAddLogItem(SMonLogItem *pItem) {
|
||||||
|
|
||||||
SMonInfo *monCreateMonitorInfo() {
|
SMonInfo *monCreateMonitorInfo() {
|
||||||
SMonInfo *pMonitor = calloc(1, sizeof(SMonInfo));
|
SMonInfo *pMonitor = calloc(1, sizeof(SMonInfo));
|
||||||
if (pMonitor == NULL) return NULL;
|
if (pMonitor == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
taosWLockLatch(&tsMonitor.lock);
|
taosWLockLatch(&tsMonitor.lock);
|
||||||
pMonitor->logs = taosArrayDup(tsMonitor.logs);
|
pMonitor->logs = taosArrayDup(tsMonitor.logs);
|
||||||
|
@ -77,41 +80,257 @@ void monCleanupMonitorInfo(SMonInfo *pMonitor) {
|
||||||
free(pMonitor);
|
free(pMonitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void monSetBasicInfo(SMonInfo *pMonitor, SMonBasicInfo *pInfo) {
|
||||||
|
SJson *pJson = pMonitor->pJson;
|
||||||
|
int64_t ms = taosGetTimestampMs();
|
||||||
|
char buf[40] = {0};
|
||||||
|
taosFormatUtcTime(buf, sizeof(buf), ms, TSDB_TIME_PRECISION_MILLI);
|
||||||
|
|
||||||
|
tjsonAddStringToObject(pJson, "ts", buf);
|
||||||
|
tjsonAddDoubleToObject(pJson, "dnode_id", pInfo->dnode_id);
|
||||||
|
tjsonAddStringToObject(pJson, "dnode_ep", pInfo->dnode_ep);
|
||||||
|
}
|
||||||
|
|
||||||
|
void monSetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) {
|
||||||
|
SJson *pJson = tjsonCreateObject();
|
||||||
|
if (pJson == NULL) return;
|
||||||
|
if (tjsonAddItemToObject(pMonitor->pJson, "cluster_info", pJson) != 0) {
|
||||||
|
tjsonDelete(pJson);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tjsonAddStringToObject(pJson, "first_ep", pInfo->first_ep);
|
||||||
|
tjsonAddDoubleToObject(pJson, "first_ep_dnode_id", pInfo->first_ep_dnode_id);
|
||||||
|
tjsonAddStringToObject(pJson, "version", pInfo->version);
|
||||||
|
tjsonAddDoubleToObject(pJson, "master_uptime", pInfo->master_uptime);
|
||||||
|
tjsonAddDoubleToObject(pJson, "monitor_interval", pInfo->monitor_interval);
|
||||||
|
tjsonAddDoubleToObject(pJson, "vgroups_total", pInfo->vgroups_total);
|
||||||
|
tjsonAddDoubleToObject(pJson, "vgroups_alive", pInfo->vgroups_alive);
|
||||||
|
tjsonAddDoubleToObject(pJson, "vnodes_total", pInfo->vnodes_total);
|
||||||
|
tjsonAddDoubleToObject(pJson, "vnodes_alive", pInfo->vnodes_alive);
|
||||||
|
tjsonAddDoubleToObject(pJson, "connections_total", pInfo->connections_total);
|
||||||
|
|
||||||
|
SJson *pDnodesJson = tjsonAddArrayToObject(pJson, "dnodes");
|
||||||
|
if (pDnodesJson == NULL) return;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(pInfo->dnodes); ++i) {
|
||||||
|
SJson *pDnodeJson = tjsonCreateObject();
|
||||||
|
if (pDnodeJson == NULL) continue;
|
||||||
|
|
||||||
|
SMonDnodeDesc *pDnodeDesc = taosArrayGet(pInfo->dnodes, i);
|
||||||
|
tjsonAddDoubleToObject(pDnodeJson, "dnode_id", pDnodeDesc->dnode_id);
|
||||||
|
tjsonAddStringToObject(pDnodeJson, "dnode_ep", pDnodeDesc->dnode_ep);
|
||||||
|
tjsonAddStringToObject(pDnodeJson, "status", pDnodeDesc->status);
|
||||||
|
|
||||||
|
if (tjsonAddItemToArray(pDnodesJson, pDnodeJson) != 0) tjsonDelete(pDnodeJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
SJson *pMnodesJson = tjsonAddArrayToObject(pJson, "mnodes");
|
||||||
|
if (pMnodesJson == NULL) return;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(pInfo->dnodes); ++i) {
|
||||||
|
SJson *pMnodeJson = tjsonCreateObject();
|
||||||
|
if (pMnodeJson == NULL) continue;
|
||||||
|
|
||||||
|
SMonMnodeDesc *pMnodeDesc = taosArrayGet(pInfo->dnodes, i);
|
||||||
|
tjsonAddDoubleToObject(pMnodeJson, "mnode_id", pMnodeDesc->mnode_id);
|
||||||
|
tjsonAddStringToObject(pMnodeJson, "mnode_ep", pMnodeDesc->mnode_ep);
|
||||||
|
tjsonAddStringToObject(pMnodeJson, "role", pMnodeDesc->role);
|
||||||
|
|
||||||
|
if (tjsonAddItemToArray(pMnodesJson, pMnodeJson) != 0) tjsonDelete(pMnodeJson);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void monSetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) {
|
||||||
|
SJson *pJson = tjsonAddArrayToObject(pMonitor->pJson, "vgroup_infos");
|
||||||
|
if (pJson == NULL) return;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(pInfo->vgroups); ++i) {
|
||||||
|
SJson *pVgroupJson = tjsonCreateObject();
|
||||||
|
if (pVgroupJson == NULL) continue;
|
||||||
|
if (tjsonAddItemToArray(pJson, pVgroupJson) != 0) {
|
||||||
|
tjsonDelete(pVgroupJson);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMonVgroupDesc *pVgroupDesc = taosArrayGet(pInfo->vgroups, i);
|
||||||
|
tjsonAddDoubleToObject(pVgroupJson, "vgroup_id", pVgroupDesc->vgroup_id);
|
||||||
|
tjsonAddStringToObject(pVgroupJson, "database_name", pVgroupDesc->database_name);
|
||||||
|
tjsonAddDoubleToObject(pVgroupJson, "tables_num", pVgroupDesc->tables_num);
|
||||||
|
tjsonAddStringToObject(pVgroupJson, "status", pVgroupDesc->status);
|
||||||
|
|
||||||
|
SJson *pVnodesJson = tjsonAddArrayToObject(pVgroupJson, "vnodes");
|
||||||
|
if (pVnodesJson == NULL) continue;
|
||||||
|
|
||||||
|
for (int32_t j = 0; j < TSDB_MAX_REPLICA; ++j) {
|
||||||
|
SMonVnodeDesc *pVnodeDesc = &pVgroupDesc->vnodes[j];
|
||||||
|
if (pVnodeDesc->dnode_id <= 0) continue;
|
||||||
|
|
||||||
|
SJson *pVnodeJson = tjsonCreateObject();
|
||||||
|
if (pVnodeJson == NULL) continue;
|
||||||
|
|
||||||
|
tjsonAddDoubleToObject(pVnodeJson, "dnode_id", pVnodeDesc->dnode_id);
|
||||||
|
tjsonAddStringToObject(pVnodeJson, "vnode_role", pVnodeDesc->vnode_role);
|
||||||
|
|
||||||
|
if (tjsonAddItemToArray(pVnodesJson, pVnodeJson) != 0) tjsonDelete(pVnodeJson);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void monSetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo) {
|
||||||
|
SJson *pJson = tjsonCreateObject();
|
||||||
|
if (pJson == NULL) return;
|
||||||
|
if (tjsonAddItemToObject(pMonitor->pJson, "grant_info", pJson) != 0) {
|
||||||
|
tjsonDelete(pJson);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tjsonAddDoubleToObject(pJson, "expire_time", pInfo->expire_time);
|
||||||
|
tjsonAddDoubleToObject(pJson, "timeseries_used", pInfo->timeseries_used);
|
||||||
|
tjsonAddDoubleToObject(pJson, "timeseries_total", pInfo->timeseries_total);
|
||||||
|
}
|
||||||
|
|
||||||
|
void monSetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo) {
|
||||||
|
SJson *pJson = tjsonCreateObject();
|
||||||
|
if (pJson == NULL) return;
|
||||||
|
if (tjsonAddItemToObject(pMonitor->pJson, "dnode_info", pJson) != 0) {
|
||||||
|
tjsonDelete(pJson);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tjsonAddDoubleToObject(pJson, "uptime", pInfo->uptime);
|
||||||
|
tjsonAddDoubleToObject(pJson, "cpu_engine", pInfo->cpu_engine);
|
||||||
|
tjsonAddDoubleToObject(pJson, "cpu_system", pInfo->cpu_system);
|
||||||
|
tjsonAddDoubleToObject(pJson, "cpu_cores", pInfo->cpu_cores);
|
||||||
|
tjsonAddDoubleToObject(pJson, "mem_engine", pInfo->mem_engine);
|
||||||
|
tjsonAddDoubleToObject(pJson, "mem_system", pInfo->mem_system);
|
||||||
|
tjsonAddDoubleToObject(pJson, "mem_total", pInfo->mem_total);
|
||||||
|
tjsonAddDoubleToObject(pJson, "disk_engine", pInfo->disk_engine);
|
||||||
|
tjsonAddDoubleToObject(pJson, "disk_used", pInfo->disk_used);
|
||||||
|
tjsonAddDoubleToObject(pJson, "disk_total", pInfo->disk_total);
|
||||||
|
tjsonAddDoubleToObject(pJson, "net_in", pInfo->net_in);
|
||||||
|
tjsonAddDoubleToObject(pJson, "net_out", pInfo->net_out);
|
||||||
|
tjsonAddDoubleToObject(pJson, "io_read", pInfo->io_read);
|
||||||
|
tjsonAddDoubleToObject(pJson, "io_write", pInfo->io_write);
|
||||||
|
tjsonAddDoubleToObject(pJson, "io_read_disk", pInfo->io_read_disk);
|
||||||
|
tjsonAddDoubleToObject(pJson, "io_write_disk", pInfo->io_write_disk);
|
||||||
|
tjsonAddDoubleToObject(pJson, "req_select", pInfo->req_select);
|
||||||
|
tjsonAddDoubleToObject(pJson, "req_select_rate", pInfo->req_select_rate);
|
||||||
|
tjsonAddDoubleToObject(pJson, "req_insert", pInfo->req_insert);
|
||||||
|
tjsonAddDoubleToObject(pJson, "req_insert_success", pInfo->req_insert_success);
|
||||||
|
tjsonAddDoubleToObject(pJson, "req_insert_rate", pInfo->req_insert_rate);
|
||||||
|
tjsonAddDoubleToObject(pJson, "req_insert_batch", pInfo->req_insert_batch);
|
||||||
|
tjsonAddDoubleToObject(pJson, "req_insert_batch_success", pInfo->req_insert_batch_success);
|
||||||
|
tjsonAddDoubleToObject(pJson, "req_insert_batch_rate", pInfo->req_insert_batch_rate);
|
||||||
|
tjsonAddDoubleToObject(pJson, "errors", pInfo->errors);
|
||||||
|
tjsonAddDoubleToObject(pJson, "vnodes_num", pInfo->vnodes_num);
|
||||||
|
tjsonAddDoubleToObject(pJson, "masters", pInfo->masters);
|
||||||
|
tjsonAddDoubleToObject(pJson, "has_mnode", pInfo->has_mnode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void monSetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) {
|
||||||
|
SJson *pJson = tjsonCreateObject();
|
||||||
|
if (pJson == NULL) return;
|
||||||
|
if (tjsonAddItemToObject(pMonitor->pJson, "disk_infos", pJson) != 0) {
|
||||||
|
tjsonDelete(pJson);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SJson *pDatadirsJson = tjsonAddArrayToObject(pJson, "datadir");
|
||||||
|
if (pDatadirsJson == NULL) return;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(pInfo->datadirs); ++i) {
|
||||||
|
SJson *pDatadirJson = tjsonCreateObject();
|
||||||
|
if (pDatadirJson == NULL) continue;
|
||||||
|
|
||||||
|
SMonDiskDesc *pDatadirDesc = taosArrayGet(pInfo->datadirs, i);
|
||||||
|
if (tjsonAddStringToObject(pDatadirJson, "name", pDatadirDesc->name) != 0) tjsonDelete(pDatadirJson);
|
||||||
|
if (tjsonAddDoubleToObject(pDatadirJson, "level", pDatadirDesc->level) != 0) tjsonDelete(pDatadirJson);
|
||||||
|
if (tjsonAddDoubleToObject(pDatadirJson, "avail", pDatadirDesc->size.avail) != 0) tjsonDelete(pDatadirJson);
|
||||||
|
if (tjsonAddDoubleToObject(pDatadirJson, "used", pDatadirDesc->size.used) != 0) tjsonDelete(pDatadirJson);
|
||||||
|
if (tjsonAddDoubleToObject(pDatadirJson, "total", pDatadirDesc->size.total) != 0) tjsonDelete(pDatadirJson);
|
||||||
|
|
||||||
|
if (tjsonAddItemToArray(pDatadirsJson, pDatadirJson) != 0) tjsonDelete(pDatadirJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
SJson *pLogdirJson = tjsonCreateObject();
|
||||||
|
if (pLogdirJson == NULL) return;
|
||||||
|
if (tjsonAddItemToObject(pJson, "logdir", pLogdirJson) != 0) return;
|
||||||
|
tjsonAddStringToObject(pLogdirJson, "name", pInfo->logdir.name);
|
||||||
|
tjsonAddDoubleToObject(pLogdirJson, "avail", pInfo->logdir.size.avail);
|
||||||
|
tjsonAddDoubleToObject(pLogdirJson, "used", pInfo->logdir.size.used);
|
||||||
|
tjsonAddDoubleToObject(pLogdirJson, "total", pInfo->logdir.size.total);
|
||||||
|
|
||||||
|
SJson *pTempdirJson = tjsonCreateObject();
|
||||||
|
if (pTempdirJson == NULL) return;
|
||||||
|
if (tjsonAddItemToObject(pJson, "tempdir", pTempdirJson) != 0) return;
|
||||||
|
tjsonAddStringToObject(pTempdirJson, "name", pInfo->tempdir.name);
|
||||||
|
tjsonAddDoubleToObject(pTempdirJson, "avail", pInfo->tempdir.size.avail);
|
||||||
|
tjsonAddDoubleToObject(pTempdirJson, "used", pInfo->tempdir.size.used);
|
||||||
|
tjsonAddDoubleToObject(pTempdirJson, "total", pInfo->tempdir.size.total);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void monSetLogInfo(SMonInfo *pMonitor) {
|
||||||
|
SJson *pJson = tjsonCreateObject();
|
||||||
|
if (pJson == NULL) return;
|
||||||
|
if (tjsonAddItemToObject(pMonitor->pJson, "log_infos", pJson) != 0) {
|
||||||
|
tjsonDelete(pJson);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SJson *pLogsJson = tjsonAddArrayToObject(pJson, "logs");
|
||||||
|
if (pLogsJson == NULL) return;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(pMonitor->logs); ++i) {
|
||||||
|
SJson *pLogJson = tjsonCreateObject();
|
||||||
|
if (pLogJson == NULL) continue;
|
||||||
|
|
||||||
|
SMonLogItem *pLogItem = taosArrayGet(pMonitor->logs, i);
|
||||||
|
|
||||||
|
char buf[40] = {0};
|
||||||
|
taosFormatUtcTime(buf, sizeof(buf), pLogItem->ts, TSDB_TIME_PRECISION_MILLI);
|
||||||
|
|
||||||
|
tjsonAddStringToObject(pLogJson, "ts", buf);
|
||||||
|
tjsonAddDoubleToObject(pLogJson, "level", pLogItem->level);
|
||||||
|
tjsonAddStringToObject(pLogJson, "content", pLogItem->content);
|
||||||
|
|
||||||
|
if (tjsonAddItemToArray(pLogsJson, pLogJson) != 0) tjsonDelete(pLogJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
SJson *pSummaryJson = tjsonAddArrayToObject(pJson, "summary");
|
||||||
|
if (pSummaryJson == NULL) return;
|
||||||
|
|
||||||
|
SJson *pLogError = tjsonCreateObject();
|
||||||
|
if (pLogError == NULL) return;
|
||||||
|
tjsonAddStringToObject(pLogError, "level", "error");
|
||||||
|
tjsonAddDoubleToObject(pLogError, "total", 1);
|
||||||
|
if (tjsonAddItemToArray(pSummaryJson, pLogError) != 0) tjsonDelete(pLogError);
|
||||||
|
|
||||||
|
SJson *pLogInfo = tjsonCreateObject();
|
||||||
|
if (pLogInfo == NULL) return;
|
||||||
|
tjsonAddStringToObject(pLogInfo, "level", "info");
|
||||||
|
tjsonAddDoubleToObject(pLogInfo, "total", 1);
|
||||||
|
if (tjsonAddItemToArray(pSummaryJson, pLogInfo) != 0) tjsonDelete(pLogInfo);
|
||||||
|
|
||||||
|
SJson *pLogDebug = tjsonCreateObject();
|
||||||
|
if (pLogDebug == NULL) return;
|
||||||
|
tjsonAddStringToObject(pLogDebug, "level", "debug");
|
||||||
|
tjsonAddDoubleToObject(pLogDebug, "total", 1);
|
||||||
|
if (tjsonAddItemToArray(pSummaryJson, pLogDebug) != 0) tjsonDelete(pLogDebug);
|
||||||
|
|
||||||
|
SJson *pLogTrace = tjsonCreateObject();
|
||||||
|
if (pLogTrace == NULL) return;
|
||||||
|
tjsonAddStringToObject(pLogTrace, "level", "trace");
|
||||||
|
tjsonAddDoubleToObject(pLogTrace, "total", 1);
|
||||||
|
if (tjsonAddItemToArray(pSummaryJson, pLogTrace) != 0) tjsonDelete(pLogTrace);
|
||||||
|
}
|
||||||
|
|
||||||
void monSendReport(SMonInfo *pMonitor) {
|
void monSendReport(SMonInfo *pMonitor) {
|
||||||
|
monSetLogInfo(pMonitor);
|
||||||
|
|
||||||
char *pCont = tjsonToString(pMonitor->pJson);
|
char *pCont = tjsonToString(pMonitor->pJson);
|
||||||
if (pCont != NULL) {
|
if (pCont != NULL) {
|
||||||
taosSendHttpReport(tsMonitor.server, tsMonitor.port, pCont, strlen(pCont));
|
taosSendHttpReport(tsMonitor.server, tsMonitor.port, pCont, strlen(pCont));
|
||||||
free(pCont);
|
free(pCont);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void monSetBasicInfo(SMonInfo *pMonitor, SMonBasicInfo *pInfo) {
|
|
||||||
SJson *pJson = pMonitor->pJson;
|
|
||||||
tjsonAddDoubleToObject(pJson, "dnode_id", pInfo->dnode_id);
|
|
||||||
tjsonAddStringToObject(pJson, "dnode_ep", pInfo->dnode_ep);
|
|
||||||
|
|
||||||
int64_t ms = taosGetTimestampMs();
|
|
||||||
char buf[40] = {0};
|
|
||||||
taosFormatUtcTime(buf, sizeof(buf), ms, TSDB_TIME_PRECISION_MILLI);
|
|
||||||
tjsonAddStringToObject(pJson, "ts", buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void monSetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void monSetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void monSetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void monSetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void monSetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -13,21 +13,262 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
#include "monitor.h"
|
#include "monitor.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
|
||||||
class MonitorTest : public ::testing::Test {
|
class MonitorTest : public ::testing::Test {
|
||||||
protected:
|
protected:
|
||||||
static void SetUpTestSuite() { root = "/tmp/monTest"; }
|
static void SetUpTestSuite() {
|
||||||
static void TearDownTestSuite() {}
|
SMonCfg cfg;
|
||||||
|
cfg.maxLogs = 2;
|
||||||
|
cfg.port = 80;
|
||||||
|
cfg.server = "localhost";
|
||||||
|
monInit(&cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void TearDownTestSuite() { monCleanup(); }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void SetUp() override {}
|
void SetUp() override {}
|
||||||
void TearDown() override {}
|
void TearDown() override {}
|
||||||
|
|
||||||
static const char *root;
|
void GetBasicInfo(SMonInfo *pMonitor, SMonBasicInfo *pInfo);
|
||||||
|
void GetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo);
|
||||||
|
void GetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo);
|
||||||
|
void GetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo);
|
||||||
|
void GetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo);
|
||||||
|
void GetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo);
|
||||||
|
void AddLogInfo1();
|
||||||
|
void AddLogInfo2();
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *MonitorTest::root;
|
void MonitorTest::GetBasicInfo(SMonInfo *pMonitor, SMonBasicInfo *pInfo) {
|
||||||
|
pInfo->dnode_id = 1;
|
||||||
TEST_F(MonitorTest, 01_Open_Close) {
|
strcpy(pInfo->dnode_ep, "localhost");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MonitorTest::GetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo) {
|
||||||
|
strcpy(pInfo->first_ep, "localhost:6030");
|
||||||
|
pInfo->first_ep_dnode_id = 1;
|
||||||
|
strcpy(pInfo->version, "3.0.0.0");
|
||||||
|
pInfo->master_uptime = 1;
|
||||||
|
pInfo->monitor_interval = 2;
|
||||||
|
pInfo->vgroups_total = 3;
|
||||||
|
pInfo->vgroups_alive = 43;
|
||||||
|
pInfo->vnodes_total = 5;
|
||||||
|
pInfo->vnodes_alive = 6;
|
||||||
|
pInfo->connections_total = 7;
|
||||||
|
|
||||||
|
pInfo->dnodes = taosArrayInit(4, sizeof(SMonDnodeDesc));
|
||||||
|
SMonDnodeDesc d1 = {0};
|
||||||
|
d1.dnode_id = 1;
|
||||||
|
strcpy(d1.dnode_ep, "localhost:6030");
|
||||||
|
strcpy(d1.status, "ready");
|
||||||
|
taosArrayPush(pInfo->dnodes, &d1);
|
||||||
|
SMonDnodeDesc d2 = {0};
|
||||||
|
d2.dnode_id = 2;
|
||||||
|
strcpy(d2.dnode_ep, "localhost:7030");
|
||||||
|
strcpy(d2.status, "offline");
|
||||||
|
taosArrayPush(pInfo->dnodes, &d2);
|
||||||
|
|
||||||
|
pInfo->mnodes = taosArrayInit(4, sizeof(SMonMnodeDesc));
|
||||||
|
SMonMnodeDesc m1 = {0};
|
||||||
|
m1.mnode_id = 1;
|
||||||
|
strcpy(m1.mnode_ep, "localhost:6030");
|
||||||
|
strcpy(m1.role, "master");
|
||||||
|
taosArrayPush(pInfo->mnodes, &m1);
|
||||||
|
SMonMnodeDesc m2 = {0};
|
||||||
|
m2.mnode_id = 2;
|
||||||
|
strcpy(m2.mnode_ep, "localhost:7030");
|
||||||
|
strcpy(m2.role, "unsynced");
|
||||||
|
taosArrayPush(pInfo->mnodes, &m2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MonitorTest::GetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo) {
|
||||||
|
pInfo->vgroups = taosArrayInit(4, sizeof(SMonVgroupDesc));
|
||||||
|
|
||||||
|
SMonVgroupDesc vg1 = {0};
|
||||||
|
vg1.vgroup_id = 1;
|
||||||
|
strcpy(vg1.database_name, "d1");
|
||||||
|
vg1.tables_num = 4;
|
||||||
|
strcpy(vg1.status, "ready");
|
||||||
|
vg1.vnodes[0].dnode_id = 1;
|
||||||
|
strcpy(vg1.vnodes[0].vnode_role, "master");
|
||||||
|
vg1.vnodes[1].dnode_id = 2;
|
||||||
|
strcpy(vg1.vnodes[1].vnode_role, "slave");
|
||||||
|
taosArrayPush(pInfo->vgroups, &vg1);
|
||||||
|
|
||||||
|
SMonVgroupDesc vg2 = {0};
|
||||||
|
vg2.vgroup_id = 2;
|
||||||
|
strcpy(vg2.database_name, "d2");
|
||||||
|
vg2.tables_num = 5;
|
||||||
|
strcpy(vg2.status, "offline");
|
||||||
|
vg2.vnodes[0].dnode_id = 1;
|
||||||
|
strcpy(vg2.vnodes[0].vnode_role, "master");
|
||||||
|
vg2.vnodes[1].dnode_id = 2;
|
||||||
|
strcpy(vg2.vnodes[1].vnode_role, "unsynced");
|
||||||
|
taosArrayPush(pInfo->vgroups, &vg2);
|
||||||
|
|
||||||
|
SMonVgroupDesc vg3 = {0};
|
||||||
|
vg3.vgroup_id = 3;
|
||||||
|
strcpy(vg3.database_name, "d3");
|
||||||
|
vg3.tables_num = 6;
|
||||||
|
strcpy(vg3.status, "ready");
|
||||||
|
vg3.vnodes[0].dnode_id = 1;
|
||||||
|
strcpy(vg3.vnodes[0].vnode_role, "master");
|
||||||
|
taosArrayPush(pInfo->vgroups, &vg3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MonitorTest::GetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo) {
|
||||||
|
pInfo->expire_time = 1234567;
|
||||||
|
pInfo->timeseries_total = 234567;
|
||||||
|
pInfo->timeseries_used = 34567;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MonitorTest::GetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo) {
|
||||||
|
pInfo->uptime = 1.2;
|
||||||
|
pInfo->cpu_engine = 2.1;
|
||||||
|
pInfo->cpu_system = 2.1;
|
||||||
|
pInfo->cpu_cores = 2;
|
||||||
|
pInfo->mem_engine = 3.1;
|
||||||
|
pInfo->mem_system = 3.2;
|
||||||
|
pInfo->mem_total = 3.3;
|
||||||
|
pInfo->disk_engine = 4.1;
|
||||||
|
pInfo->disk_used = 4.2;
|
||||||
|
pInfo->disk_total = 4.3;
|
||||||
|
pInfo->net_in = 5.1;
|
||||||
|
pInfo->net_out = 5.2;
|
||||||
|
pInfo->io_read = 6.1;
|
||||||
|
pInfo->io_write = 6.2;
|
||||||
|
pInfo->io_read_disk = 7.1;
|
||||||
|
pInfo->io_write_disk = 7.2;
|
||||||
|
pInfo->req_select = 8;
|
||||||
|
pInfo->req_select_rate = 8.1;
|
||||||
|
pInfo->req_insert = 9;
|
||||||
|
pInfo->req_insert_success = 10;
|
||||||
|
pInfo->req_insert_rate = 10.1;
|
||||||
|
pInfo->req_insert_batch = 11;
|
||||||
|
pInfo->req_insert_batch_success = 12;
|
||||||
|
pInfo->req_insert_batch_rate = 12.3;
|
||||||
|
pInfo->errors = 4;
|
||||||
|
pInfo->vnodes_num = 5;
|
||||||
|
pInfo->masters = 6;
|
||||||
|
pInfo->has_mnode = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MonitorTest::GetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo) {
|
||||||
|
pInfo->datadirs = taosArrayInit(2, sizeof(SMonDiskDesc));
|
||||||
|
SMonDiskDesc d1 = {0};
|
||||||
|
strcpy(d1.name, "/t1/d1/d");
|
||||||
|
d1.level = 0;
|
||||||
|
d1.size.avail = 11;
|
||||||
|
d1.size.total = 12;
|
||||||
|
d1.size.used = 13;
|
||||||
|
taosArrayPush(pInfo->datadirs, &d1);
|
||||||
|
|
||||||
|
SMonDiskDesc d2 = {0};
|
||||||
|
strcpy(d2.name, "/t2d2/d");
|
||||||
|
d2.level = 2;
|
||||||
|
d2.size.avail = 21;
|
||||||
|
d2.size.total = 22;
|
||||||
|
d2.size.used = 23;
|
||||||
|
taosArrayPush(pInfo->datadirs, &d2);
|
||||||
|
|
||||||
|
SMonDiskDesc d3 = {0};
|
||||||
|
strcpy(d3.name, "/t3/d3/d");
|
||||||
|
d3.level = 3;
|
||||||
|
d3.size.avail = 31;
|
||||||
|
d3.size.total = 32;
|
||||||
|
d3.size.used = 33;
|
||||||
|
taosArrayPush(pInfo->datadirs, &d3);
|
||||||
|
|
||||||
|
strcpy(pInfo->logdir.name, "/log/dir/d");
|
||||||
|
pInfo->logdir.size.avail = 41;
|
||||||
|
pInfo->logdir.size.total = 42;
|
||||||
|
pInfo->logdir.size.used = 43;
|
||||||
|
|
||||||
|
strcpy(pInfo->tempdir.name, "/data/dir/d");
|
||||||
|
pInfo->tempdir.size.avail = 51;
|
||||||
|
pInfo->tempdir.size.total = 52;
|
||||||
|
pInfo->tempdir.size.used = 53;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MonitorTest::AddLogInfo1() {
|
||||||
|
SMonLogItem log1 = {0};
|
||||||
|
log1.ts = taosGetTimestampMs();
|
||||||
|
log1.level = 1;
|
||||||
|
strcpy(log1.content, "1 -------------------------- a");
|
||||||
|
monAddLogItem(&log1);
|
||||||
|
|
||||||
|
SMonLogItem log2 = {0};
|
||||||
|
log2.ts = taosGetTimestampMs();
|
||||||
|
log2.level = 1;
|
||||||
|
strcpy(log2.content, "1 ------------------------ b");
|
||||||
|
monAddLogItem(&log2);
|
||||||
|
|
||||||
|
SMonLogItem log3 = {0};
|
||||||
|
log3.ts = taosGetTimestampMs();
|
||||||
|
log3.level = 1;
|
||||||
|
strcpy(log3.content, "1 ------- c");
|
||||||
|
monAddLogItem(&log3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MonitorTest::AddLogInfo2() {
|
||||||
|
SMonLogItem log1;
|
||||||
|
log1.ts = taosGetTimestampMs();
|
||||||
|
log1.level = 01;
|
||||||
|
strcpy(log1.content, "2 ------- a");
|
||||||
|
monAddLogItem(&log1);
|
||||||
|
|
||||||
|
SMonLogItem log2;
|
||||||
|
log2.ts = taosGetTimestampMs();
|
||||||
|
log2.level = 0;
|
||||||
|
strcpy(log2.content, "2 ------- b");
|
||||||
|
monAddLogItem(&log2);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(MonitorTest, 01_Full) {
|
||||||
|
AddLogInfo1();
|
||||||
|
|
||||||
|
SMonInfo *pMonitor = monCreateMonitorInfo();
|
||||||
|
if (pMonitor == NULL) return;
|
||||||
|
|
||||||
|
SMonBasicInfo basicInfo = {0};
|
||||||
|
GetBasicInfo(pMonitor, &basicInfo);
|
||||||
|
monSetBasicInfo(pMonitor, &basicInfo);
|
||||||
|
|
||||||
|
SMonClusterInfo clusterInfo = {0};
|
||||||
|
SMonVgroupInfo vgroupInfo = {0};
|
||||||
|
SMonGrantInfo grantInfo = {0};
|
||||||
|
GetClusterInfo(pMonitor, &clusterInfo);
|
||||||
|
GetVgroupInfo(pMonitor, &vgroupInfo);
|
||||||
|
GetGrantInfo(pMonitor, &grantInfo);
|
||||||
|
monSetClusterInfo(pMonitor, &clusterInfo);
|
||||||
|
monSetVgroupInfo(pMonitor, &vgroupInfo);
|
||||||
|
monSetGrantInfo(pMonitor, &grantInfo);
|
||||||
|
|
||||||
|
SMonDnodeInfo dnodeInfo = {0};
|
||||||
|
GetDnodeInfo(pMonitor, &dnodeInfo);
|
||||||
|
monSetDnodeInfo(pMonitor, &dnodeInfo);
|
||||||
|
|
||||||
|
SMonDiskInfo diskInfo = {0};
|
||||||
|
GetDiskInfo(pMonitor, &diskInfo);
|
||||||
|
monSetDiskInfo(pMonitor, &diskInfo);
|
||||||
|
|
||||||
|
monSendReport(pMonitor);
|
||||||
|
monCleanupMonitorInfo(pMonitor);
|
||||||
|
|
||||||
|
taosArrayDestroy(clusterInfo.dnodes);
|
||||||
|
taosArrayDestroy(clusterInfo.mnodes);
|
||||||
|
taosArrayDestroy(vgroupInfo.vgroups);
|
||||||
|
taosArrayDestroy(diskInfo.datadirs);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(MonitorTest, 02_Log) {
|
||||||
|
AddLogInfo2();
|
||||||
|
|
||||||
|
SMonInfo *pMonitor = monCreateMonitorInfo();
|
||||||
|
if (pMonitor == NULL) return;
|
||||||
|
|
||||||
|
monSendReport(pMonitor);
|
||||||
|
monCleanupMonitorInfo(pMonitor);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,19 +13,17 @@
|
||||||
* 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 "mockCatalog.h"
|
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "stub.h"
|
#include "stub.h"
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Wformat"
|
#pragma GCC diagnostic ignored "-Wformat"
|
||||||
|
|
||||||
#include "addr_any.h"
|
#include <addr_any.h>
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
#include "mockCatalog.h"
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
void generateTestT1(MockCatalogService* mcs) {
|
void generateTestT1(MockCatalogService* mcs) {
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <tglobal.h>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
|
@ -26,9 +25,11 @@
|
||||||
#pragma GCC diagnostic ignored "-Wformat"
|
#pragma GCC diagnostic ignored "-Wformat"
|
||||||
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
||||||
#pragma GCC diagnostic ignored "-Wpointer-arith"
|
#pragma GCC diagnostic ignored "-Wpointer-arith"
|
||||||
|
#include <addr_any.h>
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "tglobal.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
#include "tvariant.h"
|
#include "tvariant.h"
|
||||||
|
@ -37,7 +38,6 @@
|
||||||
#include "planner.h"
|
#include "planner.h"
|
||||||
#include "qworker.h"
|
#include "qworker.h"
|
||||||
#include "stub.h"
|
#include "stub.h"
|
||||||
#include "addr_any.h"
|
|
||||||
#include "executor.h"
|
#include "executor.h"
|
||||||
#include "dataSinkMgt.h"
|
#include "dataSinkMgt.h"
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <tglobal.h>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
|
@ -26,15 +25,16 @@
|
||||||
#pragma GCC diagnostic ignored "-Wformat"
|
#pragma GCC diagnostic ignored "-Wformat"
|
||||||
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
||||||
#pragma GCC diagnostic ignored "-Wpointer-arith"
|
#pragma GCC diagnostic ignored "-Wpointer-arith"
|
||||||
|
#include <addr_any.h>
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "tglobal.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
#include "tvariant.h"
|
#include "tvariant.h"
|
||||||
#include "tep.h"
|
#include "tep.h"
|
||||||
#include "stub.h"
|
#include "stub.h"
|
||||||
#include "addr_any.h"
|
|
||||||
#include "scalar.h"
|
#include "scalar.h"
|
||||||
#include "nodes.h"
|
#include "nodes.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <tglobal.h>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
|
@ -26,15 +25,16 @@
|
||||||
#pragma GCC diagnostic ignored "-Wformat"
|
#pragma GCC diagnostic ignored "-Wformat"
|
||||||
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
||||||
#pragma GCC diagnostic ignored "-Wpointer-arith"
|
#pragma GCC diagnostic ignored "-Wpointer-arith"
|
||||||
|
#include <addr_any.h>
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "tglobal.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
#include "tvariant.h"
|
#include "tvariant.h"
|
||||||
#include "tep.h"
|
#include "tep.h"
|
||||||
#include "stub.h"
|
#include "stub.h"
|
||||||
#include "addr_any.h"
|
|
||||||
#include "scalar.h"
|
#include "scalar.h"
|
||||||
#include "nodes.h"
|
#include "nodes.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
|
|
|
@ -14,19 +14,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <tglobal.h>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "os.h"
|
|
||||||
|
|
||||||
#include "taos.h"
|
|
||||||
#include "tdef.h"
|
|
||||||
#include "tvariant.h"
|
|
||||||
#include "catalog.h"
|
|
||||||
#include "scheduler.h"
|
|
||||||
#include "tep.h"
|
|
||||||
#include "trpc.h"
|
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
#pragma GCC diagnostic ignored "-Wwrite-strings"
|
||||||
#pragma GCC diagnostic ignored "-Wunused-function"
|
#pragma GCC diagnostic ignored "-Wunused-function"
|
||||||
|
@ -34,10 +23,21 @@
|
||||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||||
#pragma GCC diagnostic ignored "-Wreturn-type"
|
#pragma GCC diagnostic ignored "-Wreturn-type"
|
||||||
#pragma GCC diagnostic ignored "-Wformat"
|
#pragma GCC diagnostic ignored "-Wformat"
|
||||||
|
#include <addr_any.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "taos.h"
|
||||||
|
#include "tdef.h"
|
||||||
|
#include "tvariant.h"
|
||||||
|
#include "catalog.h"
|
||||||
|
#include "scheduler.h"
|
||||||
|
#include "tep.h"
|
||||||
|
#include "trpc.h"
|
||||||
#include "schedulerInt.h"
|
#include "schedulerInt.h"
|
||||||
#include "stub.h"
|
#include "stub.h"
|
||||||
#include "addr_any.h"
|
|
||||||
#include "tref.h"
|
#include "tref.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
|
@ -25,6 +25,7 @@ extern "C" {
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
|
#include "tglobal.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
#include "ttimer.h"
|
#include "ttimer.h"
|
||||||
|
|
||||||
|
@ -91,31 +92,61 @@ typedef struct SyncAppendEntriesReply SyncAppendEntriesReply;
|
||||||
struct SSyncEnv;
|
struct SSyncEnv;
|
||||||
typedef struct SSyncEnv SSyncEnv;
|
typedef struct SSyncEnv SSyncEnv;
|
||||||
|
|
||||||
|
struct SRaftStore;
|
||||||
|
typedef struct SRaftStore SRaftStore;
|
||||||
|
|
||||||
|
struct SVotesGranted;
|
||||||
|
typedef struct SVotesGranted SVotesGranted;
|
||||||
|
|
||||||
|
struct SVotesResponded;
|
||||||
|
typedef struct SVotesResponded SVotesResponded;
|
||||||
|
|
||||||
typedef struct SRaftId {
|
typedef struct SRaftId {
|
||||||
SyncNodeId addr; // typedef uint64_t SyncNodeId;
|
SyncNodeId addr; // typedef uint64_t SyncNodeId;
|
||||||
SyncGroupId vgId; // typedef int32_t SyncGroupId;
|
SyncGroupId vgId; // typedef int32_t SyncGroupId;
|
||||||
} SRaftId;
|
} SRaftId;
|
||||||
|
|
||||||
typedef struct SSyncNode {
|
typedef struct SSyncNode {
|
||||||
|
// init by SSyncInfo
|
||||||
SyncGroupId vgId;
|
SyncGroupId vgId;
|
||||||
SSyncCfg syncCfg;
|
SSyncCfg syncCfg;
|
||||||
char path[TSDB_FILENAME_LEN];
|
char path[TSDB_FILENAME_LEN];
|
||||||
SSyncFSM* pFsm;
|
void* rpcClient;
|
||||||
|
|
||||||
// passed from outside
|
|
||||||
void* rpcClient;
|
|
||||||
int32_t (*FpSendMsg)(void* rpcClient, const SEpSet* pEpSet, SRpcMsg* pMsg);
|
int32_t (*FpSendMsg)(void* rpcClient, const SEpSet* pEpSet, SRpcMsg* pMsg);
|
||||||
|
|
||||||
|
// init internal
|
||||||
|
SNodeInfo me;
|
||||||
|
int32_t peersNum;
|
||||||
|
SNodeInfo peers[TSDB_MAX_REPLICA];
|
||||||
|
|
||||||
|
// raft algorithm
|
||||||
|
SSyncFSM* pFsm;
|
||||||
|
SRaftId raftId;
|
||||||
|
SRaftId peersId[TSDB_MAX_REPLICA];
|
||||||
|
int32_t replicaNum;
|
||||||
|
int32_t quorum;
|
||||||
|
|
||||||
|
// life cycle
|
||||||
int32_t refCount;
|
int32_t refCount;
|
||||||
int64_t rid;
|
int64_t rid;
|
||||||
|
|
||||||
SNodeInfo me;
|
// tla+ server vars
|
||||||
SNodeInfo peers[TSDB_MAX_REPLICA];
|
ESyncState state;
|
||||||
int32_t peersNum;
|
SRaftStore* pRaftStore;
|
||||||
|
|
||||||
ESyncRole role;
|
// tla+ candidate vars
|
||||||
SRaftId raftId;
|
SVotesGranted* pVotesGranted;
|
||||||
|
SVotesResponded* pVotesResponded;
|
||||||
|
|
||||||
|
// tla+ leader vars
|
||||||
|
SHashObj* pNextIndex;
|
||||||
|
SHashObj* pMatchIndex;
|
||||||
|
|
||||||
|
// tla+ log vars
|
||||||
|
SSyncLogStore* pLogStore;
|
||||||
|
SyncIndex commitIndex;
|
||||||
|
|
||||||
|
// timer
|
||||||
tmr_h pPingTimer;
|
tmr_h pPingTimer;
|
||||||
int32_t pingTimerMS;
|
int32_t pingTimerMS;
|
||||||
uint8_t pingTimerStart;
|
uint8_t pingTimerStart;
|
||||||
|
@ -136,32 +167,21 @@ typedef struct SSyncNode {
|
||||||
|
|
||||||
// callback
|
// callback
|
||||||
int32_t (*FpOnPing)(SSyncNode* ths, SyncPing* pMsg);
|
int32_t (*FpOnPing)(SSyncNode* ths, SyncPing* pMsg);
|
||||||
|
|
||||||
int32_t (*FpOnPingReply)(SSyncNode* ths, SyncPingReply* pMsg);
|
int32_t (*FpOnPingReply)(SSyncNode* ths, SyncPingReply* pMsg);
|
||||||
|
|
||||||
int32_t (*FpOnRequestVote)(SSyncNode* ths, SyncRequestVote* pMsg);
|
int32_t (*FpOnRequestVote)(SSyncNode* ths, SyncRequestVote* pMsg);
|
||||||
|
|
||||||
int32_t (*FpOnRequestVoteReply)(SSyncNode* ths, SyncRequestVoteReply* pMsg);
|
int32_t (*FpOnRequestVoteReply)(SSyncNode* ths, SyncRequestVoteReply* pMsg);
|
||||||
|
|
||||||
int32_t (*FpOnAppendEntries)(SSyncNode* ths, SyncAppendEntries* pMsg);
|
int32_t (*FpOnAppendEntries)(SSyncNode* ths, SyncAppendEntries* pMsg);
|
||||||
|
|
||||||
int32_t (*FpOnAppendEntriesReply)(SSyncNode* ths, SyncAppendEntriesReply* pMsg);
|
int32_t (*FpOnAppendEntriesReply)(SSyncNode* ths, SyncAppendEntriesReply* pMsg);
|
||||||
|
|
||||||
} SSyncNode;
|
} SSyncNode;
|
||||||
|
|
||||||
SSyncNode* syncNodeOpen(const SSyncInfo* pSyncInfo);
|
SSyncNode* syncNodeOpen(const SSyncInfo* pSyncInfo);
|
||||||
|
void syncNodeClose(SSyncNode* pSyncNode);
|
||||||
void syncNodeClose(SSyncNode* pSyncNode);
|
void syncNodePingAll(SSyncNode* pSyncNode);
|
||||||
|
void syncNodePingPeers(SSyncNode* pSyncNode);
|
||||||
void syncNodePingAll(SSyncNode* pSyncNode);
|
void syncNodePingSelf(SSyncNode* pSyncNode);
|
||||||
|
int32_t syncNodeStartPingTimer(SSyncNode* pSyncNode);
|
||||||
void syncNodePingPeers(SSyncNode* pSyncNode);
|
int32_t syncNodeStopPingTimer(SSyncNode* pSyncNode);
|
||||||
|
|
||||||
void syncNodePingSelf(SSyncNode* pSyncNode);
|
|
||||||
|
|
||||||
int32_t syncNodeStartPingTimer(SSyncNode* pSyncNode);
|
|
||||||
|
|
||||||
int32_t syncNodeStopPingTimer(SSyncNode* pSyncNode);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,30 +28,25 @@ extern "C" {
|
||||||
#include "syncRaftEntry.h"
|
#include "syncRaftEntry.h"
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
|
|
||||||
// encode as uint64
|
// encode as uint32
|
||||||
typedef enum ESyncMessageType {
|
typedef enum ESyncMessageType {
|
||||||
SYNC_PING = 101,
|
SYNC_PING = 101,
|
||||||
SYNC_PING_REPLY = 103,
|
SYNC_PING_REPLY = 103,
|
||||||
SYNC_CLIENT_REQUEST,
|
SYNC_CLIENT_REQUEST = 105,
|
||||||
SYNC_CLIENT_REQUEST_REPLY,
|
SYNC_CLIENT_REQUEST_REPLY = 107,
|
||||||
SYNC_REQUEST_VOTE,
|
SYNC_REQUEST_VOTE = 109,
|
||||||
SYNC_REQUEST_VOTE_REPLY,
|
SYNC_REQUEST_VOTE_REPLY = 111,
|
||||||
SYNC_APPEND_ENTRIES,
|
SYNC_APPEND_ENTRIES = 113,
|
||||||
SYNC_APPEND_ENTRIES_REPLY,
|
SYNC_APPEND_ENTRIES_REPLY = 115,
|
||||||
} ESyncMessageType;
|
} ESyncMessageType;
|
||||||
|
|
||||||
/*
|
// ---------------------------------------------
|
||||||
typedef struct SRaftId {
|
|
||||||
SyncNodeId addr; // typedef uint64_t SyncNodeId;
|
|
||||||
SyncGroupId vgId; // typedef int32_t SyncGroupId;
|
|
||||||
} SRaftId;
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct SyncPing {
|
typedef struct SyncPing {
|
||||||
uint32_t bytes;
|
uint32_t bytes;
|
||||||
uint32_t msgType;
|
uint32_t msgType;
|
||||||
SRaftId srcId;
|
SRaftId srcId;
|
||||||
SRaftId destId;
|
SRaftId destId;
|
||||||
|
// private data
|
||||||
uint32_t dataLen;
|
uint32_t dataLen;
|
||||||
char data[];
|
char data[];
|
||||||
} SyncPing;
|
} SyncPing;
|
||||||
|
@ -59,28 +54,22 @@ typedef struct SyncPing {
|
||||||
#define SYNC_PING_FIX_LEN (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(SRaftId) + sizeof(SRaftId) + sizeof(uint32_t))
|
#define SYNC_PING_FIX_LEN (sizeof(uint32_t) + sizeof(uint32_t) + sizeof(SRaftId) + sizeof(SRaftId) + sizeof(uint32_t))
|
||||||
|
|
||||||
SyncPing* syncPingBuild(uint32_t dataLen);
|
SyncPing* syncPingBuild(uint32_t dataLen);
|
||||||
|
void syncPingDestroy(SyncPing* pMsg);
|
||||||
void syncPingDestroy(SyncPing* pMsg);
|
void syncPingSerialize(const SyncPing* pMsg, char* buf, uint32_t bufLen);
|
||||||
|
void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg);
|
||||||
void syncPingSerialize(const SyncPing* pMsg, char* buf, uint32_t bufLen);
|
void syncPing2RpcMsg(const SyncPing* pMsg, SRpcMsg* pRpcMsg);
|
||||||
|
void syncPingFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPing* pMsg);
|
||||||
void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg);
|
cJSON* syncPing2Json(const SyncPing* pMsg);
|
||||||
|
|
||||||
void syncPing2RpcMsg(const SyncPing* pMsg, SRpcMsg* pRpcMsg);
|
|
||||||
|
|
||||||
void syncPingFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPing* pMsg);
|
|
||||||
|
|
||||||
cJSON* syncPing2Json(const SyncPing* pMsg);
|
|
||||||
|
|
||||||
SyncPing* syncPingBuild2(const SRaftId* srcId, const SRaftId* destId, const char* str);
|
SyncPing* syncPingBuild2(const SRaftId* srcId, const SRaftId* destId, const char* str);
|
||||||
|
|
||||||
SyncPing* syncPingBuild3(const SRaftId* srcId, const SRaftId* destId);
|
SyncPing* syncPingBuild3(const SRaftId* srcId, const SRaftId* destId);
|
||||||
|
|
||||||
|
// ---------------------------------------------
|
||||||
typedef struct SyncPingReply {
|
typedef struct SyncPingReply {
|
||||||
uint32_t bytes;
|
uint32_t bytes;
|
||||||
uint32_t msgType;
|
uint32_t msgType;
|
||||||
SRaftId srcId;
|
SRaftId srcId;
|
||||||
SRaftId destId;
|
SRaftId destId;
|
||||||
|
// private data
|
||||||
uint32_t dataLen;
|
uint32_t dataLen;
|
||||||
char data[];
|
char data[];
|
||||||
} SyncPingReply;
|
} SyncPingReply;
|
||||||
|
@ -89,74 +78,117 @@ typedef struct SyncPingReply {
|
||||||
(sizeof(uint32_t) + sizeof(uint32_t) + sizeof(SRaftId) + sizeof(SRaftId) + sizeof(uint32_t))
|
(sizeof(uint32_t) + sizeof(uint32_t) + sizeof(SRaftId) + sizeof(SRaftId) + sizeof(uint32_t))
|
||||||
|
|
||||||
SyncPingReply* syncPingReplyBuild(uint32_t dataLen);
|
SyncPingReply* syncPingReplyBuild(uint32_t dataLen);
|
||||||
|
void syncPingReplyDestroy(SyncPingReply* pMsg);
|
||||||
void syncPingReplyDestroy(SyncPingReply* pMsg);
|
void syncPingReplySerialize(const SyncPingReply* pMsg, char* buf, uint32_t bufLen);
|
||||||
|
void syncPingReplyDeserialize(const char* buf, uint32_t len, SyncPingReply* pMsg);
|
||||||
void syncPingReplySerialize(const SyncPingReply* pMsg, char* buf, uint32_t bufLen);
|
void syncPingReply2RpcMsg(const SyncPingReply* pMsg, SRpcMsg* pRpcMsg);
|
||||||
|
void syncPingReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPingReply* pMsg);
|
||||||
void syncPingReplyDeserialize(const char* buf, uint32_t len, SyncPingReply* pMsg);
|
cJSON* syncPingReply2Json(const SyncPingReply* pMsg);
|
||||||
|
|
||||||
void syncPingReply2RpcMsg(const SyncPingReply* pMsg, SRpcMsg* pRpcMsg);
|
|
||||||
|
|
||||||
void syncPingReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPingReply* pMsg);
|
|
||||||
|
|
||||||
cJSON* syncPingReply2Json(const SyncPingReply* pMsg);
|
|
||||||
|
|
||||||
SyncPingReply* syncPingReplyBuild2(const SRaftId* srcId, const SRaftId* destId, const char* str);
|
SyncPingReply* syncPingReplyBuild2(const SRaftId* srcId, const SRaftId* destId, const char* str);
|
||||||
|
|
||||||
SyncPingReply* syncPingReplyBuild3(const SRaftId* srcId, const SRaftId* destId);
|
SyncPingReply* syncPingReplyBuild3(const SRaftId* srcId, const SRaftId* destId);
|
||||||
|
|
||||||
|
// ---------------------------------------------
|
||||||
typedef struct SyncClientRequest {
|
typedef struct SyncClientRequest {
|
||||||
ESyncMessageType msgType;
|
uint32_t bytes;
|
||||||
char* data;
|
uint32_t msgType;
|
||||||
uint32_t dataLen;
|
int64_t seqNum;
|
||||||
int64_t seqNum;
|
bool isWeak;
|
||||||
bool isWeak;
|
uint32_t dataLen;
|
||||||
|
char data[];
|
||||||
} SyncClientRequest;
|
} SyncClientRequest;
|
||||||
|
|
||||||
|
// ---------------------------------------------
|
||||||
typedef struct SyncClientRequestReply {
|
typedef struct SyncClientRequestReply {
|
||||||
ESyncMessageType msgType;
|
uint32_t bytes;
|
||||||
int32_t errCode;
|
uint32_t msgType;
|
||||||
SSyncBuffer* pErrMsg;
|
int32_t errCode;
|
||||||
SSyncBuffer* pLeaderHint;
|
SRaftId leaderHint;
|
||||||
} SyncClientRequestReply;
|
} SyncClientRequestReply;
|
||||||
|
|
||||||
|
// ---------------------------------------------
|
||||||
typedef struct SyncRequestVote {
|
typedef struct SyncRequestVote {
|
||||||
ESyncMessageType msgType;
|
uint32_t bytes;
|
||||||
SyncTerm currentTerm;
|
uint32_t msgType;
|
||||||
SyncNodeId nodeId;
|
SRaftId srcId;
|
||||||
SyncGroupId vgId;
|
SRaftId destId;
|
||||||
SyncIndex lastLogIndex;
|
// private data
|
||||||
SyncTerm lastLogTerm;
|
SyncTerm currentTerm;
|
||||||
|
SyncIndex lastLogIndex;
|
||||||
|
SyncTerm lastLogTerm;
|
||||||
} SyncRequestVote;
|
} SyncRequestVote;
|
||||||
|
|
||||||
|
SyncRequestVote* syncRequestVoteBuild();
|
||||||
|
void syncRequestVoteDestroy(SyncRequestVote* pMsg);
|
||||||
|
void syncRequestVoteSerialize(const SyncRequestVote* pMsg, char* buf, uint32_t bufLen);
|
||||||
|
void syncRequestVoteDeserialize(const char* buf, uint32_t len, SyncRequestVote* pMsg);
|
||||||
|
void syncRequestVote2RpcMsg(const SyncRequestVote* pMsg, SRpcMsg* pRpcMsg);
|
||||||
|
void syncRequestVoteFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVote* pMsg);
|
||||||
|
cJSON* syncRequestVote2Json(const SyncRequestVote* pMsg);
|
||||||
|
|
||||||
|
// ---------------------------------------------
|
||||||
typedef struct SyncRequestVoteReply {
|
typedef struct SyncRequestVoteReply {
|
||||||
ESyncMessageType msgType;
|
uint32_t bytes;
|
||||||
SyncTerm currentTerm;
|
uint32_t msgType;
|
||||||
SyncNodeId nodeId;
|
SRaftId srcId;
|
||||||
SyncGroupId vgId;
|
SRaftId destId;
|
||||||
bool voteGranted;
|
// private data
|
||||||
|
SyncTerm term;
|
||||||
|
bool voteGranted;
|
||||||
} SyncRequestVoteReply;
|
} SyncRequestVoteReply;
|
||||||
|
|
||||||
|
SyncRequestVoteReply* SyncRequestVoteReplyBuild();
|
||||||
|
void syncRequestVoteReplyDestroy(SyncRequestVoteReply* pMsg);
|
||||||
|
void syncRequestVoteReplySerialize(const SyncRequestVoteReply* pMsg, char* buf, uint32_t bufLen);
|
||||||
|
void syncRequestVoteReplyDeserialize(const char* buf, uint32_t len, SyncRequestVoteReply* pMsg);
|
||||||
|
void syncRequestVoteReply2RpcMsg(const SyncRequestVoteReply* pMsg, SRpcMsg* pRpcMsg);
|
||||||
|
void syncRequestVoteReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVoteReply* pMsg);
|
||||||
|
cJSON* syncRequestVoteReply2Json(const SyncRequestVoteReply* pMsg);
|
||||||
|
|
||||||
|
// ---------------------------------------------
|
||||||
typedef struct SyncAppendEntries {
|
typedef struct SyncAppendEntries {
|
||||||
ESyncMessageType msgType;
|
uint32_t bytes;
|
||||||
SyncTerm currentTerm;
|
uint32_t msgType;
|
||||||
SyncNodeId nodeId;
|
SRaftId srcId;
|
||||||
SyncIndex prevLogIndex;
|
SRaftId destId;
|
||||||
SyncTerm prevLogTerm;
|
// private data
|
||||||
int32_t entryCount;
|
SyncIndex prevLogIndex;
|
||||||
SSyncRaftEntry* logEntries;
|
SyncTerm prevLogTerm;
|
||||||
SyncIndex commitIndex;
|
SyncIndex commitIndex;
|
||||||
|
uint32_t dataLen;
|
||||||
|
char data[];
|
||||||
} SyncAppendEntries;
|
} SyncAppendEntries;
|
||||||
|
|
||||||
|
#define SYNC_APPEND_ENTRIES_FIX_LEN \
|
||||||
|
(sizeof(uint32_t) + sizeof(uint32_t) + sizeof(SRaftId) + sizeof(SRaftId) + sizeof(SyncIndex) + sizeof(SyncTerm) + \
|
||||||
|
sizeof(SyncIndex) + sizeof(uint32_t))
|
||||||
|
|
||||||
|
SyncAppendEntries* syncAppendEntriesBuild(uint32_t dataLen);
|
||||||
|
void syncAppendEntriesDestroy(SyncAppendEntries* pMsg);
|
||||||
|
void syncAppendEntriesSerialize(const SyncAppendEntries* pMsg, char* buf, uint32_t bufLen);
|
||||||
|
void syncAppendEntriesDeserialize(const char* buf, uint32_t len, SyncAppendEntries* pMsg);
|
||||||
|
void syncAppendEntries2RpcMsg(const SyncAppendEntries* pMsg, SRpcMsg* pRpcMsg);
|
||||||
|
void syncAppendEntriesFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntries* pMsg);
|
||||||
|
cJSON* syncAppendEntries2Json(const SyncAppendEntries* pMsg);
|
||||||
|
|
||||||
|
// ---------------------------------------------
|
||||||
typedef struct SyncAppendEntriesReply {
|
typedef struct SyncAppendEntriesReply {
|
||||||
ESyncMessageType msgType;
|
uint32_t bytes;
|
||||||
SyncTerm currentTerm;
|
uint32_t msgType;
|
||||||
SyncNodeId nodeId;
|
SRaftId srcId;
|
||||||
bool success;
|
SRaftId destId;
|
||||||
SyncIndex matchIndex;
|
// private data
|
||||||
|
bool success;
|
||||||
|
SyncIndex matchIndex;
|
||||||
} SyncAppendEntriesReply;
|
} SyncAppendEntriesReply;
|
||||||
|
|
||||||
|
SyncAppendEntriesReply* syncAppendEntriesReplyBuild();
|
||||||
|
void syncAppendEntriesReplyDestroy(SyncAppendEntriesReply* pMsg);
|
||||||
|
void syncAppendEntriesReplySerialize(const SyncAppendEntriesReply* pMsg, char* buf, uint32_t bufLen);
|
||||||
|
void syncAppendEntriesReplyDeserialize(const char* buf, uint32_t len, SyncAppendEntriesReply* pMsg);
|
||||||
|
void syncAppendEntriesReply2RpcMsg(const SyncAppendEntriesReply* pMsg, SRpcMsg* pRpcMsg);
|
||||||
|
void syncAppendEntriesReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntriesReply* pMsg);
|
||||||
|
cJSON* syncAppendEntriesReply2Json(const SyncAppendEntriesReply* pMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -26,6 +26,12 @@ extern "C" {
|
||||||
#include "syncInt.h"
|
#include "syncInt.h"
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
|
|
||||||
|
typedef struct SVotesGranted {
|
||||||
|
} SVotesGranted;
|
||||||
|
|
||||||
|
typedef struct SVotesResponded {
|
||||||
|
} SVotesResponded;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -211,23 +211,17 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
if (pRpcMsg->msgType == SYNC_PING) {
|
if (pRpcMsg->msgType == SYNC_PING) {
|
||||||
if (io->FpOnSyncPing != NULL) {
|
if (io->FpOnSyncPing != NULL) {
|
||||||
SyncPing *pSyncMsg;
|
SyncPing *pSyncMsg;
|
||||||
|
pSyncMsg = syncPingBuild(pRpcMsg->contLen);
|
||||||
SRpcMsg tmpRpcMsg;
|
|
||||||
memcpy(&tmpRpcMsg, pRpcMsg, sizeof(SRpcMsg));
|
|
||||||
pSyncMsg = syncPingBuild(tmpRpcMsg.contLen);
|
|
||||||
|
|
||||||
syncPingFromRpcMsg(pRpcMsg, pSyncMsg);
|
syncPingFromRpcMsg(pRpcMsg, pSyncMsg);
|
||||||
|
|
||||||
// memcpy(pSyncMsg, tmpRpcMsg.pCont, tmpRpcMsg.contLen);
|
// memcpy(pSyncMsg, tmpRpcMsg.pCont, tmpRpcMsg.contLen);
|
||||||
|
|
||||||
io->FpOnSyncPing(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncPing(io->pSyncNode, pSyncMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (pRpcMsg->msgType == SYNC_PING_REPLY) {
|
} else if (pRpcMsg->msgType == SYNC_PING_REPLY) {
|
||||||
SyncPingReply *pSyncMsg = syncPingReplyBuild(pRpcMsg->contLen);
|
|
||||||
syncPingReplyFromRpcMsg(pRpcMsg, pSyncMsg);
|
|
||||||
|
|
||||||
if (io->FpOnSyncPingReply != NULL) {
|
if (io->FpOnSyncPingReply != NULL) {
|
||||||
|
SyncPingReply *pSyncMsg;
|
||||||
|
pSyncMsg = syncPingReplyBuild(pRpcMsg->contLen);
|
||||||
|
syncPingReplyFromRpcMsg(pRpcMsg, pSyncMsg);
|
||||||
io->FpOnSyncPingReply(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncPingReply(io->pSyncNode, pSyncMsg);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -88,7 +88,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pSyncInfo) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pSyncNode->role = TAOS_SYNC_STATE_FOLLOWER;
|
pSyncNode->state = TAOS_SYNC_STATE_FOLLOWER;
|
||||||
syncUtilnodeInfo2raftId(&pSyncNode->me, pSyncNode->vgId, &pSyncNode->raftId);
|
syncUtilnodeInfo2raftId(&pSyncNode->me, pSyncNode->vgId, &pSyncNode->raftId);
|
||||||
|
|
||||||
pSyncNode->pPingTimer = NULL;
|
pSyncNode->pPingTimer = NULL;
|
||||||
|
@ -171,16 +171,6 @@ static int32_t syncNodePing(SSyncNode* pSyncNode, const SRaftId* destRaftId, Syn
|
||||||
|
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
syncPing2RpcMsg(pMsg, &rpcMsg);
|
syncPing2RpcMsg(pMsg, &rpcMsg);
|
||||||
|
|
||||||
/*
|
|
||||||
SRpcMsg rpcMsg;
|
|
||||||
rpcMsg.contLen = 64;
|
|
||||||
rpcMsg.pCont = rpcMallocCont(rpcMsg.contLen);
|
|
||||||
snprintf((char*)rpcMsg.pCont, rpcMsg.contLen, "%s", "xxxxxxxxxxxxxx");
|
|
||||||
rpcMsg.handle = NULL;
|
|
||||||
rpcMsg.msgType = 1;
|
|
||||||
*/
|
|
||||||
|
|
||||||
syncNodeSendMsgById(destRaftId, pSyncNode, &rpcMsg);
|
syncNodeSendMsgById(destRaftId, pSyncNode, &rpcMsg);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
@ -60,12 +60,15 @@ void syncPingFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPing* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON* syncPing2Json(const SyncPing* pMsg) {
|
cJSON* syncPing2Json(const SyncPing* pMsg) {
|
||||||
|
char u64buf[128];
|
||||||
|
|
||||||
cJSON* pRoot = cJSON_CreateObject();
|
cJSON* pRoot = cJSON_CreateObject();
|
||||||
cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
|
cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
|
||||||
cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
|
cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
|
||||||
|
|
||||||
cJSON* pSrcId = cJSON_CreateObject();
|
cJSON* pSrcId = cJSON_CreateObject();
|
||||||
cJSON_AddNumberToObject(pSrcId, "addr", pMsg->srcId.addr);
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr);
|
||||||
|
cJSON_AddStringToObject(pSrcId, "addr", u64buf);
|
||||||
{
|
{
|
||||||
uint64_t u64 = pMsg->srcId.addr;
|
uint64_t u64 = pMsg->srcId.addr;
|
||||||
cJSON* pTmp = pSrcId;
|
cJSON* pTmp = pSrcId;
|
||||||
|
@ -79,7 +82,8 @@ cJSON* syncPing2Json(const SyncPing* pMsg) {
|
||||||
cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
|
cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
|
||||||
|
|
||||||
cJSON* pDestId = cJSON_CreateObject();
|
cJSON* pDestId = cJSON_CreateObject();
|
||||||
cJSON_AddNumberToObject(pDestId, "addr", pMsg->destId.addr);
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->destId.addr);
|
||||||
|
cJSON_AddStringToObject(pDestId, "addr", u64buf);
|
||||||
{
|
{
|
||||||
uint64_t u64 = pMsg->destId.addr;
|
uint64_t u64 = pMsg->destId.addr;
|
||||||
cJSON* pTmp = pDestId;
|
cJSON* pTmp = pDestId;
|
||||||
|
@ -154,12 +158,15 @@ void syncPingReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPingReply* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON* syncPingReply2Json(const SyncPingReply* pMsg) {
|
cJSON* syncPingReply2Json(const SyncPingReply* pMsg) {
|
||||||
|
char u64buf[128];
|
||||||
|
|
||||||
cJSON* pRoot = cJSON_CreateObject();
|
cJSON* pRoot = cJSON_CreateObject();
|
||||||
cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
|
cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
|
||||||
cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
|
cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
|
||||||
|
|
||||||
cJSON* pSrcId = cJSON_CreateObject();
|
cJSON* pSrcId = cJSON_CreateObject();
|
||||||
cJSON_AddNumberToObject(pSrcId, "addr", pMsg->srcId.addr);
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr);
|
||||||
|
cJSON_AddStringToObject(pSrcId, "addr", u64buf);
|
||||||
{
|
{
|
||||||
uint64_t u64 = pMsg->srcId.addr;
|
uint64_t u64 = pMsg->srcId.addr;
|
||||||
cJSON* pTmp = pSrcId;
|
cJSON* pTmp = pSrcId;
|
||||||
|
@ -173,7 +180,8 @@ cJSON* syncPingReply2Json(const SyncPingReply* pMsg) {
|
||||||
cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
|
cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
|
||||||
|
|
||||||
cJSON* pDestId = cJSON_CreateObject();
|
cJSON* pDestId = cJSON_CreateObject();
|
||||||
cJSON_AddNumberToObject(pDestId, "addr", pMsg->destId.addr);
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->destId.addr);
|
||||||
|
cJSON_AddStringToObject(pDestId, "addr", u64buf);
|
||||||
{
|
{
|
||||||
uint64_t u64 = pMsg->destId.addr;
|
uint64_t u64 = pMsg->destId.addr;
|
||||||
cJSON* pTmp = pDestId;
|
cJSON* pTmp = pDestId;
|
||||||
|
@ -208,72 +216,345 @@ SyncPingReply* syncPingReplyBuild3(const SRaftId* srcId, const SRaftId* destId)
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
// ---- message process SyncRequestVote----
|
||||||
void syncPingSerialize(const SyncPing* pMsg, char** ppBuf, uint32_t* bufLen) {
|
SyncRequestVote* syncRequestVoteBuild() {
|
||||||
*bufLen = sizeof(SyncPing) + pMsg->dataLen;
|
uint32_t bytes = sizeof(SyncRequestVote);
|
||||||
*ppBuf = (char*)malloc(*bufLen);
|
SyncRequestVote* pMsg = malloc(bytes);
|
||||||
void* pStart = *ppBuf;
|
memset(pMsg, 0, bytes);
|
||||||
uint32_t allBytes = *bufLen;
|
pMsg->bytes = bytes;
|
||||||
|
pMsg->msgType = SYNC_REQUEST_VOTE;
|
||||||
int len = 0;
|
|
||||||
len = taosEncodeFixedU32(&pStart, pMsg->msgType);
|
|
||||||
allBytes -= len;
|
|
||||||
assert(len > 0);
|
|
||||||
pStart += len;
|
|
||||||
|
|
||||||
len = taosEncodeFixedU64(&pStart, pMsg->srcId.addr);
|
|
||||||
allBytes -= len;
|
|
||||||
assert(len > 0);
|
|
||||||
pStart += len;
|
|
||||||
|
|
||||||
len = taosEncodeFixedI32(&pStart, pMsg->srcId.vgId);
|
|
||||||
allBytes -= len;
|
|
||||||
assert(len > 0);
|
|
||||||
pStart += len;
|
|
||||||
|
|
||||||
len = taosEncodeFixedU64(&pStart, pMsg->destId.addr);
|
|
||||||
allBytes -= len;
|
|
||||||
assert(len > 0);
|
|
||||||
pStart += len;
|
|
||||||
|
|
||||||
len = taosEncodeFixedI32(&pStart, pMsg->destId.vgId);
|
|
||||||
allBytes -= len;
|
|
||||||
assert(len > 0);
|
|
||||||
pStart += len;
|
|
||||||
|
|
||||||
len = taosEncodeFixedU32(&pStart, pMsg->dataLen);
|
|
||||||
allBytes -= len;
|
|
||||||
assert(len > 0);
|
|
||||||
pStart += len;
|
|
||||||
|
|
||||||
memcpy(pStart, pMsg->data, pMsg->dataLen);
|
|
||||||
allBytes -= pMsg->dataLen;
|
|
||||||
assert(allBytes == 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void syncRequestVoteDestroy(SyncRequestVote* pMsg) {
|
||||||
void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg) {
|
if (pMsg != NULL) {
|
||||||
void* pStart = (void*)buf;
|
free(pMsg);
|
||||||
uint64_t u64;
|
}
|
||||||
int32_t i32;
|
|
||||||
uint32_t u32;
|
|
||||||
|
|
||||||
pStart = taosDecodeFixedU64(pStart, &u64);
|
|
||||||
pMsg->msgType = u64;
|
|
||||||
|
|
||||||
pStart = taosDecodeFixedU64(pStart, &u64);
|
|
||||||
pMsg->srcId.addr = u64;
|
|
||||||
|
|
||||||
pStart = taosDecodeFixedI32(pStart, &i32);
|
|
||||||
pMsg->srcId.vgId = i32;
|
|
||||||
|
|
||||||
pStart = taosDecodeFixedU64(pStart, &u64);
|
|
||||||
pMsg->destId.addr = u64;
|
|
||||||
|
|
||||||
pStart = taosDecodeFixedI32(pStart, &i32);
|
|
||||||
pMsg->destId.vgId = i32;
|
|
||||||
|
|
||||||
pStart = taosDecodeFixedU32(pStart, &u32);
|
|
||||||
pMsg->dataLen = u32;
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
void syncRequestVoteSerialize(const SyncRequestVote* pMsg, char* buf, uint32_t bufLen) {
|
||||||
|
assert(pMsg->bytes <= bufLen);
|
||||||
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncRequestVoteDeserialize(const char* buf, uint32_t len, SyncRequestVote* pMsg) {
|
||||||
|
memcpy(pMsg, buf, len);
|
||||||
|
assert(len == pMsg->bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncRequestVote2RpcMsg(const SyncRequestVote* pMsg, SRpcMsg* pRpcMsg) {
|
||||||
|
memset(pRpcMsg, 0, sizeof(*pRpcMsg));
|
||||||
|
pRpcMsg->msgType = pMsg->msgType;
|
||||||
|
pRpcMsg->contLen = pMsg->bytes;
|
||||||
|
pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
|
||||||
|
syncRequestVoteSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncRequestVoteFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVote* pMsg) {
|
||||||
|
syncRequestVoteDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON* syncRequestVote2Json(const SyncRequestVote* pMsg) {
|
||||||
|
char u64buf[128];
|
||||||
|
|
||||||
|
cJSON* pRoot = cJSON_CreateObject();
|
||||||
|
cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
|
||||||
|
cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
|
||||||
|
|
||||||
|
cJSON* pSrcId = cJSON_CreateObject();
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr);
|
||||||
|
cJSON_AddStringToObject(pSrcId, "addr", u64buf);
|
||||||
|
{
|
||||||
|
uint64_t u64 = pMsg->srcId.addr;
|
||||||
|
cJSON* pTmp = pSrcId;
|
||||||
|
char host[128];
|
||||||
|
uint16_t port;
|
||||||
|
syncUtilU642Addr(u64, host, sizeof(host), &port);
|
||||||
|
cJSON_AddStringToObject(pTmp, "addr_host", host);
|
||||||
|
cJSON_AddNumberToObject(pTmp, "addr_port", port);
|
||||||
|
}
|
||||||
|
cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
|
||||||
|
cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
|
||||||
|
|
||||||
|
cJSON* pDestId = cJSON_CreateObject();
|
||||||
|
cJSON_AddNumberToObject(pDestId, "addr", pMsg->destId.addr);
|
||||||
|
{
|
||||||
|
uint64_t u64 = pMsg->destId.addr;
|
||||||
|
cJSON* pTmp = pDestId;
|
||||||
|
char host[128];
|
||||||
|
uint16_t port;
|
||||||
|
syncUtilU642Addr(u64, host, sizeof(host), &port);
|
||||||
|
cJSON_AddStringToObject(pTmp, "addr_host", host);
|
||||||
|
cJSON_AddNumberToObject(pTmp, "addr_port", port);
|
||||||
|
}
|
||||||
|
cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
|
||||||
|
cJSON_AddItemToObject(pRoot, "destId", pDestId);
|
||||||
|
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->currentTerm);
|
||||||
|
cJSON_AddStringToObject(pRoot, "currentTerm", u64buf);
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->lastLogIndex);
|
||||||
|
cJSON_AddStringToObject(pRoot, "lastLogIndex", u64buf);
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->lastLogTerm);
|
||||||
|
cJSON_AddStringToObject(pRoot, "lastLogTerm", u64buf);
|
||||||
|
|
||||||
|
cJSON* pJson = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToObject(pJson, "SyncRequestVote", pRoot);
|
||||||
|
return pJson;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---- message process SyncRequestVoteReply----
|
||||||
|
SyncRequestVoteReply* SyncRequestVoteReplyBuild() {
|
||||||
|
uint32_t bytes = sizeof(SyncRequestVoteReply);
|
||||||
|
SyncRequestVoteReply* pMsg = malloc(bytes);
|
||||||
|
memset(pMsg, 0, bytes);
|
||||||
|
pMsg->bytes = bytes;
|
||||||
|
pMsg->msgType = SYNC_REQUEST_VOTE_REPLY;
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncRequestVoteReplyDestroy(SyncRequestVoteReply* pMsg) {
|
||||||
|
if (pMsg != NULL) {
|
||||||
|
free(pMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncRequestVoteReplySerialize(const SyncRequestVoteReply* pMsg, char* buf, uint32_t bufLen) {
|
||||||
|
assert(pMsg->bytes <= bufLen);
|
||||||
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncRequestVoteReplyDeserialize(const char* buf, uint32_t len, SyncRequestVoteReply* pMsg) {
|
||||||
|
memcpy(pMsg, buf, len);
|
||||||
|
assert(len == pMsg->bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncRequestVoteReply2RpcMsg(const SyncRequestVoteReply* pMsg, SRpcMsg* pRpcMsg) {
|
||||||
|
memset(pRpcMsg, 0, sizeof(*pRpcMsg));
|
||||||
|
pRpcMsg->msgType = pMsg->msgType;
|
||||||
|
pRpcMsg->contLen = pMsg->bytes;
|
||||||
|
pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
|
||||||
|
syncRequestVoteReplySerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncRequestVoteReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVoteReply* pMsg) {
|
||||||
|
syncRequestVoteReplyDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON* syncRequestVoteReply2Json(const SyncRequestVoteReply* pMsg) {
|
||||||
|
char u64buf[128];
|
||||||
|
|
||||||
|
cJSON* pRoot = cJSON_CreateObject();
|
||||||
|
cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
|
||||||
|
cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
|
||||||
|
|
||||||
|
cJSON* pSrcId = cJSON_CreateObject();
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr);
|
||||||
|
cJSON_AddStringToObject(pSrcId, "addr", u64buf);
|
||||||
|
{
|
||||||
|
uint64_t u64 = pMsg->srcId.addr;
|
||||||
|
cJSON* pTmp = pSrcId;
|
||||||
|
char host[128];
|
||||||
|
uint16_t port;
|
||||||
|
syncUtilU642Addr(u64, host, sizeof(host), &port);
|
||||||
|
cJSON_AddStringToObject(pTmp, "addr_host", host);
|
||||||
|
cJSON_AddNumberToObject(pTmp, "addr_port", port);
|
||||||
|
}
|
||||||
|
cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
|
||||||
|
cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
|
||||||
|
|
||||||
|
cJSON* pDestId = cJSON_CreateObject();
|
||||||
|
cJSON_AddNumberToObject(pDestId, "addr", pMsg->destId.addr);
|
||||||
|
{
|
||||||
|
uint64_t u64 = pMsg->destId.addr;
|
||||||
|
cJSON* pTmp = pDestId;
|
||||||
|
char host[128];
|
||||||
|
uint16_t port;
|
||||||
|
syncUtilU642Addr(u64, host, sizeof(host), &port);
|
||||||
|
cJSON_AddStringToObject(pTmp, "addr_host", host);
|
||||||
|
cJSON_AddNumberToObject(pTmp, "addr_port", port);
|
||||||
|
}
|
||||||
|
cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
|
||||||
|
cJSON_AddItemToObject(pRoot, "destId", pDestId);
|
||||||
|
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->term);
|
||||||
|
cJSON_AddStringToObject(pRoot, "term", u64buf);
|
||||||
|
cJSON_AddNumberToObject(pRoot, "vote_granted", pMsg->voteGranted);
|
||||||
|
|
||||||
|
cJSON* pJson = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToObject(pJson, "SyncRequestVoteReply", pRoot);
|
||||||
|
return pJson;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---- message process SyncAppendEntries----
|
||||||
|
SyncAppendEntries* syncAppendEntriesBuild(uint32_t dataLen) {
|
||||||
|
uint32_t bytes = SYNC_APPEND_ENTRIES_FIX_LEN + dataLen;
|
||||||
|
SyncAppendEntries* pMsg = malloc(bytes);
|
||||||
|
memset(pMsg, 0, bytes);
|
||||||
|
pMsg->bytes = bytes;
|
||||||
|
pMsg->msgType = SYNC_APPEND_ENTRIES;
|
||||||
|
pMsg->dataLen = dataLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncAppendEntriesDestroy(SyncAppendEntries* pMsg) {
|
||||||
|
if (pMsg != NULL) {
|
||||||
|
free(pMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncAppendEntriesSerialize(const SyncAppendEntries* pMsg, char* buf, uint32_t bufLen) {
|
||||||
|
assert(pMsg->bytes <= bufLen);
|
||||||
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncAppendEntriesDeserialize(const char* buf, uint32_t len, SyncAppendEntries* pMsg) {
|
||||||
|
memcpy(pMsg, buf, len);
|
||||||
|
assert(len == pMsg->bytes);
|
||||||
|
assert(pMsg->bytes == SYNC_APPEND_ENTRIES_FIX_LEN + pMsg->dataLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncAppendEntries2RpcMsg(const SyncAppendEntries* pMsg, SRpcMsg* pRpcMsg) {
|
||||||
|
memset(pRpcMsg, 0, sizeof(*pRpcMsg));
|
||||||
|
pRpcMsg->msgType = pMsg->msgType;
|
||||||
|
pRpcMsg->contLen = pMsg->bytes;
|
||||||
|
pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
|
||||||
|
syncAppendEntriesSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncAppendEntriesFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntries* pMsg) {
|
||||||
|
syncAppendEntriesDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON* syncAppendEntries2Json(const SyncAppendEntries* pMsg) {
|
||||||
|
char u64buf[128];
|
||||||
|
|
||||||
|
cJSON* pRoot = cJSON_CreateObject();
|
||||||
|
cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
|
||||||
|
cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
|
||||||
|
|
||||||
|
cJSON* pSrcId = cJSON_CreateObject();
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr);
|
||||||
|
cJSON_AddStringToObject(pSrcId, "addr", u64buf);
|
||||||
|
{
|
||||||
|
uint64_t u64 = pMsg->srcId.addr;
|
||||||
|
cJSON* pTmp = pSrcId;
|
||||||
|
char host[128];
|
||||||
|
uint16_t port;
|
||||||
|
syncUtilU642Addr(u64, host, sizeof(host), &port);
|
||||||
|
cJSON_AddStringToObject(pTmp, "addr_host", host);
|
||||||
|
cJSON_AddNumberToObject(pTmp, "addr_port", port);
|
||||||
|
}
|
||||||
|
cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
|
||||||
|
cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
|
||||||
|
|
||||||
|
cJSON* pDestId = cJSON_CreateObject();
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->destId.addr);
|
||||||
|
cJSON_AddStringToObject(pDestId, "addr", u64buf);
|
||||||
|
{
|
||||||
|
uint64_t u64 = pMsg->destId.addr;
|
||||||
|
cJSON* pTmp = pDestId;
|
||||||
|
char host[128];
|
||||||
|
uint16_t port;
|
||||||
|
syncUtilU642Addr(u64, host, sizeof(host), &port);
|
||||||
|
cJSON_AddStringToObject(pTmp, "addr_host", host);
|
||||||
|
cJSON_AddNumberToObject(pTmp, "addr_port", port);
|
||||||
|
}
|
||||||
|
cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
|
||||||
|
cJSON_AddItemToObject(pRoot, "destId", pDestId);
|
||||||
|
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->prevLogIndex);
|
||||||
|
cJSON_AddStringToObject(pRoot, "pre_log_index", u64buf);
|
||||||
|
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->prevLogTerm);
|
||||||
|
cJSON_AddStringToObject(pRoot, "pre_log_term", u64buf);
|
||||||
|
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->commitIndex);
|
||||||
|
cJSON_AddStringToObject(pRoot, "commit_index", u64buf);
|
||||||
|
|
||||||
|
cJSON_AddNumberToObject(pRoot, "dataLen", pMsg->dataLen);
|
||||||
|
cJSON_AddStringToObject(pRoot, "data", pMsg->data);
|
||||||
|
|
||||||
|
cJSON* pJson = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToObject(pJson, "SyncAppendEntries", pRoot);
|
||||||
|
return pJson;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---- message process SyncAppendEntriesReply----
|
||||||
|
SyncAppendEntriesReply* syncAppendEntriesReplyBuild() {
|
||||||
|
uint32_t bytes = sizeof(SyncAppendEntriesReply);
|
||||||
|
SyncAppendEntriesReply* pMsg = malloc(bytes);
|
||||||
|
memset(pMsg, 0, bytes);
|
||||||
|
pMsg->bytes = bytes;
|
||||||
|
pMsg->msgType = SYNC_APPEND_ENTRIES_REPLY;
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncAppendEntriesReplyDestroy(SyncAppendEntriesReply* pMsg) {
|
||||||
|
if (pMsg != NULL) {
|
||||||
|
free(pMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncAppendEntriesReplySerialize(const SyncAppendEntriesReply* pMsg, char* buf, uint32_t bufLen) {
|
||||||
|
assert(pMsg->bytes <= bufLen);
|
||||||
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncAppendEntriesReplyDeserialize(const char* buf, uint32_t len, SyncAppendEntriesReply* pMsg) {
|
||||||
|
memcpy(pMsg, buf, len);
|
||||||
|
assert(len == pMsg->bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncAppendEntriesReply2RpcMsg(const SyncAppendEntriesReply* pMsg, SRpcMsg* pRpcMsg) {
|
||||||
|
memset(pRpcMsg, 0, sizeof(*pRpcMsg));
|
||||||
|
pRpcMsg->msgType = pMsg->msgType;
|
||||||
|
pRpcMsg->contLen = pMsg->bytes;
|
||||||
|
pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
|
||||||
|
syncAppendEntriesReplySerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void syncAppendEntriesReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntriesReply* pMsg) {
|
||||||
|
syncAppendEntriesReplyDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON* syncAppendEntriesReply2Json(const SyncAppendEntriesReply* pMsg) {
|
||||||
|
char u64buf[128];
|
||||||
|
|
||||||
|
cJSON* pRoot = cJSON_CreateObject();
|
||||||
|
cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
|
||||||
|
cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
|
||||||
|
|
||||||
|
cJSON* pSrcId = cJSON_CreateObject();
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->srcId.addr);
|
||||||
|
cJSON_AddStringToObject(pSrcId, "addr", u64buf);
|
||||||
|
{
|
||||||
|
uint64_t u64 = pMsg->srcId.addr;
|
||||||
|
cJSON* pTmp = pSrcId;
|
||||||
|
char host[128];
|
||||||
|
uint16_t port;
|
||||||
|
syncUtilU642Addr(u64, host, sizeof(host), &port);
|
||||||
|
cJSON_AddStringToObject(pTmp, "addr_host", host);
|
||||||
|
cJSON_AddNumberToObject(pTmp, "addr_port", port);
|
||||||
|
}
|
||||||
|
cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
|
||||||
|
cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
|
||||||
|
|
||||||
|
cJSON* pDestId = cJSON_CreateObject();
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->destId.addr);
|
||||||
|
cJSON_AddStringToObject(pDestId, "addr", u64buf);
|
||||||
|
{
|
||||||
|
uint64_t u64 = pMsg->destId.addr;
|
||||||
|
cJSON* pTmp = pDestId;
|
||||||
|
char host[128];
|
||||||
|
uint16_t port;
|
||||||
|
syncUtilU642Addr(u64, host, sizeof(host), &port);
|
||||||
|
cJSON_AddStringToObject(pTmp, "addr_host", host);
|
||||||
|
cJSON_AddNumberToObject(pTmp, "addr_port", port);
|
||||||
|
}
|
||||||
|
cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
|
||||||
|
cJSON_AddItemToObject(pRoot, "destId", pDestId);
|
||||||
|
|
||||||
|
cJSON_AddNumberToObject(pRoot, "success", pMsg->success);
|
||||||
|
snprintf(u64buf, sizeof(u64buf), "%lu", pMsg->matchIndex);
|
||||||
|
cJSON_AddStringToObject(pRoot, "match_index", u64buf);
|
||||||
|
|
||||||
|
cJSON* pJson = cJSON_CreateObject();
|
||||||
|
cJSON_AddItemToObject(pJson, "SyncAppendEntriesReply", pRoot);
|
||||||
|
return pJson;
|
||||||
|
}
|
|
@ -3,6 +3,7 @@
|
||||||
#include "syncIO.h"
|
#include "syncIO.h"
|
||||||
#include "syncInt.h"
|
#include "syncInt.h"
|
||||||
#include "syncMessage.h"
|
#include "syncMessage.h"
|
||||||
|
#include "syncUtil.h"
|
||||||
|
|
||||||
void logTest() {
|
void logTest() {
|
||||||
sTrace("--- sync log test: trace");
|
sTrace("--- sync log test: trace");
|
||||||
|
@ -14,6 +15,7 @@ void logTest() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PING_MSG_LEN 20
|
#define PING_MSG_LEN 20
|
||||||
|
#define APPEND_ENTRIES_VALUE_LEN 32
|
||||||
|
|
||||||
void test1() {
|
void test1() {
|
||||||
sTrace("test1: ---- syncPingSerialize, syncPingDeserialize");
|
sTrace("test1: ---- syncPingSerialize, syncPingDeserialize");
|
||||||
|
@ -21,16 +23,16 @@ void test1() {
|
||||||
char msg[PING_MSG_LEN];
|
char msg[PING_MSG_LEN];
|
||||||
snprintf(msg, sizeof(msg), "%s", "test ping");
|
snprintf(msg, sizeof(msg), "%s", "test ping");
|
||||||
SyncPing* pMsg = syncPingBuild(PING_MSG_LEN);
|
SyncPing* pMsg = syncPingBuild(PING_MSG_LEN);
|
||||||
pMsg->srcId.addr = 1;
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1111);
|
||||||
pMsg->srcId.vgId = 2;
|
pMsg->srcId.vgId = 100;
|
||||||
pMsg->destId.addr = 3;
|
pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 2222);
|
||||||
pMsg->destId.vgId = 4;
|
pMsg->destId.vgId = 100;
|
||||||
memcpy(pMsg->data, msg, PING_MSG_LEN);
|
memcpy(pMsg->data, msg, PING_MSG_LEN);
|
||||||
|
|
||||||
{
|
{
|
||||||
cJSON* pJson = syncPing2Json(pMsg);
|
cJSON* pJson = syncPing2Json(pMsg);
|
||||||
char* serialized = cJSON_Print(pJson);
|
char* serialized = cJSON_Print(pJson);
|
||||||
printf("SyncPing: \n%s\n\n", serialized);
|
printf("\n%s\n\n", serialized);
|
||||||
free(serialized);
|
free(serialized);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
}
|
}
|
||||||
|
@ -45,7 +47,7 @@ void test1() {
|
||||||
{
|
{
|
||||||
cJSON* pJson = syncPing2Json(pMsg2);
|
cJSON* pJson = syncPing2Json(pMsg2);
|
||||||
char* serialized = cJSON_Print(pJson);
|
char* serialized = cJSON_Print(pJson);
|
||||||
printf("SyncPing2: \n%s\n\n", serialized);
|
printf("\n%s\n\n", serialized);
|
||||||
free(serialized);
|
free(serialized);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
}
|
}
|
||||||
|
@ -61,16 +63,16 @@ void test2() {
|
||||||
char msg[PING_MSG_LEN];
|
char msg[PING_MSG_LEN];
|
||||||
snprintf(msg, sizeof(msg), "%s", "hello raft");
|
snprintf(msg, sizeof(msg), "%s", "hello raft");
|
||||||
SyncPing* pMsg = syncPingBuild(PING_MSG_LEN);
|
SyncPing* pMsg = syncPingBuild(PING_MSG_LEN);
|
||||||
pMsg->srcId.addr = 100;
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 3333);
|
||||||
pMsg->srcId.vgId = 200;
|
pMsg->srcId.vgId = 200;
|
||||||
pMsg->destId.addr = 300;
|
pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 4444);
|
||||||
pMsg->destId.vgId = 400;
|
pMsg->destId.vgId = 200;
|
||||||
memcpy(pMsg->data, msg, PING_MSG_LEN);
|
memcpy(pMsg->data, msg, PING_MSG_LEN);
|
||||||
|
|
||||||
{
|
{
|
||||||
cJSON* pJson = syncPing2Json(pMsg);
|
cJSON* pJson = syncPing2Json(pMsg);
|
||||||
char* serialized = cJSON_Print(pJson);
|
char* serialized = cJSON_Print(pJson);
|
||||||
printf("SyncPing: \n%s\n\n", serialized);
|
printf("\n%s\n\n", serialized);
|
||||||
free(serialized);
|
free(serialized);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
}
|
}
|
||||||
|
@ -84,7 +86,7 @@ void test2() {
|
||||||
{
|
{
|
||||||
cJSON* pJson = syncPing2Json(pMsg2);
|
cJSON* pJson = syncPing2Json(pMsg2);
|
||||||
char* serialized = cJSON_Print(pJson);
|
char* serialized = cJSON_Print(pJson);
|
||||||
printf("SyncPing2: \n%s\n\n", serialized);
|
printf("\n%s\n\n", serialized);
|
||||||
free(serialized);
|
free(serialized);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
}
|
}
|
||||||
|
@ -99,16 +101,16 @@ void test3() {
|
||||||
char msg[PING_MSG_LEN];
|
char msg[PING_MSG_LEN];
|
||||||
snprintf(msg, sizeof(msg), "%s", "test ping");
|
snprintf(msg, sizeof(msg), "%s", "test ping");
|
||||||
SyncPingReply* pMsg = syncPingReplyBuild(PING_MSG_LEN);
|
SyncPingReply* pMsg = syncPingReplyBuild(PING_MSG_LEN);
|
||||||
pMsg->srcId.addr = 19;
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 5555);
|
||||||
pMsg->srcId.vgId = 29;
|
pMsg->srcId.vgId = 100;
|
||||||
pMsg->destId.addr = 39;
|
pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 6666);
|
||||||
pMsg->destId.vgId = 49;
|
pMsg->destId.vgId = 100;
|
||||||
memcpy(pMsg->data, msg, PING_MSG_LEN);
|
memcpy(pMsg->data, msg, PING_MSG_LEN);
|
||||||
|
|
||||||
{
|
{
|
||||||
cJSON* pJson = syncPingReply2Json(pMsg);
|
cJSON* pJson = syncPingReply2Json(pMsg);
|
||||||
char* serialized = cJSON_Print(pJson);
|
char* serialized = cJSON_Print(pJson);
|
||||||
printf("SyncPingReply: \n%s\n\n", serialized);
|
printf("\n%s\n\n", serialized);
|
||||||
free(serialized);
|
free(serialized);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
}
|
}
|
||||||
|
@ -123,7 +125,7 @@ void test3() {
|
||||||
{
|
{
|
||||||
cJSON* pJson = syncPingReply2Json(pMsg2);
|
cJSON* pJson = syncPingReply2Json(pMsg2);
|
||||||
char* serialized = cJSON_Print(pJson);
|
char* serialized = cJSON_Print(pJson);
|
||||||
printf("SyncPingReply2: \n%s\n\n", serialized);
|
printf("\n%s\n\n", serialized);
|
||||||
free(serialized);
|
free(serialized);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
}
|
}
|
||||||
|
@ -139,16 +141,16 @@ void test4() {
|
||||||
char msg[PING_MSG_LEN];
|
char msg[PING_MSG_LEN];
|
||||||
snprintf(msg, sizeof(msg), "%s", "hello raft");
|
snprintf(msg, sizeof(msg), "%s", "hello raft");
|
||||||
SyncPingReply* pMsg = syncPingReplyBuild(PING_MSG_LEN);
|
SyncPingReply* pMsg = syncPingReplyBuild(PING_MSG_LEN);
|
||||||
pMsg->srcId.addr = 66;
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 7777);
|
||||||
pMsg->srcId.vgId = 77;
|
pMsg->srcId.vgId = 100;
|
||||||
pMsg->destId.addr = 88;
|
pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 8888);
|
||||||
pMsg->destId.vgId = 99;
|
pMsg->destId.vgId = 100;
|
||||||
memcpy(pMsg->data, msg, PING_MSG_LEN);
|
memcpy(pMsg->data, msg, PING_MSG_LEN);
|
||||||
|
|
||||||
{
|
{
|
||||||
cJSON* pJson = syncPingReply2Json(pMsg);
|
cJSON* pJson = syncPingReply2Json(pMsg);
|
||||||
char* serialized = cJSON_Print(pJson);
|
char* serialized = cJSON_Print(pJson);
|
||||||
printf("SyncPingReply: \n%s\n\n", serialized);
|
printf("\n%s\n\n", serialized);
|
||||||
free(serialized);
|
free(serialized);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
}
|
}
|
||||||
|
@ -162,7 +164,7 @@ void test4() {
|
||||||
{
|
{
|
||||||
cJSON* pJson = syncPingReply2Json(pMsg2);
|
cJSON* pJson = syncPingReply2Json(pMsg2);
|
||||||
char* serialized = cJSON_Print(pJson);
|
char* serialized = cJSON_Print(pJson);
|
||||||
printf("SyncPingReply2: \n%s\n\n", serialized);
|
printf("\n%s\n\n", serialized);
|
||||||
free(serialized);
|
free(serialized);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
}
|
}
|
||||||
|
@ -170,6 +172,321 @@ void test4() {
|
||||||
syncPingReplyDestroy(pMsg);
|
syncPingReplyDestroy(pMsg);
|
||||||
syncPingReplyDestroy(pMsg2);
|
syncPingReplyDestroy(pMsg2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test5() {
|
||||||
|
sTrace("test5: ---- syncRequestVoteSerialize, syncRequestVoteDeserialize");
|
||||||
|
|
||||||
|
SyncRequestVote* pMsg = syncRequestVoteBuild();
|
||||||
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1234);
|
||||||
|
pMsg->srcId.vgId = 100;
|
||||||
|
pMsg->destId.addr = syncUtilAddr2U64("8.8.8.8", 5678);
|
||||||
|
pMsg->destId.vgId = 100;
|
||||||
|
pMsg->currentTerm = 20;
|
||||||
|
pMsg->lastLogIndex = 21;
|
||||||
|
pMsg->lastLogTerm = 22;
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncRequestVote2Json(pMsg);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t bufLen = pMsg->bytes;
|
||||||
|
char* buf = (char*)malloc(bufLen);
|
||||||
|
syncRequestVoteSerialize(pMsg, buf, bufLen);
|
||||||
|
|
||||||
|
SyncRequestVote* pMsg2 = (SyncRequestVote*)malloc(pMsg->bytes);
|
||||||
|
syncRequestVoteDeserialize(buf, bufLen, pMsg2);
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncRequestVote2Json(pMsg2);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
syncRequestVoteDestroy(pMsg);
|
||||||
|
syncRequestVoteDestroy(pMsg2);
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test6() {
|
||||||
|
sTrace("test6: ---- syncRequestVote2RpcMsg, syncRequestVoteFromRpcMsg");
|
||||||
|
|
||||||
|
SyncRequestVote* pMsg = syncRequestVoteBuild();
|
||||||
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1234);
|
||||||
|
pMsg->srcId.vgId = 100;
|
||||||
|
pMsg->destId.addr = syncUtilAddr2U64("8.8.8.8", 5678);
|
||||||
|
pMsg->destId.vgId = 100;
|
||||||
|
pMsg->currentTerm = 20;
|
||||||
|
pMsg->lastLogIndex = 21;
|
||||||
|
pMsg->lastLogTerm = 22;
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncRequestVote2Json(pMsg);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
SRpcMsg rpcMsg;
|
||||||
|
syncRequestVote2RpcMsg(pMsg, &rpcMsg);
|
||||||
|
SyncRequestVote* pMsg2 = (SyncRequestVote*)malloc(pMsg->bytes);
|
||||||
|
syncRequestVoteFromRpcMsg(&rpcMsg, pMsg2);
|
||||||
|
rpcFreeCont(rpcMsg.pCont);
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncRequestVote2Json(pMsg2);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
syncRequestVoteDestroy(pMsg);
|
||||||
|
syncRequestVoteDestroy(pMsg2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test7() {
|
||||||
|
sTrace("test7: ---- syncRequestVoteReplySerialize, syncRequestVoteReplyDeserialize");
|
||||||
|
|
||||||
|
SyncRequestVoteReply* pMsg = SyncRequestVoteReplyBuild();
|
||||||
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1234);
|
||||||
|
pMsg->srcId.vgId = 100;
|
||||||
|
pMsg->destId.addr = syncUtilAddr2U64("8.8.8.8", 5678);
|
||||||
|
pMsg->destId.vgId = 100;
|
||||||
|
pMsg->term = 20;
|
||||||
|
pMsg->voteGranted = 1;
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncRequestVoteReply2Json(pMsg);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t bufLen = pMsg->bytes;
|
||||||
|
char* buf = (char*)malloc(bufLen);
|
||||||
|
syncRequestVoteReplySerialize(pMsg, buf, bufLen);
|
||||||
|
|
||||||
|
SyncRequestVoteReply* pMsg2 = (SyncRequestVoteReply*)malloc(pMsg->bytes);
|
||||||
|
syncRequestVoteReplyDeserialize(buf, bufLen, pMsg2);
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncRequestVoteReply2Json(pMsg2);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
syncRequestVoteReplyDestroy(pMsg);
|
||||||
|
syncRequestVoteReplyDestroy(pMsg2);
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test8() {
|
||||||
|
sTrace("test8: ---- syncRequestVoteReply2RpcMsg, syncRequestVoteReplyFromRpcMsg");
|
||||||
|
|
||||||
|
SyncRequestVoteReply* pMsg = SyncRequestVoteReplyBuild();
|
||||||
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1234);
|
||||||
|
pMsg->srcId.vgId = 100;
|
||||||
|
pMsg->destId.addr = syncUtilAddr2U64("8.8.8.8", 5678);
|
||||||
|
pMsg->destId.vgId = 100;
|
||||||
|
pMsg->term = 20;
|
||||||
|
pMsg->voteGranted = 1;
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncRequestVoteReply2Json(pMsg);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
SRpcMsg rpcMsg;
|
||||||
|
syncRequestVoteReply2RpcMsg(pMsg, &rpcMsg);
|
||||||
|
SyncRequestVoteReply* pMsg2 = (SyncRequestVoteReply*)malloc(pMsg->bytes);
|
||||||
|
syncRequestVoteReplyFromRpcMsg(&rpcMsg, pMsg2);
|
||||||
|
rpcFreeCont(rpcMsg.pCont);
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncRequestVoteReply2Json(pMsg2);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
syncRequestVoteReplyDestroy(pMsg);
|
||||||
|
syncRequestVoteReplyDestroy(pMsg2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test9() {
|
||||||
|
sTrace("test9: ---- syncAppendEntriesSerialize, syncAppendEntriesDeserialize");
|
||||||
|
|
||||||
|
char msg[APPEND_ENTRIES_VALUE_LEN];
|
||||||
|
snprintf(msg, sizeof(msg), "%s", "test value");
|
||||||
|
SyncAppendEntries* pMsg = syncAppendEntriesBuild(APPEND_ENTRIES_VALUE_LEN);
|
||||||
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1111);
|
||||||
|
pMsg->srcId.vgId = 100;
|
||||||
|
pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 2222);
|
||||||
|
pMsg->destId.vgId = 100;
|
||||||
|
pMsg->prevLogIndex = 55;
|
||||||
|
pMsg->prevLogTerm = 66;
|
||||||
|
pMsg->commitIndex = 77;
|
||||||
|
memcpy(pMsg->data, msg, APPEND_ENTRIES_VALUE_LEN);
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncAppendEntries2Json(pMsg);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t bufLen = pMsg->bytes;
|
||||||
|
char* buf = (char*)malloc(bufLen);
|
||||||
|
syncAppendEntriesSerialize(pMsg, buf, bufLen);
|
||||||
|
|
||||||
|
SyncAppendEntries* pMsg2 = (SyncAppendEntries*)malloc(pMsg->bytes);
|
||||||
|
syncAppendEntriesDeserialize(buf, bufLen, pMsg2);
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncAppendEntries2Json(pMsg2);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
syncAppendEntriesDestroy(pMsg);
|
||||||
|
syncAppendEntriesDestroy(pMsg2);
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test10() {
|
||||||
|
sTrace("test10: ---- syncAppendEntries2RpcMsg, syncAppendEntriesFromRpcMsg");
|
||||||
|
|
||||||
|
char msg[APPEND_ENTRIES_VALUE_LEN];
|
||||||
|
snprintf(msg, sizeof(msg), "%s", "test value");
|
||||||
|
SyncAppendEntries* pMsg = syncAppendEntriesBuild(APPEND_ENTRIES_VALUE_LEN);
|
||||||
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1111);
|
||||||
|
pMsg->srcId.vgId = 100;
|
||||||
|
pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 2222);
|
||||||
|
pMsg->destId.vgId = 100;
|
||||||
|
pMsg->prevLogIndex = 55;
|
||||||
|
pMsg->prevLogTerm = 66;
|
||||||
|
pMsg->commitIndex = 77;
|
||||||
|
memcpy(pMsg->data, msg, APPEND_ENTRIES_VALUE_LEN);
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncAppendEntries2Json(pMsg);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
SRpcMsg rpcMsg;
|
||||||
|
syncAppendEntries2RpcMsg(pMsg, &rpcMsg);
|
||||||
|
SyncAppendEntries* pMsg2 = (SyncAppendEntries*)malloc(pMsg->bytes);
|
||||||
|
syncAppendEntriesFromRpcMsg(&rpcMsg, pMsg2);
|
||||||
|
rpcFreeCont(rpcMsg.pCont);
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncAppendEntries2Json(pMsg2);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
syncAppendEntriesDestroy(pMsg);
|
||||||
|
syncAppendEntriesDestroy(pMsg2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test11() {
|
||||||
|
sTrace("test11: ---- syncAppendEntriesReplySerialize, syncAppendEntriesReplyDeserialize");
|
||||||
|
|
||||||
|
SyncAppendEntriesReply* pMsg = syncAppendEntriesReplyBuild();
|
||||||
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1111);
|
||||||
|
pMsg->srcId.vgId = 100;
|
||||||
|
pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 2222);
|
||||||
|
pMsg->destId.vgId = 100;
|
||||||
|
pMsg->success = 1;
|
||||||
|
pMsg->matchIndex = 23;
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncAppendEntriesReply2Json(pMsg);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t bufLen = pMsg->bytes;
|
||||||
|
char* buf = (char*)malloc(bufLen);
|
||||||
|
syncAppendEntriesReplySerialize(pMsg, buf, bufLen);
|
||||||
|
|
||||||
|
SyncAppendEntriesReply* pMsg2 = (SyncAppendEntriesReply*)malloc(pMsg->bytes);
|
||||||
|
syncAppendEntriesReplyDeserialize(buf, bufLen, pMsg2);
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncAppendEntriesReply2Json(pMsg2);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
syncAppendEntriesReplyDestroy(pMsg);
|
||||||
|
syncAppendEntriesReplyDestroy(pMsg2);
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test12() {
|
||||||
|
sTrace("test12: ---- syncAppendEntriesReply2RpcMsg, syncAppendEntriesReplyFromRpcMsg");
|
||||||
|
|
||||||
|
SyncAppendEntriesReply* pMsg = syncAppendEntriesReplyBuild();
|
||||||
|
pMsg->srcId.addr = syncUtilAddr2U64("127.0.0.1", 1111);
|
||||||
|
pMsg->srcId.vgId = 100;
|
||||||
|
pMsg->destId.addr = syncUtilAddr2U64("127.0.0.1", 2222);
|
||||||
|
pMsg->destId.vgId = 100;
|
||||||
|
pMsg->success = 1;
|
||||||
|
pMsg->matchIndex = 23;
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncAppendEntriesReply2Json(pMsg);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
SRpcMsg rpcMsg;
|
||||||
|
syncAppendEntriesReply2RpcMsg(pMsg, &rpcMsg);
|
||||||
|
SyncAppendEntriesReply* pMsg2 = (SyncAppendEntriesReply*)malloc(pMsg->bytes);
|
||||||
|
syncAppendEntriesReplyFromRpcMsg(&rpcMsg, pMsg2);
|
||||||
|
rpcFreeCont(rpcMsg.pCont);
|
||||||
|
|
||||||
|
{
|
||||||
|
cJSON* pJson = syncAppendEntriesReply2Json(pMsg2);
|
||||||
|
char* serialized = cJSON_Print(pJson);
|
||||||
|
printf("\n%s\n\n", serialized);
|
||||||
|
free(serialized);
|
||||||
|
cJSON_Delete(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
syncAppendEntriesReplyDestroy(pMsg);
|
||||||
|
syncAppendEntriesReplyDestroy(pMsg2);
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
// taosInitLog((char*)"syncPingTest.log", 100000, 10);
|
// taosInitLog((char*)"syncPingTest.log", 100000, 10);
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
|
@ -179,6 +496,14 @@ int main() {
|
||||||
test2();
|
test2();
|
||||||
test3();
|
test3();
|
||||||
test4();
|
test4();
|
||||||
|
test5();
|
||||||
|
test6();
|
||||||
|
test7();
|
||||||
|
test8();
|
||||||
|
test9();
|
||||||
|
test10();
|
||||||
|
test11();
|
||||||
|
test12();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "gtest/gtest.h"
|
#include <gtest/gtest.h>
|
||||||
#include "syncIO.h"
|
#include "syncIO.h"
|
||||||
#include "syncInt.h"
|
#include "syncInt.h"
|
||||||
#include "syncRaftStore.h"
|
#include "syncRaftStore.h"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "gtest/gtest.h"
|
#include <gtest/gtest.h>
|
||||||
#include "syncIO.h"
|
#include "syncIO.h"
|
||||||
#include "syncInt.h"
|
#include "syncInt.h"
|
||||||
#include "syncRaftStore.h"
|
#include "syncRaftStore.h"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "gtest/gtest.h"
|
#include <gtest/gtest.h>
|
||||||
#include "syncIO.h"
|
#include "syncIO.h"
|
||||||
#include "syncInt.h"
|
#include "syncInt.h"
|
||||||
#include "syncRaftStore.h"
|
#include "syncRaftStore.h"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "gtest/gtest.h"
|
#include <gtest/gtest.h>
|
||||||
#include "syncIO.h"
|
#include "syncIO.h"
|
||||||
#include "syncInt.h"
|
#include "syncInt.h"
|
||||||
#include "syncRaftStore.h"
|
#include "syncRaftStore.h"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "gtest/gtest.h"
|
#include <gtest/gtest.h>
|
||||||
#include "syncIO.h"
|
#include "syncIO.h"
|
||||||
#include "syncInt.h"
|
#include "syncInt.h"
|
||||||
#include "syncRaftStore.h"
|
#include "syncRaftStore.h"
|
||||||
|
|
|
@ -13,7 +13,9 @@ void logTest() {
|
||||||
sFatal("--- sync log test: fatal");
|
sFatal("--- sync log test: fatal");
|
||||||
}
|
}
|
||||||
|
|
||||||
SSyncNode* doSync() {
|
uint16_t ports[3] = {7010, 7110, 7210};
|
||||||
|
|
||||||
|
SSyncNode* doSync(int myIndex) {
|
||||||
SSyncFSM* pFsm;
|
SSyncFSM* pFsm;
|
||||||
|
|
||||||
SSyncInfo syncInfo;
|
SSyncInfo syncInfo;
|
||||||
|
@ -24,18 +26,18 @@ SSyncNode* doSync() {
|
||||||
snprintf(syncInfo.path, sizeof(syncInfo.path), "%s", "./test_sync_ping");
|
snprintf(syncInfo.path, sizeof(syncInfo.path), "%s", "./test_sync_ping");
|
||||||
|
|
||||||
SSyncCfg* pCfg = &syncInfo.syncCfg;
|
SSyncCfg* pCfg = &syncInfo.syncCfg;
|
||||||
pCfg->myIndex = 0;
|
pCfg->myIndex = myIndex;
|
||||||
pCfg->replicaNum = 2;
|
pCfg->replicaNum = 3;
|
||||||
|
|
||||||
pCfg->nodeInfo[0].nodePort = 7010;
|
pCfg->nodeInfo[0].nodePort = ports[0];
|
||||||
snprintf(pCfg->nodeInfo[0].nodeFqdn, sizeof(pCfg->nodeInfo[0].nodeFqdn), "%s", "127.0.0.1");
|
snprintf(pCfg->nodeInfo[0].nodeFqdn, sizeof(pCfg->nodeInfo[0].nodeFqdn), "%s", "127.0.0.1");
|
||||||
// taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn);
|
// taosGetFqdn(pCfg->nodeInfo[0].nodeFqdn);
|
||||||
|
|
||||||
pCfg->nodeInfo[1].nodePort = 7110;
|
pCfg->nodeInfo[1].nodePort = ports[1];
|
||||||
snprintf(pCfg->nodeInfo[1].nodeFqdn, sizeof(pCfg->nodeInfo[1].nodeFqdn), "%s", "127.0.0.1");
|
snprintf(pCfg->nodeInfo[1].nodeFqdn, sizeof(pCfg->nodeInfo[1].nodeFqdn), "%s", "127.0.0.1");
|
||||||
// taosGetFqdn(pCfg->nodeInfo[1].nodeFqdn);
|
// taosGetFqdn(pCfg->nodeInfo[1].nodeFqdn);
|
||||||
|
|
||||||
pCfg->nodeInfo[2].nodePort = 7210;
|
pCfg->nodeInfo[2].nodePort = ports[2];
|
||||||
snprintf(pCfg->nodeInfo[2].nodeFqdn, sizeof(pCfg->nodeInfo[2].nodeFqdn), "%s", "127.0.0.1");
|
snprintf(pCfg->nodeInfo[2].nodeFqdn, sizeof(pCfg->nodeInfo[2].nodeFqdn), "%s", "127.0.0.1");
|
||||||
// taosGetFqdn(pCfg->nodeInfo[2].nodeFqdn);
|
// taosGetFqdn(pCfg->nodeInfo[2].nodeFqdn);
|
||||||
|
|
||||||
|
@ -53,20 +55,25 @@ void timerPingAll(void* param, void* tmrId) {
|
||||||
syncNodePingAll(pSyncNode);
|
syncNodePingAll(pSyncNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main(int argc, char** argv) {
|
||||||
// taosInitLog((char*)"syncPingTest.log", 100000, 10);
|
// taosInitLog((char*)"syncPingTest.log", 100000, 10);
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
sDebugFlag = 143 + 64;
|
sDebugFlag = 143 + 64;
|
||||||
|
|
||||||
logTest();
|
logTest();
|
||||||
|
|
||||||
int32_t ret = syncIOStart((char*)"127.0.0.1", 7010);
|
int myIndex = 0;
|
||||||
|
if (argc >= 2) {
|
||||||
|
myIndex = atoi(argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ret = syncIOStart((char*)"127.0.0.1", ports[myIndex]);
|
||||||
assert(ret == 0);
|
assert(ret == 0);
|
||||||
|
|
||||||
ret = syncEnvStart();
|
ret = syncEnvStart();
|
||||||
assert(ret == 0);
|
assert(ret == 0);
|
||||||
|
|
||||||
SSyncNode* pSyncNode = doSync();
|
SSyncNode* pSyncNode = doSync(myIndex);
|
||||||
gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
|
gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
|
||||||
gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
|
gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
|
||||||
|
|
||||||
|
@ -74,9 +81,9 @@ int main() {
|
||||||
assert(ret == 0);
|
assert(ret == 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
taosMsleep(10000);
|
taosMsleep(10000);
|
||||||
ret = syncNodeStopPingTimer(pSyncNode);
|
ret = syncNodeStopPingTimer(pSyncNode);
|
||||||
assert(ret == 0);
|
assert(ret == 0);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "syncRaftStore.h"
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "gtest/gtest.h"
|
#include <gtest/gtest.h>
|
||||||
|
#include "syncRaftStore.h"
|
||||||
#include "syncIO.h"
|
#include "syncIO.h"
|
||||||
#include "syncInt.h"
|
#include "syncInt.h"
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "gtest/gtest.h"
|
#include <gtest/gtest.h>
|
||||||
#include "syncIO.h"
|
#include "syncIO.h"
|
||||||
#include "syncInt.h"
|
#include "syncInt.h"
|
||||||
#include "syncRaftStore.h"
|
#include "syncRaftStore.h"
|
||||||
|
|
|
@ -90,7 +90,7 @@ int tdbOpen(TDB *pDb, const char *fname, const char *dbname, TENV *pEnv) {
|
||||||
// get page file from the env, if not opened yet, open it
|
// get page file from the env, if not opened yet, open it
|
||||||
pPgFile = NULL;
|
pPgFile = NULL;
|
||||||
snprintf(dbfname, 128, "%s/%s", tdbEnvGetRootDir(pEnv), fname);
|
snprintf(dbfname, 128, "%s/%s", tdbEnvGetRootDir(pEnv), fname);
|
||||||
fileExist = (tdbCheckFileAccess(fname, TDB_F_OK) == 0);
|
fileExist = taosCheckExistFile(fname);
|
||||||
if (fileExist) {
|
if (fileExist) {
|
||||||
tdbGnrtFileID(dbfname, fileid, false);
|
tdbGnrtFileID(dbfname, fileid, false);
|
||||||
pPgFile = tdbEnvGetPageFile(pEnv, fileid);
|
pPgFile = tdbEnvGetPageFile(pEnv, fileid);
|
||||||
|
|
|
@ -16,16 +16,16 @@
|
||||||
#include "tdbInt.h"
|
#include "tdbInt.h"
|
||||||
|
|
||||||
int tdbGnrtFileID(const char *fname, uint8_t *fileid, bool unique) {
|
int tdbGnrtFileID(const char *fname, uint8_t *fileid, bool unique) {
|
||||||
struct stat statbuf;
|
int64_t stDev = 0, stIno = 0;
|
||||||
|
|
||||||
if (stat(fname, &statbuf) < 0) {
|
if (taosDevInoFile(fname, &stDev, &stIno) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(fileid, 0, TDB_FILE_ID_LEN);
|
memset(fileid, 0, TDB_FILE_ID_LEN);
|
||||||
|
|
||||||
((uint64_t *)fileid)[0] = (uint64_t)statbuf.st_ino;
|
((uint64_t *)fileid)[0] = stDev;
|
||||||
((uint64_t *)fileid)[1] = (uint64_t)statbuf.st_dev;
|
((uint64_t *)fileid)[1] = stIno;
|
||||||
if (unique) {
|
if (unique) {
|
||||||
((uint64_t *)fileid)[2] = rand();
|
((uint64_t *)fileid)[2] = rand();
|
||||||
}
|
}
|
||||||
|
@ -33,35 +33,34 @@ int tdbGnrtFileID(const char *fname, uint8_t *fileid, bool unique) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdbCheckFileAccess(const char *pathname, int mode) {
|
// int tdbCheckFileAccess(const char *pathname, int mode) {
|
||||||
int flags = 0;
|
// int flags = 0;
|
||||||
|
|
||||||
if (mode & TDB_F_OK) {
|
// if (mode & TDB_F_OK) {
|
||||||
flags |= F_OK;
|
// flags |= F_OK;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (mode & TDB_R_OK) {
|
// if (mode & TDB_R_OK) {
|
||||||
flags |= R_OK;
|
// flags |= R_OK;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (mode & TDB_W_OK) {
|
// if (mode & TDB_W_OK) {
|
||||||
flags |= W_OK;
|
// flags |= W_OK;
|
||||||
}
|
// }
|
||||||
|
|
||||||
return access(pathname, flags);
|
// return access(pathname, flags);
|
||||||
}
|
// }
|
||||||
|
|
||||||
int tdbGetFileSize(const char *fname, pgsz_t pgSize, pgno_t *pSize) {
|
int tdbGetFileSize(const char *fname, pgsz_t pgSize, pgno_t *pSize) {
|
||||||
struct stat st;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
int64_t file_size = 0;
|
||||||
ret = stat(fname, &st);
|
ret = taosStatFile(fname, &file_size, NULL);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(st.st_size % pgSize == 0);
|
ASSERT(file_size % pgSize == 0);
|
||||||
|
|
||||||
*pSize = st.st_size / pgSize;
|
*pSize = file_size / pgSize;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
|
@ -30,10 +30,10 @@ extern "C" {
|
||||||
|
|
||||||
int tdbGnrtFileID(const char *fname, uint8_t *fileid, bool unique);
|
int tdbGnrtFileID(const char *fname, uint8_t *fileid, bool unique);
|
||||||
|
|
||||||
#define TDB_F_OK 0x1
|
// #define TDB_F_OK 0x1
|
||||||
#define TDB_R_OK 0x2
|
// #define TDB_R_OK 0x2
|
||||||
#define TDB_W_OK 0x4
|
// #define TDB_W_OK 0x4
|
||||||
int tdbCheckFileAccess(const char *pathname, int mode);
|
// int tdbCheckFileAccess(const char *pathname, int mode);
|
||||||
|
|
||||||
int tdbGetFileSize(const char *fname, pgsz_t pgSize, pgno_t *pSize);
|
int tdbGetFileSize(const char *fname, pgsz_t pgSize, pgno_t *pSize);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#include "gtest/gtest.h"
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "tdb.h"
|
#include "tdb.h"
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ target_include_directories(
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(tfs os util common)
|
target_link_libraries(tfs os util common monitor)
|
||||||
|
|
||||||
if(${BUILD_TEST})
|
if(${BUILD_TEST})
|
||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
|
|
|
@ -389,7 +389,6 @@ static int32_t tfsMount(STfs *pTfs, SDiskCfg *pCfg) {
|
||||||
|
|
||||||
static int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg) {
|
static int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg) {
|
||||||
char dirName[TSDB_FILENAME_LEN] = "\0";
|
char dirName[TSDB_FILENAME_LEN] = "\0";
|
||||||
struct stat pstat;
|
|
||||||
|
|
||||||
if (pCfg->level < 0 || pCfg->level >= TFS_MAX_TIERS) {
|
if (pCfg->level < 0 || pCfg->level >= TFS_MAX_TIERS) {
|
||||||
fError("failed to mount %s to FS since invalid level %d", pCfg->dir, pCfg->level);
|
fError("failed to mount %s to FS since invalid level %d", pCfg->dir, pCfg->level);
|
||||||
|
@ -422,19 +421,13 @@ static int32_t tfsCheckAndFormatCfg(STfs *pTfs, SDiskCfg *pCfg) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (access(dirName, W_OK | R_OK | F_OK) != 0) {
|
if (!taosCheckAccessFile(dirName, TD_FILE_ACCESS_EXIST_OK | TD_FILE_ACCESS_READ_OK | TD_FILE_ACCESS_WRITE_OK)) {
|
||||||
fError("failed to mount %s to FS since no R/W access rights", pCfg->dir);
|
fError("failed to mount %s to FS since no R/W access rights", pCfg->dir);
|
||||||
terrno = TSDB_CODE_FS_INVLD_CFG;
|
terrno = TSDB_CODE_FS_INVLD_CFG;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stat(dirName, &pstat) < 0) {
|
if (!taosIsDir(dirName)) {
|
||||||
fError("failed to mount %s to FS since %s", pCfg->dir, strerror(errno));
|
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!S_ISDIR(pstat.st_mode)) {
|
|
||||||
fError("failed to mount %s to FS since not a directory", pCfg->dir);
|
fError("failed to mount %s to FS since not a directory", pCfg->dir);
|
||||||
terrno = TSDB_CODE_FS_INVLD_CFG;
|
terrno = TSDB_CODE_FS_INVLD_CFG;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -544,3 +537,24 @@ static STfsDisk *tfsNextDisk(STfs *pTfs, SDiskIter *pIter) {
|
||||||
|
|
||||||
return pDisk;
|
return pDisk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tfsGetMonitorInfo(STfs *pTfs, SMonDiskInfo *pInfo) {
|
||||||
|
pInfo->datadirs = taosArrayInit(32, sizeof(SMonDiskDesc));
|
||||||
|
if (pInfo->datadirs == NULL) return -1;
|
||||||
|
|
||||||
|
tfsUpdateSize(pTfs);
|
||||||
|
|
||||||
|
tfsLock(pTfs);
|
||||||
|
for (int32_t level = 0; level < pTfs->nlevel; level++) {
|
||||||
|
STfsTier *pTier = &pTfs->tiers[level];
|
||||||
|
for (int32_t disk = 0; disk < pTier->ndisk; ++disk) {
|
||||||
|
STfsDisk *pDisk = pTier->disks[disk];
|
||||||
|
SMonDiskDesc dinfo = {0};
|
||||||
|
dinfo.size = pDisk->size;
|
||||||
|
dinfo.level = pDisk->level;
|
||||||
|
tstrncpy(dinfo.name, pDisk->path, sizeof(dinfo.name));
|
||||||
|
taosArrayPush(pInfo->datadirs, &dinfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tfsUnLock(pTfs);
|
||||||
|
}
|
|
@ -119,29 +119,29 @@ TEST_F(TfsTest, 03_Dir) {
|
||||||
char p1[] = "p1";
|
char p1[] = "p1";
|
||||||
char ap1[128] = {0};
|
char ap1[128] = {0};
|
||||||
snprintf(ap1, 128, "%s%s%s", root, TD_DIRSEP, p1);
|
snprintf(ap1, 128, "%s%s%s", root, TD_DIRSEP, p1);
|
||||||
EXPECT_NE(taosDirExist(ap1), 0);
|
EXPECT_NE(taosDirExist(ap1), 1);
|
||||||
EXPECT_EQ(tfsMkdir(pTfs, p1), 0);
|
EXPECT_EQ(tfsMkdir(pTfs, p1), 0);
|
||||||
EXPECT_EQ(taosDirExist(ap1), 0);
|
EXPECT_EQ(taosDirExist(ap1), 1);
|
||||||
|
|
||||||
char p2[] = "p2";
|
char p2[] = "p2";
|
||||||
char ap2[128] = {0};
|
char ap2[128] = {0};
|
||||||
snprintf(ap2, 128, "%s%s%s", root, TD_DIRSEP, p2);
|
snprintf(ap2, 128, "%s%s%s", root, TD_DIRSEP, p2);
|
||||||
SDiskID did = {0};
|
SDiskID did = {0};
|
||||||
EXPECT_NE(taosDirExist(ap2), 0);
|
EXPECT_NE(taosDirExist(ap2), 1);
|
||||||
EXPECT_EQ(tfsMkdirAt(pTfs, p2, did), 0);
|
EXPECT_EQ(tfsMkdirAt(pTfs, p2, did), 0);
|
||||||
EXPECT_EQ(taosDirExist(ap2), 0);
|
EXPECT_EQ(taosDirExist(ap2), 1);
|
||||||
|
|
||||||
char p3[] = "p3/p2/p1/p0";
|
char p3[] = "p3/p2/p1/p0";
|
||||||
char ap3[128] = {0};
|
char ap3[128] = {0};
|
||||||
snprintf(ap3, 128, "%s%s%s", root, TD_DIRSEP, p3);
|
snprintf(ap3, 128, "%s%s%s", root, TD_DIRSEP, p3);
|
||||||
EXPECT_NE(taosDirExist(ap3), 0);
|
EXPECT_NE(taosDirExist(ap3), 1);
|
||||||
EXPECT_NE(tfsMkdir(pTfs, p3), 0);
|
EXPECT_NE(tfsMkdir(pTfs, p3), 0);
|
||||||
EXPECT_NE(tfsMkdirAt(pTfs, p3, did), 0);
|
EXPECT_NE(tfsMkdirAt(pTfs, p3, did), 0);
|
||||||
EXPECT_EQ(tfsMkdirRecurAt(pTfs, p3, did), 0);
|
EXPECT_EQ(tfsMkdirRecurAt(pTfs, p3, did), 0);
|
||||||
EXPECT_EQ(taosDirExist(ap3), 0);
|
EXPECT_EQ(taosDirExist(ap3), 1);
|
||||||
|
|
||||||
EXPECT_EQ(tfsRmdir(pTfs, p3), 0);
|
EXPECT_EQ(tfsRmdir(pTfs, p3), 0);
|
||||||
EXPECT_NE(taosDirExist(ap3), 0);
|
EXPECT_NE(taosDirExist(ap3), 1);
|
||||||
|
|
||||||
char p45[] = "p5";
|
char p45[] = "p5";
|
||||||
char p44[] = "p4";
|
char p44[] = "p4";
|
||||||
|
@ -149,12 +149,12 @@ TEST_F(TfsTest, 03_Dir) {
|
||||||
char ap4[128] = {0};
|
char ap4[128] = {0};
|
||||||
snprintf(ap4, 128, "%s%s%s", root, TD_DIRSEP, p4);
|
snprintf(ap4, 128, "%s%s%s", root, TD_DIRSEP, p4);
|
||||||
|
|
||||||
EXPECT_NE(taosDirExist(ap4), 0);
|
EXPECT_NE(taosDirExist(ap4), 1);
|
||||||
EXPECT_EQ(tfsMkdirRecurAt(pTfs, p4, did), 0);
|
EXPECT_EQ(tfsMkdirRecurAt(pTfs, p4, did), 0);
|
||||||
EXPECT_EQ(taosDirExist(ap4), 0);
|
EXPECT_EQ(taosDirExist(ap4), 1);
|
||||||
EXPECT_EQ(tfsRename(pTfs, p44, p45), 0);
|
EXPECT_EQ(tfsRename(pTfs, p44, p45), 0);
|
||||||
EXPECT_EQ(tfsRmdir(pTfs, p4), 0);
|
EXPECT_EQ(tfsRmdir(pTfs, p4), 0);
|
||||||
EXPECT_NE(taosDirExist(ap4), 0);
|
EXPECT_NE(taosDirExist(ap4), 1);
|
||||||
|
|
||||||
tfsClose(pTfs);
|
tfsClose(pTfs);
|
||||||
}
|
}
|
||||||
|
@ -251,9 +251,9 @@ TEST_F(TfsTest, 04_File) {
|
||||||
|
|
||||||
char af2[128] = {0};
|
char af2[128] = {0};
|
||||||
snprintf(af2, 128, "%s%s%s", root, TD_DIRSEP, n2);
|
snprintf(af2, 128, "%s%s%s", root, TD_DIRSEP, n2);
|
||||||
EXPECT_EQ(taosDirExist(af2), 0);
|
EXPECT_EQ(taosDirExist(af2), 1);
|
||||||
tfsRemoveFile(&f2);
|
tfsRemoveFile(&f2);
|
||||||
EXPECT_NE(taosDirExist(af2), 0);
|
EXPECT_NE(taosDirExist(af2), 1);
|
||||||
|
|
||||||
{
|
{
|
||||||
STfsDir *pDir = tfsOpendir(pTfs, "t3");
|
STfsDir *pDir = tfsOpendir(pTfs, "t3");
|
||||||
|
@ -529,35 +529,35 @@ TEST_F(TfsTest, 05_MultiDisk) {
|
||||||
snprintf(ap22, 128, "%s%s%s", root22, TD_DIRSEP, p1);
|
snprintf(ap22, 128, "%s%s%s", root22, TD_DIRSEP, p1);
|
||||||
char ap23[128] = {0};
|
char ap23[128] = {0};
|
||||||
snprintf(ap23, 128, "%s%s%s", root23, TD_DIRSEP, p1);
|
snprintf(ap23, 128, "%s%s%s", root23, TD_DIRSEP, p1);
|
||||||
EXPECT_NE(taosDirExist(ap00), 0);
|
EXPECT_NE(taosDirExist(ap00), 1);
|
||||||
EXPECT_NE(taosDirExist(ap01), 0);
|
EXPECT_NE(taosDirExist(ap01), 1);
|
||||||
EXPECT_NE(taosDirExist(ap10), 0);
|
EXPECT_NE(taosDirExist(ap10), 1);
|
||||||
EXPECT_NE(taosDirExist(ap11), 0);
|
EXPECT_NE(taosDirExist(ap11), 1);
|
||||||
EXPECT_NE(taosDirExist(ap12), 0);
|
EXPECT_NE(taosDirExist(ap12), 1);
|
||||||
EXPECT_NE(taosDirExist(ap20), 0);
|
EXPECT_NE(taosDirExist(ap20), 1);
|
||||||
EXPECT_NE(taosDirExist(ap21), 0);
|
EXPECT_NE(taosDirExist(ap21), 1);
|
||||||
EXPECT_NE(taosDirExist(ap22), 0);
|
EXPECT_NE(taosDirExist(ap22), 1);
|
||||||
EXPECT_NE(taosDirExist(ap23), 0);
|
EXPECT_NE(taosDirExist(ap23), 1);
|
||||||
EXPECT_EQ(tfsMkdir(pTfs, p1), 0);
|
EXPECT_EQ(tfsMkdir(pTfs, p1), 0);
|
||||||
EXPECT_EQ(taosDirExist(ap00), 0);
|
EXPECT_EQ(taosDirExist(ap00), 1);
|
||||||
EXPECT_EQ(taosDirExist(ap01), 0);
|
EXPECT_EQ(taosDirExist(ap01), 1);
|
||||||
EXPECT_EQ(taosDirExist(ap10), 0);
|
EXPECT_EQ(taosDirExist(ap10), 1);
|
||||||
EXPECT_EQ(taosDirExist(ap11), 0);
|
EXPECT_EQ(taosDirExist(ap11), 1);
|
||||||
EXPECT_EQ(taosDirExist(ap12), 0);
|
EXPECT_EQ(taosDirExist(ap12), 1);
|
||||||
EXPECT_EQ(taosDirExist(ap20), 0);
|
EXPECT_EQ(taosDirExist(ap20), 1);
|
||||||
EXPECT_EQ(taosDirExist(ap21), 0);
|
EXPECT_EQ(taosDirExist(ap21), 1);
|
||||||
EXPECT_EQ(taosDirExist(ap22), 0);
|
EXPECT_EQ(taosDirExist(ap22), 1);
|
||||||
EXPECT_EQ(taosDirExist(ap23), 0);
|
EXPECT_EQ(taosDirExist(ap23), 1);
|
||||||
EXPECT_EQ(tfsRmdir(pTfs, p1), 0);
|
EXPECT_EQ(tfsRmdir(pTfs, p1), 0);
|
||||||
EXPECT_NE(taosDirExist(ap00), 0);
|
EXPECT_NE(taosDirExist(ap00), 1);
|
||||||
EXPECT_NE(taosDirExist(ap01), 0);
|
EXPECT_NE(taosDirExist(ap01), 1);
|
||||||
EXPECT_NE(taosDirExist(ap10), 0);
|
EXPECT_NE(taosDirExist(ap10), 1);
|
||||||
EXPECT_NE(taosDirExist(ap11), 0);
|
EXPECT_NE(taosDirExist(ap11), 1);
|
||||||
EXPECT_NE(taosDirExist(ap12), 0);
|
EXPECT_NE(taosDirExist(ap12), 1);
|
||||||
EXPECT_NE(taosDirExist(ap20), 0);
|
EXPECT_NE(taosDirExist(ap20), 1);
|
||||||
EXPECT_NE(taosDirExist(ap21), 0);
|
EXPECT_NE(taosDirExist(ap21), 1);
|
||||||
EXPECT_NE(taosDirExist(ap22), 0);
|
EXPECT_NE(taosDirExist(ap22), 1);
|
||||||
EXPECT_NE(taosDirExist(ap23), 0);
|
EXPECT_NE(taosDirExist(ap23), 1);
|
||||||
|
|
||||||
char p2[] = "p2";
|
char p2[] = "p2";
|
||||||
char _ap21[128] = {0};
|
char _ap21[128] = {0};
|
||||||
|
@ -565,22 +565,22 @@ TEST_F(TfsTest, 05_MultiDisk) {
|
||||||
SDiskID did = {0};
|
SDiskID did = {0};
|
||||||
did.level = 2;
|
did.level = 2;
|
||||||
did.id = 1;
|
did.id = 1;
|
||||||
EXPECT_NE(taosDirExist(_ap21), 0);
|
EXPECT_NE(taosDirExist(_ap21), 1);
|
||||||
EXPECT_EQ(tfsMkdirAt(pTfs, p2, did), 0);
|
EXPECT_EQ(tfsMkdirAt(pTfs, p2, did), 0);
|
||||||
EXPECT_EQ(taosDirExist(_ap21), 0);
|
EXPECT_EQ(taosDirExist(_ap21), 1);
|
||||||
|
|
||||||
char p3[] = "p3/p2/p1/p0";
|
char p3[] = "p3/p2/p1/p0";
|
||||||
char _ap12[128] = {0};
|
char _ap12[128] = {0};
|
||||||
snprintf(_ap12, 128, "%s%s%s", root12, TD_DIRSEP, p3);
|
snprintf(_ap12, 128, "%s%s%s", root12, TD_DIRSEP, p3);
|
||||||
did.level = 1;
|
did.level = 1;
|
||||||
did.id = 2;
|
did.id = 2;
|
||||||
EXPECT_NE(taosDirExist(_ap12), 0);
|
EXPECT_NE(taosDirExist(_ap12), 1);
|
||||||
EXPECT_NE(tfsMkdir(pTfs, p3), 0);
|
EXPECT_NE(tfsMkdir(pTfs, p3), 0);
|
||||||
EXPECT_NE(tfsMkdirAt(pTfs, p3, did), 0);
|
EXPECT_NE(tfsMkdirAt(pTfs, p3, did), 0);
|
||||||
EXPECT_EQ(tfsMkdirRecurAt(pTfs, p3, did), 0);
|
EXPECT_EQ(tfsMkdirRecurAt(pTfs, p3, did), 0);
|
||||||
EXPECT_EQ(taosDirExist(_ap12), 0);
|
EXPECT_EQ(taosDirExist(_ap12), 1);
|
||||||
EXPECT_EQ(tfsRmdir(pTfs, p3), 0);
|
EXPECT_EQ(tfsRmdir(pTfs, p3), 0);
|
||||||
EXPECT_NE(taosDirExist(_ap12), 0);
|
EXPECT_NE(taosDirExist(_ap12), 1);
|
||||||
|
|
||||||
char p45[] = "p5";
|
char p45[] = "p5";
|
||||||
char p44[] = "p4";
|
char p44[] = "p4";
|
||||||
|
@ -590,12 +590,12 @@ TEST_F(TfsTest, 05_MultiDisk) {
|
||||||
did.level = 2;
|
did.level = 2;
|
||||||
did.id = 2;
|
did.id = 2;
|
||||||
|
|
||||||
EXPECT_NE(taosDirExist(_ap22), 0);
|
EXPECT_NE(taosDirExist(_ap22), 1);
|
||||||
EXPECT_EQ(tfsMkdirRecurAt(pTfs, p4, did), 0);
|
EXPECT_EQ(tfsMkdirRecurAt(pTfs, p4, did), 0);
|
||||||
EXPECT_EQ(taosDirExist(_ap22), 0);
|
EXPECT_EQ(taosDirExist(_ap22), 1);
|
||||||
EXPECT_EQ(tfsRename(pTfs, p44, p45), 0);
|
EXPECT_EQ(tfsRename(pTfs, p44, p45), 0);
|
||||||
EXPECT_EQ(tfsRmdir(pTfs, p4), 0);
|
EXPECT_EQ(tfsRmdir(pTfs, p4), 0);
|
||||||
EXPECT_NE(taosDirExist(_ap22), 0);
|
EXPECT_NE(taosDirExist(_ap22), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------- File -----------------//
|
//------------- File -----------------//
|
||||||
|
@ -660,7 +660,7 @@ TEST_F(TfsTest, 05_MultiDisk) {
|
||||||
|
|
||||||
char af2[128] = {0};
|
char af2[128] = {0};
|
||||||
snprintf(af2, 128, "%s%s%s", root23, TD_DIRSEP, n2);
|
snprintf(af2, 128, "%s%s%s", root23, TD_DIRSEP, n2);
|
||||||
EXPECT_EQ(taosDirExist(af2), 0);
|
EXPECT_EQ(taosDirExist(af2), 1);
|
||||||
tfsRemoveFile(&f2);
|
tfsRemoveFile(&f2);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -678,7 +678,7 @@ TEST_F(TfsTest, 05_MultiDisk) {
|
||||||
tfsClosedir(pDir);
|
tfsClosedir(pDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPECT_NE(taosDirExist(af2), 0);
|
EXPECT_NE(taosDirExist(af2), 1);
|
||||||
EXPECT_GT(tfsCopyFile(&f1, &f2), 0);
|
EXPECT_GT(tfsCopyFile(&f1, &f2), 0);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
@ -286,15 +286,17 @@ void uvOnWriteCb(uv_write_t* req, int status) {
|
||||||
transClearBuffer(&conn->readBuf);
|
transClearBuffer(&conn->readBuf);
|
||||||
if (status == 0) {
|
if (status == 0) {
|
||||||
tTrace("server conn %p data already was written on stream", conn);
|
tTrace("server conn %p data already was written on stream", conn);
|
||||||
assert(taosArrayGetSize(conn->srvMsgs) >= 1);
|
if (conn->srvMsgs != NULL) {
|
||||||
SSrvMsg* msg = taosArrayGetP(conn->srvMsgs, 0);
|
assert(taosArrayGetSize(conn->srvMsgs) >= 1);
|
||||||
taosArrayRemove(conn->srvMsgs, 0);
|
SSrvMsg* msg = taosArrayGetP(conn->srvMsgs, 0);
|
||||||
destroySmsg(msg);
|
taosArrayRemove(conn->srvMsgs, 0);
|
||||||
|
destroySmsg(msg);
|
||||||
|
|
||||||
// send second data, just use for push
|
// send second data, just use for push
|
||||||
if (taosArrayGetSize(conn->srvMsgs) > 0) {
|
if (taosArrayGetSize(conn->srvMsgs) > 0) {
|
||||||
msg = (SSrvMsg*)taosArrayGetP(conn->srvMsgs, 0);
|
msg = (SSrvMsg*)taosArrayGetP(conn->srvMsgs, 0);
|
||||||
uvStartSendRespInternal(msg);
|
uvStartSendRespInternal(msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tError("server conn %p failed to write data, %s", conn, uv_err_name(status));
|
tError("server conn %p failed to write data, %s", conn, uv_err_name(status));
|
||||||
|
@ -615,7 +617,7 @@ static void destroyConn(SSrvConn* conn, bool clear) {
|
||||||
SSrvMsg* msg = taosArrayGetP(conn->srvMsgs, i);
|
SSrvMsg* msg = taosArrayGetP(conn->srvMsgs, i);
|
||||||
destroySmsg(msg);
|
destroySmsg(msg);
|
||||||
}
|
}
|
||||||
taosArrayDestroy(conn->srvMsgs);
|
conn->srvMsgs = taosArrayDestroy(conn->srvMsgs);
|
||||||
QUEUE_REMOVE(&conn->queue);
|
QUEUE_REMOVE(&conn->queue);
|
||||||
|
|
||||||
if (clear) {
|
if (clear) {
|
||||||
|
|
|
@ -64,10 +64,10 @@ static inline int64_t walScanLogGetLastVer(SWal* pWal) {
|
||||||
char fnameStr[WAL_FILE_LEN];
|
char fnameStr[WAL_FILE_LEN];
|
||||||
walBuildLogName(pWal, pLastFileInfo->firstVer, fnameStr);
|
walBuildLogName(pWal, pLastFileInfo->firstVer, fnameStr);
|
||||||
|
|
||||||
struct stat statbuf;
|
int64_t file_size = 0;
|
||||||
stat(fnameStr, &statbuf);
|
taosStatFile(fnameStr, &file_size, NULL);
|
||||||
int readSize = TMIN(WAL_MAX_SIZE + 2, statbuf.st_size);
|
int readSize = TMIN(WAL_MAX_SIZE + 2, file_size);
|
||||||
pLastFileInfo->fileSize = statbuf.st_size;
|
pLastFileInfo->fileSize = file_size;
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile(fnameStr, TD_FILE_READ);
|
TdFilePtr pFile = taosOpenFile(fnameStr, TD_FILE_READ);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
|
@ -177,11 +177,11 @@ int walCheckAndRepairMeta(SWal* pWal) {
|
||||||
SWalFileInfo *pLastFileInfo = taosArrayGet(pWal->fileInfoSet, newSz-1);
|
SWalFileInfo *pLastFileInfo = taosArrayGet(pWal->fileInfoSet, newSz-1);
|
||||||
char fnameStr[WAL_FILE_LEN];
|
char fnameStr[WAL_FILE_LEN];
|
||||||
walBuildLogName(pWal, pLastFileInfo->firstVer, fnameStr);
|
walBuildLogName(pWal, pLastFileInfo->firstVer, fnameStr);
|
||||||
struct stat statbuf;
|
int64_t file_size = 0;
|
||||||
stat(fnameStr, &statbuf);
|
taosStatFile(fnameStr, &file_size, NULL);
|
||||||
|
|
||||||
if (oldSz != newSz || pLastFileInfo->fileSize != statbuf.st_size) {
|
if (oldSz != newSz || pLastFileInfo->fileSize != file_size) {
|
||||||
pLastFileInfo->fileSize = statbuf.st_size;
|
pLastFileInfo->fileSize = file_size;
|
||||||
pWal->vers.lastVer = walScanLogGetLastVer(pWal);
|
pWal->vers.lastVer = walScanLogGetLastVer(pWal);
|
||||||
((SWalFileInfo*)taosArrayGetLast(pWal->fileInfoSet))->lastVer = pWal->vers.lastVer;
|
((SWalFileInfo*)taosArrayGetLast(pWal->fileInfoSet))->lastVer = pWal->vers.lastVer;
|
||||||
ASSERT(pWal->vers.lastVer != -1);
|
ASSERT(pWal->vers.lastVer != -1);
|
||||||
|
@ -395,9 +395,9 @@ int walLoadMeta(SWal* pWal) {
|
||||||
char fnameStr[WAL_FILE_LEN];
|
char fnameStr[WAL_FILE_LEN];
|
||||||
walBuildMetaName(pWal, metaVer, fnameStr);
|
walBuildMetaName(pWal, metaVer, fnameStr);
|
||||||
// read metafile
|
// read metafile
|
||||||
struct stat statbuf;
|
int64_t file_size = 0;
|
||||||
stat(fnameStr, &statbuf);
|
taosStatFile(fnameStr, &file_size, NULL);
|
||||||
int size = statbuf.st_size;
|
int size = (int)file_size;
|
||||||
char* buf = malloc(size + 5);
|
char* buf = malloc(size + 5);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
terrno = TSDB_CODE_WAL_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_WAL_OUT_OF_MEMORY;
|
||||||
|
|
|
@ -60,7 +60,7 @@ void taosRemoveDir(const char *dirname) {
|
||||||
//printf("dir:%s is removed\n", dirname);
|
//printf("dir:%s is removed\n", dirname);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosDirExist(char *dirname) { return access(dirname, F_OK); }
|
bool taosDirExist(char *dirname) { return taosCheckExistFile(dirname); }
|
||||||
|
|
||||||
int32_t taosMkDir(const char *dirname) {
|
int32_t taosMkDir(const char *dirname) {
|
||||||
int32_t code = mkdir(dirname, 0755);
|
int32_t code = mkdir(dirname, 0755);
|
||||||
|
|
|
@ -31,11 +31,11 @@ char tsLocale[TD_LOCALE_LEN] = {0};
|
||||||
char tsCharset[TD_CHARSET_LEN] = {0};
|
char tsCharset[TD_CHARSET_LEN] = {0};
|
||||||
int8_t tsDaylight = 0;
|
int8_t tsDaylight = 0;
|
||||||
bool tsEnableCoreFile = 0;
|
bool tsEnableCoreFile = 0;
|
||||||
int64_t tsPageSize = 0;
|
int64_t tsPageSizeKB = 0;
|
||||||
int64_t tsOpenMax = 0;
|
int64_t tsOpenMax = 0;
|
||||||
int64_t tsStreamMax = 0;
|
int64_t tsStreamMax = 0;
|
||||||
int32_t tsNumOfCores = 0;
|
float tsNumOfCores = 0;
|
||||||
int32_t tsTotalMemoryMB = 0;
|
int64_t tsTotalMemoryKB = 0;
|
||||||
|
|
||||||
void osInit() {
|
void osInit() {
|
||||||
srand(taosSafeRand());
|
srand(taosSafeRand());
|
||||||
|
@ -44,6 +44,11 @@ void osInit() {
|
||||||
taosSetSystemTimezone(tsTimezone, tsTimezone, &tsDaylight);
|
taosSetSystemTimezone(tsTimezone, tsTimezone, &tsDaylight);
|
||||||
taosGetSystemInfo();
|
taosGetSystemInfo();
|
||||||
|
|
||||||
|
// deadlock in query
|
||||||
|
if (tsNumOfCores < 2) {
|
||||||
|
tsNumOfCores = 2;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
||||||
taosWinSocketInit();
|
taosWinSocketInit();
|
||||||
|
|
||||||
|
|
|
@ -186,6 +186,27 @@ int32_t taosStatFile(const char *path, int64_t *size, int32_t *mtime) {
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
int32_t taosDevInoFile(const char *path, int64_t *stDev, int64_t *stIno) {
|
||||||
|
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
struct stat fileStat;
|
||||||
|
int32_t code = stat(path, &fileStat);
|
||||||
|
if (code < 0) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stDev != NULL) {
|
||||||
|
*stDev = fileStat.st_dev;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stIno != NULL) {
|
||||||
|
*stIno = fileStat.st_ino;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void autoDelFileListAdd(const char *path) { return; }
|
void autoDelFileListAdd(const char *path) { return; }
|
||||||
|
|
||||||
|
@ -733,3 +754,21 @@ int32_t taosEOFFile(TdFilePtr pFile) {
|
||||||
|
|
||||||
return feof(pFile->fp);
|
return feof(pFile->fp);
|
||||||
}
|
}
|
||||||
|
bool taosCheckAccessFile(const char *pathname, int32_t tdFileAccessOptions) {
|
||||||
|
int flags = 0;
|
||||||
|
|
||||||
|
if (tdFileAccessOptions & TD_FILE_ACCESS_EXIST_OK) {
|
||||||
|
flags |= F_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdFileAccessOptions & TD_FILE_ACCESS_READ_OK) {
|
||||||
|
flags |= R_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdFileAccessOptions & TD_FILE_ACCESS_WRITE_OK) {
|
||||||
|
flags |= W_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return access(pathname, flags) == 0;
|
||||||
|
}
|
||||||
|
bool taosCheckExistFile(const char *pathname) { return taosCheckAccessFile(pathname, TD_FILE_ACCESS_EXIST_OK); };
|
|
@ -39,32 +39,32 @@
|
||||||
#include <DbgHelp.h>
|
#include <DbgHelp.h>
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
|
||||||
static int32_t taosGetTotalMemory() {
|
int32_t taosGetTotalMemory(int64_t *totalKB) {
|
||||||
MEMORYSTATUSEX memsStat;
|
MEMORYSTATUSEX memsStat;
|
||||||
memsStat.dwLength = sizeof(memsStat);
|
memsStat.dwLength = sizeof(memsStat);
|
||||||
if (!GlobalMemoryStatusEx(&memsStat)) {
|
if (!GlobalMemoryStatusEx(&memsStat)) {
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
float nMemTotal = memsStat.ullTotalPhys / (1024.0f * 1024.0f);
|
*totalKB = memsStat.ullTotalPhys / 1024;
|
||||||
return (int32_t)nMemTotal;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetSysMemory(float *memoryUsedMB) {
|
int32_t taosGetSysMemory(int64_t *usedKB) {
|
||||||
MEMORYSTATUSEX memsStat;
|
MEMORYSTATUSEX memsStat;
|
||||||
memsStat.dwLength = sizeof(memsStat);
|
memsStat.dwLength = sizeof(memsStat);
|
||||||
if (!GlobalMemoryStatusEx(&memsStat)) {
|
if (!GlobalMemoryStatusEx(&memsStat)) {
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
float nMemFree = memsStat.ullAvailPhys / (1024.0f * 1024.0f);
|
int64_t nMemFree = memsStat.ullAvailPhys / 1024;
|
||||||
float nMemTotal = memsStat.ullTotalPhys / (1024.0f * 1024.0f);
|
int64_t nMemTotal = memsStat.ullTotalPhys / 1024.0;
|
||||||
|
|
||||||
*memoryUsedMB = nMemTotal - nMemFree;
|
*usedKB = nMemTotal - nMemFree;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetProcMemory(float *memoryUsedMB) {
|
int32_t taosGetProcMemory(int64_t *usedKB) {
|
||||||
unsigned bytes_used = 0;
|
unsigned bytes_used = 0;
|
||||||
|
|
||||||
#if defined(_WIN64) && defined(_MSC_VER)
|
#if defined(_WIN64) && defined(_MSC_VER)
|
||||||
|
@ -76,21 +76,21 @@ bool taosGetProcMemory(float *memoryUsedMB) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*memoryUsedMB = (float)bytes_used / 1024 / 1024;
|
*usedKB = bytes_used / 1024;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t taosGetCpuCores(float *numOfCores) {
|
||||||
int32_t taosGetCpuCores() {
|
|
||||||
SYSTEM_INFO info;
|
SYSTEM_INFO info;
|
||||||
GetSystemInfo(&info);
|
GetSystemInfo(&info);
|
||||||
return (int32_t)info.dwNumberOfProcessors;
|
*numOfCores = info.dwNumberOfProcessors;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) {
|
int32_t taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) {
|
||||||
*sysCpuUsage = 0;
|
*sysCpuUsage = 0;
|
||||||
*procCpuUsage = 0;
|
*procCpuUsage = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) {
|
int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) {
|
||||||
|
@ -106,49 +106,49 @@ int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) {
|
||||||
diskSize->used = (int64_t)(i64TotalBytes - i64FreeBytes);
|
diskSize->used = (int64_t)(i64TotalBytes - i64FreeBytes);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
//printf("failed to get disk size, dataDir:%s errno:%s", tsDataDir, strerror(errno));
|
// printf("failed to get disk size, dataDir:%s errno:%s", tsDataDir, strerror(errno));
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) {
|
int32_t taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) {
|
||||||
if (bytes) *bytes = 0;
|
if (bytes) *bytes = 0;
|
||||||
if (rbytes) *rbytes = 0;
|
if (rbytes) *rbytes = 0;
|
||||||
if (tbytes) *tbytes = 0;
|
if (tbytes) *tbytes = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetBandSpeed(float *bandSpeedKb) {
|
int32_t taosGetBandSpeed(float *bandSpeedKb) {
|
||||||
*bandSpeedKb = 0;
|
*bandSpeedKb = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosReadProcIO(int64_t *readbyte, int64_t *writebyte) {
|
int32_t taosReadProcIO(int64_t *readbyte, int64_t *writebyte) {
|
||||||
IO_COUNTERS io_counter;
|
IO_COUNTERS io_counter;
|
||||||
if (GetProcessIoCounters(GetCurrentProcess(), &io_counter)) {
|
if (GetProcessIoCounters(GetCurrentProcess(), &io_counter)) {
|
||||||
if (readbyte) *readbyte = io_counter.ReadTransferCount;
|
if (readbyte) *readbyte = io_counter.ReadTransferCount;
|
||||||
if (writebyte) *writebyte = io_counter.WriteTransferCount;
|
if (writebyte) *writebyte = io_counter.WriteTransferCount;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetProcIO(float *readKB, float *writeKB) {
|
int32_t taosGetProcIO(float *readKB, float *writeKB) {
|
||||||
static int64_t lastReadbyte = -1;
|
static int64_t lastReadbyte = -1;
|
||||||
static int64_t lastWritebyte = -1;
|
static int64_t lastWritebyte = -1;
|
||||||
|
|
||||||
int64_t curReadbyte = 0;
|
int64_t curReadbyte = 0;
|
||||||
int64_t curWritebyte = 0;
|
int64_t curWritebyte = 0;
|
||||||
|
|
||||||
if (!taosReadProcIO(&curReadbyte, &curWritebyte)) {
|
if (taosReadProcIO(&curReadbyte, &curWritebyte) != 0) {
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastReadbyte == -1 || lastWritebyte == -1) {
|
if (lastReadbyte == -1 || lastWritebyte == -1) {
|
||||||
lastReadbyte = curReadbyte;
|
lastReadbyte = curReadbyte;
|
||||||
lastWritebyte = curWritebyte;
|
lastWritebyte = curWritebyte;
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*readKB = (float)((double)(curReadbyte - lastReadbyte) / 1024);
|
*readKB = (float)((double)(curReadbyte - lastReadbyte) / 1024);
|
||||||
|
@ -159,12 +159,12 @@ bool taosGetProcIO(float *readKB, float *writeKB) {
|
||||||
lastReadbyte = curReadbyte;
|
lastReadbyte = curReadbyte;
|
||||||
lastWritebyte = curWritebyte;
|
lastWritebyte = curWritebyte;
|
||||||
|
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosGetSystemInfo() {
|
void taosGetSystemInfo() {
|
||||||
tsNumOfCores = taosGetCpuCores();
|
taosGetCpuCores(&tsNumOfCores);
|
||||||
tsTotalMemoryMB = taosGetTotalMemory();
|
taosGetTotalMemory(&tsTotalMemoryKB);
|
||||||
|
|
||||||
float tmp1, tmp2;
|
float tmp1, tmp2;
|
||||||
taosGetBandSpeed(&tmp1);
|
taosGetBandSpeed(&tmp1);
|
||||||
|
@ -173,12 +173,12 @@ void taosGetSystemInfo() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosKillSystem() {
|
void taosKillSystem() {
|
||||||
//printf("function taosKillSystem, exit!");
|
// printf("function taosKillSystem, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int taosSystem(const char *cmd) {
|
int taosSystem(const char *cmd) {
|
||||||
//printf("taosSystem not support");
|
// printf("taosSystem not support");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,66 +241,66 @@ char *taosGetCmdlineByPID(int pid) { return ""; }
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <libproc.h>
|
#include <libproc.h>
|
||||||
|
|
||||||
|
|
||||||
void taosKillSystem() {
|
void taosKillSystem() {
|
||||||
//printf("function taosKillSystem, exit!");
|
// printf("function taosKillSystem, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosGetCpuCores() { return sysconf(_SC_NPROCESSORS_ONLN); }
|
int32_t taosGetCpuCores(float *numOfCores) {
|
||||||
|
*numOfCores = sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void taosGetSystemInfo() {
|
void taosGetSystemInfo() {
|
||||||
// taosGetProcInfos();
|
|
||||||
|
|
||||||
tsNumOfCores = sysconf(_SC_NPROCESSORS_ONLN);
|
|
||||||
long physical_pages = sysconf(_SC_PHYS_PAGES);
|
long physical_pages = sysconf(_SC_PHYS_PAGES);
|
||||||
long page_size = sysconf(_SC_PAGESIZE);
|
long page_size = sysconf(_SC_PAGESIZE);
|
||||||
tsTotalMemoryMB = physical_pages * page_size / (1024 * 1024);
|
tsTotalMemoryKB = physical_pages * page_size / 1024;
|
||||||
tsPageSize = page_size;
|
tsPageSizeKB = page_size / 1024;
|
||||||
|
tsNumOfCores = sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosReadProcIO(int64_t *rchars, int64_t *wchars) {
|
int32_t taosReadProcIO(int64_t *rchars, int64_t *wchars) {
|
||||||
if (rchars) *rchars = 0;
|
if (rchars) *rchars = 0;
|
||||||
if (wchars) *wchars = 0;
|
if (wchars) *wchars = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetProcIO(float *readKB, float *writeKB) {
|
int32_t taosGetProcIO(float *readKB, float *writeKB) {
|
||||||
*readKB = 0;
|
*readKB = 0;
|
||||||
*writeKB = 0;
|
*writeKB = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) {
|
int32_t taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) {
|
||||||
if (bytes) *bytes = 0;
|
if (bytes) *bytes = 0;
|
||||||
if (rbytes) *rbytes = 0;
|
if (rbytes) *rbytes = 0;
|
||||||
if (tbytes) *tbytes = 0;
|
if (tbytes) *tbytes = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetBandSpeed(float *bandSpeedKb) {
|
int32_t taosGetBandSpeed(float *bandSpeedKb) {
|
||||||
*bandSpeedKb = 0;
|
*bandSpeedKb = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) {
|
int32_t taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) {
|
||||||
*sysCpuUsage = 0;
|
*sysCpuUsage = 0;
|
||||||
*procCpuUsage = 0;
|
*procCpuUsage = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetProcMemory(float *memoryUsedMB) {
|
int32_t taosGetProcMemory(int64_t *usedKB) {
|
||||||
*memoryUsedMB = 0;
|
*usedKB = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetSysMemory(float *memoryUsedMB) {
|
int32_t taosGetSysMemory(int64_t *usedKB) {
|
||||||
*memoryUsedMB = 0;
|
*usedKB = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int taosSystem(const char *cmd) {
|
int taosSystem(const char *cmd) {
|
||||||
//printf("un support funtion");
|
// printf("un support funtion");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,7 +309,7 @@ void taosSetCoreDump() {}
|
||||||
int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) {
|
int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) {
|
||||||
struct statvfs info;
|
struct statvfs info;
|
||||||
if (statvfs(dataDir, &info)) {
|
if (statvfs(dataDir, &info)) {
|
||||||
//printf("failed to get disk size, dataDir:%s errno:%s", tsDataDir, strerror(errno));
|
// printf("failed to get disk size, dataDir:%s errno:%s", tsDataDir, strerror(errno));
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -377,39 +377,38 @@ static char tsSysCpuFile[] = "/proc/stat";
|
||||||
static char tsProcCpuFile[25] = {0};
|
static char tsProcCpuFile[25] = {0};
|
||||||
static char tsProcMemFile[25] = {0};
|
static char tsProcMemFile[25] = {0};
|
||||||
static char tsProcIOFile[25] = {0};
|
static char tsProcIOFile[25] = {0};
|
||||||
static float tsPageSizeKB = 0;
|
|
||||||
|
|
||||||
static void taosGetProcInfos() {
|
static void taosGetProcInfos() {
|
||||||
tsPageSize = sysconf(_SC_PAGESIZE);
|
tsPageSizeKB = sysconf(_SC_PAGESIZE) / 1024;
|
||||||
tsOpenMax = sysconf(_SC_OPEN_MAX);
|
tsOpenMax = sysconf(_SC_OPEN_MAX);
|
||||||
tsStreamMax = sysconf(_SC_STREAM_MAX);
|
tsStreamMax = sysconf(_SC_STREAM_MAX);
|
||||||
|
|
||||||
tsProcId = (pid_t)syscall(SYS_gettid);
|
tsProcId = (pid_t)syscall(SYS_gettid);
|
||||||
tsPageSizeKB = (float)(sysconf(_SC_PAGESIZE)) / 1024;
|
|
||||||
|
|
||||||
snprintf(tsProcMemFile, 25, "/proc/%d/status", tsProcId);
|
snprintf(tsProcMemFile, sizeof(tsProcMemFile), "/proc/%d/status", tsProcId);
|
||||||
snprintf(tsProcCpuFile, 25, "/proc/%d/stat", tsProcId);
|
snprintf(tsProcCpuFile, sizeof(tsProcCpuFile), "/proc/%d/stat", tsProcId);
|
||||||
snprintf(tsProcIOFile, 25, "/proc/%d/io", tsProcId);
|
snprintf(tsProcIOFile, sizeof(tsProcIOFile), "/proc/%d/io", tsProcId);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t taosGetTotalMemory() { return (int32_t)((float)sysconf(_SC_PHYS_PAGES) * tsPageSizeKB / 1024); }
|
int32_t taosGetTotalMemory(int64_t *totalKB) {
|
||||||
|
*totalKB = (int64_t)(sysconf(_SC_PHYS_PAGES) * tsPageSizeKB);
|
||||||
bool taosGetSysMemory(float *memoryUsedMB) {
|
return 0;
|
||||||
float memoryAvailMB = (float)sysconf(_SC_AVPHYS_PAGES) * tsPageSizeKB / 1024;
|
|
||||||
*memoryUsedMB = (float)tsTotalMemoryMB - memoryAvailMB;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetProcMemory(float *memoryUsedMB) {
|
int32_t taosGetSysMemory(int64_t *usedKB) {
|
||||||
|
*usedKB = sysconf(_SC_AVPHYS_PAGES) * tsPageSizeKB;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t taosGetProcMemory(int64_t *usedKB) {
|
||||||
// FILE *fp = fopen(tsProcMemFile, "r");
|
// FILE *fp = fopen(tsProcMemFile, "r");
|
||||||
TdFilePtr pFile = taosOpenFile(tsProcMemFile, TD_FILE_READ | TD_FILE_STREAM);
|
TdFilePtr pFile = taosOpenFile(tsProcMemFile, TD_FILE_READ | TD_FILE_STREAM);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
//printf("open file:%s failed", tsProcMemFile);
|
// printf("open file:%s failed", tsProcMemFile);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t _bytes = 0;
|
ssize_t _bytes = 0;
|
||||||
char * line = NULL;
|
char *line = NULL;
|
||||||
while (!taosEOFFile(pFile)) {
|
while (!taosEOFFile(pFile)) {
|
||||||
_bytes = taosGetLineFile(pFile, &line);
|
_bytes = taosGetLineFile(pFile, &line);
|
||||||
if ((_bytes < 0) || (line == NULL)) {
|
if ((_bytes < 0) || (line == NULL)) {
|
||||||
|
@ -421,60 +420,58 @@ bool taosGetProcMemory(float *memoryUsedMB) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line == NULL) {
|
if (line == NULL) {
|
||||||
//printf("read file:%s failed", tsProcMemFile);
|
// printf("read file:%s failed", tsProcMemFile);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t memKB = 0;
|
char tmp[10];
|
||||||
char tmp[10];
|
sscanf(line, "%s %" PRId64, tmp, usedKB);
|
||||||
sscanf(line, "%s %" PRId64, tmp, &memKB);
|
|
||||||
*memoryUsedMB = (float)((double)memKB / 1024);
|
|
||||||
|
|
||||||
if(line != NULL) tfree(line);
|
if (line != NULL) tfree(line);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool taosGetSysCpuInfo(SysCpuInfo *cpuInfo) {
|
static int32_t taosGetSysCpuInfo(SysCpuInfo *cpuInfo) {
|
||||||
// FILE *fp = fopen(tsSysCpuFile, "r");
|
// FILE *fp = fopen(tsSysCpuFile, "r");
|
||||||
TdFilePtr pFile = taosOpenFile(tsSysCpuFile, TD_FILE_READ | TD_FILE_STREAM);
|
TdFilePtr pFile = taosOpenFile(tsSysCpuFile, TD_FILE_READ | TD_FILE_STREAM);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
//printf("open file:%s failed", tsSysCpuFile);
|
// printf("open file:%s failed", tsSysCpuFile);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char * line = NULL;
|
char *line = NULL;
|
||||||
ssize_t _bytes = taosGetLineFile(pFile, &line);
|
ssize_t _bytes = taosGetLineFile(pFile, &line);
|
||||||
if ((_bytes < 0) || (line == NULL)) {
|
if ((_bytes < 0) || (line == NULL)) {
|
||||||
//printf("read file:%s failed", tsSysCpuFile);
|
// printf("read file:%s failed", tsSysCpuFile);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char cpu[10] = {0};
|
char cpu[10] = {0};
|
||||||
sscanf(line, "%s %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, cpu, &cpuInfo->user, &cpuInfo->nice, &cpuInfo->system,
|
sscanf(line, "%s %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, cpu, &cpuInfo->user, &cpuInfo->nice, &cpuInfo->system,
|
||||||
&cpuInfo->idle);
|
&cpuInfo->idle);
|
||||||
|
|
||||||
if(line != NULL) tfree(line);
|
if (line != NULL) tfree(line);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) {
|
static int32_t taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) {
|
||||||
// FILE *fp = fopen(tsProcCpuFile, "r");
|
// FILE *fp = fopen(tsProcCpuFile, "r");
|
||||||
TdFilePtr pFile = taosOpenFile(tsProcCpuFile, TD_FILE_READ | TD_FILE_STREAM);
|
TdFilePtr pFile = taosOpenFile(tsProcCpuFile, TD_FILE_READ | TD_FILE_STREAM);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
//printf("open file:%s failed", tsProcCpuFile);
|
// printf("open file:%s failed", tsProcCpuFile);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char * line = NULL;
|
char *line = NULL;
|
||||||
ssize_t _bytes = taosGetLineFile(pFile, &line);
|
ssize_t _bytes = taosGetLineFile(pFile, &line);
|
||||||
if ((_bytes < 0) || (line == NULL)) {
|
if ((_bytes < 0) || (line == NULL)) {
|
||||||
//printf("read file:%s failed", tsProcCpuFile);
|
// printf("read file:%s failed", tsProcCpuFile);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0, blank = 0; line[i] != 0; ++i) {
|
for (int i = 0, blank = 0; line[i] != 0; ++i) {
|
||||||
|
@ -486,26 +483,28 @@ static bool taosGetProcCpuInfo(ProcCpuInfo *cpuInfo) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(line != NULL) tfree(line);
|
if (line != NULL) tfree(line);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t taosGetCpuCores(float *numOfCores) {
|
||||||
|
*numOfCores = sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t taosGetCpuCores() { return (int32_t)sysconf(_SC_NPROCESSORS_ONLN); }
|
int32_t taosGetCpuUsage(float *cpu_system, float *cpu_engine) {
|
||||||
|
|
||||||
bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) {
|
|
||||||
static uint64_t lastSysUsed = 0;
|
static uint64_t lastSysUsed = 0;
|
||||||
static uint64_t lastSysTotal = 0;
|
static uint64_t lastSysTotal = 0;
|
||||||
static uint64_t lastProcTotal = 0;
|
static uint64_t lastProcTotal = 0;
|
||||||
|
|
||||||
SysCpuInfo sysCpu;
|
SysCpuInfo sysCpu;
|
||||||
ProcCpuInfo procCpu;
|
ProcCpuInfo procCpu;
|
||||||
if (!taosGetSysCpuInfo(&sysCpu)) {
|
if (taosGetSysCpuInfo(&sysCpu) != 0) {
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!taosGetProcCpuInfo(&procCpu)) {
|
if (taosGetProcCpuInfo(&procCpu) != 0) {
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t curSysUsed = sysCpu.user + sysCpu.nice + sysCpu.system;
|
uint64_t curSysUsed = sysCpu.user + sysCpu.nice + sysCpu.system;
|
||||||
|
@ -516,21 +515,21 @@ bool taosGetCpuUsage(float *sysCpuUsage, float *procCpuUsage) {
|
||||||
lastSysUsed = curSysUsed > 1 ? curSysUsed : 1;
|
lastSysUsed = curSysUsed > 1 ? curSysUsed : 1;
|
||||||
lastSysTotal = curSysTotal > 1 ? curSysTotal : 1;
|
lastSysTotal = curSysTotal > 1 ? curSysTotal : 1;
|
||||||
lastProcTotal = curProcTotal > 1 ? curProcTotal : 1;
|
lastProcTotal = curProcTotal > 1 ? curProcTotal : 1;
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (curSysTotal == lastSysTotal) {
|
if (curSysTotal == lastSysTotal) {
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*sysCpuUsage = (float)((double)(curSysUsed - lastSysUsed) / (double)(curSysTotal - lastSysTotal) * 100);
|
*cpu_engine = (float)((double)(curSysUsed - lastSysUsed) / (double)(curSysTotal - lastSysTotal) * 100);
|
||||||
*procCpuUsage = (float)((double)(curProcTotal - lastProcTotal) / (double)(curSysTotal - lastSysTotal) * 100);
|
*cpu_system = (float)((double)(curProcTotal - lastProcTotal) / (double)(curSysTotal - lastSysTotal) * 100);
|
||||||
|
|
||||||
lastSysUsed = curSysUsed;
|
lastSysUsed = curSysUsed;
|
||||||
lastSysTotal = curSysTotal;
|
lastSysTotal = curSysTotal;
|
||||||
lastProcTotal = curProcTotal;
|
lastProcTotal = curProcTotal;
|
||||||
|
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) {
|
int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) {
|
||||||
|
@ -545,17 +544,17 @@ int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) {
|
int32_t taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) {
|
||||||
*bytes = 0;
|
if (bytes) *bytes = 0;
|
||||||
// FILE *fp = fopen(tsSysNetFile, "r");
|
// FILE *fp = fopen(tsSysNetFile, "r");
|
||||||
TdFilePtr pFile = taosOpenFile(tsSysNetFile, TD_FILE_READ | TD_FILE_STREAM);
|
TdFilePtr pFile = taosOpenFile(tsSysNetFile, TD_FILE_READ | TD_FILE_STREAM);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
//printf("open file:%s failed", tsSysNetFile);
|
// printf("open file:%s failed", tsSysNetFile);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t _bytes = 0;
|
ssize_t _bytes = 0;
|
||||||
char * line = NULL;
|
char *line = NULL;
|
||||||
|
|
||||||
while (!taosEOFFile(pFile)) {
|
while (!taosEOFFile(pFile)) {
|
||||||
int64_t o_rbytes = 0;
|
int64_t o_rbytes = 0;
|
||||||
|
@ -587,37 +586,37 @@ bool taosGetCardInfo(int64_t *bytes, int64_t *rbytes, int64_t *tbytes) {
|
||||||
nouse0, &o_rbytes, &rpackts, &nouse1, &nouse2, &nouse3, &nouse4, &nouse5, &nouse6, &o_tbytes, &tpackets);
|
nouse0, &o_rbytes, &rpackts, &nouse1, &nouse2, &nouse3, &nouse4, &nouse5, &nouse6, &o_tbytes, &tpackets);
|
||||||
if (rbytes) *rbytes = o_rbytes;
|
if (rbytes) *rbytes = o_rbytes;
|
||||||
if (tbytes) *tbytes = o_tbytes;
|
if (tbytes) *tbytes = o_tbytes;
|
||||||
*bytes += (o_rbytes + o_tbytes);
|
if (bytes) *bytes += (o_rbytes + o_tbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(line != NULL) tfree(line);
|
if (line != NULL) tfree(line);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
|
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetBandSpeed(float *bandSpeedKb) {
|
int32_t taosGetBandSpeed(float *bandSpeedKb) {
|
||||||
static int64_t lastBytes = 0;
|
static int64_t lastBytes = 0;
|
||||||
static time_t lastTime = 0;
|
static time_t lastTime = 0;
|
||||||
int64_t curBytes = 0;
|
int64_t curBytes = 0;
|
||||||
time_t curTime = time(NULL);
|
time_t curTime = time(NULL);
|
||||||
|
|
||||||
if (!taosGetCardInfo(&curBytes, NULL, NULL)) {
|
if (taosGetCardInfo(&curBytes, NULL, NULL) != 0) {
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastTime == 0 || lastBytes == 0) {
|
if (lastTime == 0 || lastBytes == 0) {
|
||||||
lastTime = curTime;
|
lastTime = curTime;
|
||||||
lastBytes = curBytes;
|
lastBytes = curBytes;
|
||||||
*bandSpeedKb = 0;
|
*bandSpeedKb = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastTime >= curTime || lastBytes > curBytes) {
|
if (lastTime >= curTime || lastBytes > curBytes) {
|
||||||
lastTime = curTime;
|
lastTime = curTime;
|
||||||
lastBytes = curBytes;
|
lastBytes = curBytes;
|
||||||
*bandSpeedKb = 0;
|
*bandSpeedKb = 0;
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
double totalBytes = (double)(curBytes - lastBytes) / 1024 * 8; // Kb
|
double totalBytes = (double)(curBytes - lastBytes) / 1024 * 8; // Kb
|
||||||
|
@ -629,19 +628,19 @@ bool taosGetBandSpeed(float *bandSpeedKb) {
|
||||||
lastTime = curTime;
|
lastTime = curTime;
|
||||||
lastBytes = curBytes;
|
lastBytes = curBytes;
|
||||||
|
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosReadProcIO(int64_t *rchars, int64_t *wchars) {
|
int32_t taosReadProcIO(int64_t *rchars, int64_t *wchars) {
|
||||||
// FILE *fp = fopen(tsProcIOFile, "r");
|
// FILE *fp = fopen(tsProcIOFile, "r");
|
||||||
TdFilePtr pFile = taosOpenFile(tsProcIOFile, TD_FILE_READ | TD_FILE_STREAM);
|
TdFilePtr pFile = taosOpenFile(tsProcIOFile, TD_FILE_READ | TD_FILE_STREAM);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
//printf("open file:%s failed", tsProcIOFile);
|
// printf("open file:%s failed", tsProcIOFile);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t _bytes = 0;
|
ssize_t _bytes = 0;
|
||||||
char * line = NULL;
|
char *line = NULL;
|
||||||
char tmp[10];
|
char tmp[10];
|
||||||
int readIndex = 0;
|
int readIndex = 0;
|
||||||
|
|
||||||
|
@ -662,32 +661,32 @@ bool taosReadProcIO(int64_t *rchars, int64_t *wchars) {
|
||||||
if (readIndex >= 2) break;
|
if (readIndex >= 2) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(line != NULL) tfree(line);
|
if (line != NULL) tfree(line);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
|
|
||||||
if (readIndex < 2) {
|
if (readIndex < 2) {
|
||||||
//printf("read file:%s failed", tsProcIOFile);
|
// printf("read file:%s failed", tsProcIOFile);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetProcIO(float *readKB, float *writeKB) {
|
int32_t taosGetProcIO(float *readKB, float *writeKB) {
|
||||||
static int64_t lastReadbyte = -1;
|
static int64_t lastReadbyte = -1;
|
||||||
static int64_t lastWritebyte = -1;
|
static int64_t lastWritebyte = -1;
|
||||||
|
|
||||||
int64_t curReadbyte = 0;
|
int64_t curReadbyte = 0;
|
||||||
int64_t curWritebyte = 0;
|
int64_t curWritebyte = 0;
|
||||||
|
|
||||||
if (!taosReadProcIO(&curReadbyte, &curWritebyte)) {
|
if (taosReadProcIO(&curReadbyte, &curWritebyte) != 0) {
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastReadbyte == -1 || lastWritebyte == -1) {
|
if (lastReadbyte == -1 || lastWritebyte == -1) {
|
||||||
lastReadbyte = curReadbyte;
|
lastReadbyte = curReadbyte;
|
||||||
lastWritebyte = curWritebyte;
|
lastWritebyte = curWritebyte;
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*readKB = (float)((double)(curReadbyte - lastReadbyte) / 1024);
|
*readKB = (float)((double)(curReadbyte - lastReadbyte) / 1024);
|
||||||
|
@ -698,27 +697,23 @@ bool taosGetProcIO(float *readKB, float *writeKB) {
|
||||||
lastReadbyte = curReadbyte;
|
lastReadbyte = curReadbyte;
|
||||||
lastWritebyte = curWritebyte;
|
lastWritebyte = curWritebyte;
|
||||||
|
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosGetSystemInfo() {
|
void taosGetSystemInfo() {
|
||||||
taosGetProcInfos();
|
taosGetProcInfos();
|
||||||
|
taosGetCpuCores(&tsNumOfCores);
|
||||||
tsNumOfCores = taosGetCpuCores();
|
taosGetTotalMemory(&tsTotalMemoryKB);
|
||||||
tsTotalMemoryMB = taosGetTotalMemory();
|
|
||||||
|
|
||||||
float tmp1, tmp2;
|
float tmp1, tmp2;
|
||||||
taosGetSysMemory(&tmp1);
|
|
||||||
taosGetProcMemory(&tmp2);
|
|
||||||
taosGetBandSpeed(&tmp1);
|
taosGetBandSpeed(&tmp1);
|
||||||
taosGetCpuUsage(&tmp1, &tmp2);
|
taosGetCpuUsage(&tmp1, &tmp2);
|
||||||
taosGetProcIO(&tmp1, &tmp2);
|
taosGetProcIO(&tmp1, &tmp2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosKillSystem() {
|
void taosKillSystem() {
|
||||||
// SIGINT
|
// SIGINT
|
||||||
//printf("taosd will shut down soon");
|
// printf("taosd will shut down soon");
|
||||||
kill(tsProcId, 2);
|
kill(tsProcId, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -727,22 +722,22 @@ int taosSystem(const char *cmd) {
|
||||||
int res;
|
int res;
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
if (cmd == NULL) {
|
if (cmd == NULL) {
|
||||||
//printf("taosSystem cmd is NULL!");
|
// printf("taosSystem cmd is NULL!");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((fp = popen(cmd, "r")) == NULL) {
|
if ((fp = popen(cmd, "r")) == NULL) {
|
||||||
//printf("popen cmd:%s error: %s", cmd, strerror(errno));
|
// printf("popen cmd:%s error: %s", cmd, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
while (fgets(buf, sizeof(buf), fp)) {
|
while (fgets(buf, sizeof(buf), fp)) {
|
||||||
//printf("popen result:%s", buf);
|
// printf("popen result:%s", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((res = pclose(fp)) == -1) {
|
if ((res = pclose(fp)) == -1) {
|
||||||
//printf("close popen file pointer fp error!");
|
// printf("close popen file pointer fp error!");
|
||||||
} else {
|
} else {
|
||||||
//printf("popen res is :%d", res);
|
// printf("popen res is :%d", res);
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
@ -757,14 +752,14 @@ void taosSetCoreDump(bool enable) {
|
||||||
struct rlimit rlim_new;
|
struct rlimit rlim_new;
|
||||||
if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
|
if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
|
||||||
#ifndef _ALPINE
|
#ifndef _ALPINE
|
||||||
//printf("the old unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max);
|
// printf("the old unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max);
|
||||||
#else
|
#else
|
||||||
//printf("the old unlimited para: rlim_cur=%llu, rlim_max=%llu", rlim.rlim_cur, rlim.rlim_max);
|
// printf("the old unlimited para: rlim_cur=%llu, rlim_max=%llu", rlim.rlim_cur, rlim.rlim_max);
|
||||||
#endif
|
#endif
|
||||||
rlim_new.rlim_cur = RLIM_INFINITY;
|
rlim_new.rlim_cur = RLIM_INFINITY;
|
||||||
rlim_new.rlim_max = RLIM_INFINITY;
|
rlim_new.rlim_max = RLIM_INFINITY;
|
||||||
if (setrlimit(RLIMIT_CORE, &rlim_new) != 0) {
|
if (setrlimit(RLIMIT_CORE, &rlim_new) != 0) {
|
||||||
//printf("set unlimited fail, error: %s", strerror(errno));
|
// printf("set unlimited fail, error: %s", strerror(errno));
|
||||||
rlim_new.rlim_cur = rlim.rlim_max;
|
rlim_new.rlim_cur = rlim.rlim_max;
|
||||||
rlim_new.rlim_max = rlim.rlim_max;
|
rlim_new.rlim_max = rlim.rlim_max;
|
||||||
(void)setrlimit(RLIMIT_CORE, &rlim_new);
|
(void)setrlimit(RLIMIT_CORE, &rlim_new);
|
||||||
|
@ -773,9 +768,9 @@ void taosSetCoreDump(bool enable) {
|
||||||
|
|
||||||
if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
|
if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
|
||||||
#ifndef _ALPINE
|
#ifndef _ALPINE
|
||||||
//printf("the new unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max);
|
// printf("the new unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max);
|
||||||
#else
|
#else
|
||||||
//printf("the new unlimited para: rlim_cur=%llu, rlim_max=%llu", rlim.rlim_cur, rlim.rlim_max);
|
// printf("the new unlimited para: rlim_cur=%llu, rlim_max=%llu", rlim.rlim_cur, rlim.rlim_max);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -801,10 +796,10 @@ void taosSetCoreDump(bool enable) {
|
||||||
old_len = sizeof(old_usespid);
|
old_len = sizeof(old_usespid);
|
||||||
|
|
||||||
if (syscall(SYS__sysctl, &args) == -1) {
|
if (syscall(SYS__sysctl, &args) == -1) {
|
||||||
//printf("_sysctl(kern_core_uses_pid) set fail: %s", strerror(errno));
|
// printf("_sysctl(kern_core_uses_pid) set fail: %s", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("The old core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid);
|
// printf("The old core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid);
|
||||||
|
|
||||||
old_usespid = 0;
|
old_usespid = 0;
|
||||||
old_len = 0;
|
old_len = 0;
|
||||||
|
@ -817,10 +812,10 @@ void taosSetCoreDump(bool enable) {
|
||||||
old_len = sizeof(old_usespid);
|
old_len = sizeof(old_usespid);
|
||||||
|
|
||||||
if (syscall(SYS__sysctl, &args) == -1) {
|
if (syscall(SYS__sysctl, &args) == -1) {
|
||||||
//printf("_sysctl(kern_core_uses_pid) get fail: %s", strerror(errno));
|
// printf("_sysctl(kern_core_uses_pid) get fail: %s", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("The new core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid);
|
// printf("The new core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -885,7 +880,7 @@ SysNameInfo taosGetSysNameInfo() {
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetEmail(char *email, int32_t maxLen) {
|
int32_t taosGetEmail(char *email, int32_t maxLen) {
|
||||||
const char *filepath = "/usr/local/taos/email";
|
const char *filepath = "/usr/local/taos/email";
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ);
|
TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ);
|
||||||
|
@ -893,17 +888,17 @@ bool taosGetEmail(char *email, int32_t maxLen) {
|
||||||
|
|
||||||
if (taosReadFile(pFile, (void *)email, maxLen) < 0) {
|
if (taosReadFile(pFile, (void *)email, maxLen) < 0) {
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return true;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetOsReleaseName(char *releaseName, int32_t maxLen) {
|
int32_t taosGetOsReleaseName(char *releaseName, int32_t maxLen) {
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
bool ret = false;
|
int32_t code = -1;
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile("/etc/os-release", TD_FILE_READ | TD_FILE_STREAM);
|
TdFilePtr pFile = taosOpenFile("/etc/os-release", TD_FILE_READ | TD_FILE_STREAM);
|
||||||
if (pFile == NULL) return false;
|
if (pFile == NULL) return false;
|
||||||
|
@ -917,21 +912,21 @@ bool taosGetOsReleaseName(char *releaseName, int32_t maxLen) {
|
||||||
line[size - 2] = 0;
|
line[size - 2] = 0;
|
||||||
}
|
}
|
||||||
tstrncpy(releaseName, p, maxLen);
|
tstrncpy(releaseName, p, maxLen);
|
||||||
ret = true;
|
code = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (line != NULL) free(line);
|
if (line != NULL) free(line);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
return ret;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores) {
|
int32_t taosGetCpuInfo(char *cpuModel, int32_t maxLen, float *numOfCores) {
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
int32_t done = 0;
|
int32_t done = 0;
|
||||||
bool ret = false;
|
int32_t code = -1;
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile("/proc/cpuinfo", TD_FILE_READ | TD_FILE_STREAM);
|
TdFilePtr pFile = taosOpenFile("/proc/cpuinfo", TD_FILE_READ | TD_FILE_STREAM);
|
||||||
if (pFile == NULL) return false;
|
if (pFile == NULL) return false;
|
||||||
|
@ -941,11 +936,11 @@ bool taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores) {
|
||||||
if (((done & 1) == 0) && strncmp(line, "model name", 10) == 0) {
|
if (((done & 1) == 0) && strncmp(line, "model name", 10) == 0) {
|
||||||
const char *v = strchr(line, ':') + 2;
|
const char *v = strchr(line, ':') + 2;
|
||||||
tstrncpy(cpuModel, v, maxLen);
|
tstrncpy(cpuModel, v, maxLen);
|
||||||
ret = true;
|
code = 0;
|
||||||
done |= 1;
|
done |= 1;
|
||||||
} else if (((done & 2) == 0) && strncmp(line, "cpu cores", 9) == 0) {
|
} else if (((done & 2) == 0) && strncmp(line, "cpu cores", 9) == 0) {
|
||||||
const char *v = strchr(line, ':') + 2;
|
const char *v = strchr(line, ':') + 2;
|
||||||
*numOfCores = atoi(v);
|
*numOfCores = atof(v);
|
||||||
done |= 2;
|
done |= 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -953,31 +948,7 @@ bool taosGetCpuInfo(char *cpuModel, int32_t maxLen, int32_t *numOfCores) {
|
||||||
if (line != NULL) free(line);
|
if (line != NULL) free(line);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
|
|
||||||
return ret;
|
return code;
|
||||||
}
|
|
||||||
|
|
||||||
bool taosGetTotalSysMemoryKB(uint64_t *kb) {
|
|
||||||
char *line = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
bool ret = false;
|
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile("/proc/meminfo", TD_FILE_READ | TD_FILE_STREAM);
|
|
||||||
if (pFile == NULL) return false;
|
|
||||||
|
|
||||||
while ((size = taosGetLineFile(pFile, &line)) != -1) {
|
|
||||||
line[size - 1] = '\0';
|
|
||||||
if (strncmp(line, "MemTotal", 8) == 0) {
|
|
||||||
const char *p = strchr(line, ':') + 1;
|
|
||||||
while (*p == ' ') p++;
|
|
||||||
ret = true;
|
|
||||||
*kb = atoll(p);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (line != NULL) free(line);
|
|
||||||
taosCloseFile(&pFile);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "os.h"
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "tcache.h"
|
#include "tcache.h"
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "tencode.h"
|
#include "tencode.h"
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#include "gtest/gtest.h"
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "tfreelist.h"
|
#include "tfreelist.h"
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#include "os.h"
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <taosdef.h>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
#include "taosdef.h"
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
|
||||||
|
|
|
@ -93,8 +93,7 @@ static void shellCheckTablesSQLFile(const char *directoryName)
|
||||||
{
|
{
|
||||||
sprintf(shellTablesSQLFile, "%s/tables.sql", directoryName);
|
sprintf(shellTablesSQLFile, "%s/tables.sql", directoryName);
|
||||||
|
|
||||||
struct stat fstat;
|
if (taosFStatFile(shellTablesSQLFile, NULL, NULL) < 0) {
|
||||||
if (stat(shellTablesSQLFile, &fstat) < 0) {
|
|
||||||
shellTablesSQLFile[0] = 0;
|
shellTablesSQLFile[0] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,13 +108,12 @@ static void shellMallocSQLFiles()
|
||||||
|
|
||||||
static void shellGetDirectoryFileList(char *inputDir)
|
static void shellGetDirectoryFileList(char *inputDir)
|
||||||
{
|
{
|
||||||
struct stat fileStat;
|
if (!taosDirExist(inputDir)) {
|
||||||
if (stat(inputDir, &fileStat) < 0) {
|
|
||||||
fprintf(stderr, "ERROR: %s not exist\n", inputDir);
|
fprintf(stderr, "ERROR: %s not exist\n", inputDir);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fileStat.st_mode & S_IFDIR) {
|
if (taosIsDir(inputDir)) {
|
||||||
shellCheckTablesSQLFile(inputDir);
|
shellCheckTablesSQLFile(inputDir);
|
||||||
shellSQLFileNum = shellGetFilesNum(inputDir, "sql");
|
shellSQLFileNum = shellGetFilesNum(inputDir, "sql");
|
||||||
int totalSQLFileNum = shellSQLFileNum;
|
int totalSQLFileNum = shellSQLFileNum;
|
||||||
|
|
Loading…
Reference in New Issue