Merge remote-tracking branch 'origin/3.0' into feature/qnode
This commit is contained in:
		
						commit
						8febfa11aa
					
				| 
						 | 
					@ -17,7 +17,7 @@
 | 
				
			||||||
#define TDENGINE_COMMON_H
 | 
					#define TDENGINE_COMMON_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "taosdef.h"
 | 
					#include "taosdef.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tarray.h"
 | 
					#include "tarray.h"
 | 
				
			||||||
#include "tvariant.h"
 | 
					#include "tvariant.h"
 | 
				
			||||||
//typedef struct STimeWindow {
 | 
					//typedef struct STimeWindow {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,36 +20,38 @@
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "tdef.h"
 | 
					 | 
				
			||||||
#include "taos.h"
 | 
					#include "taos.h"
 | 
				
			||||||
 | 
					#include "tdef.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSWINDOW_INITIALIZER ((STimeWindow) {INT64_MIN, INT64_MAX})
 | 
					typedef uint64_t tb_uid_t;
 | 
				
			||||||
#define TSWINDOW_DESC_INITIALIZER ((STimeWindow) {INT64_MAX, INT64_MIN})
 | 
					
 | 
				
			||||||
 | 
					#define TSWINDOW_INITIALIZER ((STimeWindow){INT64_MIN, INT64_MAX})
 | 
				
			||||||
 | 
					#define TSWINDOW_DESC_INITIALIZER ((STimeWindow){INT64_MAX, INT64_MIN})
 | 
				
			||||||
#define IS_TSWINDOW_SPECIFIED(win) (((win).skey != INT64_MIN) || ((win).ekey != INT64_MAX))
 | 
					#define IS_TSWINDOW_SPECIFIED(win) (((win).skey != INT64_MIN) || ((win).ekey != INT64_MAX))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
  TAOS_QTYPE_RPC   = 1,
 | 
					  TAOS_QTYPE_RPC = 1,
 | 
				
			||||||
  TAOS_QTYPE_FWD   = 2,
 | 
					  TAOS_QTYPE_FWD = 2,
 | 
				
			||||||
  TAOS_QTYPE_WAL   = 3,
 | 
					  TAOS_QTYPE_WAL = 3,
 | 
				
			||||||
  TAOS_QTYPE_CQ    = 4,
 | 
					  TAOS_QTYPE_CQ = 4,
 | 
				
			||||||
  TAOS_QTYPE_QUERY = 5
 | 
					  TAOS_QTYPE_QUERY = 5
 | 
				
			||||||
} EQType;
 | 
					} EQType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
  TSDB_SUPER_TABLE  = 1,   // super table
 | 
					  TSDB_SUPER_TABLE = 1,   // super table
 | 
				
			||||||
  TSDB_CHILD_TABLE  = 2,   // table created from super table
 | 
					  TSDB_CHILD_TABLE = 2,   // table created from super table
 | 
				
			||||||
  TSDB_NORMAL_TABLE = 3,   // ordinary table
 | 
					  TSDB_NORMAL_TABLE = 3,  // ordinary table
 | 
				
			||||||
  TSDB_STREAM_TABLE = 4,   // table created from stream computing
 | 
					  TSDB_STREAM_TABLE = 4,  // table created from stream computing
 | 
				
			||||||
  TSDB_TEMP_TABLE   = 5,   // temp table created by nest query
 | 
					  TSDB_TEMP_TABLE = 5,    // temp table created by nest query
 | 
				
			||||||
  TSDB_TABLE_MAX    = 6
 | 
					  TSDB_TABLE_MAX = 6
 | 
				
			||||||
} ETableType;
 | 
					} ETableType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
  TSDB_MOD_MNODE   = 1,
 | 
					  TSDB_MOD_MNODE = 1,
 | 
				
			||||||
  TSDB_MOD_HTTP    = 2,
 | 
					  TSDB_MOD_HTTP = 2,
 | 
				
			||||||
  TSDB_MOD_MONITOR = 3,
 | 
					  TSDB_MOD_MONITOR = 3,
 | 
				
			||||||
  TSDB_MOD_MQTT    = 4,
 | 
					  TSDB_MOD_MQTT = 4,
 | 
				
			||||||
  TSDB_MOD_MAX     = 5
 | 
					  TSDB_MOD_MAX = 5
 | 
				
			||||||
} EModuleType;
 | 
					} EModuleType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
| 
						 | 
					@ -64,11 +66,7 @@ typedef enum {
 | 
				
			||||||
  TSDB_CHECK_ITEM_MAX
 | 
					  TSDB_CHECK_ITEM_MAX
 | 
				
			||||||
} ECheckItemType;
 | 
					} ECheckItemType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum { TD_ROW_DISCARD_UPDATE = 0, TD_ROW_OVERWRITE_UPDATE = 1, TD_ROW_PARTIAL_UPDATE = 2 } TDUpdateConfig;
 | 
				
			||||||
  TD_ROW_DISCARD_UPDATE   = 0,
 | 
					 | 
				
			||||||
  TD_ROW_OVERWRITE_UPDATE = 1,
 | 
					 | 
				
			||||||
  TD_ROW_PARTIAL_UPDATE   = 2
 | 
					 | 
				
			||||||
} TDUpdateConfig;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern char *qtypeStr[];
 | 
					extern char *qtypeStr[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
#define TDENGINE_TEP_H
 | 
					#define TDENGINE_TEP_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SCorEpSet {
 | 
					typedef struct SCorEpSet {
 | 
				
			||||||
  int32_t version;
 | 
					  int32_t version;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,127 +22,36 @@ extern "C" {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "taosdef.h"
 | 
					#include "taosdef.h"
 | 
				
			||||||
#include "taoserror.h"
 | 
					#include "taoserror.h"
 | 
				
			||||||
 | 
					#include "tcoding.h"
 | 
				
			||||||
#include "tdataformat.h"
 | 
					#include "tdataformat.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// message type
 | 
					#define TD_MSG_NUMBER_
 | 
				
			||||||
 | 
					#undef TD_MSG_DICT_
 | 
				
			||||||
 | 
					#undef TD_MSG_INFO_
 | 
				
			||||||
 | 
					#undef TD_MSG_SEG_CODE_
 | 
				
			||||||
 | 
					#include "tmsgdef.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef TAOS_MESSAGE_C
 | 
					#undef TD_MSG_NUMBER_
 | 
				
			||||||
#define TAOS_DEFINE_MESSAGE_TYPE( name, msg ) msg, msg "-rsp",
 | 
					#undef TD_MSG_DICT_
 | 
				
			||||||
char *taosMsg[] = {
 | 
					#undef TD_MSG_INFO_
 | 
				
			||||||
  "null",
 | 
					#define TD_MSG_SEG_CODE_
 | 
				
			||||||
#else
 | 
					#include "tmsgdef.h"
 | 
				
			||||||
#define TAOS_DEFINE_MESSAGE_TYPE( name, msg ) name, name##_RSP,
 | 
					 | 
				
			||||||
enum {
 | 
					 | 
				
			||||||
  TSDB_MESSAGE_NULL = 0,
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// message from client to vnode
 | 
					#undef TD_MSG_NUMBER_
 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_SUBMIT, "submit" )
 | 
					#undef TD_MSG_DICT_
 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_QUERY, "query" )
 | 
					#undef TD_MSG_INFO_
 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_FETCH, "fetch" )
 | 
					#undef TD_MSG_SEG_CODE_
 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CREATE_TABLE, "create-table" )
 | 
					#include "tmsgdef.h"
 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_TABLE, "drop-table" )	
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_ALTER_TABLE, "alter-table" )	
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_UPDATE_TAG_VAL, "update-tag-val" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_TABLE_META, "table-meta" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_TABLES_META, "tables-meta" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_MQ_CONSUME, "mq-consume" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_MQ_QUERY, "mq-query" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_MQ_CONNECT, "mq-connect" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_MQ_DISCONNECT, "mq-disconnect" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_MQ_SET_CUR, "mq-set-cur" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_RES_READY, "res-ready" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_TASKS_STATUS, "tasks-status" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CANCEL_TASK, "cancel-task" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_TASK, "drop-task" )
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// message from client to mnode
 | 
					extern char* tMsgInfo[];
 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CONNECT, "connect" )
 | 
					extern int   tMsgDict[];
 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CREATE_ACCT, "create-acct" )	
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_ALTER_ACCT, "alter-acct" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_ACCT, "drop-acct" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CREATE_USER, "create-user" )	
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_ALTER_USER, "alter-user" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_USER, "drop-user" ) 
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CREATE_DNODE, "create-dnode" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CONFIG_DNODE, "config-dnode" ) 
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_DNODE, "drop-dnode" )   
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CREATE_MNODE, "create-mnode" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_MNODE, "drop-mnode" ) 
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CREATE_DB, "create-db" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_DB, "drop-db" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_USE_DB, "use-db" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_ALTER_DB, "alter-db" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_SYNC_DB, "sync-db" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_COMPACT_DB, "compact-db" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CREATE_FUNCTION, "create-function" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_RETRIEVE_FUNCTION, "retrieve-function" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_FUNCTION, "drop-function" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CREATE_STB, "create-stb" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_ALTER_STB, "alter-stb" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_STB, "drop-stb" )	
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_VGROUP_LIST, "vgroup-list" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_KILL_QUERY, "kill-query" )		
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_KILL_CONN, "kill-conn" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_HEARTBEAT, "heartbeat" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_SHOW, "show" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_SHOW_RETRIEVE, "retrieve" )  
 | 
					 | 
				
			||||||
// message from client to qnode
 | 
					 | 
				
			||||||
// message from client to dnode
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_NETWORK_TEST, "nettest" )
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// message from vnode to vnode
 | 
					#define TMSG_SEG_CODE(TYPE) (((TYPE)&0xff00) >> 8)
 | 
				
			||||||
// message from vnode to mnode
 | 
					#define TMSG_SEG_SEQ(TYPE) ((TYPE)&0xff)
 | 
				
			||||||
// message from vnode to qnode
 | 
					#define TMSG_INFO(TYPE) tMsgInfo[tMsgDict[TMSG_SEG_CODE(TYPE)] + TMSG_SEG_SEQ(TYPE)]
 | 
				
			||||||
// message from vnode to dnode
 | 
					#define TMSG_INDEX(TYPE) (tMsgDict[TMSG_SEG_CODE(TYPE)] + TMSG_SEG_SEQ(TYPE))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// message from mnode to vnode
 | 
					typedef uint16_t tmsg_t;
 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CREATE_STB_IN, "create-stb-internal" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_ALTER_STB_IN, "alter-stb-internal" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_STB_IN, "drop-stb-internal" )
 | 
					 | 
				
			||||||
// message from mnode to mnode
 | 
					 | 
				
			||||||
// message from mnode to qnode
 | 
					 | 
				
			||||||
// message from mnode to dnode
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CREATE_VNODE_IN, "create-vnode-internal" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_ALTER_VNODE_IN, "alter-vnode-internal" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_VNODE_IN, "drop-vnode-internal" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_AUTH_VNODE_IN, "auth-vnode-internal" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_SYNC_VNODE_IN, "sync-vnode-internal" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_COMPACT_VNODE_IN, "compact-vnode-internal" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CREATE_MNODE_IN, "create-mnode-internal" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_ALTER_MNODE_IN, "alter-mnode-internal" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DROP_MNODE_IN, "drop-mnode-internal" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_CONFIG_DNODE_IN, "config-dnode-internal" )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// message from qnode to vnode
 | 
					 | 
				
			||||||
// message from qnode to mnode
 | 
					 | 
				
			||||||
// message from qnode to qnode
 | 
					 | 
				
			||||||
// message from qnode to dnode
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// message from dnode to vnode
 | 
					 | 
				
			||||||
// message from dnode to mnode
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_STATUS, "status" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_GRANT, "grant" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_AUTH, "auth" )
 | 
					 | 
				
			||||||
// message from dnode to qnode
 | 
					 | 
				
			||||||
// message from dnode to dnode
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DUMMY0, "dummy0" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DUMMY1, "dummy1" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DUMMY2, "dummy2" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DUMMY3, "dummy3" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DUMMY4, "dummy4" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DUMMY5, "dummy5" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DUMMY6, "dummy6" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DUMMY7, "dummy7" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DUMMY8, "dummy8" )
 | 
					 | 
				
			||||||
TAOS_DEFINE_MESSAGE_TYPE( TSDB_MSG_TYPE_DUMMY9, "dummy9" )
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef TAOS_MESSAGE_C
 | 
					 | 
				
			||||||
  TSDB_MSG_TYPE_MAX  // 147
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IE type
 | 
					// IE type
 | 
				
			||||||
#define TSDB_IE_TYPE_SEC 1
 | 
					#define TSDB_IE_TYPE_SEC 1
 | 
				
			||||||
| 
						 | 
					@ -178,48 +87,46 @@ typedef enum _mgmt_table {
 | 
				
			||||||
  TSDB_MGMT_TABLE_MAX,
 | 
					  TSDB_MGMT_TABLE_MAX,
 | 
				
			||||||
} EShowType;
 | 
					} EShowType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_ALTER_TABLE_ADD_TAG_COLUMN    1
 | 
					#define TSDB_ALTER_TABLE_ADD_TAG_COLUMN 1
 | 
				
			||||||
#define TSDB_ALTER_TABLE_DROP_TAG_COLUMN   2
 | 
					#define TSDB_ALTER_TABLE_DROP_TAG_COLUMN 2
 | 
				
			||||||
#define TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN 3
 | 
					#define TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN 3
 | 
				
			||||||
#define TSDB_ALTER_TABLE_UPDATE_TAG_VAL    4
 | 
					#define TSDB_ALTER_TABLE_UPDATE_TAG_VAL 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_ALTER_TABLE_ADD_COLUMN        5
 | 
					#define TSDB_ALTER_TABLE_ADD_COLUMN 5
 | 
				
			||||||
#define TSDB_ALTER_TABLE_DROP_COLUMN       6
 | 
					#define TSDB_ALTER_TABLE_DROP_COLUMN 6
 | 
				
			||||||
#define TSDB_ALTER_TABLE_CHANGE_COLUMN     7
 | 
					#define TSDB_ALTER_TABLE_CHANGE_COLUMN 7
 | 
				
			||||||
#define TSDB_ALTER_TABLE_MODIFY_TAG_COLUMN 8
 | 
					#define TSDB_ALTER_TABLE_MODIFY_TAG_COLUMN 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_FILL_NONE             0
 | 
					#define TSDB_FILL_NONE 0
 | 
				
			||||||
#define TSDB_FILL_NULL             1
 | 
					#define TSDB_FILL_NULL 1
 | 
				
			||||||
#define TSDB_FILL_SET_VALUE        2
 | 
					#define TSDB_FILL_SET_VALUE 2
 | 
				
			||||||
#define TSDB_FILL_LINEAR           3
 | 
					#define TSDB_FILL_LINEAR 3
 | 
				
			||||||
#define TSDB_FILL_PREV             4
 | 
					#define TSDB_FILL_PREV 4
 | 
				
			||||||
#define TSDB_FILL_NEXT             5
 | 
					#define TSDB_FILL_NEXT 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_ALTER_USER_PASSWD     0x1
 | 
					#define TSDB_ALTER_USER_PASSWD 0x1
 | 
				
			||||||
#define TSDB_ALTER_USER_PRIVILEGES 0x2
 | 
					#define TSDB_ALTER_USER_PRIVILEGES 0x2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_KILL_MSG_LEN          30
 | 
					#define TSDB_KILL_MSG_LEN 30
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_VN_READ_ACCCESS       ((char)0x1)
 | 
					#define TSDB_VN_READ_ACCCESS ((char)0x1)
 | 
				
			||||||
#define TSDB_VN_WRITE_ACCCESS      ((char)0x2)
 | 
					#define TSDB_VN_WRITE_ACCCESS ((char)0x2)
 | 
				
			||||||
#define TSDB_VN_ALL_ACCCESS (TSDB_VN_READ_ACCCESS | TSDB_VN_WRITE_ACCCESS)
 | 
					#define TSDB_VN_ALL_ACCCESS (TSDB_VN_READ_ACCCESS | TSDB_VN_WRITE_ACCCESS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_COL_NORMAL             0x0u    // the normal column of the table
 | 
					#define TSDB_COL_NORMAL 0x0u  // the normal column of the table
 | 
				
			||||||
#define TSDB_COL_TAG                0x1u    // the tag column type
 | 
					#define TSDB_COL_TAG 0x1u     // the tag column type
 | 
				
			||||||
#define TSDB_COL_UDC                0x2u    // the user specified normal string column, it is a dummy column
 | 
					#define TSDB_COL_UDC 0x2u     // the user specified normal string column, it is a dummy column
 | 
				
			||||||
#define TSDB_COL_TMP                0x4u    // internal column generated by the previous operators
 | 
					#define TSDB_COL_TMP 0x4u     // internal column generated by the previous operators
 | 
				
			||||||
#define TSDB_COL_NULL               0x8u    // the column filter NULL or not
 | 
					#define TSDB_COL_NULL 0x8u    // the column filter NULL or not
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_COL_IS_TAG(f)          (((f&(~(TSDB_COL_NULL)))&TSDB_COL_TAG) != 0)
 | 
					#define TSDB_COL_IS_TAG(f) (((f & (~(TSDB_COL_NULL))) & TSDB_COL_TAG) != 0)
 | 
				
			||||||
#define TSDB_COL_IS_NORMAL_COL(f)   ((f&(~(TSDB_COL_NULL))) == TSDB_COL_NORMAL)
 | 
					#define TSDB_COL_IS_NORMAL_COL(f) ((f & (~(TSDB_COL_NULL))) == TSDB_COL_NORMAL)
 | 
				
			||||||
#define TSDB_COL_IS_UD_COL(f)       ((f&(~(TSDB_COL_NULL))) == TSDB_COL_UDC)
 | 
					#define TSDB_COL_IS_UD_COL(f) ((f & (~(TSDB_COL_NULL))) == TSDB_COL_UDC)
 | 
				
			||||||
#define TSDB_COL_REQ_NULL(f)        (((f)&TSDB_COL_NULL) != 0)
 | 
					#define TSDB_COL_REQ_NULL(f) (((f)&TSDB_COL_NULL) != 0)
 | 
				
			||||||
 | 
					 | 
				
			||||||
extern char *taosMsg[];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SBuildTableMetaInput {
 | 
					typedef struct SBuildTableMetaInput {
 | 
				
			||||||
  int32_t vgId;
 | 
					  int32_t vgId;
 | 
				
			||||||
  char   *tableFullName;
 | 
					  char*   tableFullName;
 | 
				
			||||||
} SBuildTableMetaInput;
 | 
					} SBuildTableMetaInput;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SBuildUseDBInput {
 | 
					typedef struct SBuildUseDBInput {
 | 
				
			||||||
| 
						 | 
					@ -227,7 +134,6 @@ typedef struct SBuildUseDBInput {
 | 
				
			||||||
  int32_t vgVersion;
 | 
					  int32_t vgVersion;
 | 
				
			||||||
} SBuildUseDBInput;
 | 
					} SBuildUseDBInput;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#pragma pack(push, 1)
 | 
					#pragma pack(push, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// null-terminated string instead of char array to avoid too many memory consumption in case of more than 1M tableMeta
 | 
					// null-terminated string instead of char array to avoid too many memory consumption in case of more than 1M tableMeta
 | 
				
			||||||
| 
						 | 
					@ -312,7 +218,7 @@ typedef struct {
 | 
				
			||||||
  char     data[];
 | 
					  char     data[];
 | 
				
			||||||
} SMDCreateTableMsg;
 | 
					} SMDCreateTableMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//typedef struct {
 | 
					// typedef struct {
 | 
				
			||||||
//  int32_t len;  // one create table message
 | 
					//  int32_t len;  // one create table message
 | 
				
			||||||
//  char    tableName[TSDB_TABLE_FNAME_LEN];
 | 
					//  char    tableName[TSDB_TABLE_FNAME_LEN];
 | 
				
			||||||
//  int16_t numOfColumns;
 | 
					//  int16_t numOfColumns;
 | 
				
			||||||
| 
						 | 
					@ -442,7 +348,7 @@ typedef struct {
 | 
				
			||||||
  int8_t  type;
 | 
					  int8_t  type;
 | 
				
			||||||
  char    user[TSDB_USER_LEN];
 | 
					  char    user[TSDB_USER_LEN];
 | 
				
			||||||
  char    pass[TSDB_PASSWORD_LEN];
 | 
					  char    pass[TSDB_PASSWORD_LEN];
 | 
				
			||||||
  int8_t  superUser;      // denote if it is a super user or not
 | 
					  int8_t  superUser;  // denote if it is a super user or not
 | 
				
			||||||
  int32_t reserve[8];
 | 
					  int32_t reserve[8];
 | 
				
			||||||
} SCreateUserMsg, SAlterUserMsg;
 | 
					} SCreateUserMsg, SAlterUserMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -493,7 +399,7 @@ typedef struct SColumnFilterList {
 | 
				
			||||||
  int16_t numOfFilters;
 | 
					  int16_t numOfFilters;
 | 
				
			||||||
  union {
 | 
					  union {
 | 
				
			||||||
    int64_t            placeholder;
 | 
					    int64_t            placeholder;
 | 
				
			||||||
    SColumnFilterInfo *filterInfo;
 | 
					    SColumnFilterInfo* filterInfo;
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
} SColumnFilterList;
 | 
					} SColumnFilterList;
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -578,8 +484,8 @@ typedef struct {
 | 
				
			||||||
  int32_t     sqlstrLen;      // sql query string
 | 
					  int32_t     sqlstrLen;      // sql query string
 | 
				
			||||||
  int32_t     prevResultLen;  // previous result length
 | 
					  int32_t     prevResultLen;  // previous result length
 | 
				
			||||||
  int32_t     numOfOperator;
 | 
					  int32_t     numOfOperator;
 | 
				
			||||||
  int32_t     tableScanOperator;// table scan operator. -1 means no scan operator
 | 
					  int32_t     tableScanOperator;  // table scan operator. -1 means no scan operator
 | 
				
			||||||
  int32_t     udfNum;           // number of udf function
 | 
					  int32_t     udfNum;             // number of udf function
 | 
				
			||||||
  int32_t     udfContentOffset;
 | 
					  int32_t     udfContentOffset;
 | 
				
			||||||
  int32_t     udfContentLen;
 | 
					  int32_t     udfContentLen;
 | 
				
			||||||
  SColumnInfo tableCols[];
 | 
					  SColumnInfo tableCols[];
 | 
				
			||||||
| 
						 | 
					@ -882,7 +788,7 @@ typedef struct SMultiTableMeta {
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  int32_t dataLen;
 | 
					  int32_t dataLen;
 | 
				
			||||||
  char    name[TSDB_TABLE_FNAME_LEN];
 | 
					  char    name[TSDB_TABLE_FNAME_LEN];
 | 
				
			||||||
  char   *data;
 | 
					  char*   data;
 | 
				
			||||||
} STagData;
 | 
					} STagData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
| 
						 | 
					@ -917,7 +823,7 @@ typedef struct SShowRsp {
 | 
				
			||||||
} SShowRsp;
 | 
					} SShowRsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  char    ep[TSDB_EP_LEN];  // end point, hostname:port
 | 
					  char ep[TSDB_EP_LEN];  // end point, hostname:port
 | 
				
			||||||
} SCreateDnodeMsg;
 | 
					} SCreateDnodeMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
| 
						 | 
					@ -1019,35 +925,27 @@ typedef struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// mq related
 | 
					// mq related
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
 | 
					 | 
				
			||||||
} SMqConnectReq;
 | 
					} SMqConnectReq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
 | 
					 | 
				
			||||||
} SMqConnectRsp;
 | 
					} SMqConnectRsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
 | 
					 | 
				
			||||||
} SMqDisconnectReq;
 | 
					} SMqDisconnectReq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
 | 
					 | 
				
			||||||
} SMqDisconnectRsp;
 | 
					} SMqDisconnectRsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
 | 
					 | 
				
			||||||
} SMqAckReq;
 | 
					} SMqAckReq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
 | 
					 | 
				
			||||||
} SMqAckRsp;
 | 
					} SMqAckRsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
 | 
					 | 
				
			||||||
} SMqResetReq;
 | 
					} SMqResetReq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
 | 
					 | 
				
			||||||
} SMqResetRsp;
 | 
					} SMqResetRsp;
 | 
				
			||||||
// mq related end
 | 
					// mq related end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1104,17 +1002,17 @@ typedef struct {
 | 
				
			||||||
} SUpdateTagValRsp;
 | 
					} SUpdateTagValRsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SSubQueryMsg {
 | 
					typedef struct SSubQueryMsg {
 | 
				
			||||||
  uint64_t  schedulerId;
 | 
					  uint64_t schedulerId;
 | 
				
			||||||
  uint64_t  queryId;
 | 
					  uint64_t queryId;
 | 
				
			||||||
  uint64_t  taskId;
 | 
					  uint64_t taskId;
 | 
				
			||||||
  uint32_t  contentLen;
 | 
					  uint32_t contentLen;
 | 
				
			||||||
  char      msg[];
 | 
					  char     msg[];
 | 
				
			||||||
} SSubQueryMsg;
 | 
					} SSubQueryMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SResReadyMsg {
 | 
					typedef struct SResReadyMsg {
 | 
				
			||||||
  uint64_t  schedulerId;
 | 
					  uint64_t schedulerId;
 | 
				
			||||||
  uint64_t  queryId;
 | 
					  uint64_t queryId;
 | 
				
			||||||
  uint64_t  taskId;
 | 
					  uint64_t taskId;
 | 
				
			||||||
} SResReadyMsg;
 | 
					} SResReadyMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SResReadyRsp {
 | 
					typedef struct SResReadyRsp {
 | 
				
			||||||
| 
						 | 
					@ -1122,19 +1020,19 @@ typedef struct SResReadyRsp {
 | 
				
			||||||
} SResReadyRsp;
 | 
					} SResReadyRsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SResFetchMsg {
 | 
					typedef struct SResFetchMsg {
 | 
				
			||||||
  uint64_t  schedulerId;
 | 
					  uint64_t schedulerId;
 | 
				
			||||||
  uint64_t  queryId;
 | 
					  uint64_t queryId;
 | 
				
			||||||
  uint64_t  taskId;
 | 
					  uint64_t taskId;
 | 
				
			||||||
} SResFetchMsg;
 | 
					} SResFetchMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SSchTasksStatusMsg {
 | 
					typedef struct SSchTasksStatusMsg {
 | 
				
			||||||
  uint64_t  schedulerId;
 | 
					  uint64_t schedulerId;
 | 
				
			||||||
} SSchTasksStatusMsg;
 | 
					} SSchTasksStatusMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct STaskStatus {
 | 
					typedef struct STaskStatus {
 | 
				
			||||||
  uint64_t  queryId;
 | 
					  uint64_t queryId;
 | 
				
			||||||
  uint64_t  taskId;
 | 
					  uint64_t taskId;
 | 
				
			||||||
  int8_t    status;
 | 
					  int8_t   status;
 | 
				
			||||||
} STaskStatus;
 | 
					} STaskStatus;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SSchedulerStatusRsp {
 | 
					typedef struct SSchedulerStatusRsp {
 | 
				
			||||||
| 
						 | 
					@ -1142,11 +1040,10 @@ typedef struct SSchedulerStatusRsp {
 | 
				
			||||||
  STaskStatus status[];
 | 
					  STaskStatus status[];
 | 
				
			||||||
} SSchedulerStatusRsp;
 | 
					} SSchedulerStatusRsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct STaskCancelMsg {
 | 
					typedef struct STaskCancelMsg {
 | 
				
			||||||
  uint64_t  schedulerId;
 | 
					  uint64_t schedulerId;
 | 
				
			||||||
  uint64_t  queryId;
 | 
					  uint64_t queryId;
 | 
				
			||||||
  uint64_t  taskId;
 | 
					  uint64_t taskId;
 | 
				
			||||||
} STaskCancelMsg;
 | 
					} STaskCancelMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct STaskCancelRsp {
 | 
					typedef struct STaskCancelRsp {
 | 
				
			||||||
| 
						 | 
					@ -1154,15 +1051,176 @@ typedef struct STaskCancelRsp {
 | 
				
			||||||
} STaskCancelRsp;
 | 
					} STaskCancelRsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct STaskDropMsg {
 | 
					typedef struct STaskDropMsg {
 | 
				
			||||||
  uint64_t  schedulerId;
 | 
					  uint64_t schedulerId;
 | 
				
			||||||
  uint64_t  queryId;
 | 
					  uint64_t queryId;
 | 
				
			||||||
  uint64_t  taskId;
 | 
					  uint64_t taskId;
 | 
				
			||||||
} STaskDropMsg;
 | 
					} STaskDropMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct STaskDropRsp {
 | 
					typedef struct STaskDropRsp {
 | 
				
			||||||
  int32_t code;
 | 
					  int32_t code;
 | 
				
			||||||
} STaskDropRsp;
 | 
					} STaskDropRsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  char    name[TSDB_TOPIC_FNAME_LEN];
 | 
				
			||||||
 | 
					  int8_t  igExists;
 | 
				
			||||||
 | 
					  int32_t execLen;
 | 
				
			||||||
 | 
					  void*   executor;
 | 
				
			||||||
 | 
					  int32_t sqlLen;
 | 
				
			||||||
 | 
					  char*   sql;
 | 
				
			||||||
 | 
					} SCreateTopicMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  char   name[TSDB_TABLE_FNAME_LEN];
 | 
				
			||||||
 | 
					  int8_t igNotExists;
 | 
				
			||||||
 | 
					} SDropTopicMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  char    name[TSDB_TABLE_FNAME_LEN];
 | 
				
			||||||
 | 
					  int8_t  alterType;
 | 
				
			||||||
 | 
					  SSchema schema;
 | 
				
			||||||
 | 
					} SAlterTopicMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  SMsgHead head;
 | 
				
			||||||
 | 
					  char     name[TSDB_TABLE_FNAME_LEN];
 | 
				
			||||||
 | 
					  uint64_t tuid;
 | 
				
			||||||
 | 
					  int32_t  sverson;
 | 
				
			||||||
 | 
					  int32_t  execLen;
 | 
				
			||||||
 | 
					  char*    executor;
 | 
				
			||||||
 | 
					  int32_t  sqlLen;
 | 
				
			||||||
 | 
					  char*    sql;
 | 
				
			||||||
 | 
					} SCreateTopicInternalMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  SMsgHead head;
 | 
				
			||||||
 | 
					  char     name[TSDB_TABLE_FNAME_LEN];
 | 
				
			||||||
 | 
					  uint64_t tuid;
 | 
				
			||||||
 | 
					} SDropTopicInternalMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct SVCreateTbReq {
 | 
				
			||||||
 | 
					  uint64_t ver;  // use a general definition
 | 
				
			||||||
 | 
					  char*    name;
 | 
				
			||||||
 | 
					  uint32_t ttl;
 | 
				
			||||||
 | 
					  uint32_t keep;
 | 
				
			||||||
 | 
					#define TD_SUPER_TABLE 0
 | 
				
			||||||
 | 
					#define TD_CHILD_TABLE 1
 | 
				
			||||||
 | 
					#define TD_NORMAL_TABLE 2
 | 
				
			||||||
 | 
					  uint8_t type;
 | 
				
			||||||
 | 
					  union {
 | 
				
			||||||
 | 
					    struct {
 | 
				
			||||||
 | 
					      tb_uid_t suid;
 | 
				
			||||||
 | 
					      uint32_t nCols;
 | 
				
			||||||
 | 
					      SSchema* pSchema;
 | 
				
			||||||
 | 
					      uint32_t nTagCols;
 | 
				
			||||||
 | 
					      SSchema* pTagSchema;
 | 
				
			||||||
 | 
					    } stbCfg;
 | 
				
			||||||
 | 
					    struct {
 | 
				
			||||||
 | 
					      tb_uid_t suid;
 | 
				
			||||||
 | 
					      SKVRow   pTag;
 | 
				
			||||||
 | 
					    } ctbCfg;
 | 
				
			||||||
 | 
					    struct {
 | 
				
			||||||
 | 
					      uint32_t nCols;
 | 
				
			||||||
 | 
					      SSchema* pSchema;
 | 
				
			||||||
 | 
					    } ntbCfg;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					} SVCreateTbReq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static FORCE_INLINE int tSerializeSVCreateTbReq(void** buf, const SVCreateTbReq* pReq) {
 | 
				
			||||||
 | 
					  int tlen = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tlen += taosEncodeFixedU64(buf, pReq->ver);
 | 
				
			||||||
 | 
					  tlen += taosEncodeString(buf, pReq->name);
 | 
				
			||||||
 | 
					  tlen += taosEncodeFixedU32(buf, pReq->ttl);
 | 
				
			||||||
 | 
					  tlen += taosEncodeFixedU32(buf, pReq->keep);
 | 
				
			||||||
 | 
					  tlen += taosEncodeFixedU8(buf, pReq->type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  switch (pReq->type) {
 | 
				
			||||||
 | 
					    case TD_SUPER_TABLE:
 | 
				
			||||||
 | 
					      tlen += taosEncodeFixedU64(buf, pReq->stbCfg.suid);
 | 
				
			||||||
 | 
					      tlen += taosEncodeFixedU32(buf, pReq->stbCfg.nCols);
 | 
				
			||||||
 | 
					      for (uint32_t i = 0; i < pReq->stbCfg.nCols; i++) {
 | 
				
			||||||
 | 
					        tlen += taosEncodeFixedI8(buf, pReq->stbCfg.pSchema[i].type);
 | 
				
			||||||
 | 
					        tlen += taosEncodeFixedI32(buf, pReq->stbCfg.pSchema[i].colId);
 | 
				
			||||||
 | 
					        tlen += taosEncodeFixedI32(buf, pReq->stbCfg.pSchema[i].bytes);
 | 
				
			||||||
 | 
					        tlen += taosEncodeString(buf, pReq->stbCfg.pSchema[i].name);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      tlen += taosEncodeFixedU32(buf, pReq->stbCfg.nTagCols);
 | 
				
			||||||
 | 
					      for (uint32_t i = 0; i < pReq->stbCfg.nTagCols; i++) {
 | 
				
			||||||
 | 
					        tlen += taosEncodeFixedI8(buf, pReq->stbCfg.pTagSchema[i].type);
 | 
				
			||||||
 | 
					        tlen += taosEncodeFixedI32(buf, pReq->stbCfg.pTagSchema[i].colId);
 | 
				
			||||||
 | 
					        tlen += taosEncodeFixedI32(buf, pReq->stbCfg.pTagSchema[i].bytes);
 | 
				
			||||||
 | 
					        tlen += taosEncodeString(buf, pReq->stbCfg.pTagSchema[i].name);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case TD_CHILD_TABLE:
 | 
				
			||||||
 | 
					      tlen += taosEncodeFixedU64(buf, pReq->ctbCfg.suid);
 | 
				
			||||||
 | 
					      tlen += tdEncodeKVRow(buf, pReq->ctbCfg.pTag);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case TD_NORMAL_TABLE:
 | 
				
			||||||
 | 
					      tlen += taosEncodeFixedU32(buf, pReq->ntbCfg.nCols);
 | 
				
			||||||
 | 
					      for (uint32_t i = 0; i < pReq->ntbCfg.nCols; i++) {
 | 
				
			||||||
 | 
					        tlen += taosEncodeFixedI8(buf, pReq->ntbCfg.pSchema[i].type);
 | 
				
			||||||
 | 
					        tlen += taosEncodeFixedI32(buf, pReq->ntbCfg.pSchema[i].colId);
 | 
				
			||||||
 | 
					        tlen += taosEncodeFixedI32(buf, pReq->ntbCfg.pSchema[i].bytes);
 | 
				
			||||||
 | 
					        tlen += taosEncodeString(buf, pReq->ntbCfg.pSchema[i].name);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					      ASSERT(0);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return tlen;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static FORCE_INLINE void* tDeserializeSVCreateTbReq(void* buf, SVCreateTbReq* pReq) {
 | 
				
			||||||
 | 
					  buf = taosDecodeFixedU64(buf, &(pReq->ver));
 | 
				
			||||||
 | 
					  buf = taosDecodeString(buf, &(pReq->name));
 | 
				
			||||||
 | 
					  buf = taosDecodeFixedU32(buf, &(pReq->ttl));
 | 
				
			||||||
 | 
					  buf = taosDecodeFixedU32(buf, &(pReq->keep));
 | 
				
			||||||
 | 
					  buf = taosDecodeFixedU8(buf, &(pReq->type));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  switch (pReq->type) {
 | 
				
			||||||
 | 
					    case TD_SUPER_TABLE:
 | 
				
			||||||
 | 
					      buf = taosDecodeFixedU64(buf, &(pReq->stbCfg.suid));
 | 
				
			||||||
 | 
					      buf = taosDecodeFixedU32(buf, &(pReq->stbCfg.nCols));
 | 
				
			||||||
 | 
					      pReq->stbCfg.pSchema = (SSchema*)malloc(pReq->stbCfg.nCols * sizeof(SSchema));
 | 
				
			||||||
 | 
					      for (uint32_t i = 0; i < pReq->stbCfg.nCols; i++) {
 | 
				
			||||||
 | 
					        buf = taosDecodeFixedI8(buf, &(pReq->stbCfg.pSchema[i].type));
 | 
				
			||||||
 | 
					        buf = taosDecodeFixedI32(buf, &(pReq->stbCfg.pSchema[i].colId));
 | 
				
			||||||
 | 
					        buf = taosDecodeFixedI32(buf, &(pReq->stbCfg.pSchema[i].bytes));
 | 
				
			||||||
 | 
					        buf = taosDecodeStringTo(buf, pReq->stbCfg.pSchema[i].name);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      buf = taosDecodeFixedU32(buf, &pReq->stbCfg.nTagCols);
 | 
				
			||||||
 | 
					      pReq->stbCfg.pTagSchema = (SSchema*)malloc(pReq->stbCfg.nTagCols * sizeof(SSchema));
 | 
				
			||||||
 | 
					      for (uint32_t i = 0; i < pReq->stbCfg.nTagCols; i++) {
 | 
				
			||||||
 | 
					        buf = taosDecodeFixedI8(buf, &(pReq->stbCfg.pTagSchema[i].type));
 | 
				
			||||||
 | 
					        buf = taosDecodeFixedI32(buf, &pReq->stbCfg.pTagSchema[i].colId);
 | 
				
			||||||
 | 
					        buf = taosDecodeFixedI32(buf, &pReq->stbCfg.pTagSchema[i].bytes);
 | 
				
			||||||
 | 
					        buf = taosDecodeStringTo(buf, pReq->stbCfg.pTagSchema[i].name);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case TD_CHILD_TABLE:
 | 
				
			||||||
 | 
					      buf = taosDecodeFixedU64(buf, &pReq->ctbCfg.suid);
 | 
				
			||||||
 | 
					      buf = tdDecodeKVRow(buf, &pReq->ctbCfg.pTag);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case TD_NORMAL_TABLE:
 | 
				
			||||||
 | 
					      buf = taosDecodeFixedU32(buf, &pReq->ntbCfg.nCols);
 | 
				
			||||||
 | 
					      pReq->ntbCfg.pSchema = (SSchema*)malloc(pReq->ntbCfg.nCols * sizeof(SSchema));
 | 
				
			||||||
 | 
					      for (uint32_t i = 0; i < pReq->ntbCfg.nCols; i++) {
 | 
				
			||||||
 | 
					        buf = taosDecodeFixedI8(buf, &pReq->ntbCfg.pSchema[i].type);
 | 
				
			||||||
 | 
					        buf = taosDecodeFixedI32(buf, &pReq->ntbCfg.pSchema[i].colId);
 | 
				
			||||||
 | 
					        buf = taosDecodeFixedI32(buf, &pReq->ntbCfg.pSchema[i].bytes);
 | 
				
			||||||
 | 
					        buf = taosDecodeStringTo(buf, pReq->ntbCfg.pSchema[i].name);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					      ASSERT(0);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					typedef struct SVCreateTbRsp {
 | 
				
			||||||
 | 
					} SVCreateTbRsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack(pop)
 | 
					#pragma pack(pop)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,157 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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/>.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					#undef TD_MSG_INFO_
 | 
				
			||||||
 | 
					#undef TD_MSG_NUMBER_
 | 
				
			||||||
 | 
					#undef TD_MSG_DICT_
 | 
				
			||||||
 | 
					#undef TD_MSG_SEG_CODE_
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(TD_MSG_INFO_)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef TD_NEW_MSG_SEG
 | 
				
			||||||
 | 
					#undef TD_DEF_MSG_TYPE
 | 
				
			||||||
 | 
					#define TD_NEW_MSG_SEG(TYPE) "null",
 | 
				
			||||||
 | 
					#define TD_DEF_MSG_TYPE(TYPE, MSG, REQ, RSP) MSG, MSG "-rsp",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *tMsgInfo[] = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#elif defined(TD_MSG_NUMBER_)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef TD_NEW_MSG_SEG
 | 
				
			||||||
 | 
					#undef TD_DEF_MSG_TYPE
 | 
				
			||||||
 | 
					#define TD_NEW_MSG_SEG(TYPE) TYPE##_NUM,
 | 
				
			||||||
 | 
					#define TD_DEF_MSG_TYPE(TYPE, MSG, REQ, RSP) TYPE##_NUM, TYPE##_RSP_NUM,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#elif defined(TD_MSG_DICT_)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef TD_NEW_MSG_SEG
 | 
				
			||||||
 | 
					#undef TD_DEF_MSG_TYPE
 | 
				
			||||||
 | 
					#define TD_NEW_MSG_SEG(TYPE) TYPE##_NUM,
 | 
				
			||||||
 | 
					#define TD_DEF_MSG_TYPE(TYPE, MSG, REQ, RSP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int tMsgDict[] = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#elif defined(TD_MSG_SEG_CODE_)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef TD_NEW_MSG_SEG
 | 
				
			||||||
 | 
					#undef TD_DEF_MSG_TYPE
 | 
				
			||||||
 | 
					#define TD_NEW_MSG_SEG(TYPE) TYPE##_SEG_CODE,
 | 
				
			||||||
 | 
					#define TD_DEF_MSG_TYPE(TYPE, MSG, REQ, RSP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef TD_NEW_MSG_SEG
 | 
				
			||||||
 | 
					#undef TD_DEF_MSG_TYPE
 | 
				
			||||||
 | 
					#define TD_NEW_MSG_SEG(TYPE) TYPE = ((TYPE##_SEG_CODE) << 8),
 | 
				
			||||||
 | 
					#define TD_DEF_MSG_TYPE(TYPE, MSG, REQ, RSP) TYPE, TYPE##_RSP,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  // Requests handled by DNODE
 | 
				
			||||||
 | 
					  TD_NEW_MSG_SEG(TDMT_DND_MSG)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_DND_NETWORK_TEST, "dnode-nettest", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_DND_CREATE_VNODE, "dnode-create-vnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_DND_ALTER_VNODE, "dnode-alter-vnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_DND_DROP_VNODE, "dnode-drop-vnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_DND_AUTH_VNODE, "dnode-auth-vnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_DND_SYNC_VNODE, "dnode-sync-vnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_DND_COMPACT_VNODE, "dnode-compact-vnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_DND_CREATE_MNODE, "dnode-create-mnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_DND_ALTER_MNODE, "dnode-alter-mnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_DND_DROP_MNODE, "dnode-drop-mnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_DND_CONFIG_DNODE, "dnode-config-dnode", NULL, NULL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Requests handled by MNODE
 | 
				
			||||||
 | 
					  TD_NEW_MSG_SEG(TDMT_MND_MSG)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_CONNECT, "mnode-connect", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_CREATE_TABLE, "mnode-create-table", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_DROP_TABLE, "mnode-drop-table", NULL, NULL)	
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_CREATE_ACCT, "mnode-create-acct", NULL, NULL)	
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_ALTER_ACCT, "mnode-alter-acct", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_DROP_ACCT, "mnode-drop-acct", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_CREATE_USER, "mnode-create-user", NULL, NULL)	
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_ALTER_USER, "mnode-alter-user", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_DROP_USER, "mnode-drop-user", NULL, NULL) 
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_CREATE_DNODE, "mnode-create-dnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_CONFIG_DNODE, "mnode-config-dnode", NULL, NULL) 
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_DROP_DNODE, "mnode-drop-dnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_CREATE_MNODE, "mnode-create-mnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_DROP_MNODE, "mnode-drop-mnode", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_CREATE_DB, "mnode-create-db", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_DROP_DB, "mnode-drop-db", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_USE_DB, "mnode-use-db", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_ALTER_DB, "mnode-alter-db", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_SYNC_DB, "mnode-sync-db", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_COMPACT_DB, "mnode-compact-db", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_CREATE_FUNCTION, "mnode-create-function", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_RETRIEVE_FUNCTION, "mnode-retrieve-function", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_DROP_FUNCTION, "mnode-drop-function", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_CREATE_STB, "mnode-create-stb", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_ALTER_STB, "mnode-alter-stb", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_DROP_STB, "mnode-drop-stb", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_VGROUP_LIST, "mnode-vgroup-list", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_KILL_QUERY, "mnode-kill-query", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_KILL_CONN, "mnode-kill-conn", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_HEARTBEAT, "mnode-heartbeat", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_SHOW, "mnode-show", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_SHOW_RETRIEVE, "mnode-retrieve", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_STATUS, "mnode-status", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_GRANT, "mnode-grant", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_AUTH, "mnode-auth", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_CREATE_TOPIC, "mnode-create-topic", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_ALTER_TOPIC, "mnode-alter-topic", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_MND_DROP_TOPIC, "mnode-drop-topic", NULL, NULL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Requests handled by VNODE
 | 
				
			||||||
 | 
					  TD_NEW_MSG_SEG(TDMT_VND_MSG)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_SUBMIT, "vnode-submit", SSubmitReq, SSubmitRsp)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_QUERY, "vnode-query", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_FETCH, "vnode-fetch", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_ALTER_TABLE, "vnode-alter-table", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_UPDATE_TAG_VAL, "vnode-update-tag-val", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_TABLE_META, "vnode-table-meta", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_TABLES_META, "vnode-tables-meta", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_MQ_CONSUME, "vnode-mq-consume", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_MQ_QUERY, "vnode-mq-query", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_MQ_CONNECT, "vnode-mq-connect", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_MQ_DISCONNECT, "vnode-mq-disconnect", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_MQ_SET_CUR, "vnode-mq-set-cur", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_RES_READY, "vnode-res-ready", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_TASKS_STATUS, "vnode-tasks-status", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_CANCEL_TASK, "vnode-cancel-task", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_DROP_TASK, "vnode-drop-task", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_CREATE_STB, "vnode-create-super-table", SVCreateTbReq, SVCreateTbRsp)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_ALTER_STB, "vnode-alter-stb", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_DROP_STB, "vnode-drop-stb", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_CREATE_TOPIC, "vnode-create-topic", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_ALTER_TOPIC, "vnode-alter-topic", NULL, NULL)
 | 
				
			||||||
 | 
					  TD_DEF_MSG_TYPE(TDMT_VND_DROP_TOPIC, "vnode-drop-topic", NULL, NULL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Requests handled by QNODE
 | 
				
			||||||
 | 
					  TD_NEW_MSG_SEG(TDMT_QND_MSG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Requests handled by SNODE
 | 
				
			||||||
 | 
					  TD_NEW_MSG_SEG(TDMT_SND_MSG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(TD_MSG_NUMBER_)
 | 
				
			||||||
 | 
					  TDMT_MAX
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -16,18 +16,22 @@
 | 
				
			||||||
#ifndef TDENGINE_TNAME_H
 | 
					#ifndef TDENGINE_TNAME_H
 | 
				
			||||||
#define TDENGINE_TNAME_H
 | 
					#define TDENGINE_TNAME_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "tdef.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_DB_NAME_T     1
 | 
					#define TSDB_DB_NAME_T     1
 | 
				
			||||||
#define TSDB_TABLE_NAME_T  2
 | 
					#define TSDB_TABLE_NAME_T  2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define T_NAME_ACCT        0x1u
 | 
					#define T_NAME_ACCT        0x1u
 | 
				
			||||||
#define T_NAME_DB          0x2u
 | 
					#define T_NAME_DB          0x2u
 | 
				
			||||||
#define T_NAME_TABLE       0x4u
 | 
					#define T_NAME_TABLE       0x4u
 | 
				
			||||||
 | 
					#define T_NAME_TOPIC       0x8u
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SName {
 | 
					typedef struct SName {
 | 
				
			||||||
  uint8_t type;  //db_name_t, table_name_t
 | 
					  uint8_t type;  //db_name_t, table_name_t
 | 
				
			||||||
  int32_t acctId;
 | 
					  int32_t acctId;
 | 
				
			||||||
  char    dbname[TSDB_DB_NAME_LEN];
 | 
					  char    dbname[TSDB_DB_NAME_LEN];
 | 
				
			||||||
  char    tname[TSDB_TABLE_NAME_LEN];
 | 
					  char    tname[TSDB_TABLE_NAME_LEN];
 | 
				
			||||||
 | 
					  char    topicName[TSDB_TOPIC_NAME_LEN];
 | 
				
			||||||
} SName;
 | 
					} SName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32_t tNameExtractFullName(const SName* name, char* dst);
 | 
					int32_t tNameExtractFullName(const SName* name, char* dst);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,7 +21,7 @@ extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "taosdef.h"
 | 
					#include "taosdef.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TIME_IS_VAR_DURATION(_t) ((_t) == 'n' || (_t) == 'y' || (_t) == 'N' || (_t) == 'Y')
 | 
					#define TIME_IS_VAR_DURATION(_t) ((_t) == 'n' || (_t) == 'y' || (_t) == 'N' || (_t) == 'Y')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,6 @@ typedef struct SMnodeMsg SMnodeMsg;
 | 
				
			||||||
typedef void (*SendMsgToDnodeFp)(SDnode *pDnode, struct SEpSet *epSet, struct SRpcMsg *rpcMsg);
 | 
					typedef void (*SendMsgToDnodeFp)(SDnode *pDnode, struct SEpSet *epSet, struct SRpcMsg *rpcMsg);
 | 
				
			||||||
typedef void (*SendMsgToMnodeFp)(SDnode *pDnode, struct SRpcMsg *rpcMsg);
 | 
					typedef void (*SendMsgToMnodeFp)(SDnode *pDnode, struct SRpcMsg *rpcMsg);
 | 
				
			||||||
typedef void (*SendRedirectMsgFp)(SDnode *pDnode, struct SRpcMsg *rpcMsg);
 | 
					typedef void (*SendRedirectMsgFp)(SDnode *pDnode, struct SRpcMsg *rpcMsg);
 | 
				
			||||||
typedef int32_t (*PutMsgToMnodeQFp)(SDnode *pDnode, SMnodeMsg *pMsg);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SMnodeLoad {
 | 
					typedef struct SMnodeLoad {
 | 
				
			||||||
  int64_t numOfDnode;
 | 
					  int64_t numOfDnode;
 | 
				
			||||||
| 
						 | 
					@ -63,7 +62,6 @@ typedef struct {
 | 
				
			||||||
  SReplica          replicas[TSDB_MAX_REPLICA];
 | 
					  SReplica          replicas[TSDB_MAX_REPLICA];
 | 
				
			||||||
  SMnodeCfg         cfg;
 | 
					  SMnodeCfg         cfg;
 | 
				
			||||||
  SDnode           *pDnode;
 | 
					  SDnode           *pDnode;
 | 
				
			||||||
  PutMsgToMnodeQFp  putMsgToApplyMsgFp;
 | 
					 | 
				
			||||||
  SendMsgToDnodeFp  sendMsgToDnodeFp;
 | 
					  SendMsgToDnodeFp  sendMsgToDnodeFp;
 | 
				
			||||||
  SendMsgToMnodeFp  sendMsgToMnodeFp;
 | 
					  SendMsgToMnodeFp  sendMsgToMnodeFp;
 | 
				
			||||||
  SendRedirectMsgFp sendRedirectMsgFp;
 | 
					  SendRedirectMsgFp sendRedirectMsgFp;
 | 
				
			||||||
| 
						 | 
					@ -172,14 +170,6 @@ void mndProcessWriteMsg(SMnodeMsg *pMsg);
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void mndProcessSyncMsg(SMnodeMsg *pMsg);
 | 
					void mndProcessSyncMsg(SMnodeMsg *pMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief Process the apply request.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @param pMsg The request msg.
 | 
					 | 
				
			||||||
 * @return int32_t 0 for success, -1 for failure.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
void mndProcessApplyMsg(SMnodeMsg *pMsg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,8 @@
 | 
				
			||||||
#ifndef _TD_SDB_H_
 | 
					#ifndef _TD_SDB_H_
 | 
				
			||||||
#define _TD_SDB_H_
 | 
					#define _TD_SDB_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "os.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -159,11 +161,12 @@ typedef enum {
 | 
				
			||||||
  SDB_USER = 5,
 | 
					  SDB_USER = 5,
 | 
				
			||||||
  SDB_AUTH = 6,
 | 
					  SDB_AUTH = 6,
 | 
				
			||||||
  SDB_ACCT = 7,
 | 
					  SDB_ACCT = 7,
 | 
				
			||||||
  SDB_VGROUP = 8,
 | 
					  SDB_TOPIC = 8,
 | 
				
			||||||
  SDB_STB = 9,
 | 
					  SDB_VGROUP = 9,
 | 
				
			||||||
  SDB_DB = 10,
 | 
					  SDB_STB = 10,
 | 
				
			||||||
  SDB_FUNC = 11,
 | 
					  SDB_DB = 11,
 | 
				
			||||||
  SDB_MAX = 12
 | 
					  SDB_FUNC = 12,
 | 
				
			||||||
 | 
					  SDB_MAX = 13
 | 
				
			||||||
} ESdbType;
 | 
					} ESdbType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SSdb SSdb;
 | 
					typedef struct SSdb SSdb;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,13 +19,13 @@
 | 
				
			||||||
#include "mallocator.h"
 | 
					#include "mallocator.h"
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
#include "trow.h"
 | 
					#include "trow.h"
 | 
				
			||||||
 | 
					#include "tmsg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Types exported
 | 
					// Types exported
 | 
				
			||||||
typedef uint64_t     tb_uid_t;
 | 
					 | 
				
			||||||
typedef struct SMeta SMeta;
 | 
					typedef struct SMeta SMeta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define META_SUPER_TABLE 0
 | 
					#define META_SUPER_TABLE 0
 | 
				
			||||||
| 
						 | 
					@ -37,39 +37,7 @@ typedef struct SMetaCfg {
 | 
				
			||||||
  uint64_t lruSize;
 | 
					  uint64_t lruSize;
 | 
				
			||||||
} SMetaCfg;
 | 
					} SMetaCfg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct STbCfg {
 | 
					typedef SVCreateTbReq STbCfg;
 | 
				
			||||||
  /// name of the table
 | 
					 | 
				
			||||||
  char *name;
 | 
					 | 
				
			||||||
  /// time to live of the table
 | 
					 | 
				
			||||||
  uint32_t ttl;
 | 
					 | 
				
			||||||
  /// keep time of this table
 | 
					 | 
				
			||||||
  uint32_t keep;
 | 
					 | 
				
			||||||
  /// type of table
 | 
					 | 
				
			||||||
  uint8_t type;
 | 
					 | 
				
			||||||
  union {
 | 
					 | 
				
			||||||
    /// super table configurations
 | 
					 | 
				
			||||||
    struct {
 | 
					 | 
				
			||||||
      /// super table UID
 | 
					 | 
				
			||||||
      tb_uid_t suid;
 | 
					 | 
				
			||||||
      /// row schema
 | 
					 | 
				
			||||||
      STSchema *pSchema;
 | 
					 | 
				
			||||||
      /// tag schema
 | 
					 | 
				
			||||||
      STSchema *pTagSchema;
 | 
					 | 
				
			||||||
    } stbCfg;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /// normal table configuration
 | 
					 | 
				
			||||||
    struct {
 | 
					 | 
				
			||||||
      /// row schema
 | 
					 | 
				
			||||||
      STSchema *pSchema;
 | 
					 | 
				
			||||||
    } ntbCfg;
 | 
					 | 
				
			||||||
    /// child table configuration
 | 
					 | 
				
			||||||
    struct {
 | 
					 | 
				
			||||||
      /// super table UID
 | 
					 | 
				
			||||||
      tb_uid_t suid;
 | 
					 | 
				
			||||||
      SKVRow   pTag;
 | 
					 | 
				
			||||||
    } ctbCfg;
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
} STbCfg;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SMeta operations
 | 
					// SMeta operations
 | 
				
			||||||
SMeta *metaOpen(const char *path, const SMetaCfg *pMetaCfg, SMemAllocatorFactory *pMAF);
 | 
					SMeta *metaOpen(const char *path, const SMetaCfg *pMetaCfg, SMemAllocatorFactory *pMAF);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@
 | 
				
			||||||
#include "mallocator.h"
 | 
					#include "mallocator.h"
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
#include "taoserror.h"
 | 
					#include "taoserror.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tlist.h"
 | 
					#include "tlist.h"
 | 
				
			||||||
#include "trpc.h"
 | 
					#include "trpc.h"
 | 
				
			||||||
#include "ttimer.h"
 | 
					#include "ttimer.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -246,8 +246,8 @@ static FORCE_INLINE void vnodeSetCreateNtbReq(SVnodeReq *pReq, char *name, uint3
 | 
				
			||||||
  pReq->ctReq.ntbCfg.pSchema = pSchema;
 | 
					  pReq->ctReq.ntbCfg.pSchema = pSchema;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int   vnodeBuildReq(void **buf, const SVnodeReq *pReq, uint8_t type);
 | 
					int   vnodeBuildReq(void **buf, const SVnodeReq *pReq, tmsg_t type);
 | 
				
			||||||
void *vnodeParseReq(void *buf, SVnodeReq *pReq, uint8_t type);
 | 
					void *vnodeParseReq(void *buf, SVnodeReq *pReq, tmsg_t type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ------------------------ FOR COMPILE ------------------------ */
 | 
					/* ------------------------ FOR COMPILE ------------------------ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@ extern "C" {
 | 
				
			||||||
#include "taosdef.h"
 | 
					#include "taosdef.h"
 | 
				
			||||||
#include "transport.h"
 | 
					#include "transport.h"
 | 
				
			||||||
#include "common.h"
 | 
					#include "common.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "query.h"
 | 
					#include "query.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct SCatalog;
 | 
					struct SCatalog;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,7 +44,9 @@ typedef struct SParseContext {
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int32_t qParseQuerySql(SParseContext* pContext, SQueryNode** pQuery);
 | 
					int32_t qParseQuerySql(SParseContext* pContext, SQueryNode** pQuery);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool qIsDclQuery(const SQueryNode* pQuery);
 | 
					bool qIsDdlQuery(const SQueryNode* pQuery);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void qDestoryQuery(SQueryNode* pQuery);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Convert a normal sql statement to only query tags information to enable that the subscribe client can be aware quickly of the true vgroup ids that
 | 
					 * Convert a normal sql statement to only query tags information to enable that the subscribe client can be aware quickly of the true vgroup ids that
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define QUERY_TYPE_MERGE       1
 | 
					#define QUERY_TYPE_MERGE       1
 | 
				
			||||||
#define QUERY_TYPE_PARTIAL     2
 | 
					#define QUERY_TYPE_PARTIAL     2
 | 
				
			||||||
| 
						 | 
					@ -139,7 +139,7 @@ struct SQueryNode;
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Create the physical plan for the query, according to the AST.
 | 
					 * Create the physical plan for the query, according to the AST.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int32_t qCreateQueryDag(const struct SQueryNode* pQueryInfo, struct SEpSet* pQnode, struct SQueryDag** pDag);
 | 
					int32_t qCreateQueryDag(const struct SQueryNode* pQueryInfo, struct SQueryDag** pDag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Set datasource of this subplan, multiple calls may be made to a subplan.
 | 
					// Set datasource of this subplan, multiple calls may be made to a subplan.
 | 
				
			||||||
// @subplan subplan to be schedule
 | 
					// @subplan subplan to be schedule
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -112,8 +112,8 @@ int32_t taosAsyncExec(__async_exec_fn_t execFn, void* execParam, int32_t* code);
 | 
				
			||||||
SSchema* tGetTbnameColumnSchema();
 | 
					SSchema* tGetTbnameColumnSchema();
 | 
				
			||||||
void initQueryModuleMsgHandle();
 | 
					void initQueryModuleMsgHandle();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int32_t (*queryBuildMsg[TSDB_MSG_TYPE_MAX])(void* input, char **msg, int32_t msgSize, int32_t *msgLen);
 | 
					extern int32_t (*queryBuildMsg[TDMT_MAX])(void* input, char **msg, int32_t msgSize, int32_t *msgLen);
 | 
				
			||||||
extern int32_t (*queryProcessMsgRsp[TSDB_MSG_TYPE_MAX])(void* output, char *msg, int32_t msgSize);
 | 
					extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char *msg, int32_t msgSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define qFatal(...)  do { if (qDebugFlag & DEBUG_FATAL) { taosPrintLog("QRY FATAL ", qDebugFlag, __VA_ARGS__); }} while(0)
 | 
					#define qFatal(...)  do { if (qDebugFlag & DEBUG_FATAL) { taosPrintLog("QRY FATAL ", qDebugFlag, __VA_ARGS__); }} while(0)
 | 
				
			||||||
#define qError(...)  do { if (qDebugFlag & DEBUG_ERROR) { taosPrintLog("QRY ERROR ", qDebugFlag, __VA_ARGS__); }} while(0)
 | 
					#define qError(...)  do { if (qDebugFlag & DEBUG_ERROR) { taosPrintLog("QRY ERROR ", qDebugFlag, __VA_ARGS__); }} while(0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,43 +22,43 @@ extern "C" {
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include "taosdef.h"
 | 
					#include "taosdef.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TAOS_CONN_SERVER   0
 | 
					#define TAOS_CONN_SERVER 0
 | 
				
			||||||
#define TAOS_CONN_CLIENT   1
 | 
					#define TAOS_CONN_CLIENT 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int tsRpcHeadSize;
 | 
					extern int tsRpcHeadSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SRpcConnInfo {
 | 
					typedef struct SRpcConnInfo {
 | 
				
			||||||
  uint32_t  clientIp;
 | 
					  uint32_t clientIp;
 | 
				
			||||||
  uint16_t  clientPort;
 | 
					  uint16_t clientPort;
 | 
				
			||||||
  uint32_t  serverIp;
 | 
					  uint32_t serverIp;
 | 
				
			||||||
  char      user[TSDB_USER_LEN];
 | 
					  char     user[TSDB_USER_LEN];
 | 
				
			||||||
} SRpcConnInfo;
 | 
					} SRpcConnInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SRpcMsg {
 | 
					typedef struct SRpcMsg {
 | 
				
			||||||
  uint8_t msgType;
 | 
					  tmsg_t  msgType;
 | 
				
			||||||
  void   *pCont;
 | 
					  void *  pCont;
 | 
				
			||||||
  int     contLen;
 | 
					  int     contLen;
 | 
				
			||||||
  int32_t code;
 | 
					  int32_t code;
 | 
				
			||||||
  void   *handle;   // rpc handle returned to app
 | 
					  void *  handle;   // rpc handle returned to app
 | 
				
			||||||
  void   *ahandle;  // app handle set by client
 | 
					  void *  ahandle;  // app handle set by client
 | 
				
			||||||
} SRpcMsg;
 | 
					} SRpcMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SRpcInit {
 | 
					typedef struct SRpcInit {
 | 
				
			||||||
 uint16_t localPort; // local port
 | 
					  uint16_t localPort;     // local port
 | 
				
			||||||
  char  *label;        // for debug purpose
 | 
					  char *   label;         // for debug purpose
 | 
				
			||||||
  int    numOfThreads; // number of threads to handle connections
 | 
					  int      numOfThreads;  // number of threads to handle connections
 | 
				
			||||||
  int    sessions;     // number of sessions allowed
 | 
					  int      sessions;      // number of sessions allowed
 | 
				
			||||||
  int8_t connType;     // TAOS_CONN_UDP, TAOS_CONN_TCPC, TAOS_CONN_TCPS
 | 
					  int8_t   connType;      // TAOS_CONN_UDP, TAOS_CONN_TCPC, TAOS_CONN_TCPS
 | 
				
			||||||
  int    idleTime;     // milliseconds, 0 means idle timer is disabled
 | 
					  int      idleTime;      // milliseconds, 0 means idle timer is disabled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // the following is for client app ecurity only
 | 
					  // the following is for client app ecurity only
 | 
				
			||||||
  char *user;         // user name
 | 
					  char *user;     // user name
 | 
				
			||||||
  char  spi;          // security parameter index
 | 
					  char  spi;      // security parameter index
 | 
				
			||||||
  char  encrypt;      // encrypt algorithm
 | 
					  char  encrypt;  // encrypt algorithm
 | 
				
			||||||
  char *secret;       // key for authentication
 | 
					  char *secret;   // key for authentication
 | 
				
			||||||
  char *ckey;         // ciphering key
 | 
					  char *ckey;     // ciphering key
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // call back to process incoming msg, code shall be ignored by server app
 | 
					  // call back to process incoming msg, code shall be ignored by server app
 | 
				
			||||||
  void (*cfp)(void *parent, SRpcMsg *, SEpSet *);
 | 
					  void (*cfp)(void *parent, SRpcMsg *, SEpSet *);
 | 
				
			||||||
| 
						 | 
					@ -70,19 +70,19 @@ typedef struct SRpcInit {
 | 
				
			||||||
} SRpcInit;
 | 
					} SRpcInit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32_t rpcInit();
 | 
					int32_t rpcInit();
 | 
				
			||||||
void  rpcCleanup();
 | 
					void    rpcCleanup();
 | 
				
			||||||
void *rpcOpen(const SRpcInit *pRpc);
 | 
					void *  rpcOpen(const SRpcInit *pRpc);
 | 
				
			||||||
void  rpcClose(void *);
 | 
					void    rpcClose(void *);
 | 
				
			||||||
void *rpcMallocCont(int contLen);
 | 
					void *  rpcMallocCont(int contLen);
 | 
				
			||||||
void  rpcFreeCont(void *pCont);
 | 
					void    rpcFreeCont(void *pCont);
 | 
				
			||||||
void *rpcReallocCont(void *ptr, int contLen);
 | 
					void *  rpcReallocCont(void *ptr, int contLen);
 | 
				
			||||||
void  rpcSendRequest(void *thandle, const SEpSet *pEpSet, SRpcMsg *pMsg, int64_t *rid);
 | 
					void    rpcSendRequest(void *thandle, const SEpSet *pEpSet, SRpcMsg *pMsg, int64_t *rid);
 | 
				
			||||||
void  rpcSendResponse(const SRpcMsg *pMsg);
 | 
					void    rpcSendResponse(const SRpcMsg *pMsg);
 | 
				
			||||||
void  rpcSendRedirectRsp(void *pConn, const SEpSet *pEpSet); 
 | 
					void    rpcSendRedirectRsp(void *pConn, const SEpSet *pEpSet);
 | 
				
			||||||
int   rpcGetConnInfo(void *thandle, SRpcConnInfo *pInfo);
 | 
					int     rpcGetConnInfo(void *thandle, SRpcConnInfo *pInfo);
 | 
				
			||||||
void  rpcSendRecv(void *shandle, SEpSet *pEpSet, SRpcMsg *pReq, SRpcMsg *pRsp);
 | 
					void    rpcSendRecv(void *shandle, SEpSet *pEpSet, SRpcMsg *pReq, SRpcMsg *pRsp);
 | 
				
			||||||
int   rpcReportProgress(void *pConn, char *pCont, int contLen);
 | 
					int     rpcReportProgress(void *pConn, char *pCont, int contLen);
 | 
				
			||||||
void  rpcCancelRequest(int64_t rid);
 | 
					void    rpcCancelRequest(int64_t rid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -220,6 +220,7 @@ int32_t* taosGetErrno();
 | 
				
			||||||
#define TSDB_CODE_MND_COLUMN_ALREAY_EXIST       TAOS_DEF_ERROR_CODE(0, 0x03AA)
 | 
					#define TSDB_CODE_MND_COLUMN_ALREAY_EXIST       TAOS_DEF_ERROR_CODE(0, 0x03AA)
 | 
				
			||||||
#define TSDB_CODE_MND_COLUMN_NOT_EXIST          TAOS_DEF_ERROR_CODE(0, 0x03AB)
 | 
					#define TSDB_CODE_MND_COLUMN_NOT_EXIST          TAOS_DEF_ERROR_CODE(0, 0x03AB)
 | 
				
			||||||
#define TSDB_CODE_MND_EXCEED_MAX_ROW_BYTES      TAOS_DEF_ERROR_CODE(0, 0x03AC)
 | 
					#define TSDB_CODE_MND_EXCEED_MAX_ROW_BYTES      TAOS_DEF_ERROR_CODE(0, 0x03AC)
 | 
				
			||||||
 | 
					#define TSDB_CODE_MND_NAME_CONFLICT_WITH_TOPIC  TAOS_DEF_ERROR_CODE(0, 0x03AD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// mnode-func
 | 
					// mnode-func
 | 
				
			||||||
#define TSDB_CODE_MND_FUNC_ALREADY_EXIST        TAOS_DEF_ERROR_CODE(0, 0x03C0)
 | 
					#define TSDB_CODE_MND_FUNC_ALREADY_EXIST        TAOS_DEF_ERROR_CODE(0, 0x03C0)
 | 
				
			||||||
| 
						 | 
					@ -234,6 +235,15 @@ int32_t* taosGetErrno();
 | 
				
			||||||
#define TSDB_CODE_MND_TRANS_ALREADY_EXIST       TAOS_DEF_ERROR_CODE(0, 0x03D0)
 | 
					#define TSDB_CODE_MND_TRANS_ALREADY_EXIST       TAOS_DEF_ERROR_CODE(0, 0x03D0)
 | 
				
			||||||
#define TSDB_CODE_MND_TRANS_NOT_EXIST           TAOS_DEF_ERROR_CODE(0, 0x03D1)
 | 
					#define TSDB_CODE_MND_TRANS_NOT_EXIST           TAOS_DEF_ERROR_CODE(0, 0x03D1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// mnode-topic
 | 
				
			||||||
 | 
					#define TSDB_CODE_MND_TOPIC_ALREADY_EXIST       TAOS_DEF_ERROR_CODE(0, 0x03E0)
 | 
				
			||||||
 | 
					#define TSDB_CODE_MND_TOPIC_NOT_EXIST           TAOS_DEF_ERROR_CODE(0, 0x03E1)
 | 
				
			||||||
 | 
					#define TSDB_CODE_MND_TOO_MANY_TOPICS           TAOS_DEF_ERROR_CODE(0, 0x03E2)
 | 
				
			||||||
 | 
					#define TSDB_CODE_MND_INVALID_TOPIC             TAOS_DEF_ERROR_CODE(0, 0x03E3)
 | 
				
			||||||
 | 
					#define TSDB_CODE_MND_INVALID_TOPIC_OPTION      TAOS_DEF_ERROR_CODE(0, 0x03E4)
 | 
				
			||||||
 | 
					#define TSDB_CODE_MND_TOPIC_OPTION_UNCHNAGED    TAOS_DEF_ERROR_CODE(0, 0x03E5)
 | 
				
			||||||
 | 
					#define TSDB_CODE_MND_NAME_CONFLICT_WITH_STB    TAOS_DEF_ERROR_CODE(0, 0x03E6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// dnode
 | 
					// dnode
 | 
				
			||||||
#define TSDB_CODE_DND_ACTION_IN_PROGRESS        TAOS_DEF_ERROR_CODE(0, 0x0400)
 | 
					#define TSDB_CODE_DND_ACTION_IN_PROGRESS        TAOS_DEF_ERROR_CODE(0, 0x0400)
 | 
				
			||||||
#define TSDB_CODE_DND_EXITING                   TAOS_DEF_ERROR_CODE(0, 0x0401)
 | 
					#define TSDB_CODE_DND_EXITING                   TAOS_DEF_ERROR_CODE(0, 0x0401)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -357,6 +357,17 @@ static FORCE_INLINE void *taosDecodeString(void *buf, char **value) {
 | 
				
			||||||
  return POINTER_SHIFT(buf, size);
 | 
					  return POINTER_SHIFT(buf, size);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static FORCE_INLINE void *taosDecodeStringTo(void *buf, char *value) {
 | 
				
			||||||
 | 
					  uint64_t size = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  buf = taosDecodeVariantU64(buf, &size);
 | 
				
			||||||
 | 
					  memcpy(value, buf, (size_t)size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  value[size] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return POINTER_SHIFT(buf, size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -163,6 +163,7 @@ do { \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_NODE_NAME_LEN        64
 | 
					#define TSDB_NODE_NAME_LEN        64
 | 
				
			||||||
#define TSDB_TABLE_NAME_LEN       193     // it is a null-terminated string
 | 
					#define TSDB_TABLE_NAME_LEN       193     // it is a null-terminated string
 | 
				
			||||||
 | 
					#define TSDB_TOPIC_NAME_LEN       193     // it is a null-terminated string
 | 
				
			||||||
#define TSDB_DB_NAME_LEN          65
 | 
					#define TSDB_DB_NAME_LEN          65
 | 
				
			||||||
#define TSDB_FULL_DB_NAME_LEN     (TSDB_ACCT_ID_LEN + TSDB_DB_NAME_LEN)
 | 
					#define TSDB_FULL_DB_NAME_LEN     (TSDB_ACCT_ID_LEN + TSDB_DB_NAME_LEN)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -175,6 +176,7 @@ do { \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_TYPE_STR_MAX_LEN     32
 | 
					#define TSDB_TYPE_STR_MAX_LEN     32
 | 
				
			||||||
#define TSDB_TABLE_FNAME_LEN      (TSDB_FULL_DB_NAME_LEN + TSDB_TABLE_NAME_LEN)
 | 
					#define TSDB_TABLE_FNAME_LEN      (TSDB_FULL_DB_NAME_LEN + TSDB_TABLE_NAME_LEN)
 | 
				
			||||||
 | 
					#define TSDB_TOPIC_FNAME_LEN      TSDB_TABLE_FNAME_LEN
 | 
				
			||||||
#define TSDB_COL_NAME_LEN         65
 | 
					#define TSDB_COL_NAME_LEN         65
 | 
				
			||||||
#define TSDB_MAX_SAVED_SQL_LEN    TSDB_MAX_COLUMNS * 64
 | 
					#define TSDB_MAX_SAVED_SQL_LEN    TSDB_MAX_COLUMNS * 64
 | 
				
			||||||
#define TSDB_MAX_SQL_LEN          TSDB_PAYLOAD_SIZE
 | 
					#define TSDB_MAX_SQL_LEN          TSDB_PAYLOAD_SIZE
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ target_include_directories(
 | 
				
			||||||
target_link_libraries(
 | 
					target_link_libraries(
 | 
				
			||||||
    taos
 | 
					    taos
 | 
				
			||||||
    INTERFACE api
 | 
					    INTERFACE api
 | 
				
			||||||
    PRIVATE os util common transport parser catalog function qcom
 | 
					    PRIVATE os util common transport parser planner catalog scheduler function qcom
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ADD_SUBDIRECTORY(test)
 | 
					ADD_SUBDIRECTORY(test)
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@ extern "C" {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "taos.h"
 | 
					#include "taos.h"
 | 
				
			||||||
#include "common.h"
 | 
					#include "common.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tdef.h"
 | 
					#include "tdef.h"
 | 
				
			||||||
#include "tep.h"
 | 
					#include "tep.h"
 | 
				
			||||||
#include "thash.h"
 | 
					#include "thash.h"
 | 
				
			||||||
| 
						 | 
					@ -121,6 +121,7 @@ typedef struct SRequestObj {
 | 
				
			||||||
  STscObj         *pTscObj;
 | 
					  STscObj         *pTscObj;
 | 
				
			||||||
  SQueryExecMetric metric;
 | 
					  SQueryExecMetric metric;
 | 
				
			||||||
  char            *sqlstr;  // sql string
 | 
					  char            *sqlstr;  // sql string
 | 
				
			||||||
 | 
					  int32_t          sqlLen;
 | 
				
			||||||
  SRequestSendRecvBody     body;
 | 
					  SRequestSendRecvBody     body;
 | 
				
			||||||
  int64_t          self;
 | 
					  int64_t          self;
 | 
				
			||||||
  char            *msgBuf;
 | 
					  char            *msgBuf;
 | 
				
			||||||
| 
						 | 
					@ -140,7 +141,7 @@ extern int32_t    tscReqRef;
 | 
				
			||||||
extern int32_t    tscConnRef;
 | 
					extern int32_t    tscConnRef;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SRequestMsgBody buildRequestMsgImpl(SRequestObj *pRequest);
 | 
					SRequestMsgBody buildRequestMsgImpl(SRequestObj *pRequest);
 | 
				
			||||||
extern int (*handleRequestRspFp[TSDB_MSG_TYPE_MAX])(SRequestObj *pRequest, const char* pMsg, int32_t msgLen);
 | 
					extern int (*handleRequestRspFp[TDMT_MAX])(SRequestObj *pRequest, const char* pMsg, int32_t msgLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int   taos_init();
 | 
					int   taos_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@
 | 
				
			||||||
#include "clientLog.h"
 | 
					#include "clientLog.h"
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
#include "query.h"
 | 
					#include "query.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tcache.h"
 | 
					#include "tcache.h"
 | 
				
			||||||
#include "tconfig.h"
 | 
					#include "tconfig.h"
 | 
				
			||||||
#include "tglobal.h"
 | 
					#include "tglobal.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,17 @@
 | 
				
			||||||
#include "tpagedfile.h"
 | 
					#include "tpagedfile.h"
 | 
				
			||||||
#include "tref.h"
 | 
					#include "tref.h"
 | 
				
			||||||
#include "parser.h"
 | 
					#include "parser.h"
 | 
				
			||||||
 | 
					#include "planner.h"
 | 
				
			||||||
 | 
					#include "scheduler.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CHECK_CODE_GOTO(expr, lable) \
 | 
				
			||||||
 | 
					  do { \
 | 
				
			||||||
 | 
					    int32_t code = expr; \
 | 
				
			||||||
 | 
					    if (TSDB_CODE_SUCCESS != code) { \
 | 
				
			||||||
 | 
					      terrno = code; \
 | 
				
			||||||
 | 
					      goto lable; \
 | 
				
			||||||
 | 
					    } \
 | 
				
			||||||
 | 
					  } while (0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t initEpSetFromCfg(const char *firstEp, const char *secondEp, SCorEpSet *pEpSet);
 | 
					static int32_t initEpSetFromCfg(const char *firstEp, const char *secondEp, SCorEpSet *pEpSet);
 | 
				
			||||||
static int32_t buildConnectMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody);
 | 
					static int32_t buildConnectMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody);
 | 
				
			||||||
| 
						 | 
					@ -113,6 +124,94 @@ TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass,
 | 
				
			||||||
  return taosConnectImpl(ip, user, &secretEncrypt[0], db, port, NULL, NULL, *pInst);
 | 
					  return taosConnectImpl(ip, user, &secretEncrypt[0], db, port, NULL, NULL, *pInst);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int32_t buildRequest(STscObj *pTscObj, const char *sql, int sqlLen, SRequestObj** pRequest) {
 | 
				
			||||||
 | 
					  *pRequest = createRequest(pTscObj, NULL, NULL, TSDB_SQL_SELECT);
 | 
				
			||||||
 | 
					  if (*pRequest == NULL) {
 | 
				
			||||||
 | 
					    tscError("failed to malloc sqlObj");
 | 
				
			||||||
 | 
					    return TSDB_CODE_TSC_OUT_OF_MEMORY;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (*pRequest)->sqlstr = malloc(sqlLen + 1);
 | 
				
			||||||
 | 
					  if ((*pRequest)->sqlstr == NULL) {
 | 
				
			||||||
 | 
					    tscError("0x%"PRIx64" failed to prepare sql string buffer", (*pRequest)->self);
 | 
				
			||||||
 | 
					    (*pRequest)->msgBuf = strdup("failed to prepare sql string buffer");
 | 
				
			||||||
 | 
					    return TSDB_CODE_TSC_OUT_OF_MEMORY;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  strntolower((*pRequest)->sqlstr, sql, (int32_t)sqlLen);
 | 
				
			||||||
 | 
					  (*pRequest)->sqlstr[sqlLen] = 0;
 | 
				
			||||||
 | 
					  (*pRequest)->sqlLen = sqlLen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tscDebugL("0x%"PRIx64" SQL: %s", (*pRequest)->requestId, (*pRequest)->sqlstr);
 | 
				
			||||||
 | 
					  return TSDB_CODE_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int32_t parseSql(SRequestObj* pRequest, SQueryNode** pQuery) {
 | 
				
			||||||
 | 
					  SParseContext cxt = {
 | 
				
			||||||
 | 
					    .ctx = {.requestId = pRequest->requestId, .acctId = pRequest->pTscObj->acctId, .db = getConnectionDB(pRequest->pTscObj)},
 | 
				
			||||||
 | 
					    .pSql = pRequest->sqlstr,
 | 
				
			||||||
 | 
					    .sqlLen = pRequest->sqlLen,
 | 
				
			||||||
 | 
					    .pMsg = pRequest->msgBuf,
 | 
				
			||||||
 | 
					    .msgLen = ERROR_MSG_BUF_DEFAULT_SIZE
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  int32_t code = qParseQuerySql(&cxt, pQuery);
 | 
				
			||||||
 | 
					  tfree(cxt.ctx.db);
 | 
				
			||||||
 | 
					  return code;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int32_t execDdlQuery(SRequestObj* pRequest, SQueryNode* pQuery) {
 | 
				
			||||||
 | 
					  SDclStmtInfo* pDcl = (SDclStmtInfo*)pQuery;
 | 
				
			||||||
 | 
					  pRequest->type = pDcl->msgType;
 | 
				
			||||||
 | 
					  pRequest->body.requestMsg = (SReqMsgInfo){.pMsg = pDcl->pMsg, .len = pDcl->msgLen};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SRequestMsgBody body = buildRequestMsgImpl(pRequest);
 | 
				
			||||||
 | 
					  SEpSet* pEpSet = &pRequest->pTscObj->pAppInfo->mgmtEp.epSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (pDcl->msgType == TDMT_MND_CREATE_TABLE) {
 | 
				
			||||||
 | 
					    struct SCatalog* pCatalog = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    char buf[12] = {0};
 | 
				
			||||||
 | 
					    sprintf(buf, "%d", pRequest->pTscObj->pAppInfo->clusterId);
 | 
				
			||||||
 | 
					    int32_t code = catalogGetHandle(buf, &pCatalog);
 | 
				
			||||||
 | 
					    if (code != TSDB_CODE_SUCCESS) {
 | 
				
			||||||
 | 
					      return code;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SCreateTableMsg* pMsg = body.msgInfo.pMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SName t = {0};
 | 
				
			||||||
 | 
					    tNameFromString(&t, pMsg->name, T_NAME_ACCT|T_NAME_DB|T_NAME_TABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    char db[TSDB_DB_NAME_LEN + TS_PATH_DELIMITER_LEN + TSDB_ACCT_ID_LEN] = {0};
 | 
				
			||||||
 | 
					    tNameGetFullDbName(&t, db);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SVgroupInfo info = {0};
 | 
				
			||||||
 | 
					    catalogGetTableHashVgroup(pCatalog, pRequest->pTscObj->pTransporter, pEpSet, db, tNameGetTableName(&t), &info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int64_t transporterId = 0;
 | 
				
			||||||
 | 
					    SEpSet ep = {0};
 | 
				
			||||||
 | 
					    ep.inUse = info.inUse;
 | 
				
			||||||
 | 
					    ep.numOfEps = info.numOfEps;
 | 
				
			||||||
 | 
					    for(int32_t i = 0; i < ep.numOfEps; ++i) {
 | 
				
			||||||
 | 
					      ep.port[i] = info.epAddr[i].port;
 | 
				
			||||||
 | 
					      tstrncpy(ep.fqdn[i], info.epAddr[i].fqdn, tListLen(ep.fqdn[i]));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sendMsgToServer(pRequest->pTscObj->pTransporter, &ep, &body, &transporterId);
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    int64_t transporterId = 0;
 | 
				
			||||||
 | 
					    sendMsgToServer(pRequest->pTscObj->pTransporter, pEpSet, &body, &transporterId);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tsem_wait(&pRequest->body.rspSem);
 | 
				
			||||||
 | 
					  destroyRequestMsgBody(&body);
 | 
				
			||||||
 | 
					  return TSDB_CODE_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag, void** pJob) {
 | 
				
			||||||
 | 
					  return scheduleAsyncExecJob(pRequest->pTscObj->pTransporter, NULL/*todo appInfo.xxx*/, pDag, pJob);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) {
 | 
					TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) {
 | 
				
			||||||
  STscObj *pTscObj = (STscObj *)taos;
 | 
					  STscObj *pTscObj = (STscObj *)taos;
 | 
				
			||||||
  if (sqlLen > (size_t) tsMaxSQLStringLen) {
 | 
					  if (sqlLen > (size_t) tsMaxSQLStringLen) {
 | 
				
			||||||
| 
						 | 
					@ -123,99 +222,34 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  nPrintTsc("%s", sql)
 | 
					  nPrintTsc("%s", sql)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRequestObj* pRequest = createRequest(pTscObj, NULL, NULL, TSDB_SQL_SELECT);
 | 
					  SRequestObj* pRequest = NULL;
 | 
				
			||||||
  if (pRequest == NULL) {
 | 
					 | 
				
			||||||
    tscError("failed to malloc sqlObj");
 | 
					 | 
				
			||||||
    terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  pRequest->sqlstr = malloc(sqlLen + 1);
 | 
					 | 
				
			||||||
  if (pRequest->sqlstr == NULL) {
 | 
					 | 
				
			||||||
    tscError("0x%"PRIx64" failed to prepare sql string buffer", pRequest->self);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pRequest->msgBuf = strdup("failed to prepare sql string buffer");
 | 
					 | 
				
			||||||
    terrno = pRequest->code = TSDB_CODE_TSC_OUT_OF_MEMORY;
 | 
					 | 
				
			||||||
    return pRequest;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  strntolower(pRequest->sqlstr, sql, (int32_t)sqlLen);
 | 
					 | 
				
			||||||
  pRequest->sqlstr[sqlLen] = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  tscDebugL("0x%"PRIx64" SQL: %s", pRequest->requestId, pRequest->sqlstr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SParseContext cxt = {
 | 
					 | 
				
			||||||
    .ctx = {.requestId = pRequest->requestId, .acctId = pTscObj->acctId, .db = getConnectionDB(pTscObj)},
 | 
					 | 
				
			||||||
    .pSql = pRequest->sqlstr,
 | 
					 | 
				
			||||||
    .sqlLen = sqlLen,
 | 
					 | 
				
			||||||
    .pMsg = pRequest->msgBuf,
 | 
					 | 
				
			||||||
    .msgLen = ERROR_MSG_BUF_DEFAULT_SIZE
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
  SQueryNode* pQuery = NULL;
 | 
					  SQueryNode* pQuery = NULL;
 | 
				
			||||||
  int32_t code = qParseQuerySql(&cxt, &pQuery);
 | 
					  SQueryDag* pDag = NULL;
 | 
				
			||||||
  if (qIsDclQuery(pQuery)) {
 | 
					  void* pJob = NULL;
 | 
				
			||||||
    SDclStmtInfo* pDcl = (SDclStmtInfo*)pQuery;
 | 
					 | 
				
			||||||
    pRequest->type = pDcl->msgType;
 | 
					 | 
				
			||||||
    pRequest->body.requestMsg = (SReqMsgInfo){.pMsg = pDcl->pMsg, .len = pDcl->msgLen};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRequestMsgBody body = buildRequestMsgImpl(pRequest);
 | 
					  terrno = TSDB_CODE_SUCCESS;
 | 
				
			||||||
    SEpSet* pEpSet = &pTscObj->pAppInfo->mgmtEp.epSet;
 | 
					  CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
 | 
				
			||||||
 | 
					  CHECK_CODE_GOTO(parseSql(pRequest, &pQuery), _return);
 | 
				
			||||||
    if (pDcl->msgType == TSDB_MSG_TYPE_CREATE_TABLE) {
 | 
					  if (qIsDdlQuery(pQuery)) {
 | 
				
			||||||
      struct SCatalog* pCatalog = NULL;
 | 
					    CHECK_CODE_GOTO(execDdlQuery(pRequest, pQuery), _return);
 | 
				
			||||||
 | 
					    goto _return;
 | 
				
			||||||
      char buf[12] = {0};
 | 
					 | 
				
			||||||
      sprintf(buf, "%d", pTscObj->pAppInfo->clusterId);
 | 
					 | 
				
			||||||
      code = catalogGetHandle(buf, &pCatalog);
 | 
					 | 
				
			||||||
      if (code != 0) {
 | 
					 | 
				
			||||||
        pRequest->code = code;
 | 
					 | 
				
			||||||
        return pRequest;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      SCreateTableMsg* pMsg = body.msgInfo.pMsg;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      SName t = {0};
 | 
					 | 
				
			||||||
      tNameFromString(&t, pMsg->name, T_NAME_ACCT|T_NAME_DB|T_NAME_TABLE);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      char db[TSDB_DB_NAME_LEN + TS_PATH_DELIMITER_LEN + TSDB_ACCT_ID_LEN] = {0};
 | 
					 | 
				
			||||||
      tNameGetFullDbName(&t, db);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      SVgroupInfo info = {0};
 | 
					 | 
				
			||||||
      catalogGetTableHashVgroup(pCatalog, pTscObj->pTransporter, pEpSet, db, tNameGetTableName(&t), &info);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      int64_t transporterId = 0;
 | 
					 | 
				
			||||||
      SEpSet ep = {0};
 | 
					 | 
				
			||||||
      ep.inUse = info.inUse;
 | 
					 | 
				
			||||||
      ep.numOfEps = info.numOfEps;
 | 
					 | 
				
			||||||
      for(int32_t i = 0; i < ep.numOfEps; ++i) {
 | 
					 | 
				
			||||||
        ep.port[i] = info.epAddr[i].port;
 | 
					 | 
				
			||||||
        tstrncpy(ep.fqdn[i], info.epAddr[i].fqdn, tListLen(ep.fqdn[i]));
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      sendMsgToServer(pTscObj->pTransporter, &ep, &body, &transporterId);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      int64_t transporterId = 0;
 | 
					 | 
				
			||||||
      sendMsgToServer(pTscObj->pTransporter, pEpSet, &body, &transporterId);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tsem_wait(&pRequest->body.rspSem);
 | 
					 | 
				
			||||||
    destroyRequestMsgBody(&body);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  CHECK_CODE_GOTO(qCreateQueryDag(pQuery, &pDag), _return);
 | 
				
			||||||
 | 
					  CHECK_CODE_GOTO(scheduleQuery(pRequest, pDag, &pJob), _return);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tfree(cxt.ctx.db);
 | 
					_return:
 | 
				
			||||||
 | 
					  qDestoryQuery(pQuery);
 | 
				
			||||||
  if (code != TSDB_CODE_SUCCESS) {
 | 
					  qDestroyQueryDag(pDag);
 | 
				
			||||||
    pRequest->code = code;
 | 
					  if (NULL != pRequest && TSDB_CODE_SUCCESS != terrno) {
 | 
				
			||||||
    return pRequest;
 | 
					    pRequest->code = terrno;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return pRequest;
 | 
					  return pRequest;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int initEpSetFromCfg(const char *firstEp, const char *secondEp, SCorEpSet *pEpSet) {
 | 
					int initEpSetFromCfg(const char *firstEp, const char *secondEp, SCorEpSet *pEpSet) {
 | 
				
			||||||
  pEpSet->version = 0;
 | 
					  pEpSet->version = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // init mgmt ip set
 | 
					  // init mnode ip set
 | 
				
			||||||
  SEpSet *mgmtEpSet   = &(pEpSet->epSet);
 | 
					  SEpSet *mgmtEpSet   = &(pEpSet->epSet);
 | 
				
			||||||
  mgmtEpSet->numOfEps = 0;
 | 
					  mgmtEpSet->numOfEps = 0;
 | 
				
			||||||
  mgmtEpSet->inUse    = 0;
 | 
					  mgmtEpSet->inUse    = 0;
 | 
				
			||||||
| 
						 | 
					@ -255,7 +289,7 @@ STscObj* taosConnectImpl(const char *ip, const char *user, const char *auth, con
 | 
				
			||||||
    return pTscObj;
 | 
					    return pTscObj;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRequestObj *pRequest = createRequest(pTscObj, fp, param, TSDB_MSG_TYPE_CONNECT);
 | 
					  SRequestObj *pRequest = createRequest(pTscObj, fp, param, TDMT_MND_CONNECT);
 | 
				
			||||||
  if (pRequest == NULL) {
 | 
					  if (pRequest == NULL) {
 | 
				
			||||||
    destroyTscObj(pTscObj);
 | 
					    destroyTscObj(pTscObj);
 | 
				
			||||||
    terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
 | 
					    terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
 | 
				
			||||||
| 
						 | 
					@ -287,7 +321,7 @@ STscObj* taosConnectImpl(const char *ip, const char *user, const char *auth, con
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t buildConnectMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody) {
 | 
					static int32_t buildConnectMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody) {
 | 
				
			||||||
  pMsgBody->msgType         = TSDB_MSG_TYPE_CONNECT;
 | 
					  pMsgBody->msgType         = TDMT_MND_CONNECT;
 | 
				
			||||||
  pMsgBody->msgInfo.len     = sizeof(SConnectMsg);
 | 
					  pMsgBody->msgInfo.len     = sizeof(SConnectMsg);
 | 
				
			||||||
  pMsgBody->requestObjRefId = pRequest->self;
 | 
					  pMsgBody->requestObjRefId = pRequest->self;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -319,7 +353,7 @@ static void destroyRequestMsgBody(SRequestMsgBody* pMsgBody) {
 | 
				
			||||||
int32_t sendMsgToServer(void *pTransporter, SEpSet* epSet, const SRequestMsgBody *pBody, int64_t* pTransporterId) {
 | 
					int32_t sendMsgToServer(void *pTransporter, SEpSet* epSet, const SRequestMsgBody *pBody, int64_t* pTransporterId) {
 | 
				
			||||||
  char *pMsg = rpcMallocCont(pBody->msgInfo.len);
 | 
					  char *pMsg = rpcMallocCont(pBody->msgInfo.len);
 | 
				
			||||||
  if (NULL == pMsg) {
 | 
					  if (NULL == pMsg) {
 | 
				
			||||||
    tscError("0x%"PRIx64" msg:%s malloc failed", pBody->requestId, taosMsg[pBody->msgType]);
 | 
					    tscError("0x%"PRIx64" msg:%s malloc failed", pBody->requestId, TMSG_INFO(pBody->msgType));
 | 
				
			||||||
    terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
 | 
					    terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -364,7 +398,7 @@ void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
 | 
				
			||||||
   * The actual inserted number of points is the first number.
 | 
					   * The actual inserted number of points is the first number.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  if (pMsg->code == TSDB_CODE_SUCCESS) {
 | 
					  if (pMsg->code == TSDB_CODE_SUCCESS) {
 | 
				
			||||||
    tscDebug("0x%" PRIx64 " message:%s, code:%s rspLen:%d, elapsed:%"PRId64 " ms", pRequest->requestId, taosMsg[pMsg->msgType],
 | 
					    tscDebug("0x%" PRIx64 " message:%s, code:%s rspLen:%d, elapsed:%"PRId64 " ms", pRequest->requestId, TMSG_INFO(pMsg->msgType),
 | 
				
			||||||
             tstrerror(pMsg->code), pMsg->contLen, pRequest->metric.rsp - pRequest->metric.start);
 | 
					             tstrerror(pMsg->code), pMsg->contLen, pRequest->metric.rsp - pRequest->metric.start);
 | 
				
			||||||
    if (handleRequestRspFp[pRequest->type]) {
 | 
					    if (handleRequestRspFp[pRequest->type]) {
 | 
				
			||||||
      char *p = malloc(pMsg->contLen);
 | 
					      char *p = malloc(pMsg->contLen);
 | 
				
			||||||
| 
						 | 
					@ -377,7 +411,7 @@ void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    tscError("0x%" PRIx64 " SQL cmd:%s, code:%s rspLen:%d, elapsed time:%"PRId64" ms", pRequest->requestId, taosMsg[pMsg->msgType],
 | 
					    tscError("0x%" PRIx64 " SQL cmd:%s, code:%s rspLen:%d, elapsed time:%"PRId64" ms", pRequest->requestId, TMSG_INFO(pMsg->msgType),
 | 
				
			||||||
             tstrerror(pMsg->code), pMsg->contLen, pRequest->metric.rsp - pRequest->metric.start);
 | 
					             tstrerror(pMsg->code), pMsg->contLen, pRequest->metric.rsp - pRequest->metric.start);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -419,7 +453,7 @@ void* doFetchRow(SRequestObj* pRequest) {
 | 
				
			||||||
  SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
 | 
					  SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pResultInfo->pData == NULL || pResultInfo->current >= pResultInfo->numOfRows) {
 | 
					  if (pResultInfo->pData == NULL || pResultInfo->current >= pResultInfo->numOfRows) {
 | 
				
			||||||
    pRequest->type = TSDB_MSG_TYPE_SHOW_RETRIEVE;
 | 
					    pRequest->type = TDMT_MND_SHOW_RETRIEVE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRequestMsgBody body = buildRequestMsgImpl(pRequest);
 | 
					    SRequestMsgBody body = buildRequestMsgImpl(pRequest);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
#include "clientInt.h"
 | 
					#include "clientInt.h"
 | 
				
			||||||
#include "clientLog.h"
 | 
					#include "clientLog.h"
 | 
				
			||||||
#include "query.h"
 | 
					#include "query.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tglobal.h"
 | 
					#include "tglobal.h"
 | 
				
			||||||
#include "tref.h"
 | 
					#include "tref.h"
 | 
				
			||||||
#include "trpc.h"
 | 
					#include "trpc.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,10 +21,10 @@
 | 
				
			||||||
#include "tmsgtype.h"
 | 
					#include "tmsgtype.h"
 | 
				
			||||||
#include "trpc.h"
 | 
					#include "trpc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int (*handleRequestRspFp[TSDB_MSG_TYPE_MAX])(SRequestObj *pRequest, const char* pMsg, int32_t msgLen);
 | 
					int (*handleRequestRspFp[TDMT_MAX])(SRequestObj *pRequest, const char* pMsg, int32_t msgLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32_t buildConnectMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody) {
 | 
					int32_t buildConnectMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody) {
 | 
				
			||||||
  pMsgBody->msgType         = TSDB_MSG_TYPE_CONNECT;
 | 
					  pMsgBody->msgType         = TDMT_MND_CONNECT;
 | 
				
			||||||
  pMsgBody->msgInfo.len     = sizeof(SConnectMsg);
 | 
					  pMsgBody->msgInfo.len     = sizeof(SConnectMsg);
 | 
				
			||||||
  pMsgBody->requestObjRefId = pRequest->self;
 | 
					  pMsgBody->requestObjRefId = pRequest->self;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -87,7 +87,7 @@ int processConnectRsp(SRequestObj *pRequest, const char* pMsg, int32_t msgLen) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t buildRetrieveMnodeMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody) {
 | 
					static int32_t buildRetrieveMnodeMsg(SRequestObj *pRequest, SRequestMsgBody* pMsgBody) {
 | 
				
			||||||
  pMsgBody->msgType = TSDB_MSG_TYPE_SHOW_RETRIEVE;
 | 
					  pMsgBody->msgType = TDMT_MND_SHOW_RETRIEVE;
 | 
				
			||||||
  pMsgBody->msgInfo.len = sizeof(SRetrieveTableMsg);
 | 
					  pMsgBody->msgInfo.len = sizeof(SRetrieveTableMsg);
 | 
				
			||||||
  pMsgBody->requestObjRefId = pRequest->self;
 | 
					  pMsgBody->requestObjRefId = pRequest->self;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,7 +102,7 @@ static int32_t buildRetrieveMnodeMsg(SRequestObj *pRequest, SRequestMsgBody* pMs
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SRequestMsgBody buildRequestMsgImpl(SRequestObj *pRequest) {
 | 
					SRequestMsgBody buildRequestMsgImpl(SRequestObj *pRequest) {
 | 
				
			||||||
  if (pRequest->type == TSDB_MSG_TYPE_SHOW_RETRIEVE) {
 | 
					  if (pRequest->type == TDMT_MND_SHOW_RETRIEVE) {
 | 
				
			||||||
    SRequestMsgBody body = {0};
 | 
					    SRequestMsgBody body = {0};
 | 
				
			||||||
    buildRetrieveMnodeMsg(pRequest, &body);
 | 
					    buildRetrieveMnodeMsg(pRequest, &body);
 | 
				
			||||||
    return body;
 | 
					    return body;
 | 
				
			||||||
| 
						 | 
					@ -110,9 +110,9 @@ SRequestMsgBody buildRequestMsgImpl(SRequestObj *pRequest) {
 | 
				
			||||||
    assert(pRequest != NULL);
 | 
					    assert(pRequest != NULL);
 | 
				
			||||||
    SRequestMsgBody body = {
 | 
					    SRequestMsgBody body = {
 | 
				
			||||||
        .requestObjRefId = pRequest->self,
 | 
					        .requestObjRefId = pRequest->self,
 | 
				
			||||||
        .msgInfo = pRequest->body.requestMsg,
 | 
					        .msgInfo         = pRequest->body.requestMsg,
 | 
				
			||||||
        .msgType = pRequest->type,
 | 
					        .msgType         = pRequest->type,
 | 
				
			||||||
        .requestId = pRequest->requestId,
 | 
					        .requestId       = pRequest->requestId,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    return body;
 | 
					    return body;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -273,11 +273,11 @@ void initMsgHandleFp() {
 | 
				
			||||||
  tscProcessMsgRsp[TSDB_SQL_SHOW_CREATE_DATABASE] = tscProcessShowCreateRsp;
 | 
					  tscProcessMsgRsp[TSDB_SQL_SHOW_CREATE_DATABASE] = tscProcessShowCreateRsp;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleRequestRspFp[TSDB_MSG_TYPE_CONNECT]       = processConnectRsp;
 | 
					  handleRequestRspFp[TDMT_MND_CONNECT]       = processConnectRsp;
 | 
				
			||||||
  handleRequestRspFp[TSDB_MSG_TYPE_SHOW]          = processShowRsp;
 | 
					  handleRequestRspFp[TDMT_MND_SHOW]          = processShowRsp;
 | 
				
			||||||
  handleRequestRspFp[TSDB_MSG_TYPE_SHOW_RETRIEVE] = processRetrieveMnodeRsp;
 | 
					  handleRequestRspFp[TDMT_MND_SHOW_RETRIEVE] = processRetrieveMnodeRsp;
 | 
				
			||||||
  handleRequestRspFp[TSDB_MSG_TYPE_CREATE_DB]     = processCreateDbRsp;
 | 
					  handleRequestRspFp[TDMT_MND_CREATE_DB]     = processCreateDbRsp;
 | 
				
			||||||
  handleRequestRspFp[TSDB_MSG_TYPE_USE_DB]        = processUseDbRsp;
 | 
					  handleRequestRspFp[TDMT_MND_USE_DB]        = processUseDbRsp;
 | 
				
			||||||
  handleRequestRspFp[TSDB_MSG_TYPE_CREATE_TABLE]  = processCreateTableRsp;
 | 
					  handleRequestRspFp[TDMT_MND_CREATE_TABLE]  = processCreateTableRsp;
 | 
				
			||||||
  handleRequestRspFp[TSDB_MSG_TYPE_DROP_DB]       = processDropDbRsp;
 | 
					  handleRequestRspFp[TDMT_MND_DROP_DB]       = processDropDbRsp;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -49,101 +49,101 @@ int main(int argc, char** argv) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST(testCase, driverInit_Test) { taos_init(); }
 | 
					TEST(testCase, driverInit_Test) { taos_init(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TEST(testCase, connect_Test) {
 | 
					 TEST(testCase, connect_Test) {
 | 
				
			||||||
//  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
					  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
				
			||||||
////  assert(pConn != NULL);
 | 
					 | 
				
			||||||
//  taos_close(pConn);
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// TEST(testCase, create_user_Test) {
 | 
					 | 
				
			||||||
//  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
					 | 
				
			||||||
//  assert(pConn != NULL);
 | 
					//  assert(pConn != NULL);
 | 
				
			||||||
//
 | 
					  taos_close(pConn);
 | 
				
			||||||
//  TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'");
 | 
					}
 | 
				
			||||||
//  if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
 | 
					
 | 
				
			||||||
//    printf("failed to create user, reason:%s\n", taos_errstr(pRes));
 | 
					 TEST(testCase, create_user_Test) {
 | 
				
			||||||
//  }
 | 
					  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
				
			||||||
//
 | 
					  assert(pConn != NULL);
 | 
				
			||||||
//  taos_free_result(pRes);
 | 
					
 | 
				
			||||||
//  taos_close(pConn);
 | 
					  TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'");
 | 
				
			||||||
//}
 | 
					  if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
 | 
				
			||||||
//
 | 
					    printf("failed to create user, reason:%s\n", taos_errstr(pRes));
 | 
				
			||||||
// TEST(testCase, create_account_Test) {
 | 
					  }
 | 
				
			||||||
//  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
					
 | 
				
			||||||
 | 
					  taos_free_result(pRes);
 | 
				
			||||||
 | 
					  taos_close(pConn);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 TEST(testCase, create_account_Test) {
 | 
				
			||||||
 | 
					  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
				
			||||||
 | 
					  assert(pConn != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'");
 | 
				
			||||||
 | 
					  if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
 | 
				
			||||||
 | 
					    printf("failed to create user, reason:%s\n", taos_errstr(pRes));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  taos_free_result(pRes);
 | 
				
			||||||
 | 
					  taos_close(pConn);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 TEST(testCase, drop_account_Test) {
 | 
				
			||||||
 | 
					  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
				
			||||||
 | 
					  assert(pConn != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TAOS_RES* pRes = taos_query(pConn, "drop account aabc");
 | 
				
			||||||
 | 
					  if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
 | 
				
			||||||
 | 
					    printf("failed to create user, reason:%s\n", taos_errstr(pRes));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  taos_free_result(pRes);
 | 
				
			||||||
 | 
					  taos_close(pConn);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 TEST(testCase, show_user_Test) {
 | 
				
			||||||
 | 
					  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
				
			||||||
//  assert(pConn != NULL);
 | 
					//  assert(pConn != NULL);
 | 
				
			||||||
//
 | 
					
 | 
				
			||||||
//  TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'");
 | 
					  TAOS_RES* pRes = taos_query(pConn, "show users");
 | 
				
			||||||
//  if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
 | 
					  TAOS_ROW pRow = NULL;
 | 
				
			||||||
//    printf("failed to create user, reason:%s\n", taos_errstr(pRes));
 | 
					
 | 
				
			||||||
//  }
 | 
					  TAOS_FIELD* pFields = taos_fetch_fields(pRes);
 | 
				
			||||||
//
 | 
					  int32_t numOfFields = taos_num_fields(pRes);
 | 
				
			||||||
//  taos_free_result(pRes);
 | 
					
 | 
				
			||||||
//  taos_close(pConn);
 | 
					  char str[512] = {0};
 | 
				
			||||||
//}
 | 
					  while((pRow = taos_fetch_row(pRes)) != NULL) {
 | 
				
			||||||
//
 | 
					    int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
 | 
				
			||||||
// TEST(testCase, drop_account_Test) {
 | 
					    printf("%s\n", str);
 | 
				
			||||||
//  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  taos_close(pConn);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 TEST(testCase, drop_user_Test) {
 | 
				
			||||||
 | 
					  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
				
			||||||
 | 
					  assert(pConn != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  TAOS_RES* pRes = taos_query(pConn, "drop user abc");
 | 
				
			||||||
 | 
					  if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
 | 
				
			||||||
 | 
					    printf("failed to create user, reason:%s\n", taos_errstr(pRes));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  taos_free_result(pRes);
 | 
				
			||||||
 | 
					  taos_close(pConn);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 TEST(testCase, show_db_Test) {
 | 
				
			||||||
 | 
					  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
				
			||||||
//  assert(pConn != NULL);
 | 
					//  assert(pConn != NULL);
 | 
				
			||||||
//
 | 
					
 | 
				
			||||||
//  TAOS_RES* pRes = taos_query(pConn, "drop account aabc");
 | 
					  TAOS_RES* pRes = taos_query(pConn, "show databases");
 | 
				
			||||||
//  if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
 | 
					  TAOS_ROW pRow = NULL;
 | 
				
			||||||
//    printf("failed to create user, reason:%s\n", taos_errstr(pRes));
 | 
					
 | 
				
			||||||
//  }
 | 
					  TAOS_FIELD* pFields = taos_fetch_fields(pRes);
 | 
				
			||||||
//
 | 
					  int32_t numOfFields = taos_num_fields(pRes);
 | 
				
			||||||
//  taos_free_result(pRes);
 | 
					
 | 
				
			||||||
//  taos_close(pConn);
 | 
					  char str[512] = {0};
 | 
				
			||||||
//}
 | 
					  while((pRow = taos_fetch_row(pRes)) != NULL) {
 | 
				
			||||||
//
 | 
					    int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
 | 
				
			||||||
// TEST(testCase, show_user_Test) {
 | 
					    printf("%s\n", str);
 | 
				
			||||||
//  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
					  }
 | 
				
			||||||
////  assert(pConn != NULL);
 | 
					
 | 
				
			||||||
//
 | 
					  taos_close(pConn);
 | 
				
			||||||
//  TAOS_RES* pRes = taos_query(pConn, "show users");
 | 
					}
 | 
				
			||||||
//  TAOS_ROW pRow = NULL;
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  TAOS_FIELD* pFields = taos_fetch_fields(pRes);
 | 
					 | 
				
			||||||
//  int32_t numOfFields = taos_num_fields(pRes);
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  char str[512] = {0};
 | 
					 | 
				
			||||||
//  while((pRow = taos_fetch_row(pRes)) != NULL) {
 | 
					 | 
				
			||||||
//    int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
 | 
					 | 
				
			||||||
//    printf("%s\n", str);
 | 
					 | 
				
			||||||
//  }
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  taos_close(pConn);
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// TEST(testCase, drop_user_Test) {
 | 
					 | 
				
			||||||
//  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
					 | 
				
			||||||
//  assert(pConn != NULL);
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  TAOS_RES* pRes = taos_query(pConn, "drop user abc");
 | 
					 | 
				
			||||||
//  if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
 | 
					 | 
				
			||||||
//    printf("failed to create user, reason:%s\n", taos_errstr(pRes));
 | 
					 | 
				
			||||||
//  }
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  taos_free_result(pRes);
 | 
					 | 
				
			||||||
//  taos_close(pConn);
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// TEST(testCase, show_db_Test) {
 | 
					 | 
				
			||||||
//  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
					 | 
				
			||||||
////  assert(pConn != NULL);
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  TAOS_RES* pRes = taos_query(pConn, "show databases");
 | 
					 | 
				
			||||||
//  TAOS_ROW pRow = NULL;
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  TAOS_FIELD* pFields = taos_fetch_fields(pRes);
 | 
					 | 
				
			||||||
//  int32_t numOfFields = taos_num_fields(pRes);
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  char str[512] = {0};
 | 
					 | 
				
			||||||
//  while((pRow = taos_fetch_row(pRes)) != NULL) {
 | 
					 | 
				
			||||||
//    int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
 | 
					 | 
				
			||||||
//    printf("%s\n", str);
 | 
					 | 
				
			||||||
//  }
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  taos_close(pConn);
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST(testCase, create_db_Test) {
 | 
					TEST(testCase, create_db_Test) {
 | 
				
			||||||
  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
					  TAOS* pConn = taos_connect("ubuntu", "root", "taosdata", NULL, 0);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,8 +13,16 @@
 | 
				
			||||||
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 | 
					 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TAOS_MESSAGE_C
 | 
					#include "tmsg.h"
 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "taosmsg.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef TD_MSG_NUMBER_
 | 
				
			||||||
 | 
					#undef TD_MSG_DICT_
 | 
				
			||||||
 | 
					#define TD_MSG_INFO_
 | 
				
			||||||
 | 
					#undef TD_MSG_SEG_CODE_
 | 
				
			||||||
 | 
					#include "tmsgdef.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef TD_MSG_NUMBER_
 | 
				
			||||||
 | 
					#undef TD_MSG_INFO_
 | 
				
			||||||
 | 
					#define TD_MSG_DICT_
 | 
				
			||||||
 | 
					#undef TD_MSG_SEG_CODE_
 | 
				
			||||||
 | 
					#include "tmsgdef.h"
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
#include "tutil.h"
 | 
					#include "tutil.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "tname.h"
 | 
					#include "tname.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VALID_NAME_TYPE(x)  ((x) == TSDB_DB_NAME_T || (x) == TSDB_TABLE_NAME_T)
 | 
					#define VALID_NAME_TYPE(x)  ((x) == TSDB_DB_NAME_T || (x) == TSDB_TABLE_NAME_T)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,3 +16,13 @@ TARGET_INCLUDE_DIRECTORIES(
 | 
				
			||||||
        PUBLIC "${CMAKE_SOURCE_DIR}/include/libs/common/"
 | 
					        PUBLIC "${CMAKE_SOURCE_DIR}/include/libs/common/"
 | 
				
			||||||
        PRIVATE "${CMAKE_SOURCE_DIR}/source/libs/common/inc"
 | 
					        PRIVATE "${CMAKE_SOURCE_DIR}/source/libs/common/inc"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# tmsg test
 | 
				
			||||||
 | 
					add_executable(tmsgTest "")
 | 
				
			||||||
 | 
					target_sources(tmsgTest 
 | 
				
			||||||
 | 
					        PRIVATE
 | 
				
			||||||
 | 
					        "tmsgTest.cpp"
 | 
				
			||||||
 | 
					        "../src/tmsg.c"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					target_include_directories(tmsgTest PUBLIC "${CMAKE_SOURCE_DIR}/include/common/")
 | 
				
			||||||
 | 
					target_link_libraries(tmsgTest PUBLIC os util gtest gtest_main)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,11 @@
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "gtest/gtest.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "tmsg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(td_msg_test, simple_msg_test) {
 | 
				
			||||||
 | 
					  // std::cout << TMSG_INFO(TDMT_VND_DROP_TABLE) << std::endl;
 | 
				
			||||||
 | 
					  // std::cout << TMSG_INFO(TDMT_MND_DROP_SUPER_TABLE) << std::endl;
 | 
				
			||||||
 | 
					  // std::cout << TMSG_INFO(TDMT_MND_CREATE_SUPER_TABLE) << std::endl;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@ extern "C" {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "cJSON.h"
 | 
					#include "cJSON.h"
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "thash.h"
 | 
					#include "thash.h"
 | 
				
			||||||
#include "tlockfree.h"
 | 
					#include "tlockfree.h"
 | 
				
			||||||
#include "tlog.h"
 | 
					#include "tlog.h"
 | 
				
			||||||
| 
						 | 
					@ -80,7 +80,6 @@ typedef struct {
 | 
				
			||||||
  SRWLatch    latch;
 | 
					  SRWLatch    latch;
 | 
				
			||||||
  taos_queue  pReadQ;
 | 
					  taos_queue  pReadQ;
 | 
				
			||||||
  taos_queue  pWriteQ;
 | 
					  taos_queue  pWriteQ;
 | 
				
			||||||
  taos_queue  pApplyQ;
 | 
					 | 
				
			||||||
  taos_queue  pSyncQ;
 | 
					  taos_queue  pSyncQ;
 | 
				
			||||||
  taos_queue  pMgmtQ;
 | 
					  taos_queue  pMgmtQ;
 | 
				
			||||||
  SWorkerPool mgmtPool;
 | 
					  SWorkerPool mgmtPool;
 | 
				
			||||||
| 
						 | 
					@ -105,7 +104,7 @@ typedef struct {
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  void    *serverRpc;
 | 
					  void    *serverRpc;
 | 
				
			||||||
  void    *clientRpc;
 | 
					  void    *clientRpc;
 | 
				
			||||||
  DndMsgFp msgFp[TSDB_MSG_TYPE_MAX];
 | 
					  DndMsgFp msgFp[TDMT_MAX];
 | 
				
			||||||
} STransMgmt;
 | 
					} STransMgmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SDnode {
 | 
					typedef struct SDnode {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,12 +63,12 @@ void dndGetMnodeEpSet(SDnode *pDnode, SEpSet *pEpSet) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void dndSendRedirectMsg(SDnode *pDnode, SRpcMsg *pMsg) {
 | 
					void dndSendRedirectMsg(SDnode *pDnode, SRpcMsg *pMsg) {
 | 
				
			||||||
  int32_t msgType = pMsg->msgType;
 | 
					  tmsg_t msgType = pMsg->msgType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SEpSet epSet = {0};
 | 
					  SEpSet epSet = {0};
 | 
				
			||||||
  dndGetMnodeEpSet(pDnode, &epSet);
 | 
					  dndGetMnodeEpSet(pDnode, &epSet);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  dDebug("RPC %p, msg:%s is redirected, num:%d inUse:%d", pMsg->handle, taosMsg[msgType], epSet.numOfEps, epSet.inUse);
 | 
					  dDebug("RPC %p, msg:%s is redirected, num:%d inUse:%d", pMsg->handle, TMSG_INFO(msgType), epSet.numOfEps, epSet.inUse);
 | 
				
			||||||
  for (int32_t i = 0; i < epSet.numOfEps; ++i) {
 | 
					  for (int32_t i = 0; i < epSet.numOfEps; ++i) {
 | 
				
			||||||
    dDebug("mnode index:%d %s:%u", i, epSet.fqdn[i], epSet.port[i]);
 | 
					    dDebug("mnode index:%d %s:%u", i, epSet.fqdn[i], epSet.port[i]);
 | 
				
			||||||
    if (strcmp(epSet.fqdn[i], pDnode->opt.localFqdn) == 0 && epSet.port[i] == pDnode->opt.serverPort) {
 | 
					    if (strcmp(epSet.fqdn[i], pDnode->opt.localFqdn) == 0 && epSet.port[i] == pDnode->opt.serverPort) {
 | 
				
			||||||
| 
						 | 
					@ -369,7 +369,7 @@ void dndSendStatusMsg(SDnode *pDnode) {
 | 
				
			||||||
  dndGetVnodeLoads(pDnode, &pStatus->vnodeLoads);
 | 
					  dndGetVnodeLoads(pDnode, &pStatus->vnodeLoads);
 | 
				
			||||||
  contLen = sizeof(SStatusMsg) + pStatus->vnodeLoads.num * sizeof(SVnodeLoad);
 | 
					  contLen = sizeof(SStatusMsg) + pStatus->vnodeLoads.num * sizeof(SVnodeLoad);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg rpcMsg = {.pCont = pStatus, .contLen = contLen, .msgType = TSDB_MSG_TYPE_STATUS};
 | 
					  SRpcMsg rpcMsg = {.pCont = pStatus, .contLen = contLen, .msgType = TDMT_MND_STATUS, .ahandle = (void *)9527};
 | 
				
			||||||
  pMgmt->statusSent = 1;
 | 
					  pMgmt->statusSent = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  dTrace("pDnode:%p, send status msg to mnode", pDnode);
 | 
					  dTrace("pDnode:%p, send status msg to mnode", pDnode);
 | 
				
			||||||
| 
						 | 
					@ -556,14 +556,14 @@ void dndCleanupDnode(SDnode *pDnode) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void dndProcessDnodeReq(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
 | 
					void dndProcessDnodeReq(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
 | 
				
			||||||
  switch (pMsg->msgType) {
 | 
					  switch (pMsg->msgType) {
 | 
				
			||||||
    case TSDB_MSG_TYPE_NETWORK_TEST:
 | 
					    case TDMT_DND_NETWORK_TEST:
 | 
				
			||||||
      dndProcessStartupReq(pDnode, pMsg);
 | 
					      dndProcessStartupReq(pDnode, pMsg);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_CONFIG_DNODE_IN:
 | 
					    case TDMT_DND_CONFIG_DNODE:
 | 
				
			||||||
      dndProcessConfigDnodeReq(pDnode, pMsg);
 | 
					      dndProcessConfigDnodeReq(pDnode, pMsg);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      dError("RPC %p, dnode req:%s not processed", pMsg->handle, taosMsg[pMsg->msgType]);
 | 
					      dError("RPC %p, dnode req:%s not processed", pMsg->handle, TMSG_INFO(pMsg->msgType));
 | 
				
			||||||
      SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_MSG_NOT_PROCESSED};
 | 
					      SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_MSG_NOT_PROCESSED};
 | 
				
			||||||
      rpcSendResponse(&rspMsg);
 | 
					      rpcSendResponse(&rspMsg);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -574,17 +574,17 @@ void dndProcessDnodeReq(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void dndProcessDnodeRsp(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
 | 
					void dndProcessDnodeRsp(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
 | 
				
			||||||
  switch (pMsg->msgType) {
 | 
					  switch (pMsg->msgType) {
 | 
				
			||||||
    case TSDB_MSG_TYPE_STATUS_RSP:
 | 
					    case TDMT_MND_STATUS_RSP:
 | 
				
			||||||
      dndProcessStatusRsp(pDnode, pMsg, pEpSet);
 | 
					      dndProcessStatusRsp(pDnode, pMsg, pEpSet);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_AUTH_RSP:
 | 
					    case TDMT_MND_AUTH_RSP:
 | 
				
			||||||
      dndProcessAuthRsp(pDnode, pMsg, pEpSet);
 | 
					      dndProcessAuthRsp(pDnode, pMsg, pEpSet);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_GRANT_RSP:
 | 
					    case TDMT_MND_GRANT_RSP:
 | 
				
			||||||
      dndProcessGrantRsp(pDnode, pMsg, pEpSet);
 | 
					      dndProcessGrantRsp(pDnode, pMsg, pEpSet);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      dError("RPC %p, dnode rsp:%s not processed", pMsg->handle, taosMsg[pMsg->msgType]);
 | 
					      dError("RPC %p, dnode rsp:%s not processed", pMsg->handle, TMSG_INFO(pMsg->msgType));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  rpcFreeCont(pMsg->pCont);
 | 
					  rpcFreeCont(pMsg->pCont);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,18 +28,15 @@ static void    dndCleanupMnodeSyncWorker(SDnode *pDnode);
 | 
				
			||||||
static void    dndCleanupMnodeMgmtWorker(SDnode *pDnode);
 | 
					static void    dndCleanupMnodeMgmtWorker(SDnode *pDnode);
 | 
				
			||||||
static int32_t dndAllocMnodeReadQueue(SDnode *pDnode);
 | 
					static int32_t dndAllocMnodeReadQueue(SDnode *pDnode);
 | 
				
			||||||
static int32_t dndAllocMnodeWriteQueue(SDnode *pDnode);
 | 
					static int32_t dndAllocMnodeWriteQueue(SDnode *pDnode);
 | 
				
			||||||
static int32_t dndAllocMnodeApplyQueue(SDnode *pDnode);
 | 
					 | 
				
			||||||
static int32_t dndAllocMnodeSyncQueue(SDnode *pDnode);
 | 
					static int32_t dndAllocMnodeSyncQueue(SDnode *pDnode);
 | 
				
			||||||
static int32_t dndAllocMnodeMgmtQueue(SDnode *pDnode);
 | 
					static int32_t dndAllocMnodeMgmtQueue(SDnode *pDnode);
 | 
				
			||||||
static void    dndFreeMnodeReadQueue(SDnode *pDnode);
 | 
					static void    dndFreeMnodeReadQueue(SDnode *pDnode);
 | 
				
			||||||
static void    dndFreeMnodeWriteQueue(SDnode *pDnode);
 | 
					static void    dndFreeMnodeWriteQueue(SDnode *pDnode);
 | 
				
			||||||
static void    dndFreeMnodeApplyQueue(SDnode *pDnode);
 | 
					 | 
				
			||||||
static void    dndFreeMnodeSyncQueue(SDnode *pDnode);
 | 
					static void    dndFreeMnodeSyncQueue(SDnode *pDnode);
 | 
				
			||||||
static void    dndFreeMnodeMgmtQueue(SDnode *pDnode);
 | 
					static void    dndFreeMnodeMgmtQueue(SDnode *pDnode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void    dndProcessMnodeReadQueue(SDnode *pDnode, SMnodeMsg *pMsg);
 | 
					static void    dndProcessMnodeReadQueue(SDnode *pDnode, SMnodeMsg *pMsg);
 | 
				
			||||||
static void    dndProcessMnodeWriteQueue(SDnode *pDnode, SMnodeMsg *pMsg);
 | 
					static void    dndProcessMnodeWriteQueue(SDnode *pDnode, SMnodeMsg *pMsg);
 | 
				
			||||||
static void    dndProcessMnodeApplyQueue(SDnode *pDnode, SMnodeMsg *pMsg);
 | 
					 | 
				
			||||||
static void    dndProcessMnodeSyncQueue(SDnode *pDnode, SMnodeMsg *pMsg);
 | 
					static void    dndProcessMnodeSyncQueue(SDnode *pDnode, SMnodeMsg *pMsg);
 | 
				
			||||||
static void    dndProcessMnodeMgmtQueue(SDnode *pDnode, SRpcMsg *pMsg);
 | 
					static void    dndProcessMnodeMgmtQueue(SDnode *pDnode, SRpcMsg *pMsg);
 | 
				
			||||||
static int32_t dndWriteMnodeMsgToQueue(SMnode *pMnode, taos_queue pQueue, SRpcMsg *pRpcMsg);
 | 
					static int32_t dndWriteMnodeMsgToQueue(SMnode *pMnode, taos_queue pQueue, SRpcMsg *pRpcMsg);
 | 
				
			||||||
| 
						 | 
					@ -47,7 +44,6 @@ void           dndProcessMnodeReadMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEp
 | 
				
			||||||
void           dndProcessMnodeWriteMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet);
 | 
					void           dndProcessMnodeWriteMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet);
 | 
				
			||||||
void           dndProcessMnodeSyncMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet);
 | 
					void           dndProcessMnodeSyncMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet);
 | 
				
			||||||
void           dndProcessMnodeMgmtMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet);
 | 
					void           dndProcessMnodeMgmtMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet);
 | 
				
			||||||
static int32_t dndPutMsgIntoMnodeApplyQueue(SDnode *pDnode, SMnodeMsg *pMsg);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t dndStartMnodeWorker(SDnode *pDnode);
 | 
					static int32_t dndStartMnodeWorker(SDnode *pDnode);
 | 
				
			||||||
static void    dndStopMnodeWorker(SDnode *pDnode);
 | 
					static void    dndStopMnodeWorker(SDnode *pDnode);
 | 
				
			||||||
| 
						 | 
					@ -271,11 +267,6 @@ static int32_t dndStartMnodeWorker(SDnode *pDnode) {
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (dndAllocMnodeApplyQueue(pDnode) != 0) {
 | 
					 | 
				
			||||||
    dError("failed to alloc mnode apply queue since %s", terrstr());
 | 
					 | 
				
			||||||
    return -1;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (dndAllocMnodeSyncQueue(pDnode) != 0) {
 | 
					  if (dndAllocMnodeSyncQueue(pDnode) != 0) {
 | 
				
			||||||
    dError("failed to alloc mnode sync queue since %s", terrstr());
 | 
					    dError("failed to alloc mnode sync queue since %s", terrstr());
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
| 
						 | 
					@ -293,7 +284,6 @@ static void dndStopMnodeWorker(SDnode *pDnode) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while (pMgmt->refCount > 1) taosMsleep(10);
 | 
					  while (pMgmt->refCount > 1) taosMsleep(10);
 | 
				
			||||||
  while (!taosQueueEmpty(pMgmt->pReadQ)) taosMsleep(10);
 | 
					  while (!taosQueueEmpty(pMgmt->pReadQ)) taosMsleep(10);
 | 
				
			||||||
  while (!taosQueueEmpty(pMgmt->pApplyQ)) taosMsleep(10);
 | 
					 | 
				
			||||||
  while (!taosQueueEmpty(pMgmt->pWriteQ)) taosMsleep(10);
 | 
					  while (!taosQueueEmpty(pMgmt->pWriteQ)) taosMsleep(10);
 | 
				
			||||||
  while (!taosQueueEmpty(pMgmt->pSyncQ)) taosMsleep(10);
 | 
					  while (!taosQueueEmpty(pMgmt->pSyncQ)) taosMsleep(10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -303,7 +293,6 @@ static void dndStopMnodeWorker(SDnode *pDnode) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  dndFreeMnodeReadQueue(pDnode);
 | 
					  dndFreeMnodeReadQueue(pDnode);
 | 
				
			||||||
  dndFreeMnodeWriteQueue(pDnode);
 | 
					  dndFreeMnodeWriteQueue(pDnode);
 | 
				
			||||||
  dndFreeMnodeApplyQueue(pDnode);
 | 
					 | 
				
			||||||
  dndFreeMnodeSyncQueue(pDnode);
 | 
					  dndFreeMnodeSyncQueue(pDnode);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -328,7 +317,6 @@ static void dndInitMnodeOption(SDnode *pDnode, SMnodeOpt *pOption) {
 | 
				
			||||||
  pOption->sendMsgToDnodeFp = dndSendMsgToDnode;
 | 
					  pOption->sendMsgToDnodeFp = dndSendMsgToDnode;
 | 
				
			||||||
  pOption->sendMsgToMnodeFp = dndSendMsgToMnode;
 | 
					  pOption->sendMsgToMnodeFp = dndSendMsgToMnode;
 | 
				
			||||||
  pOption->sendRedirectMsgFp = dndSendRedirectMsg;
 | 
					  pOption->sendRedirectMsgFp = dndSendRedirectMsg;
 | 
				
			||||||
  pOption->putMsgToApplyMsgFp = dndPutMsgIntoMnodeApplyQueue;
 | 
					 | 
				
			||||||
  pOption->dnodeId = dndGetDnodeId(pDnode);
 | 
					  pOption->dnodeId = dndGetDnodeId(pDnode);
 | 
				
			||||||
  pOption->clusterId = dndGetClusterId(pDnode);
 | 
					  pOption->clusterId = dndGetClusterId(pDnode);
 | 
				
			||||||
  pOption->cfg.sver = pDnode->opt.sver;
 | 
					  pOption->cfg.sver = pDnode->opt.sver;
 | 
				
			||||||
| 
						 | 
					@ -552,13 +540,13 @@ static void dndProcessMnodeMgmtQueue(SDnode *pDnode, SRpcMsg *pMsg) {
 | 
				
			||||||
  int32_t code = 0;
 | 
					  int32_t code = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (pMsg->msgType) {
 | 
					  switch (pMsg->msgType) {
 | 
				
			||||||
    case TSDB_MSG_TYPE_CREATE_MNODE_IN:
 | 
					    case TDMT_DND_CREATE_MNODE:
 | 
				
			||||||
      code = dndProcessCreateMnodeReq(pDnode, pMsg);
 | 
					      code = dndProcessCreateMnodeReq(pDnode, pMsg);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_ALTER_MNODE_IN:
 | 
					    case TDMT_DND_ALTER_MNODE:
 | 
				
			||||||
      code = dndProcessAlterMnodeReq(pDnode, pMsg);
 | 
					      code = dndProcessAlterMnodeReq(pDnode, pMsg);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_DROP_MNODE_IN:
 | 
					    case TDMT_DND_DROP_MNODE:
 | 
				
			||||||
      code = dndProcessDropMnodeReq(pDnode, pMsg);
 | 
					      code = dndProcessDropMnodeReq(pDnode, pMsg);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
| 
						 | 
					@ -604,20 +592,6 @@ static void dndProcessMnodeWriteQueue(SDnode *pDnode, SMnodeMsg *pMsg) {
 | 
				
			||||||
  mndCleanupMsg(pMsg);
 | 
					  mndCleanupMsg(pMsg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void dndProcessMnodeApplyQueue(SDnode *pDnode, SMnodeMsg *pMsg) {
 | 
					 | 
				
			||||||
  SMnodeMgmt *pMgmt = &pDnode->mmgmt;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SMnode *pMnode = dndAcquireMnode(pDnode);
 | 
					 | 
				
			||||||
  if (pMnode != NULL) {
 | 
					 | 
				
			||||||
    mndProcessApplyMsg(pMsg);
 | 
					 | 
				
			||||||
    dndReleaseMnode(pDnode, pMnode);
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    mndSendRsp(pMsg, terrno);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  mndCleanupMsg(pMsg);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void dndProcessMnodeSyncQueue(SDnode *pDnode, SMnodeMsg *pMsg) {
 | 
					static void dndProcessMnodeSyncQueue(SDnode *pDnode, SMnodeMsg *pMsg) {
 | 
				
			||||||
  SMnodeMgmt *pMgmt = &pDnode->mmgmt;
 | 
					  SMnodeMgmt *pMgmt = &pDnode->mmgmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -712,19 +686,6 @@ void dndProcessMnodeReadMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
 | 
				
			||||||
  dndReleaseMnode(pDnode, pMnode);
 | 
					  dndReleaseMnode(pDnode, pMnode);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t dndPutMsgIntoMnodeApplyQueue(SDnode *pDnode, SMnodeMsg *pMsg) {
 | 
					 | 
				
			||||||
  SMnodeMgmt *pMgmt = &pDnode->mmgmt;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SMnode *pMnode = dndAcquireMnode(pDnode);
 | 
					 | 
				
			||||||
  if (pMnode == NULL) {
 | 
					 | 
				
			||||||
    return -1;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  int32_t code = taosWriteQitem(pMgmt->pApplyQ, pMsg);
 | 
					 | 
				
			||||||
  dndReleaseMnode(pDnode, pMnode);
 | 
					 | 
				
			||||||
  return code;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int32_t dndAllocMnodeMgmtQueue(SDnode *pDnode) {
 | 
					static int32_t dndAllocMnodeMgmtQueue(SDnode *pDnode) {
 | 
				
			||||||
  SMnodeMgmt *pMgmt = &pDnode->mmgmt;
 | 
					  SMnodeMgmt *pMgmt = &pDnode->mmgmt;
 | 
				
			||||||
  pMgmt->pMgmtQ = tWorkerAllocQueue(&pMgmt->mgmtPool, pDnode, (FProcessItem)dndProcessMnodeMgmtQueue);
 | 
					  pMgmt->pMgmtQ = tWorkerAllocQueue(&pMgmt->mgmtPool, pDnode, (FProcessItem)dndProcessMnodeMgmtQueue);
 | 
				
			||||||
| 
						 | 
					@ -817,23 +778,6 @@ static void dndFreeMnodeWriteQueue(SDnode *pDnode) {
 | 
				
			||||||
  pMgmt->pWriteQ = NULL;
 | 
					  pMgmt->pWriteQ = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t dndAllocMnodeApplyQueue(SDnode *pDnode) {
 | 
					 | 
				
			||||||
  SMnodeMgmt *pMgmt = &pDnode->mmgmt;
 | 
					 | 
				
			||||||
  pMgmt->pApplyQ = tWorkerAllocQueue(&pMgmt->writePool, pDnode, (FProcessItem)dndProcessMnodeApplyQueue);
 | 
					 | 
				
			||||||
  if (pMgmt->pApplyQ == NULL) {
 | 
					 | 
				
			||||||
    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
					 | 
				
			||||||
    return -1;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void dndFreeMnodeApplyQueue(SDnode *pDnode) {
 | 
					 | 
				
			||||||
  SMnodeMgmt *pMgmt = &pDnode->mmgmt;
 | 
					 | 
				
			||||||
  tWorkerFreeQueue(&pMgmt->writePool, pMgmt->pApplyQ);
 | 
					 | 
				
			||||||
  pMgmt->pApplyQ = NULL;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int32_t dndInitMnodeWriteWorker(SDnode *pDnode) {
 | 
					static int32_t dndInitMnodeWriteWorker(SDnode *pDnode) {
 | 
				
			||||||
  SMnodeMgmt  *pMgmt = &pDnode->mmgmt;
 | 
					  SMnodeMgmt  *pMgmt = &pDnode->mmgmt;
 | 
				
			||||||
  SWorkerPool *pPool = &pMgmt->writePool;
 | 
					  SWorkerPool *pPool = &pMgmt->writePool;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,118 +31,118 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void dndInitMsgFp(STransMgmt *pMgmt) {
 | 
					static void dndInitMsgFp(STransMgmt *pMgmt) {
 | 
				
			||||||
  // msg from client to dnode
 | 
					  // msg from client to dnode
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_SUBMIT] = dndProcessVnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_SUBMIT)] = dndProcessVnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_QUERY] = dndProcessVnodeQueryMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_QUERY)] = dndProcessVnodeQueryMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_FETCH] = dndProcessVnodeFetchMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_FETCH)] = dndProcessVnodeFetchMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_TABLE] = dndProcessVnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_TABLE)] = dndProcessVnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_TABLE] = dndProcessVnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_DROP_TABLE)] = dndProcessVnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_ALTER_TABLE] = dndProcessVnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_TABLE)] = dndProcessVnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_UPDATE_TAG_VAL] = dndProcessVnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_UPDATE_TAG_VAL)] = dndProcessVnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_TABLE_META] = dndProcessMnodeReadMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_TABLE_META)] = dndProcessMnodeReadMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_TABLES_META] = dndProcessVnodeQueryMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_TABLES_META)] = dndProcessVnodeQueryMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_MQ_QUERY] = dndProcessVnodeQueryMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_QUERY)] = dndProcessVnodeQueryMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_MQ_CONSUME] = dndProcessVnodeQueryMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_CONSUME)] = dndProcessVnodeQueryMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_MQ_CONNECT] = dndProcessVnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_CONNECT)] = dndProcessVnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_MQ_DISCONNECT] = dndProcessVnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_DISCONNECT)] = dndProcessVnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_MQ_SET_CUR] = dndProcessVnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_SET_CUR)] = dndProcessVnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_RES_READY] = dndProcessVnodeFetchMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_RES_READY)] = dndProcessVnodeFetchMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_TASKS_STATUS] = dndProcessVnodeFetchMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_TASKS_STATUS)] = dndProcessVnodeFetchMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CANCEL_TASK] = dndProcessVnodeFetchMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CANCEL_TASK)] = dndProcessVnodeFetchMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_TASK] = dndProcessVnodeFetchMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_DROP_TASK)] = dndProcessVnodeFetchMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // msg from client to mnode
 | 
					  // msg from client to mnode
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CONNECT] = dndProcessMnodeReadMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CONNECT)] = dndProcessMnodeReadMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_ACCT] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_ACCT)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_ALTER_ACCT] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_ALTER_ACCT)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_ACCT] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_DROP_ACCT)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_USER] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_USER)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_ALTER_USER] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_ALTER_USER)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_USER] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_DROP_USER)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_DNODE] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_DNODE)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CONFIG_DNODE] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CONFIG_DNODE)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_DNODE] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_DROP_DNODE)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_MNODE] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_MNODE)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_MNODE] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_DROP_MNODE)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_DB] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_DB)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_DB] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_DROP_DB)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_USE_DB] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_USE_DB)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_ALTER_DB] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_ALTER_DB)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_SYNC_DB] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_SYNC_DB)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_COMPACT_DB] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_COMPACT_DB)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_FUNCTION] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_FUNCTION)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_RETRIEVE_FUNCTION] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_RETRIEVE_FUNCTION)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_FUNCTION] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_DROP_FUNCTION)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_STB] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_CREATE_STB)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_ALTER_STB] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_ALTER_STB)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_STB] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_DROP_STB)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_VGROUP_LIST] = dndProcessMnodeReadMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_VGROUP_LIST)] = dndProcessMnodeReadMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_KILL_QUERY] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_KILL_QUERY)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_KILL_CONN] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_KILL_CONN)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_HEARTBEAT] = dndProcessMnodeReadMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_HEARTBEAT)] = dndProcessMnodeReadMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_SHOW] = dndProcessMnodeReadMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_SHOW)] = dndProcessMnodeReadMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_SHOW_RETRIEVE] = dndProcessMnodeReadMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_SHOW_RETRIEVE)] = dndProcessMnodeReadMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // message from client to dnode
 | 
					  // message from client to dnode
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_NETWORK_TEST] = dndProcessDnodeReq;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_NETWORK_TEST)] = dndProcessDnodeReq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // message from mnode to vnode
 | 
					  // message from mnode to vnode
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_STB_IN] = dndProcessVnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CREATE_STB)] = dndProcessVnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_STB_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CREATE_STB_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_ALTER_STB_IN] = dndProcessVnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_STB)] = dndProcessVnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_ALTER_STB_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_STB_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_STB_IN] = dndProcessVnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_DROP_STB)] = dndProcessVnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_STB_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_VND_DROP_STB_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // message from mnode to dnode
 | 
					  // message from mnode to dnode
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_VNODE_IN] = dndProcessVnodeMgmtMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_VNODE)] = dndProcessVnodeMgmtMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_VNODE_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_VNODE_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_ALTER_VNODE_IN] = dndProcessVnodeMgmtMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_VNODE)] = dndProcessVnodeMgmtMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_ALTER_VNODE_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_VNODE_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_VNODE_IN] = dndProcessVnodeMgmtMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_VNODE)] = dndProcessVnodeMgmtMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_VNODE_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_VNODE_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_SYNC_VNODE_IN] = dndProcessVnodeMgmtMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_SYNC_VNODE)] = dndProcessVnodeMgmtMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_SYNC_VNODE_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_SYNC_VNODE_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_AUTH_VNODE_IN] = dndProcessVnodeMgmtMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_AUTH_VNODE)] = dndProcessVnodeMgmtMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_AUTH_VNODE_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_AUTH_VNODE_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_COMPACT_VNODE_IN] = dndProcessVnodeMgmtMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_COMPACT_VNODE)] = dndProcessVnodeMgmtMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_COMPACT_VNODE_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_COMPACT_VNODE_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_MNODE_IN] = dndProcessMnodeMgmtMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_MNODE)] = dndProcessMnodeMgmtMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CREATE_MNODE_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CREATE_MNODE_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_ALTER_MNODE_IN] = dndProcessMnodeMgmtMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_MNODE)] = dndProcessMnodeMgmtMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_ALTER_MNODE_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_ALTER_MNODE_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_MNODE_IN] = dndProcessMnodeMgmtMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_MNODE)] = dndProcessMnodeMgmtMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_DROP_MNODE_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_DROP_MNODE_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CONFIG_DNODE_IN] = dndProcessDnodeReq;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CONFIG_DNODE)] = dndProcessDnodeReq;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_CONFIG_DNODE_IN_RSP] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_DND_CONFIG_DNODE_RSP)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // message from dnode to mnode
 | 
					  // message from dnode to mnode
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_GRANT] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GRANT)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_GRANT_RSP] = dndProcessDnodeRsp;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GRANT_RSP)] = dndProcessDnodeRsp;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_STATUS] = dndProcessMnodeWriteMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STATUS)] = dndProcessMnodeWriteMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_STATUS_RSP] = dndProcessDnodeRsp;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_STATUS_RSP)] = dndProcessDnodeRsp;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_AUTH] = dndProcessMnodeReadMsg;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_AUTH)] = dndProcessMnodeReadMsg;
 | 
				
			||||||
  pMgmt->msgFp[TSDB_MSG_TYPE_AUTH_RSP] = dndProcessDnodeRsp;
 | 
					  pMgmt->msgFp[TMSG_INDEX(TDMT_MND_AUTH_RSP)] = dndProcessDnodeRsp;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void dndProcessResponse(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) {
 | 
					static void dndProcessResponse(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) {
 | 
				
			||||||
  SDnode     *pDnode = parent;
 | 
					  SDnode     *pDnode = parent;
 | 
				
			||||||
  STransMgmt *pMgmt = &pDnode->tmgmt;
 | 
					  STransMgmt *pMgmt = &pDnode->tmgmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int32_t msgType = pMsg->msgType;
 | 
					  tmsg_t msgType = pMsg->msgType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (dndGetStat(pDnode) == DND_STAT_STOPPED) {
 | 
					  if (dndGetStat(pDnode) == DND_STAT_STOPPED) {
 | 
				
			||||||
    if (pMsg == NULL || pMsg->pCont == NULL) return;
 | 
					    if (pMsg == NULL || pMsg->pCont == NULL) return;
 | 
				
			||||||
    dTrace("RPC %p, rsp:%s is ignored since dnode is stopping", pMsg->handle, taosMsg[msgType]);
 | 
					    dTrace("RPC %p, rsp:%s is ignored since dnode is stopping", pMsg->handle, TMSG_INFO(msgType));
 | 
				
			||||||
    rpcFreeCont(pMsg->pCont);
 | 
					    rpcFreeCont(pMsg->pCont);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DndMsgFp fp = pMgmt->msgFp[msgType];
 | 
					  DndMsgFp fp = pMgmt->msgFp[TMSG_INDEX(msgType)];
 | 
				
			||||||
  if (fp != NULL) {
 | 
					  if (fp != NULL) {
 | 
				
			||||||
    (*fp)(pDnode, pMsg, pEpSet);
 | 
					    (*fp)(pDnode, pMsg, pEpSet);
 | 
				
			||||||
    dTrace("RPC %p, rsp:%s is processed, code:0x%x", pMsg->handle, taosMsg[msgType], pMsg->code & 0XFFFF);
 | 
					    dTrace("RPC %p, rsp:%s is processed, code:0x%x", pMsg->handle, TMSG_INFO(msgType), pMsg->code & 0XFFFF);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    dError("RPC %p, rsp:%s not processed", pMsg->handle, taosMsg[msgType]);
 | 
					    dError("RPC %p, rsp:%s not processed", pMsg->handle, TMSG_INFO(msgType));
 | 
				
			||||||
    rpcFreeCont(pMsg->pCont);
 | 
					    rpcFreeCont(pMsg->pCont);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -186,21 +186,21 @@ static void dndProcessRequest(void *param, SRpcMsg *pMsg, SEpSet *pEpSet) {
 | 
				
			||||||
  SDnode     *pDnode = param;
 | 
					  SDnode     *pDnode = param;
 | 
				
			||||||
  STransMgmt *pMgmt = &pDnode->tmgmt;
 | 
					  STransMgmt *pMgmt = &pDnode->tmgmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int32_t msgType = pMsg->msgType;
 | 
					  tmsg_t msgType = pMsg->msgType;
 | 
				
			||||||
  if (msgType == TSDB_MSG_TYPE_NETWORK_TEST) {
 | 
					  if (msgType == TDMT_DND_NETWORK_TEST) {
 | 
				
			||||||
    dTrace("RPC %p, network test req, app:%p will be processed, code:0x%x", pMsg->handle, pMsg->ahandle, pMsg->code);
 | 
					    dTrace("RPC %p, network test req, app:%p will be processed, code:0x%x", pMsg->handle, pMsg->ahandle, pMsg->code);
 | 
				
			||||||
    dndProcessDnodeReq(pDnode, pMsg, pEpSet);
 | 
					    dndProcessDnodeReq(pDnode, pMsg, pEpSet);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (dndGetStat(pDnode) == DND_STAT_STOPPED) {
 | 
					  if (dndGetStat(pDnode) == DND_STAT_STOPPED) {
 | 
				
			||||||
    dError("RPC %p, req:%s app:%p is ignored since dnode exiting", pMsg->handle, taosMsg[msgType], pMsg->ahandle);
 | 
					    dError("RPC %p, req:%s app:%p is ignored since dnode exiting", pMsg->handle, TMSG_INFO(msgType), pMsg->ahandle);
 | 
				
			||||||
    SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_DND_EXITING};
 | 
					    SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_DND_EXITING};
 | 
				
			||||||
    rpcSendResponse(&rspMsg);
 | 
					    rpcSendResponse(&rspMsg);
 | 
				
			||||||
    rpcFreeCont(pMsg->pCont);
 | 
					    rpcFreeCont(pMsg->pCont);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  } else if (dndGetStat(pDnode) != DND_STAT_RUNNING) {
 | 
					  } else if (dndGetStat(pDnode) != DND_STAT_RUNNING) {
 | 
				
			||||||
    dError("RPC %p, req:%s app:%p is ignored since dnode not running", pMsg->handle, taosMsg[msgType], pMsg->ahandle);
 | 
					    dError("RPC %p, req:%s app:%p is ignored since dnode not running", pMsg->handle, TMSG_INFO(msgType), pMsg->ahandle);
 | 
				
			||||||
    SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_APP_NOT_READY};
 | 
					    SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_APP_NOT_READY};
 | 
				
			||||||
    rpcSendResponse(&rspMsg);
 | 
					    rpcSendResponse(&rspMsg);
 | 
				
			||||||
    rpcFreeCont(pMsg->pCont);
 | 
					    rpcFreeCont(pMsg->pCont);
 | 
				
			||||||
| 
						 | 
					@ -208,18 +208,18 @@ static void dndProcessRequest(void *param, SRpcMsg *pMsg, SEpSet *pEpSet) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pMsg->pCont == NULL) {
 | 
					  if (pMsg->pCont == NULL) {
 | 
				
			||||||
    dTrace("RPC %p, req:%s app:%p not processed since content is null", pMsg->handle, taosMsg[msgType], pMsg->ahandle);
 | 
					    dTrace("RPC %p, req:%s app:%p not processed since content is null", pMsg->handle, TMSG_INFO(msgType), pMsg->ahandle);
 | 
				
			||||||
    SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_DND_INVALID_MSG_LEN};
 | 
					    SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_DND_INVALID_MSG_LEN};
 | 
				
			||||||
    rpcSendResponse(&rspMsg);
 | 
					    rpcSendResponse(&rspMsg);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DndMsgFp fp = pMgmt->msgFp[msgType];
 | 
					  DndMsgFp fp = pMgmt->msgFp[TMSG_INDEX(msgType)];
 | 
				
			||||||
  if (fp != NULL) {
 | 
					  if (fp != NULL) {
 | 
				
			||||||
    dTrace("RPC %p, req:%s app:%p will be processed", pMsg->handle, taosMsg[msgType], pMsg->ahandle);
 | 
					    dTrace("RPC %p, req:%s app:%p will be processed", pMsg->handle, TMSG_INFO(msgType), pMsg->ahandle);
 | 
				
			||||||
    (*fp)(pDnode, pMsg, pEpSet);
 | 
					    (*fp)(pDnode, pMsg, pEpSet);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    dError("RPC %p, req:%s app:%p is not processed since no handle", pMsg->handle, taosMsg[msgType], pMsg->ahandle);
 | 
					    dError("RPC %p, req:%s app:%p is not processed since no handle", pMsg->handle, TMSG_INFO(msgType), pMsg->ahandle);
 | 
				
			||||||
    SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_MSG_NOT_PROCESSED};
 | 
					    SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_MSG_NOT_PROCESSED};
 | 
				
			||||||
    rpcSendResponse(&rspMsg);
 | 
					    rpcSendResponse(&rspMsg);
 | 
				
			||||||
    rpcFreeCont(pMsg->pCont);
 | 
					    rpcFreeCont(pMsg->pCont);
 | 
				
			||||||
| 
						 | 
					@ -281,7 +281,7 @@ static int32_t dndRetrieveUserAuthInfo(void *parent, char *user, char *spi, char
 | 
				
			||||||
  SAuthMsg *pMsg = rpcMallocCont(sizeof(SAuthMsg));
 | 
					  SAuthMsg *pMsg = rpcMallocCont(sizeof(SAuthMsg));
 | 
				
			||||||
  tstrncpy(pMsg->user, user, TSDB_USER_LEN);
 | 
					  tstrncpy(pMsg->user, user, TSDB_USER_LEN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg rpcMsg = {.pCont = pMsg, .contLen = sizeof(SAuthMsg), .msgType = TSDB_MSG_TYPE_AUTH};
 | 
					  SRpcMsg rpcMsg = {.pCont = pMsg, .contLen = sizeof(SAuthMsg), .msgType = TDMT_MND_AUTH};
 | 
				
			||||||
  SRpcMsg rpcRsp = {0};
 | 
					  SRpcMsg rpcRsp = {0};
 | 
				
			||||||
  dndSendMsgToMnodeRecv(pDnode, &rpcMsg, &rpcRsp);
 | 
					  dndSendMsgToMnodeRecv(pDnode, &rpcMsg, &rpcRsp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -773,22 +773,22 @@ static void dndProcessVnodeMgmtQueue(SDnode *pDnode, SRpcMsg *pMsg) {
 | 
				
			||||||
  int32_t code = 0;
 | 
					  int32_t code = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (pMsg->msgType) {
 | 
					  switch (pMsg->msgType) {
 | 
				
			||||||
    case TSDB_MSG_TYPE_CREATE_VNODE_IN:
 | 
					    case TDMT_DND_CREATE_VNODE:
 | 
				
			||||||
      code = dndProcessCreateVnodeReq(pDnode, pMsg);
 | 
					      code = dndProcessCreateVnodeReq(pDnode, pMsg);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_ALTER_VNODE_IN:
 | 
					    case TDMT_DND_ALTER_VNODE:
 | 
				
			||||||
      code = dndProcessAlterVnodeReq(pDnode, pMsg);
 | 
					      code = dndProcessAlterVnodeReq(pDnode, pMsg);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_DROP_VNODE_IN:
 | 
					    case TDMT_DND_DROP_VNODE:
 | 
				
			||||||
      code = dndProcessDropVnodeReq(pDnode, pMsg);
 | 
					      code = dndProcessDropVnodeReq(pDnode, pMsg);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_AUTH_VNODE_IN:
 | 
					    case TDMT_DND_AUTH_VNODE:
 | 
				
			||||||
      code = dndProcessAuthVnodeReq(pDnode, pMsg);
 | 
					      code = dndProcessAuthVnodeReq(pDnode, pMsg);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_SYNC_VNODE_IN:
 | 
					    case TDMT_DND_SYNC_VNODE:
 | 
				
			||||||
      code = dndProcessSyncVnodeReq(pDnode, pMsg);
 | 
					      code = dndProcessSyncVnodeReq(pDnode, pMsg);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_COMPACT_VNODE_IN:
 | 
					    case TDMT_DND_COMPACT_VNODE:
 | 
				
			||||||
      code = dndProcessCompactVnodeReq(pDnode, pMsg);
 | 
					      code = dndProcessCompactVnodeReq(pDnode, pMsg);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
| 
						 | 
					@ -829,6 +829,7 @@ static void dndProcessVnodeWriteQueue(SVnodeObj *pVnode, taos_qall qall, int32_t
 | 
				
			||||||
    SRpcMsg *pMsg = *(SRpcMsg **)taosArrayGet(pArray, i);
 | 
					    SRpcMsg *pMsg = *(SRpcMsg **)taosArrayGet(pArray, i);
 | 
				
			||||||
    int32_t  code = vnodeApplyWMsg(pVnode->pImpl, pMsg, &pRsp);
 | 
					    int32_t  code = vnodeApplyWMsg(pVnode->pImpl, pMsg, &pRsp);
 | 
				
			||||||
    if (pRsp != NULL) {
 | 
					    if (pRsp != NULL) {
 | 
				
			||||||
 | 
					      pRsp->ahandle = pMsg->ahandle;
 | 
				
			||||||
      rpcSendResponse(pRsp);
 | 
					      rpcSendResponse(pRsp);
 | 
				
			||||||
      free(pRsp);
 | 
					      free(pRsp);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@ TEST_F(DndTestAcct, 01_CreateAcct) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SCreateAcctMsg* pReq = (SCreateAcctMsg*)rpcMallocCont(contLen);
 | 
					  SCreateAcctMsg* pReq = (SCreateAcctMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_ACCT, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_ACCT, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_MSG_NOT_PROCESSED);
 | 
					  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_MSG_NOT_PROCESSED);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -40,7 +40,7 @@ TEST_F(DndTestAcct, 02_AlterAcct) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SAlterAcctMsg* pReq = (SAlterAcctMsg*)rpcMallocCont(contLen);
 | 
					  SAlterAcctMsg* pReq = (SAlterAcctMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_ALTER_ACCT, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_ALTER_ACCT, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_MSG_NOT_PROCESSED);
 | 
					  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_MSG_NOT_PROCESSED);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -50,7 +50,7 @@ TEST_F(DndTestAcct, 03_DropAcct) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SDropAcctMsg* pReq = (SDropAcctMsg*)rpcMallocCont(contLen);
 | 
					  SDropAcctMsg* pReq = (SDropAcctMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_DROP_ACCT, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_DROP_ACCT, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_MSG_NOT_PROCESSED);
 | 
					  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_MSG_NOT_PROCESSED);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -61,7 +61,7 @@ TEST_F(DndTestAcct, 04_ShowAcct) {
 | 
				
			||||||
  SShowMsg* pReq = (SShowMsg*)rpcMallocCont(contLen);
 | 
					  SShowMsg* pReq = (SShowMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
  pReq->type = TSDB_MGMT_TABLE_ACCT;
 | 
					  pReq->type = TSDB_MGMT_TABLE_ACCT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_SHOW, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_SHOW, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_MSG_TYPE);
 | 
					  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_MSG_TYPE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -27,24 +27,25 @@ Testbase DndTestDb::test;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST_F(DndTestDb, 01_ShowDb) {
 | 
					TEST_F(DndTestDb, 01_ShowDb) {
 | 
				
			||||||
  test.SendShowMetaMsg(TSDB_MGMT_TABLE_DB, "");
 | 
					  test.SendShowMetaMsg(TSDB_MGMT_TABLE_DB, "");
 | 
				
			||||||
  CHECK_META("show databases", 17);
 | 
					  CHECK_META("show databases", 18);
 | 
				
			||||||
  CHECK_SCHEMA(0, TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN - 1 + VARSTR_HEADER_SIZE, "name");
 | 
					  CHECK_SCHEMA(0, TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN - 1 + VARSTR_HEADER_SIZE, "name");
 | 
				
			||||||
  CHECK_SCHEMA(1, TSDB_DATA_TYPE_TIMESTAMP, 8, "create_time");
 | 
					  CHECK_SCHEMA(1, TSDB_DATA_TYPE_TIMESTAMP, 8, "create_time");
 | 
				
			||||||
  CHECK_SCHEMA(2, TSDB_DATA_TYPE_SMALLINT, 2, "vgroups");
 | 
					  CHECK_SCHEMA(2, TSDB_DATA_TYPE_SMALLINT, 2, "vgroups");
 | 
				
			||||||
  CHECK_SCHEMA(3, TSDB_DATA_TYPE_SMALLINT, 2, "replica");
 | 
					  CHECK_SCHEMA(3, TSDB_DATA_TYPE_INT, 4, "ntables");
 | 
				
			||||||
  CHECK_SCHEMA(4, TSDB_DATA_TYPE_SMALLINT, 2, "quorum");
 | 
					  CHECK_SCHEMA(4, TSDB_DATA_TYPE_SMALLINT, 2, "replica");
 | 
				
			||||||
  CHECK_SCHEMA(5, TSDB_DATA_TYPE_SMALLINT, 2, "days");
 | 
					  CHECK_SCHEMA(5, TSDB_DATA_TYPE_SMALLINT, 2, "quorum");
 | 
				
			||||||
  CHECK_SCHEMA(6, TSDB_DATA_TYPE_BINARY, 24 + VARSTR_HEADER_SIZE, "keep0,keep1,keep2");
 | 
					  CHECK_SCHEMA(6, TSDB_DATA_TYPE_SMALLINT, 2, "days");
 | 
				
			||||||
  CHECK_SCHEMA(7, TSDB_DATA_TYPE_INT, 4, "cache");
 | 
					  CHECK_SCHEMA(7, TSDB_DATA_TYPE_BINARY, 24 + VARSTR_HEADER_SIZE, "keep0,keep1,keep2");
 | 
				
			||||||
  CHECK_SCHEMA(8, TSDB_DATA_TYPE_INT, 4, "blocks");
 | 
					  CHECK_SCHEMA(8, TSDB_DATA_TYPE_INT, 4, "cache");
 | 
				
			||||||
  CHECK_SCHEMA(9, TSDB_DATA_TYPE_INT, 4, "minrows");
 | 
					  CHECK_SCHEMA(9, TSDB_DATA_TYPE_INT, 4, "blocks");
 | 
				
			||||||
  CHECK_SCHEMA(10, TSDB_DATA_TYPE_INT, 4, "maxrows");
 | 
					  CHECK_SCHEMA(10, TSDB_DATA_TYPE_INT, 4, "minrows");
 | 
				
			||||||
  CHECK_SCHEMA(11, TSDB_DATA_TYPE_TINYINT, 1, "wallevel");
 | 
					  CHECK_SCHEMA(11, TSDB_DATA_TYPE_INT, 4, "maxrows");
 | 
				
			||||||
  CHECK_SCHEMA(12, TSDB_DATA_TYPE_INT, 4, "fsync");
 | 
					  CHECK_SCHEMA(12, TSDB_DATA_TYPE_TINYINT, 1, "wallevel");
 | 
				
			||||||
  CHECK_SCHEMA(13, TSDB_DATA_TYPE_TINYINT, 1, "comp");
 | 
					  CHECK_SCHEMA(13, TSDB_DATA_TYPE_INT, 4, "fsync");
 | 
				
			||||||
  CHECK_SCHEMA(14, TSDB_DATA_TYPE_TINYINT, 1, "cachelast");
 | 
					  CHECK_SCHEMA(14, TSDB_DATA_TYPE_TINYINT, 1, "comp");
 | 
				
			||||||
  CHECK_SCHEMA(15, TSDB_DATA_TYPE_BINARY, 3 + VARSTR_HEADER_SIZE, "precision");
 | 
					  CHECK_SCHEMA(15, TSDB_DATA_TYPE_TINYINT, 1, "cachelast");
 | 
				
			||||||
  CHECK_SCHEMA(16, TSDB_DATA_TYPE_TINYINT, 1, "update");
 | 
					  CHECK_SCHEMA(16, TSDB_DATA_TYPE_BINARY, 3 + VARSTR_HEADER_SIZE, "precision");
 | 
				
			||||||
 | 
					  CHECK_SCHEMA(17, TSDB_DATA_TYPE_TINYINT, 1, "update");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  test.SendShowRetrieveMsg();
 | 
					  test.SendShowRetrieveMsg();
 | 
				
			||||||
  EXPECT_EQ(test.GetShowRows(), 0);
 | 
					  EXPECT_EQ(test.GetShowRows(), 0);
 | 
				
			||||||
| 
						 | 
					@ -76,19 +77,20 @@ TEST_F(DndTestDb, 02_Create_Alter_Drop_Db) {
 | 
				
			||||||
    pReq->cacheLastRow = 0;
 | 
					    pReq->cacheLastRow = 0;
 | 
				
			||||||
    pReq->ignoreExist = 1;
 | 
					    pReq->ignoreExist = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_DB, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_DB, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  test.SendShowMetaMsg(TSDB_MGMT_TABLE_DB, "");
 | 
					  test.SendShowMetaMsg(TSDB_MGMT_TABLE_DB, "");
 | 
				
			||||||
  CHECK_META("show databases", 17);
 | 
					  CHECK_META("show databases", 18);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  test.SendShowRetrieveMsg();
 | 
					  test.SendShowRetrieveMsg();
 | 
				
			||||||
  EXPECT_EQ(test.GetShowRows(), 1);
 | 
					  EXPECT_EQ(test.GetShowRows(), 1);
 | 
				
			||||||
  CheckBinary("d1", TSDB_DB_NAME_LEN - 1);
 | 
					  CheckBinary("d1", TSDB_DB_NAME_LEN - 1);
 | 
				
			||||||
  CheckTimestamp();
 | 
					  CheckTimestamp();
 | 
				
			||||||
  CheckInt16(2);                      // vgroups
 | 
					  CheckInt16(2);                      // vgroups
 | 
				
			||||||
 | 
					  CheckInt32(0);                      // ntables
 | 
				
			||||||
  CheckInt16(1);                      // replica
 | 
					  CheckInt16(1);                      // replica
 | 
				
			||||||
  CheckInt16(1);                      // quorum
 | 
					  CheckInt16(1);                      // quorum
 | 
				
			||||||
  CheckInt16(10);                     // days
 | 
					  CheckInt16(10);                     // days
 | 
				
			||||||
| 
						 | 
					@ -136,7 +138,7 @@ TEST_F(DndTestDb, 02_Create_Alter_Drop_Db) {
 | 
				
			||||||
    pReq->quorum = 2;
 | 
					    pReq->quorum = 2;
 | 
				
			||||||
    pReq->cacheLastRow = 1;
 | 
					    pReq->cacheLastRow = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_ALTER_DB, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_ALTER_DB, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -147,6 +149,7 @@ TEST_F(DndTestDb, 02_Create_Alter_Drop_Db) {
 | 
				
			||||||
  CheckBinary("d1", TSDB_DB_NAME_LEN - 1);
 | 
					  CheckBinary("d1", TSDB_DB_NAME_LEN - 1);
 | 
				
			||||||
  CheckTimestamp();
 | 
					  CheckTimestamp();
 | 
				
			||||||
  CheckInt16(2);                   // vgroups
 | 
					  CheckInt16(2);                   // vgroups
 | 
				
			||||||
 | 
					  CheckInt32(0);
 | 
				
			||||||
  CheckInt16(1);                   // replica
 | 
					  CheckInt16(1);                   // replica
 | 
				
			||||||
  CheckInt16(2);                   // quorum
 | 
					  CheckInt16(2);                   // quorum
 | 
				
			||||||
  CheckInt16(10);                  // days
 | 
					  CheckInt16(10);                  // days
 | 
				
			||||||
| 
						 | 
					@ -166,7 +169,7 @@ TEST_F(DndTestDb, 02_Create_Alter_Drop_Db) {
 | 
				
			||||||
  test.Restart();
 | 
					  test.Restart();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  test.SendShowMetaMsg(TSDB_MGMT_TABLE_DB, "");
 | 
					  test.SendShowMetaMsg(TSDB_MGMT_TABLE_DB, "");
 | 
				
			||||||
  CHECK_META("show databases", 17);
 | 
					  CHECK_META("show databases", 18);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  test.SendShowRetrieveMsg();
 | 
					  test.SendShowRetrieveMsg();
 | 
				
			||||||
  EXPECT_EQ(test.GetShowRows(), 1);
 | 
					  EXPECT_EQ(test.GetShowRows(), 1);
 | 
				
			||||||
| 
						 | 
					@ -174,6 +177,7 @@ TEST_F(DndTestDb, 02_Create_Alter_Drop_Db) {
 | 
				
			||||||
  CheckBinary("d1", TSDB_DB_NAME_LEN - 1);
 | 
					  CheckBinary("d1", TSDB_DB_NAME_LEN - 1);
 | 
				
			||||||
  CheckTimestamp();
 | 
					  CheckTimestamp();
 | 
				
			||||||
  CheckInt16(2);                   // vgroups
 | 
					  CheckInt16(2);                   // vgroups
 | 
				
			||||||
 | 
					  CheckInt32(0);
 | 
				
			||||||
  CheckInt16(1);                   // replica
 | 
					  CheckInt16(1);                   // replica
 | 
				
			||||||
  CheckInt16(2);                   // quorum
 | 
					  CheckInt16(2);                   // quorum
 | 
				
			||||||
  CheckInt16(10);                  // days
 | 
					  CheckInt16(10);                  // days
 | 
				
			||||||
| 
						 | 
					@ -195,13 +199,13 @@ TEST_F(DndTestDb, 02_Create_Alter_Drop_Db) {
 | 
				
			||||||
    SDropDbMsg* pReq = (SDropDbMsg*)rpcMallocCont(contLen);
 | 
					    SDropDbMsg* pReq = (SDropDbMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    strcpy(pReq->db, "1.d1");
 | 
					    strcpy(pReq->db, "1.d1");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_DROP_DB, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_DROP_DB, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  test.SendShowMetaMsg(TSDB_MGMT_TABLE_DB, "");
 | 
					  test.SendShowMetaMsg(TSDB_MGMT_TABLE_DB, "");
 | 
				
			||||||
  CHECK_META("show databases", 17);
 | 
					  CHECK_META("show databases", 18);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  test.SendShowRetrieveMsg();
 | 
					  test.SendShowRetrieveMsg();
 | 
				
			||||||
  EXPECT_EQ(test.GetShowRows(), 0);
 | 
					  EXPECT_EQ(test.GetShowRows(), 0);
 | 
				
			||||||
| 
						 | 
					@ -233,13 +237,13 @@ TEST_F(DndTestDb, 03_Create_Use_Restart_Use_Db) {
 | 
				
			||||||
    pReq->cacheLastRow = 0;
 | 
					    pReq->cacheLastRow = 0;
 | 
				
			||||||
    pReq->ignoreExist = 1;
 | 
					    pReq->ignoreExist = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_DB, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_DB, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  test.SendShowMetaMsg(TSDB_MGMT_TABLE_DB, "");
 | 
					  test.SendShowMetaMsg(TSDB_MGMT_TABLE_DB, "");
 | 
				
			||||||
  CHECK_META("show databases", 17);
 | 
					  CHECK_META("show databases", 18);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  test.SendShowRetrieveMsg();
 | 
					  test.SendShowRetrieveMsg();
 | 
				
			||||||
  EXPECT_EQ(test.GetShowRows(), 1);
 | 
					  EXPECT_EQ(test.GetShowRows(), 1);
 | 
				
			||||||
| 
						 | 
					@ -252,7 +256,7 @@ TEST_F(DndTestDb, 03_Create_Use_Restart_Use_Db) {
 | 
				
			||||||
    strcpy(pReq->db, "1.d2");
 | 
					    strcpy(pReq->db, "1.d2");
 | 
				
			||||||
    pReq->vgVersion = htonl(-1);
 | 
					    pReq->vgVersion = htonl(-1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_USE_DB, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_USE_DB, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,7 +81,7 @@ TEST_F(DndTestDnode, 02_ConfigDnode) {
 | 
				
			||||||
  pReq->dnodeId = htonl(1);
 | 
					  pReq->dnodeId = htonl(1);
 | 
				
			||||||
  strcpy(pReq->config, "ddebugflag 131");
 | 
					  strcpy(pReq->config, "ddebugflag 131");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CONFIG_DNODE, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CONFIG_DNODE, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, 0);
 | 
					  ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -93,7 +93,7 @@ TEST_F(DndTestDnode, 03_Create_Drop_Restart_Dnode) {
 | 
				
			||||||
    SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
					    SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    strcpy(pReq->ep, "localhost:9042");
 | 
					    strcpy(pReq->ep, "localhost:9042");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_DNODE, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_DNODE, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -126,7 +126,7 @@ TEST_F(DndTestDnode, 03_Create_Drop_Restart_Dnode) {
 | 
				
			||||||
    SDropDnodeMsg* pReq = (SDropDnodeMsg*)rpcMallocCont(contLen);
 | 
					    SDropDnodeMsg* pReq = (SDropDnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    pReq->dnodeId = htonl(2);
 | 
					    pReq->dnodeId = htonl(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_DROP_DNODE, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_DROP_DNODE, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -150,7 +150,7 @@ TEST_F(DndTestDnode, 03_Create_Drop_Restart_Dnode) {
 | 
				
			||||||
    SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
					    SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    strcpy(pReq->ep, "localhost:9043");
 | 
					    strcpy(pReq->ep, "localhost:9043");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_DNODE, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_DNODE, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -161,7 +161,7 @@ TEST_F(DndTestDnode, 03_Create_Drop_Restart_Dnode) {
 | 
				
			||||||
    SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
					    SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    strcpy(pReq->ep, "localhost:9044");
 | 
					    strcpy(pReq->ep, "localhost:9044");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_DNODE, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_DNODE, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -172,7 +172,7 @@ TEST_F(DndTestDnode, 03_Create_Drop_Restart_Dnode) {
 | 
				
			||||||
    SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
					    SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    strcpy(pReq->ep, "localhost:9045");
 | 
					    strcpy(pReq->ep, "localhost:9045");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_DNODE, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_DNODE, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -77,7 +77,7 @@ TEST_F(DndTestMnode, 02_Create_Mnode_Invalid_Id) {
 | 
				
			||||||
    SCreateMnodeMsg* pReq = (SCreateMnodeMsg*)rpcMallocCont(contLen);
 | 
					    SCreateMnodeMsg* pReq = (SCreateMnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    pReq->dnodeId = htonl(1);
 | 
					    pReq->dnodeId = htonl(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_MNODE, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_MNODE, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, TSDB_CODE_MND_MNODE_ALREADY_EXIST);
 | 
					    ASSERT_EQ(pMsg->code, TSDB_CODE_MND_MNODE_ALREADY_EXIST);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -90,7 +90,7 @@ TEST_F(DndTestMnode, 03_Create_Mnode_Invalid_Id) {
 | 
				
			||||||
    SCreateMnodeMsg* pReq = (SCreateMnodeMsg*)rpcMallocCont(contLen);
 | 
					    SCreateMnodeMsg* pReq = (SCreateMnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    pReq->dnodeId = htonl(2);
 | 
					    pReq->dnodeId = htonl(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_MNODE, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_MNODE, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, TSDB_CODE_MND_DNODE_NOT_EXIST);
 | 
					    ASSERT_EQ(pMsg->code, TSDB_CODE_MND_DNODE_NOT_EXIST);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -104,7 +104,7 @@ TEST_F(DndTestMnode, 04_Create_Mnode) {
 | 
				
			||||||
    SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
					    SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    strcpy(pReq->ep, "localhost:9062");
 | 
					    strcpy(pReq->ep, "localhost:9062");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_DNODE, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_DNODE, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,7 +121,7 @@ TEST_F(DndTestMnode, 04_Create_Mnode) {
 | 
				
			||||||
    SCreateMnodeMsg* pReq = (SCreateMnodeMsg*)rpcMallocCont(contLen);
 | 
					    SCreateMnodeMsg* pReq = (SCreateMnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    pReq->dnodeId = htonl(2);
 | 
					    pReq->dnodeId = htonl(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_MNODE, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_MNODE, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -148,7 +148,7 @@ TEST_F(DndTestMnode, 04_Create_Mnode) {
 | 
				
			||||||
    SDropMnodeMsg* pReq = (SDropMnodeMsg*)rpcMallocCont(contLen);
 | 
					    SDropMnodeMsg* pReq = (SDropMnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    pReq->dnodeId = htonl(2);
 | 
					    pReq->dnodeId = htonl(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_DROP_MNODE, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_DROP_MNODE, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -169,7 +169,7 @@ TEST_F(DndTestMnode, 04_Create_Mnode) {
 | 
				
			||||||
//   SDropDnodeMsg* pReq = (SDropDnodeMsg*)rpcMallocCont(contLen);
 | 
					//   SDropDnodeMsg* pReq = (SDropDnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
//   pReq->dnodeId = htonl(2);
 | 
					//   pReq->dnodeId = htonl(2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//   SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_DROP_DNODE, pReq, contLen);
 | 
					//   SRpcMsg* pMsg = test.SendMsg(TDMT_MND_DROP_DNODE, pReq, contLen);
 | 
				
			||||||
//   ASSERT_NE(pMsg, nullptr);
 | 
					//   ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
//   ASSERT_EQ(pMsg->code, 0);
 | 
					//   ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
// }
 | 
					// }
 | 
				
			||||||
| 
						 | 
					@ -193,7 +193,7 @@ TEST_F(DndTestMnode, 04_Create_Mnode) {
 | 
				
			||||||
//   SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
					//   SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
//   strcpy(pReq->ep, "localhost:9063");
 | 
					//   strcpy(pReq->ep, "localhost:9063");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//   SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_DNODE, pReq, contLen);
 | 
					//   SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_DNODE, pReq, contLen);
 | 
				
			||||||
//   ASSERT_NE(pMsg, nullptr);
 | 
					//   ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
//   ASSERT_EQ(pMsg->code, 0);
 | 
					//   ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
// }
 | 
					// }
 | 
				
			||||||
| 
						 | 
					@ -204,7 +204,7 @@ TEST_F(DndTestMnode, 04_Create_Mnode) {
 | 
				
			||||||
//   SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
					//   SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
//   strcpy(pReq->ep, "localhost:9064");
 | 
					//   strcpy(pReq->ep, "localhost:9064");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//   SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_DNODE, pReq, contLen);
 | 
					//   SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_DNODE, pReq, contLen);
 | 
				
			||||||
//   ASSERT_NE(pMsg, nullptr);
 | 
					//   ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
//   ASSERT_EQ(pMsg->code, 0);
 | 
					//   ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
// }
 | 
					// }
 | 
				
			||||||
| 
						 | 
					@ -215,7 +215,7 @@ TEST_F(DndTestMnode, 04_Create_Mnode) {
 | 
				
			||||||
//   SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
					//   SCreateDnodeMsg* pReq = (SCreateDnodeMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
//   strcpy(pReq->ep, "localhost:9065");
 | 
					//   strcpy(pReq->ep, "localhost:9065");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//   SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_DNODE, pReq, contLen);
 | 
					//   SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_DNODE, pReq, contLen);
 | 
				
			||||||
//   ASSERT_NE(pMsg, nullptr);
 | 
					//   ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
//   ASSERT_EQ(pMsg->code, 0);
 | 
					//   ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
// }
 | 
					// }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,7 @@ TEST_F(DndTestProfile, 01_ConnectMsg) {
 | 
				
			||||||
  strcpy(pReq->app, "dnode_test_profile");
 | 
					  strcpy(pReq->app, "dnode_test_profile");
 | 
				
			||||||
  strcpy(pReq->db, "");
 | 
					  strcpy(pReq->db, "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CONNECT, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CONNECT, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, 0);
 | 
					  ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,7 +67,7 @@ TEST_F(DndTestProfile, 02_ConnectMsg_InvalidDB) {
 | 
				
			||||||
  strcpy(pReq->app, "dnode_test_profile");
 | 
					  strcpy(pReq->app, "dnode_test_profile");
 | 
				
			||||||
  strcpy(pReq->db, "invalid_db");
 | 
					  strcpy(pReq->db, "invalid_db");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CONNECT, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CONNECT, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_DB);
 | 
					  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_DB);
 | 
				
			||||||
  ASSERT_EQ(pMsg->contLen, 0);
 | 
					  ASSERT_EQ(pMsg->contLen, 0);
 | 
				
			||||||
| 
						 | 
					@ -105,7 +105,7 @@ TEST_F(DndTestProfile, 04_HeartBeatMsg) {
 | 
				
			||||||
  pReq->numOfStreams = htonl(0);
 | 
					  pReq->numOfStreams = htonl(0);
 | 
				
			||||||
  strcpy(pReq->app, "dnode_test_profile");
 | 
					  strcpy(pReq->app, "dnode_test_profile");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_HEARTBEAT, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_HEARTBEAT, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, 0);
 | 
					  ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -138,7 +138,7 @@ TEST_F(DndTestProfile, 05_KillConnMsg) {
 | 
				
			||||||
    SKillConnMsg* pReq = (SKillConnMsg*)rpcMallocCont(contLen);
 | 
					    SKillConnMsg* pReq = (SKillConnMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    pReq->connId = htonl(connId);
 | 
					    pReq->connId = htonl(connId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_KILL_CONN, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_KILL_CONN, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -153,7 +153,7 @@ TEST_F(DndTestProfile, 05_KillConnMsg) {
 | 
				
			||||||
    pReq->numOfStreams = htonl(0);
 | 
					    pReq->numOfStreams = htonl(0);
 | 
				
			||||||
    strcpy(pReq->app, "dnode_test_profile");
 | 
					    strcpy(pReq->app, "dnode_test_profile");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_HEARTBEAT, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_HEARTBEAT, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_CONNECTION);
 | 
					    ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_CONNECTION);
 | 
				
			||||||
    ASSERT_EQ(pMsg->contLen, 0);
 | 
					    ASSERT_EQ(pMsg->contLen, 0);
 | 
				
			||||||
| 
						 | 
					@ -167,7 +167,7 @@ TEST_F(DndTestProfile, 05_KillConnMsg) {
 | 
				
			||||||
    strcpy(pReq->app, "dnode_test_profile");
 | 
					    strcpy(pReq->app, "dnode_test_profile");
 | 
				
			||||||
    strcpy(pReq->db, "");
 | 
					    strcpy(pReq->db, "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CONNECT, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CONNECT, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -198,7 +198,7 @@ TEST_F(DndTestProfile, 06_KillConnMsg_InvalidConn) {
 | 
				
			||||||
  SKillConnMsg* pReq = (SKillConnMsg*)rpcMallocCont(contLen);
 | 
					  SKillConnMsg* pReq = (SKillConnMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
  pReq->connId = htonl(2345);
 | 
					  pReq->connId = htonl(2345);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_KILL_CONN, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_KILL_CONN, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_CONN_ID);
 | 
					  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_CONN_ID);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -211,7 +211,7 @@ TEST_F(DndTestProfile, 07_KillQueryMsg) {
 | 
				
			||||||
    pReq->connId = htonl(connId);
 | 
					    pReq->connId = htonl(connId);
 | 
				
			||||||
    pReq->queryId = htonl(1234);
 | 
					    pReq->queryId = htonl(1234);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_KILL_QUERY, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_KILL_QUERY, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
    ASSERT_EQ(pMsg->contLen, 0);
 | 
					    ASSERT_EQ(pMsg->contLen, 0);
 | 
				
			||||||
| 
						 | 
					@ -227,7 +227,7 @@ TEST_F(DndTestProfile, 07_KillQueryMsg) {
 | 
				
			||||||
    pReq->numOfStreams = htonl(0);
 | 
					    pReq->numOfStreams = htonl(0);
 | 
				
			||||||
    strcpy(pReq->app, "dnode_test_profile");
 | 
					    strcpy(pReq->app, "dnode_test_profile");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_HEARTBEAT, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_HEARTBEAT, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -261,7 +261,7 @@ TEST_F(DndTestProfile, 08_KillQueryMsg_InvalidConn) {
 | 
				
			||||||
  pReq->connId = htonl(2345);
 | 
					  pReq->connId = htonl(2345);
 | 
				
			||||||
  pReq->queryId = htonl(1234);
 | 
					  pReq->queryId = htonl(1234);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_KILL_QUERY, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_KILL_QUERY, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_CONN_ID);
 | 
					  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_CONN_ID);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,7 +32,7 @@ TEST_F(DndTestShow, 01_ShowMsg_InvalidMsgMax) {
 | 
				
			||||||
  pReq->type = TSDB_MGMT_TABLE_MAX;
 | 
					  pReq->type = TSDB_MGMT_TABLE_MAX;
 | 
				
			||||||
  strcpy(pReq->db, "");
 | 
					  strcpy(pReq->db, "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_SHOW, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_SHOW, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_MSG_TYPE);
 | 
					  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_MSG_TYPE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -44,7 +44,7 @@ TEST_F(DndTestShow, 02_ShowMsg_InvalidMsgStart) {
 | 
				
			||||||
  pReq->type = TSDB_MGMT_TABLE_START;
 | 
					  pReq->type = TSDB_MGMT_TABLE_START;
 | 
				
			||||||
  strcpy(pReq->db, "");
 | 
					  strcpy(pReq->db, "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_SHOW, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_SHOW, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_MSG_TYPE);
 | 
					  ASSERT_EQ(pMsg->code, TSDB_CODE_MND_INVALID_MSG_TYPE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -57,7 +57,7 @@ TEST_F(DndTestShow, 02_ShowMsg_Conn) {
 | 
				
			||||||
  strcpy(pReq->app, "dnode_test_show");
 | 
					  strcpy(pReq->app, "dnode_test_show");
 | 
				
			||||||
  strcpy(pReq->db, "");
 | 
					  strcpy(pReq->db, "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CONNECT, pReq, contLen);
 | 
					  SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CONNECT, pReq, contLen);
 | 
				
			||||||
  ASSERT_NE(pMsg, nullptr);
 | 
					  ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
  ASSERT_EQ(pMsg->code, 0);
 | 
					  ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ TEST_F(DndTestStb, 01_Create_Show_Meta_Drop_Restart_Stb) {
 | 
				
			||||||
    pReq->cacheLastRow = 0;
 | 
					    pReq->cacheLastRow = 0;
 | 
				
			||||||
    pReq->ignoreExist = 1;
 | 
					    pReq->ignoreExist = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_DB, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_DB, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -106,7 +106,7 @@ TEST_F(DndTestStb, 01_Create_Show_Meta_Drop_Restart_Stb) {
 | 
				
			||||||
      strcpy(pSchema->name, "tag3");
 | 
					      strcpy(pSchema->name, "tag3");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_STB, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_STB, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -133,7 +133,7 @@ TEST_F(DndTestStb, 01_Create_Show_Meta_Drop_Restart_Stb) {
 | 
				
			||||||
    STableInfoMsg* pReq = (STableInfoMsg*)rpcMallocCont(contLen);
 | 
					    STableInfoMsg* pReq = (STableInfoMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    strcpy(pReq->tableFname, "1.d1.stb");
 | 
					    strcpy(pReq->tableFname, "1.d1.stb");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_TABLE_META, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_VND_TABLE_META, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -192,7 +192,7 @@ TEST_F(DndTestStb, 01_Create_Show_Meta_Drop_Restart_Stb) {
 | 
				
			||||||
    SDropStbMsg* pReq = (SDropStbMsg*)rpcMallocCont(contLen);
 | 
					    SDropStbMsg* pReq = (SDropStbMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    strcpy(pReq->name, "1.d1.stb");
 | 
					    strcpy(pReq->name, "1.d1.stb");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_DROP_STB, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_DROP_STB, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "dnode.h"
 | 
					#include "dnode.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tconfig.h"
 | 
					#include "tconfig.h"
 | 
				
			||||||
#include "tdataformat.h"
 | 
					#include "tdataformat.h"
 | 
				
			||||||
#include "tglobal.h"
 | 
					#include "tglobal.h"
 | 
				
			||||||
| 
						 | 
					@ -37,7 +37,7 @@ class Testbase {
 | 
				
			||||||
  void     Init(const char* path, int16_t port);
 | 
					  void     Init(const char* path, int16_t port);
 | 
				
			||||||
  void     Cleanup();
 | 
					  void     Cleanup();
 | 
				
			||||||
  void     Restart();
 | 
					  void     Restart();
 | 
				
			||||||
  SRpcMsg* SendMsg(int8_t msgType, void* pCont, int32_t contLen);
 | 
					  SRpcMsg* SendMsg(tmsg_t msgType, void* pCont, int32_t contLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 private:
 | 
					 private:
 | 
				
			||||||
  void InitLog(const char* path);
 | 
					  void InitLog(const char* path);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,7 +60,7 @@ void Testbase::Cleanup() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Testbase::Restart() { server.Restart(); }
 | 
					void Testbase::Restart() { server.Restart(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SRpcMsg* Testbase::SendMsg(int8_t msgType, void* pCont, int32_t contLen) {
 | 
					SRpcMsg* Testbase::SendMsg(tmsg_t msgType, void* pCont, int32_t contLen) {
 | 
				
			||||||
  SRpcMsg rpcMsg = {0};
 | 
					  SRpcMsg rpcMsg = {0};
 | 
				
			||||||
  rpcMsg.pCont = pCont;
 | 
					  rpcMsg.pCont = pCont;
 | 
				
			||||||
  rpcMsg.contLen = contLen;
 | 
					  rpcMsg.contLen = contLen;
 | 
				
			||||||
| 
						 | 
					@ -75,7 +75,7 @@ void Testbase::SendShowMetaMsg(int8_t showType, const char* db) {
 | 
				
			||||||
  pShow->type = showType;
 | 
					  pShow->type = showType;
 | 
				
			||||||
  strcpy(pShow->db, db);
 | 
					  strcpy(pShow->db, db);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg*  pMsg = SendMsg(TSDB_MSG_TYPE_SHOW, pShow, contLen);
 | 
					  SRpcMsg*  pMsg = SendMsg(TDMT_MND_SHOW, pShow, contLen);
 | 
				
			||||||
  SShowRsp* pShowRsp = (SShowRsp*)pMsg->pCont;
 | 
					  SShowRsp* pShowRsp = (SShowRsp*)pMsg->pCont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ASSERT(pShowRsp != nullptr);
 | 
					  ASSERT(pShowRsp != nullptr);
 | 
				
			||||||
| 
						 | 
					@ -124,7 +124,7 @@ void Testbase::SendShowRetrieveMsg() {
 | 
				
			||||||
  pRetrieve->showId = htonl(showId);
 | 
					  pRetrieve->showId = htonl(showId);
 | 
				
			||||||
  pRetrieve->free = 0;
 | 
					  pRetrieve->free = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg* pMsg = SendMsg(TSDB_MSG_TYPE_SHOW_RETRIEVE, pRetrieve, contLen);
 | 
					  SRpcMsg* pMsg = SendMsg(TDMT_MND_SHOW_RETRIEVE, pRetrieve, contLen);
 | 
				
			||||||
  pRetrieveRsp = (SRetrieveTableRsp*)pMsg->pCont;
 | 
					  pRetrieveRsp = (SRetrieveTableRsp*)pMsg->pCont;
 | 
				
			||||||
  pRetrieveRsp->numOfRows = htonl(pRetrieveRsp->numOfRows);
 | 
					  pRetrieveRsp->numOfRows = htonl(pRetrieveRsp->numOfRows);
 | 
				
			||||||
  pRetrieveRsp->useconds = htobe64(pRetrieveRsp->useconds);
 | 
					  pRetrieveRsp->useconds = htobe64(pRetrieveRsp->useconds);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@
 | 
				
			||||||
static void processClientRsp(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
 | 
					static void processClientRsp(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
 | 
				
			||||||
  TestClient* client = (TestClient*)parent;
 | 
					  TestClient* client = (TestClient*)parent;
 | 
				
			||||||
  client->SetRpcRsp(pMsg);
 | 
					  client->SetRpcRsp(pMsg);
 | 
				
			||||||
  uInfo("response:%s from dnode, code:0x%x", taosMsg[pMsg->msgType], pMsg->code);
 | 
					  uInfo("response:%s from dnode, code:0x%x", TMSG_INFO(pMsg->msgType), pMsg->code);
 | 
				
			||||||
  tsem_post(client->GetSem());
 | 
					  tsem_post(client->GetSem());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ TEST_F(DndTestUser, 02_Create_Drop_Alter_User) {
 | 
				
			||||||
    strcpy(pReq->user, "u1");
 | 
					    strcpy(pReq->user, "u1");
 | 
				
			||||||
    strcpy(pReq->pass, "p1");
 | 
					    strcpy(pReq->pass, "p1");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_USER, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_USER, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -63,7 +63,7 @@ TEST_F(DndTestUser, 02_Create_Drop_Alter_User) {
 | 
				
			||||||
    strcpy(pReq->user, "u2");
 | 
					    strcpy(pReq->user, "u2");
 | 
				
			||||||
    strcpy(pReq->pass, "p2");
 | 
					    strcpy(pReq->pass, "p2");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_USER, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_CREATE_USER, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -94,7 +94,7 @@ TEST_F(DndTestUser, 02_Create_Drop_Alter_User) {
 | 
				
			||||||
    strcpy(pReq->user, "u1");
 | 
					    strcpy(pReq->user, "u1");
 | 
				
			||||||
    strcpy(pReq->pass, "p2");
 | 
					    strcpy(pReq->pass, "p2");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_ALTER_USER, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_ALTER_USER, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -124,7 +124,7 @@ TEST_F(DndTestUser, 02_Create_Drop_Alter_User) {
 | 
				
			||||||
    SDropUserMsg* pReq = (SDropUserMsg*)rpcMallocCont(contLen);
 | 
					    SDropUserMsg* pReq = (SDropUserMsg*)rpcMallocCont(contLen);
 | 
				
			||||||
    strcpy(pReq->user, "u1");
 | 
					    strcpy(pReq->user, "u1");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_DROP_USER, pReq, contLen);
 | 
					    SRpcMsg* pMsg = test.SendMsg(TDMT_MND_DROP_USER, pReq, contLen);
 | 
				
			||||||
    ASSERT_NE(pMsg, nullptr);
 | 
					    ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
    ASSERT_EQ(pMsg->code, 0);
 | 
					    ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,7 +60,7 @@ TEST_F(DndTestVgroup, 01_Create_Restart_Drop_Vnode) {
 | 
				
			||||||
        pReplica->port = htons(9150);
 | 
					        pReplica->port = htons(9150);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_CREATE_VNODE_IN, pReq, contLen);
 | 
					      SRpcMsg* pMsg = test.SendMsg(TDMT_DND_CREATE_VNODE, pReq, contLen);
 | 
				
			||||||
      ASSERT_NE(pMsg, nullptr);
 | 
					      ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
      ASSERT_EQ(pMsg->code, 0);
 | 
					      ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -100,7 +100,7 @@ TEST_F(DndTestVgroup, 01_Create_Restart_Drop_Vnode) {
 | 
				
			||||||
        pReplica->port = htons(9150);
 | 
					        pReplica->port = htons(9150);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_ALTER_VNODE_IN, pReq, contLen);
 | 
					      SRpcMsg* pMsg = test.SendMsg(TDMT_DND_ALTER_VNODE, pReq, contLen);
 | 
				
			||||||
      ASSERT_NE(pMsg, nullptr);
 | 
					      ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
      ASSERT_EQ(pMsg->code, 0);
 | 
					      ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -119,9 +119,9 @@ TEST_F(DndTestVgroup, 01_Create_Restart_Drop_Vnode) {
 | 
				
			||||||
      SRpcMsg rpcMsg = {0};
 | 
					      SRpcMsg rpcMsg = {0};
 | 
				
			||||||
      rpcMsg.pCont = pReq;
 | 
					      rpcMsg.pCont = pReq;
 | 
				
			||||||
      rpcMsg.contLen = sizeof(SDropVnodeMsg);
 | 
					      rpcMsg.contLen = sizeof(SDropVnodeMsg);
 | 
				
			||||||
      rpcMsg.msgType = TSDB_MSG_TYPE_DROP_VNODE_IN;
 | 
					      rpcMsg.msgType = TDMT_DND_DROP_VNODE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      SRpcMsg* pMsg = test.SendMsg(TSDB_MSG_TYPE_DROP_VNODE_IN, pReq, contLen);
 | 
					      SRpcMsg* pMsg = test.SendMsg(TDMT_DND_DROP_VNODE, pReq, contLen);
 | 
				
			||||||
      ASSERT_NE(pMsg, nullptr);
 | 
					      ASSERT_NE(pMsg, nullptr);
 | 
				
			||||||
      ASSERT_EQ(pMsg->code, 0);
 | 
					      ASSERT_EQ(pMsg->code, 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "cJSON.h"
 | 
					#include "cJSON.h"
 | 
				
			||||||
#include "sync.h"
 | 
					#include "sync.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "thash.h"
 | 
					#include "thash.h"
 | 
				
			||||||
#include "tlog.h"
 | 
					#include "tlog.h"
 | 
				
			||||||
#include "trpc.h"
 | 
					#include "trpc.h"
 | 
				
			||||||
| 
						 | 
					@ -95,7 +95,9 @@ typedef struct {
 | 
				
			||||||
  int32_t    id;
 | 
					  int32_t    id;
 | 
				
			||||||
  ETrnStage  stage;
 | 
					  ETrnStage  stage;
 | 
				
			||||||
  ETrnPolicy policy;
 | 
					  ETrnPolicy policy;
 | 
				
			||||||
 | 
					  int32_t    retryTimes;
 | 
				
			||||||
  void      *rpcHandle;
 | 
					  void      *rpcHandle;
 | 
				
			||||||
 | 
					  void      *rpcAHandle;
 | 
				
			||||||
  SArray    *redoLogs;
 | 
					  SArray    *redoLogs;
 | 
				
			||||||
  SArray    *undoLogs;
 | 
					  SArray    *undoLogs;
 | 
				
			||||||
  SArray    *commitLogs;
 | 
					  SArray    *commitLogs;
 | 
				
			||||||
| 
						 | 
					@ -285,6 +287,21 @@ typedef struct {
 | 
				
			||||||
  char    payload[];
 | 
					  char    payload[];
 | 
				
			||||||
} SShowObj;
 | 
					} SShowObj;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  char name[TSDB_TOPIC_FNAME_LEN];
 | 
				
			||||||
 | 
					  char db[TSDB_FULL_DB_NAME_LEN];
 | 
				
			||||||
 | 
					  int64_t createTime;
 | 
				
			||||||
 | 
					  int64_t updateTime;
 | 
				
			||||||
 | 
					  uint64_t uid;
 | 
				
			||||||
 | 
					  uint64_t dbUid;
 | 
				
			||||||
 | 
					  int32_t version;
 | 
				
			||||||
 | 
					  SRWLatch lock;
 | 
				
			||||||
 | 
					  int32_t  execLen;
 | 
				
			||||||
 | 
					  void*    executor;
 | 
				
			||||||
 | 
					  int32_t  sqlLen;
 | 
				
			||||||
 | 
					  char*    sql;
 | 
				
			||||||
 | 
					} STopicObj;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SMnodeMsg {
 | 
					typedef struct SMnodeMsg {
 | 
				
			||||||
  char    user[TSDB_USER_LEN];
 | 
					  char    user[TSDB_USER_LEN];
 | 
				
			||||||
  char    db[TSDB_FULL_DB_NAME_LEN];
 | 
					  char    db[TSDB_FULL_DB_NAME_LEN];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,6 +61,13 @@ typedef struct {
 | 
				
			||||||
  char             email[TSDB_FQDN_LEN];
 | 
					  char             email[TSDB_FQDN_LEN];
 | 
				
			||||||
} STelemMgmt;
 | 
					} STelemMgmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  int32_t    errCode;
 | 
				
			||||||
 | 
					  sem_t      syncSem;
 | 
				
			||||||
 | 
					  SSyncNode *pSyncNode;
 | 
				
			||||||
 | 
					  ESyncState state;
 | 
				
			||||||
 | 
					} SSyncMgmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SMnode {
 | 
					typedef struct SMnode {
 | 
				
			||||||
  int32_t           dnodeId;
 | 
					  int32_t           dnodeId;
 | 
				
			||||||
  int32_t           clusterId;
 | 
					  int32_t           clusterId;
 | 
				
			||||||
| 
						 | 
					@ -77,17 +84,17 @@ typedef struct SMnode {
 | 
				
			||||||
  SShowMgmt         showMgmt;
 | 
					  SShowMgmt         showMgmt;
 | 
				
			||||||
  SProfileMgmt      profileMgmt;
 | 
					  SProfileMgmt      profileMgmt;
 | 
				
			||||||
  STelemMgmt        telemMgmt;
 | 
					  STelemMgmt        telemMgmt;
 | 
				
			||||||
  MndMsgFp          msgFp[TSDB_MSG_TYPE_MAX];
 | 
					  SSyncMgmt         syncMgmt;
 | 
				
			||||||
 | 
					  MndMsgFp          msgFp[TDMT_MAX];
 | 
				
			||||||
  SendMsgToDnodeFp  sendMsgToDnodeFp;
 | 
					  SendMsgToDnodeFp  sendMsgToDnodeFp;
 | 
				
			||||||
  SendMsgToMnodeFp  sendMsgToMnodeFp;
 | 
					  SendMsgToMnodeFp  sendMsgToMnodeFp;
 | 
				
			||||||
  SendRedirectMsgFp sendRedirectMsgFp;
 | 
					  SendRedirectMsgFp sendRedirectMsgFp;
 | 
				
			||||||
  PutMsgToMnodeQFp  putMsgToApplyMsgFp;
 | 
					 | 
				
			||||||
} SMnode;
 | 
					} SMnode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void mndSendMsgToDnode(SMnode *pMnode, SEpSet *pEpSet, SRpcMsg *rpcMsg);
 | 
					void mndSendMsgToDnode(SMnode *pMnode, SEpSet *pEpSet, SRpcMsg *rpcMsg);
 | 
				
			||||||
void mndSendMsgToMnode(SMnode *pMnode, SRpcMsg *pMsg);
 | 
					void mndSendMsgToMnode(SMnode *pMnode, SRpcMsg *pMsg);
 | 
				
			||||||
void mndSendRedirectMsg(SMnode *pMnode, SRpcMsg *pMsg);
 | 
					void mndSendRedirectMsg(SMnode *pMnode, SRpcMsg *pMsg);
 | 
				
			||||||
void mndSetMsgHandle(SMnode *pMnode, int32_t msgType, MndMsgFp fp);
 | 
					void mndSetMsgHandle(SMnode *pMnode, tmsg_t msgType, MndMsgFp fp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint64_t mndGenerateUid(char *name, int32_t len) ;
 | 
					uint64_t mndGenerateUid(char *name, int32_t len) ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,9 @@ extern "C" {
 | 
				
			||||||
int32_t mndInitStb(SMnode *pMnode);
 | 
					int32_t mndInitStb(SMnode *pMnode);
 | 
				
			||||||
void    mndCleanupStb(SMnode *pMnode);
 | 
					void    mndCleanupStb(SMnode *pMnode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName);
 | 
				
			||||||
 | 
					void mndReleaseStb(SMnode *pMnode, SStbObj *pStb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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_MND_TOPIC_H_
 | 
				
			||||||
 | 
					#define _TD_MND_TOPIC_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "mndInt.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int32_t mndInitTopic(SMnode *pMnode);
 | 
				
			||||||
 | 
					void    mndCleanupTopic(SMnode *pMnode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					STopicObj *mndAcquireTopic(SMnode *pMnode, char *topicName);
 | 
				
			||||||
 | 
					void       mndReleaseTopic(SMnode *pMnode, STopicObj *pTopic);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /*_TD_MND_TOPIC_H_*/
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,7 @@ extern "C" {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  SEpSet  epSet;
 | 
					  SEpSet  epSet;
 | 
				
			||||||
  int8_t  msgType;
 | 
					  tmsg_t  msgType;
 | 
				
			||||||
  int8_t  msgSent;
 | 
					  int8_t  msgSent;
 | 
				
			||||||
  int8_t  msgReceived;
 | 
					  int8_t  msgReceived;
 | 
				
			||||||
  int32_t errCode;
 | 
					  int32_t errCode;
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,7 @@ typedef struct {
 | 
				
			||||||
int32_t mndInitTrans(SMnode *pMnode);
 | 
					int32_t mndInitTrans(SMnode *pMnode);
 | 
				
			||||||
void    mndCleanupTrans(SMnode *pMnode);
 | 
					void    mndCleanupTrans(SMnode *pMnode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, void *rpcHandle);
 | 
					STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, SRpcMsg *pMsg);
 | 
				
			||||||
void    mndTransDrop(STrans *pTrans);
 | 
					void    mndTransDrop(STrans *pTrans);
 | 
				
			||||||
int32_t mndTransAppendRedolog(STrans *pTrans, SSdbRaw *pRaw);
 | 
					int32_t mndTransAppendRedolog(STrans *pTrans, SSdbRaw *pRaw);
 | 
				
			||||||
int32_t mndTransAppendUndolog(STrans *pTrans, SSdbRaw *pRaw);
 | 
					int32_t mndTransAppendUndolog(STrans *pTrans, SSdbRaw *pRaw);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,9 +40,9 @@ int32_t mndInitAcct(SMnode *pMnode) {
 | 
				
			||||||
                     .updateFp = (SdbUpdateFp)mndAcctActionUpdate,
 | 
					                     .updateFp = (SdbUpdateFp)mndAcctActionUpdate,
 | 
				
			||||||
                     .deleteFp = (SdbDeleteFp)mndAcctActionDelete};
 | 
					                     .deleteFp = (SdbDeleteFp)mndAcctActionDelete};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CREATE_ACCT, mndProcessCreateAcctMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_ACCT, mndProcessCreateAcctMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_ALTER_ACCT, mndProcessAlterAcctMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_ACCT, mndProcessAlterAcctMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_DROP_ACCT, mndProcessDropAcctMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_DROP_ACCT, mndProcessDropAcctMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return sdbSetTable(pMnode->pSdb, table);
 | 
					  return sdbSetTable(pMnode->pSdb, table);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,12 +48,12 @@ int32_t mndInitDb(SMnode *pMnode) {
 | 
				
			||||||
                     .updateFp = (SdbUpdateFp)mndDbActionUpdate,
 | 
					                     .updateFp = (SdbUpdateFp)mndDbActionUpdate,
 | 
				
			||||||
                     .deleteFp = (SdbDeleteFp)mndDbActionDelete};
 | 
					                     .deleteFp = (SdbDeleteFp)mndDbActionDelete};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CREATE_DB, mndProcessCreateDbMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_DB, mndProcessCreateDbMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_ALTER_DB, mndProcessAlterDbMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_DB, mndProcessAlterDbMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_DROP_DB, mndProcessDropDbMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_DROP_DB, mndProcessDropDbMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_USE_DB, mndProcessUseDbMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_USE_DB, mndProcessUseDbMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_SYNC_DB, mndProcessSyncDbMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_SYNC_DB, mndProcessSyncDbMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_COMPACT_DB, mndProcessCompactDbMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_COMPACT_DB, mndProcessCompactDbMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_DB, mndGetDbMeta);
 | 
					  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_DB, mndGetDbMeta);
 | 
				
			||||||
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_DB, mndRetrieveDbs);
 | 
					  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_DB, mndRetrieveDbs);
 | 
				
			||||||
| 
						 | 
					@ -311,7 +311,7 @@ static int32_t mndSetCreateDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      action.pCont = pMsg;
 | 
					      action.pCont = pMsg;
 | 
				
			||||||
      action.contLen = sizeof(SCreateVnodeMsg);
 | 
					      action.contLen = sizeof(SCreateVnodeMsg);
 | 
				
			||||||
      action.msgType = TSDB_MSG_TYPE_CREATE_VNODE_IN;
 | 
					      action.msgType = TDMT_DND_CREATE_VNODE;
 | 
				
			||||||
      if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
					      if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
				
			||||||
        free(pMsg);
 | 
					        free(pMsg);
 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
| 
						 | 
					@ -340,7 +340,7 @@ static int32_t mndSetCreateDbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      action.pCont = pMsg;
 | 
					      action.pCont = pMsg;
 | 
				
			||||||
      action.contLen = sizeof(SDropVnodeMsg);
 | 
					      action.contLen = sizeof(SDropVnodeMsg);
 | 
				
			||||||
      action.msgType = TSDB_MSG_TYPE_DROP_VNODE_IN;
 | 
					      action.msgType = TDMT_DND_DROP_VNODE;
 | 
				
			||||||
      if (mndTransAppendUndoAction(pTrans, &action) != 0) {
 | 
					      if (mndTransAppendUndoAction(pTrans, &action) != 0) {
 | 
				
			||||||
        free(pMsg);
 | 
					        free(pMsg);
 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
| 
						 | 
					@ -400,7 +400,7 @@ static int32_t mndCreateDb(SMnode *pMnode, SMnodeMsg *pMsg, SCreateDbMsg *pCreat
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int32_t code = -1;
 | 
					  int32_t code = -1;
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
 | 
					    mError("db:%s, failed to create since %s", pCreate->db, terrstr());
 | 
				
			||||||
    goto CREATE_DB_OVER;
 | 
					    goto CREATE_DB_OVER;
 | 
				
			||||||
| 
						 | 
					@ -541,32 +541,74 @@ static int32_t mndSetDbCfgFromAlterDbMsg(SDbObj *pDb, SAlterDbMsg *pAlter) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndSetUpdateDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) {
 | 
					static int32_t mndSetUpdateDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) {
 | 
				
			||||||
  SSdbRaw *pRedoRaw = mndDbActionEncode(pNewDb);
 | 
					  SSdbRaw *pRedoRaw = mndDbActionEncode(pOldDb);
 | 
				
			||||||
  if (pRedoRaw == NULL) return -1;
 | 
					  if (pRedoRaw == NULL) return -1;
 | 
				
			||||||
  if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) return -1;
 | 
					  if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) return -1;
 | 
				
			||||||
  if (sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY) != 0) return -1;
 | 
					  if (sdbSetRawStatus(pRedoRaw, SDB_STATUS_UPDATING) != 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndSetUpdateDbUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) {
 | 
					static int32_t mndSetUpdateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) { 
 | 
				
			||||||
  SSdbRaw *pUndoRaw = mndDbActionEncode(pOldDb);
 | 
					  SSdbRaw *pCommitRaw = mndDbActionEncode(pNewDb);
 | 
				
			||||||
  if (pUndoRaw == NULL) return -1;
 | 
					  if (pCommitRaw == NULL) return -1;
 | 
				
			||||||
  if (mndTransAppendUndolog(pTrans, pUndoRaw) != 0) return -1;
 | 
					  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
 | 
				
			||||||
  if (sdbSetRawStatus(pUndoRaw, SDB_STATUS_READY) != 0) return -1;
 | 
					  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY) != 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndSetUpdateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) { return 0; }
 | 
					static int32_t mndBuildUpdateVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
 | 
				
			||||||
 | 
					  for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
 | 
				
			||||||
 | 
					    STransAction action = {0};
 | 
				
			||||||
 | 
					    SVnodeGid   *pVgid = pVgroup->vnodeGid + vn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndSetUpdateDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) { return 0; }
 | 
					    SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
 | 
				
			||||||
 | 
					    if (pDnode == NULL) return -1;
 | 
				
			||||||
 | 
					    action.epSet = mndGetDnodeEpset(pDnode);
 | 
				
			||||||
 | 
					    mndReleaseDnode(pMnode, pDnode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndSetUpdateDbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) { return 0; }
 | 
					    SAlterVnodeMsg *pMsg = (SAlterVnodeMsg *)mndBuildCreateVnodeMsg(pMnode, pDnode, pDb, pVgroup);
 | 
				
			||||||
 | 
					    if (pMsg == NULL) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    action.pCont = pMsg;
 | 
				
			||||||
 | 
					    action.contLen = sizeof(SAlterVnodeMsg);
 | 
				
			||||||
 | 
					    action.msgType = TDMT_DND_ALTER_VNODE;
 | 
				
			||||||
 | 
					    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
				
			||||||
 | 
					      free(pMsg);
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetUpdateDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pOldDb, SDbObj *pNewDb) {
 | 
				
			||||||
 | 
					  SSdb *pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					  void *pIter = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (1) {
 | 
				
			||||||
 | 
					    SVgObj *pVgroup = NULL;
 | 
				
			||||||
 | 
					    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
 | 
				
			||||||
 | 
					    if (pIter == NULL) break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (pVgroup->dbUid == pNewDb->uid) {
 | 
				
			||||||
 | 
					      if (mndBuildUpdateVgroupAction(pMnode, pTrans, pNewDb, pVgroup) != 0) {
 | 
				
			||||||
 | 
					        sdbCancelFetch(pSdb, pIter);
 | 
				
			||||||
 | 
					        sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndUpdateDb(SMnode *pMnode, SMnodeMsg *pMsg, SDbObj *pOldDb, SDbObj *pNewDb) {
 | 
					static int32_t mndUpdateDb(SMnode *pMnode, SMnodeMsg *pMsg, SDbObj *pOldDb, SDbObj *pNewDb) {
 | 
				
			||||||
  int32_t code = -1;
 | 
					  int32_t code = -1;
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("db:%s, failed to update since %s", pOldDb->name, terrstr());
 | 
					    mError("db:%s, failed to update since %s", pOldDb->name, terrstr());
 | 
				
			||||||
    return terrno;
 | 
					    return terrno;
 | 
				
			||||||
| 
						 | 
					@ -579,11 +621,6 @@ static int32_t mndUpdateDb(SMnode *pMnode, SMnodeMsg *pMsg, SDbObj *pOldDb, SDbO
 | 
				
			||||||
    goto UPDATE_DB_OVER;
 | 
					    goto UPDATE_DB_OVER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (mndSetUpdateDbUndoLogs(pMnode, pTrans, pOldDb, pNewDb) != 0) {
 | 
					 | 
				
			||||||
    mError("trans:%d, failed to set undo log since %s", pTrans->id, terrstr());
 | 
					 | 
				
			||||||
    goto UPDATE_DB_OVER;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (mndSetUpdateDbCommitLogs(pMnode, pTrans, pOldDb, pNewDb) != 0) {
 | 
					  if (mndSetUpdateDbCommitLogs(pMnode, pTrans, pOldDb, pNewDb) != 0) {
 | 
				
			||||||
    mError("trans:%d, failed to set commit log since %s", pTrans->id, terrstr());
 | 
					    mError("trans:%d, failed to set commit log since %s", pTrans->id, terrstr());
 | 
				
			||||||
    goto UPDATE_DB_OVER;
 | 
					    goto UPDATE_DB_OVER;
 | 
				
			||||||
| 
						 | 
					@ -594,11 +631,6 @@ static int32_t mndUpdateDb(SMnode *pMnode, SMnodeMsg *pMsg, SDbObj *pOldDb, SDbO
 | 
				
			||||||
    goto UPDATE_DB_OVER;
 | 
					    goto UPDATE_DB_OVER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (mndSetUpdateDbUndoActions(pMnode, pTrans, pOldDb, pNewDb) != 0) {
 | 
					 | 
				
			||||||
    mError("trans:%d, failed to set redo actions since %s", pTrans->id, terrstr());
 | 
					 | 
				
			||||||
    goto UPDATE_DB_OVER;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (mndTransPrepare(pMnode, pTrans) != 0) {
 | 
					  if (mndTransPrepare(pMnode, pTrans) != 0) {
 | 
				
			||||||
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
 | 
					    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
 | 
				
			||||||
    goto UPDATE_DB_OVER;
 | 
					    goto UPDATE_DB_OVER;
 | 
				
			||||||
| 
						 | 
					@ -660,31 +692,87 @@ static int32_t mndSetDropDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb)
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndSetDropDbUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
 | 
					 | 
				
			||||||
  SSdbRaw *pUndoRaw = mndDbActionEncode(pDb);
 | 
					 | 
				
			||||||
  if (pUndoRaw == NULL) return -1;
 | 
					 | 
				
			||||||
  if (mndTransAppendUndolog(pTrans, pUndoRaw) != 0) return -1;
 | 
					 | 
				
			||||||
  if (sdbSetRawStatus(pUndoRaw, SDB_STATUS_READY) != 0) return -1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int32_t mndSetDropDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
 | 
					static int32_t mndSetDropDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
 | 
				
			||||||
  SSdbRaw *pCommitRaw = mndDbActionEncode(pDb);
 | 
					  SSdbRaw *pCommitRaw = mndDbActionEncode(pDb);
 | 
				
			||||||
  if (pCommitRaw == NULL) return -1;
 | 
					  if (pCommitRaw == NULL) return -1;
 | 
				
			||||||
  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
 | 
					  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
 | 
				
			||||||
  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED) != 0) return -1;
 | 
					  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED) != 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SSdb *pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					  void *pIter = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (1) {
 | 
				
			||||||
 | 
					    SVgObj *pVgroup = NULL;
 | 
				
			||||||
 | 
					    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
 | 
				
			||||||
 | 
					    if (pIter == NULL) break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (pVgroup->dbUid == pDb->uid) {
 | 
				
			||||||
 | 
					      SSdbRaw *pVgRaw = mndVgroupActionEncode(pVgroup);
 | 
				
			||||||
 | 
					      if (pVgRaw == NULL || mndTransAppendCommitlog(pTrans, pVgRaw) != 0) {
 | 
				
			||||||
 | 
					        sdbCancelFetch(pSdb, pIter);
 | 
				
			||||||
 | 
					        sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      sdbSetRawStatus(pVgRaw, SDB_STATUS_DROPPED);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndSetDropDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) { return 0; }
 | 
					static int32_t mndBuildDropVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
 | 
				
			||||||
 | 
					  for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
 | 
				
			||||||
 | 
					    STransAction action = {0};
 | 
				
			||||||
 | 
					    SVnodeGid *  pVgid = pVgroup->vnodeGid + vn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndSetDropDbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) { return 0; }
 | 
					    SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
 | 
				
			||||||
 | 
					    if (pDnode == NULL) return -1;
 | 
				
			||||||
 | 
					    action.epSet = mndGetDnodeEpset(pDnode);
 | 
				
			||||||
 | 
					    mndReleaseDnode(pMnode, pDnode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SDropVnodeMsg *pMsg = mndBuildDropVnodeMsg(pMnode, pDnode, pDb, pVgroup);
 | 
				
			||||||
 | 
					    if (pMsg == NULL) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    action.pCont = pMsg;
 | 
				
			||||||
 | 
					    action.contLen = sizeof(SCreateVnodeMsg);
 | 
				
			||||||
 | 
					    action.msgType = TDMT_DND_DROP_VNODE;
 | 
				
			||||||
 | 
					    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
				
			||||||
 | 
					      free(pMsg);
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetDropDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb) {
 | 
				
			||||||
 | 
					  SSdb *pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					  void *pIter = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (1) {
 | 
				
			||||||
 | 
					    SVgObj *pVgroup = NULL;
 | 
				
			||||||
 | 
					    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
 | 
				
			||||||
 | 
					    if (pIter == NULL) break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (pVgroup->dbUid == pDb->uid) {
 | 
				
			||||||
 | 
					      if (mndBuildDropVgroupAction(pMnode, pTrans, pDb, pVgroup) != 0) {
 | 
				
			||||||
 | 
					        sdbCancelFetch(pSdb, pIter);
 | 
				
			||||||
 | 
					        sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndDropDb(SMnode *pMnode, SMnodeMsg *pMsg, SDbObj *pDb) {
 | 
					static int32_t mndDropDb(SMnode *pMnode, SMnodeMsg *pMsg, SDbObj *pDb) {
 | 
				
			||||||
  int32_t code = -1;
 | 
					  int32_t code = -1;
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("db:%s, failed to drop since %s", pDb->name, terrstr());
 | 
					    mError("db:%s, failed to drop since %s", pDb->name, terrstr());
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
| 
						 | 
					@ -697,11 +785,6 @@ static int32_t mndDropDb(SMnode *pMnode, SMnodeMsg *pMsg, SDbObj *pDb) {
 | 
				
			||||||
    goto DROP_DB_OVER;
 | 
					    goto DROP_DB_OVER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (mndSetDropDbUndoLogs(pMnode, pTrans, pDb) != 0) {
 | 
					 | 
				
			||||||
    mError("trans:%d, failed to set undo log since %s", pTrans->id, terrstr());
 | 
					 | 
				
			||||||
    goto DROP_DB_OVER;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (mndSetDropDbCommitLogs(pMnode, pTrans, pDb) != 0) {
 | 
					  if (mndSetDropDbCommitLogs(pMnode, pTrans, pDb) != 0) {
 | 
				
			||||||
    mError("trans:%d, failed to set commit log since %s", pTrans->id, terrstr());
 | 
					    mError("trans:%d, failed to set commit log since %s", pTrans->id, terrstr());
 | 
				
			||||||
    goto DROP_DB_OVER;
 | 
					    goto DROP_DB_OVER;
 | 
				
			||||||
| 
						 | 
					@ -712,11 +795,6 @@ static int32_t mndDropDb(SMnode *pMnode, SMnodeMsg *pMsg, SDbObj *pDb) {
 | 
				
			||||||
    goto DROP_DB_OVER;
 | 
					    goto DROP_DB_OVER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (mndSetDropDbUndoActions(pMnode, pTrans, pDb) != 0) {
 | 
					 | 
				
			||||||
    mError("trans:%d, failed to set redo actions since %s", pTrans->id, terrstr());
 | 
					 | 
				
			||||||
    goto DROP_DB_OVER;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (mndTransPrepare(pMnode, pTrans) != 0) {
 | 
					  if (mndTransPrepare(pMnode, pTrans) != 0) {
 | 
				
			||||||
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
 | 
					    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
 | 
				
			||||||
    goto DROP_DB_OVER;
 | 
					    goto DROP_DB_OVER;
 | 
				
			||||||
| 
						 | 
					@ -876,6 +954,12 @@ static int32_t mndGetDbMeta(SMnodeMsg *pMsg, SShowObj *pShow, STableMetaMsg *pMe
 | 
				
			||||||
  pSchema[cols].bytes = htonl(pShow->bytes[cols]);
 | 
					  pSchema[cols].bytes = htonl(pShow->bytes[cols]);
 | 
				
			||||||
  cols++;
 | 
					  cols++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pShow->bytes[cols] = 4;
 | 
				
			||||||
 | 
					  pSchema[cols].type = TSDB_DATA_TYPE_INT;
 | 
				
			||||||
 | 
					  strcpy(pSchema[cols].name, "ntables");
 | 
				
			||||||
 | 
					  pSchema[cols].bytes = htonl(pShow->bytes[cols]);
 | 
				
			||||||
 | 
					  cols++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pShow->bytes[cols] = 2;
 | 
					  pShow->bytes[cols] = 2;
 | 
				
			||||||
  pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT;
 | 
					  pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT;
 | 
				
			||||||
  strcpy(pSchema[cols].name, "replica");
 | 
					  strcpy(pSchema[cols].name, "replica");
 | 
				
			||||||
| 
						 | 
					@ -1017,6 +1101,10 @@ static int32_t mndRetrieveDbs(SMnodeMsg *pMsg, SShowObj *pShow, char *data, int3
 | 
				
			||||||
    *(int16_t *)pWrite = pDb->cfg.numOfVgroups;
 | 
					    *(int16_t *)pWrite = pDb->cfg.numOfVgroups;
 | 
				
			||||||
    cols++;
 | 
					    cols++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
 | 
				
			||||||
 | 
					    *(int16_t *)pWrite = 0;  // todo
 | 
				
			||||||
 | 
					    cols++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
 | 
					    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
 | 
				
			||||||
    *(int16_t *)pWrite = pDb->cfg.replications;
 | 
					    *(int16_t *)pWrite = pDb->cfg.replications;
 | 
				
			||||||
    cols++;
 | 
					    cols++;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,11 +73,11 @@ int32_t mndInitDnode(SMnode *pMnode) {
 | 
				
			||||||
                     .updateFp = (SdbUpdateFp)mndDnodeActionUpdate,
 | 
					                     .updateFp = (SdbUpdateFp)mndDnodeActionUpdate,
 | 
				
			||||||
                     .deleteFp = (SdbDeleteFp)mndDnodeActionDelete};
 | 
					                     .deleteFp = (SdbDeleteFp)mndDnodeActionDelete};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CREATE_DNODE, mndProcessCreateDnodeMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_DNODE, mndProcessCreateDnodeMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_DROP_DNODE, mndProcessDropDnodeMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_DROP_DNODE, mndProcessDropDnodeMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CONFIG_DNODE, mndProcessConfigDnodeMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_CONFIG_DNODE, mndProcessConfigDnodeMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CONFIG_DNODE_IN_RSP, mndProcessConfigDnodeRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_DND_CONFIG_DNODE_RSP, mndProcessConfigDnodeRsp);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_STATUS, mndProcessStatusMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_STATUS, mndProcessStatusMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_VARIABLES, mndGetConfigMeta);
 | 
					  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_VARIABLES, mndGetConfigMeta);
 | 
				
			||||||
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_VARIABLES, mndRetrieveConfigs);
 | 
					  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_VARIABLES, mndRetrieveConfigs);
 | 
				
			||||||
| 
						 | 
					@ -396,7 +396,7 @@ static int32_t mndCreateDnode(SMnode *pMnode, SMnodeMsg *pMsg, SCreateDnodeMsg *
 | 
				
			||||||
    return terrno;
 | 
					    return terrno;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("dnode:%s, failed to create since %s", pCreate->ep, terrstr());
 | 
					    mError("dnode:%s, failed to create since %s", pCreate->ep, terrstr());
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
| 
						 | 
					@ -452,7 +452,7 @@ static int32_t mndProcessCreateDnodeMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndDropDnode(SMnode *pMnode, SMnodeMsg *pMsg, SDnodeObj *pDnode) {
 | 
					static int32_t mndDropDnode(SMnode *pMnode, SMnodeMsg *pMsg, SDnodeObj *pDnode) {
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("dnode:%d, failed to drop since %s", pDnode->id, terrstr());
 | 
					    mError("dnode:%d, failed to drop since %s", pDnode->id, terrstr());
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
| 
						 | 
					@ -527,7 +527,7 @@ static int32_t mndProcessConfigDnodeMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
  pCfgDnode->dnodeId = htonl(pCfg->dnodeId);
 | 
					  pCfgDnode->dnodeId = htonl(pCfg->dnodeId);
 | 
				
			||||||
  memcpy(pCfgDnode->config, pCfg->config, TSDB_DNODE_CONFIG_LEN);
 | 
					  memcpy(pCfgDnode->config, pCfg->config, TSDB_DNODE_CONFIG_LEN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg rpcMsg = {.msgType = TSDB_MSG_TYPE_CONFIG_DNODE_IN,
 | 
					  SRpcMsg rpcMsg = {.msgType = TDMT_DND_CONFIG_DNODE,
 | 
				
			||||||
                    .pCont = pCfgDnode,
 | 
					                    .pCont = pCfgDnode,
 | 
				
			||||||
                    .contLen = sizeof(SCfgDnodeMsg),
 | 
					                    .contLen = sizeof(SCfgDnodeMsg),
 | 
				
			||||||
                    .ahandle = pMsg->rpcMsg.ahandle};
 | 
					                    .ahandle = pMsg->rpcMsg.ahandle};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,9 +44,9 @@ int32_t mndInitFunc(SMnode *pMnode) {
 | 
				
			||||||
                     .updateFp = (SdbUpdateFp)mndFuncActionUpdate,
 | 
					                     .updateFp = (SdbUpdateFp)mndFuncActionUpdate,
 | 
				
			||||||
                     .deleteFp = (SdbDeleteFp)mndFuncActionDelete};
 | 
					                     .deleteFp = (SdbDeleteFp)mndFuncActionDelete};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CREATE_FUNCTION, mndProcessCreateFuncMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_FUNCTION, mndProcessCreateFuncMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_DROP_FUNCTION, mndProcessDropFuncMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_DROP_FUNCTION, mndProcessDropFuncMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_RETRIEVE_FUNCTION, mndProcessRetrieveFuncMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_RETRIEVE_FUNCTION, mndProcessRetrieveFuncMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_FUNCTION, mndGetFuncMeta);
 | 
					  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_FUNCTION, mndGetFuncMeta);
 | 
				
			||||||
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_FUNCTION, mndRetrieveFuncs);
 | 
					  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_FUNCTION, mndRetrieveFuncs);
 | 
				
			||||||
| 
						 | 
					@ -147,7 +147,7 @@ static int32_t mndCreateFunc(SMnode *pMnode, SMnodeMsg *pMsg, SCreateFuncMsg *pC
 | 
				
			||||||
  pFunc->pCode = pFunc->pData + pCreate->commentSize;
 | 
					  pFunc->pCode = pFunc->pData + pCreate->commentSize;
 | 
				
			||||||
  memcpy(pFunc->pCode, pCreate->pCont + pCreate->commentSize, pFunc->codeSize);
 | 
					  memcpy(pFunc->pCode, pCreate->pCont + pCreate->commentSize, pFunc->codeSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    free(pFunc);
 | 
					    free(pFunc);
 | 
				
			||||||
    mError("func:%s, failed to create since %s", pCreate->name, terrstr());
 | 
					    mError("func:%s, failed to create since %s", pCreate->name, terrstr());
 | 
				
			||||||
| 
						 | 
					@ -195,7 +195,7 @@ static int32_t mndCreateFunc(SMnode *pMnode, SMnodeMsg *pMsg, SCreateFuncMsg *pC
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndDropFunc(SMnode *pMnode, SMnodeMsg *pMsg, SFuncObj *pFunc) {
 | 
					static int32_t mndDropFunc(SMnode *pMnode, SMnodeMsg *pMsg, SFuncObj *pFunc) {
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("func:%s, failed to drop since %s", pFunc->name, terrstr());
 | 
					    mError("func:%s, failed to drop since %s", pFunc->name, terrstr());
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
| 
						 | 
					@ -441,7 +441,7 @@ static void *mnodeGenTypeStr(char *buf, int32_t buflen, uint8_t type, int16_t le
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (type == TSDB_DATA_TYPE_NCHAR || type == TSDB_DATA_TYPE_BINARY) {
 | 
					  if (type == TSDB_DATA_TYPE_NCHAR || type == TSDB_DATA_TYPE_BINARY) {
 | 
				
			||||||
    int32_t bytes = len > 0 ? (int)(len - VARSTR_HEADER_SIZE) : len;
 | 
					    int32_t bytes = len > 0 ? (int32_t)(len - VARSTR_HEADER_SIZE) : len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    snprintf(buf, buflen - 1, "%s(%d)", tDataTypes[type].name, type == TSDB_DATA_TYPE_NCHAR ? bytes / 4 : bytes);
 | 
					    snprintf(buf, buflen - 1, "%s(%d)", tDataTypes[type].name, type == TSDB_DATA_TYPE_NCHAR ? bytes / 4 : bytes);
 | 
				
			||||||
    buf[buflen - 1] = 0;
 | 
					    buf[buflen - 1] = 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,11 +47,11 @@ int32_t mndInitMnode(SMnode *pMnode) {
 | 
				
			||||||
                     .updateFp = (SdbUpdateFp)mndMnodeActionUpdate,
 | 
					                     .updateFp = (SdbUpdateFp)mndMnodeActionUpdate,
 | 
				
			||||||
                     .deleteFp = (SdbDeleteFp)mndMnodeActionDelete};
 | 
					                     .deleteFp = (SdbDeleteFp)mndMnodeActionDelete};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CREATE_MNODE, mndProcessCreateMnodeReq);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_MNODE, mndProcessCreateMnodeReq);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_DROP_MNODE, mndProcessDropMnodeReq);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_DROP_MNODE, mndProcessDropMnodeReq);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CREATE_MNODE_IN_RSP, mndProcessCreateMnodeRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_DND_CREATE_MNODE_RSP, mndProcessCreateMnodeRsp);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_ALTER_MNODE_IN_RSP, mndProcessAlterMnodeRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_DND_ALTER_MNODE_RSP, mndProcessAlterMnodeRsp);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_DROP_MNODE_IN_RSP, mndProcessDropMnodeRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_DND_DROP_MNODE_RSP, mndProcessDropMnodeRsp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_MNODE, mndGetMnodeMeta);
 | 
					  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_MNODE, mndGetMnodeMeta);
 | 
				
			||||||
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_MNODE, mndRetrieveMnodes);
 | 
					  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_MNODE, mndRetrieveMnodes);
 | 
				
			||||||
| 
						 | 
					@ -293,7 +293,7 @@ static int32_t mndSetCreateMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDno
 | 
				
			||||||
    action.epSet = mndGetDnodeEpset(pMObj->pDnode);
 | 
					    action.epSet = mndGetDnodeEpset(pMObj->pDnode);
 | 
				
			||||||
    action.pCont = pMsg;
 | 
					    action.pCont = pMsg;
 | 
				
			||||||
    action.contLen = sizeof(SAlterMnodeInMsg);
 | 
					    action.contLen = sizeof(SAlterMnodeInMsg);
 | 
				
			||||||
    action.msgType = TSDB_MSG_TYPE_ALTER_MNODE_IN;
 | 
					    action.msgType = TDMT_DND_ALTER_MNODE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
					    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
				
			||||||
      free(pMsg);
 | 
					      free(pMsg);
 | 
				
			||||||
| 
						 | 
					@ -317,7 +317,7 @@ static int32_t mndSetCreateMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDno
 | 
				
			||||||
    action.epSet = mndGetDnodeEpset(pDnode);
 | 
					    action.epSet = mndGetDnodeEpset(pDnode);
 | 
				
			||||||
    action.pCont = pMsg;
 | 
					    action.pCont = pMsg;
 | 
				
			||||||
    action.contLen = sizeof(SCreateMnodeInMsg);
 | 
					    action.contLen = sizeof(SCreateMnodeInMsg);
 | 
				
			||||||
    action.msgType = TSDB_MSG_TYPE_CREATE_MNODE_IN;
 | 
					    action.msgType = TDMT_DND_CREATE_MNODE;
 | 
				
			||||||
    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
					    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
				
			||||||
      free(pMsg);
 | 
					      free(pMsg);
 | 
				
			||||||
      return -1;
 | 
					      return -1;
 | 
				
			||||||
| 
						 | 
					@ -334,7 +334,7 @@ static int32_t mndCreateMnode(SMnode *pMnode, SMnodeMsg *pMsg, SDnodeObj *pDnode
 | 
				
			||||||
  mnodeObj.updateTime = mnodeObj.createdTime;
 | 
					  mnodeObj.updateTime = mnodeObj.createdTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int32_t code = -1;
 | 
					  int32_t code = -1;
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("mnode:%d, failed to create since %s", pCreate->dnodeId, terrstr());
 | 
					    mError("mnode:%d, failed to create since %s", pCreate->dnodeId, terrstr());
 | 
				
			||||||
    goto CREATE_MNODE_OVER;
 | 
					    goto CREATE_MNODE_OVER;
 | 
				
			||||||
| 
						 | 
					@ -461,7 +461,7 @@ static int32_t mndSetDropMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDnode
 | 
				
			||||||
      action.epSet = mndGetDnodeEpset(pMObj->pDnode);
 | 
					      action.epSet = mndGetDnodeEpset(pMObj->pDnode);
 | 
				
			||||||
      action.pCont = pMsg;
 | 
					      action.pCont = pMsg;
 | 
				
			||||||
      action.contLen = sizeof(SAlterMnodeInMsg);
 | 
					      action.contLen = sizeof(SAlterMnodeInMsg);
 | 
				
			||||||
      action.msgType = TSDB_MSG_TYPE_ALTER_MNODE_IN;
 | 
					      action.msgType = TDMT_DND_ALTER_MNODE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
					      if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
				
			||||||
        free(pMsg);
 | 
					        free(pMsg);
 | 
				
			||||||
| 
						 | 
					@ -488,7 +488,7 @@ static int32_t mndSetDropMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDnode
 | 
				
			||||||
    action.epSet = mndGetDnodeEpset(pDnode);
 | 
					    action.epSet = mndGetDnodeEpset(pDnode);
 | 
				
			||||||
    action.pCont = pMsg;
 | 
					    action.pCont = pMsg;
 | 
				
			||||||
    action.contLen = sizeof(SDropMnodeInMsg);
 | 
					    action.contLen = sizeof(SDropMnodeInMsg);
 | 
				
			||||||
    action.msgType = TSDB_MSG_TYPE_DROP_MNODE_IN;
 | 
					    action.msgType = TDMT_DND_DROP_MNODE;
 | 
				
			||||||
    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
					    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
				
			||||||
      free(pMsg);
 | 
					      free(pMsg);
 | 
				
			||||||
      return -1;
 | 
					      return -1;
 | 
				
			||||||
| 
						 | 
					@ -500,7 +500,7 @@ static int32_t mndSetDropMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDnode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndDropMnode(SMnode *pMnode, SMnodeMsg *pMsg, SMnodeObj *pObj) {
 | 
					static int32_t mndDropMnode(SMnode *pMnode, SMnodeMsg *pMsg, SMnodeObj *pObj) {
 | 
				
			||||||
  int32_t code = -1;
 | 
					  int32_t code = -1;
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("mnode:%d, failed to drop since %s", pObj->id, terrstr());
 | 
					    mError("mnode:%d, failed to drop since %s", pObj->id, terrstr());
 | 
				
			||||||
    goto DROP_MNODE_OVER;
 | 
					    goto DROP_MNODE_OVER;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,10 +68,10 @@ int32_t mndInitProfile(SMnode *pMnode) {
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_HEARTBEAT, mndProcessHeartBeatMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_HEARTBEAT, mndProcessHeartBeatMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CONNECT, mndProcessConnectMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_CONNECT, mndProcessConnectMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_KILL_QUERY, mndProcessKillQueryMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_KILL_QUERY, mndProcessKillQueryMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_KILL_CONN, mndProcessKillConnectionMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_KILL_CONN, mndProcessKillConnectionMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_CONNS, mndGetConnsMeta);
 | 
					  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_CONNS, mndGetConnsMeta);
 | 
				
			||||||
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_CONNS, mndRetrieveConns);
 | 
					  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_CONNS, mndRetrieveConns);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,8 +36,8 @@ int32_t mndInitShow(SMnode *pMnode) {
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_SHOW, mndProcessShowMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_SHOW, mndProcessShowMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_SHOW_RETRIEVE, mndProcessRetrieveMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_SHOW_RETRIEVE, mndProcessRetrieveMsg);
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -52,13 +52,13 @@ int32_t mndInitStb(SMnode *pMnode) {
 | 
				
			||||||
                     .updateFp = (SdbUpdateFp)mndStbActionUpdate,
 | 
					                     .updateFp = (SdbUpdateFp)mndStbActionUpdate,
 | 
				
			||||||
                     .deleteFp = (SdbDeleteFp)mndStbActionDelete};
 | 
					                     .deleteFp = (SdbDeleteFp)mndStbActionDelete};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CREATE_STB, mndProcessCreateStbMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_STB, mndProcessCreateStbMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_ALTER_STB, mndProcessAlterStbMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_STB, mndProcessAlterStbMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_DROP_STB, mndProcessDropStbMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_DROP_STB, mndProcessDropStbMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CREATE_STB_IN_RSP, mndProcessCreateStbInRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_STB_RSP, mndProcessCreateStbInRsp);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_ALTER_STB_IN_RSP, mndProcessAlterStbInRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_VND_ALTER_STB_RSP, mndProcessAlterStbInRsp);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_DROP_STB_IN_RSP, mndProcessDropStbInRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_VND_DROP_STB_RSP, mndProcessDropStbInRsp);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_TABLE_META, mndProcessStbMetaMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_VND_TABLE_META, mndProcessStbMetaMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_STB, mndGetStbMeta);
 | 
					  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_STB, mndGetStbMeta);
 | 
				
			||||||
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
 | 
					  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
 | 
				
			||||||
| 
						 | 
					@ -177,7 +177,7 @@ static int32_t mndStbActionUpdate(SSdb *pSdb, SStbObj *pOldStb, SStbObj *pNewStb
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
 | 
					SStbObj *mndAcquireStb(SMnode *pMnode, char *stbName) {
 | 
				
			||||||
  SSdb    *pSdb = pMnode->pSdb;
 | 
					  SSdb *   pSdb = pMnode->pSdb;
 | 
				
			||||||
  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
 | 
					  SStbObj *pStb = sdbAcquire(pSdb, SDB_STB, stbName);
 | 
				
			||||||
  if (pStb == NULL) {
 | 
					  if (pStb == NULL) {
 | 
				
			||||||
    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
 | 
					    terrno = TSDB_CODE_MND_STB_NOT_EXIST;
 | 
				
			||||||
| 
						 | 
					@ -200,7 +200,43 @@ static SDbObj *mndAcquireDbByStb(SMnode *pMnode, char *stbName) {
 | 
				
			||||||
  return mndAcquireDb(pMnode, db);
 | 
					  return mndAcquireDb(pMnode, db);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static SCreateStbInternalMsg *mndBuildCreateStbMsg(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb) {
 | 
					static void *mndBuildCreateStbMsg(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb, int *pContLen) {
 | 
				
			||||||
 | 
					#if 1
 | 
				
			||||||
 | 
					  SVCreateTbReq req;
 | 
				
			||||||
 | 
					  void *        buf;
 | 
				
			||||||
 | 
					  int           bsize;
 | 
				
			||||||
 | 
					  SMsgHead *    pMsgHead;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  req.ver = 0;
 | 
				
			||||||
 | 
					  req.name = pStb->name;
 | 
				
			||||||
 | 
					  req.ttl = 0;
 | 
				
			||||||
 | 
					  req.keep = 0;
 | 
				
			||||||
 | 
					  req.type = TD_SUPER_TABLE;
 | 
				
			||||||
 | 
					  req.stbCfg.suid = pStb->uid;
 | 
				
			||||||
 | 
					  req.stbCfg.nCols = pStb->numOfColumns;
 | 
				
			||||||
 | 
					  req.stbCfg.pSchema = pStb->pSchema;
 | 
				
			||||||
 | 
					  req.stbCfg.nTagCols = pStb->numOfTags;
 | 
				
			||||||
 | 
					  req.stbCfg.pTagSchema = pStb->pSchema + pStb->numOfColumns;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bsize = tSerializeSVCreateTbReq(NULL, &req);
 | 
				
			||||||
 | 
					  buf = malloc(sizeof(SMsgHead) + bsize);
 | 
				
			||||||
 | 
					  if (buf == NULL) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pMsgHead = (SMsgHead *)buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pMsgHead->contLen = htonl(sizeof(SMsgHead) + bsize);
 | 
				
			||||||
 | 
					  pMsgHead->vgId = htonl(pVgroup->vgId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void *pBuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
 | 
				
			||||||
 | 
					  tSerializeSVCreateTbReq(&pBuf, &req);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  *pContLen = sizeof(SMsgHead) + bsize;
 | 
				
			||||||
 | 
					  return buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
  int32_t totalCols = pStb->numOfTags + pStb->numOfColumns;
 | 
					  int32_t totalCols = pStb->numOfTags + pStb->numOfColumns;
 | 
				
			||||||
  int32_t contLen = totalCols * sizeof(SSchema) + sizeof(SCreateStbInternalMsg);
 | 
					  int32_t contLen = totalCols * sizeof(SSchema) + sizeof(SCreateStbInternalMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -227,7 +263,9 @@ static SCreateStbInternalMsg *mndBuildCreateStbMsg(SMnode *pMnode, SVgObj *pVgro
 | 
				
			||||||
    pSchema->colId = htonl(pSchema->colId);
 | 
					    pSchema->colId = htonl(pSchema->colId);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  *pContLen = contLen;
 | 
				
			||||||
  return pCreate;
 | 
					  return pCreate;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static SDropStbInternalMsg *mndBuildDropStbMsg(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb) {
 | 
					static SDropStbInternalMsg *mndBuildDropStbMsg(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb) {
 | 
				
			||||||
| 
						 | 
					@ -324,16 +362,17 @@ static int32_t mndSetCreateStbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndSetCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
 | 
					static int32_t mndSetCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
 | 
				
			||||||
  SSdb   *pSdb = pMnode->pSdb;
 | 
					  SSdb *  pSdb = pMnode->pSdb;
 | 
				
			||||||
  SVgObj *pVgroup = NULL;
 | 
					  SVgObj *pVgroup = NULL;
 | 
				
			||||||
  void   *pIter = NULL;
 | 
					  void *  pIter = NULL;
 | 
				
			||||||
 | 
					  int     contLen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while (1) {
 | 
					  while (1) {
 | 
				
			||||||
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
 | 
					    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
 | 
				
			||||||
    if (pIter == NULL) break;
 | 
					    if (pIter == NULL) break;
 | 
				
			||||||
    if (pVgroup->dbUid != pDb->uid) continue;
 | 
					    if (pVgroup->dbUid != pDb->uid) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SCreateStbInternalMsg *pMsg = mndBuildCreateStbMsg(pMnode, pVgroup, pStb);
 | 
					    void *pMsg = mndBuildCreateStbMsg(pMnode, pVgroup, pStb, &contLen);
 | 
				
			||||||
    if (pMsg == NULL) {
 | 
					    if (pMsg == NULL) {
 | 
				
			||||||
      sdbCancelFetch(pSdb, pIter);
 | 
					      sdbCancelFetch(pSdb, pIter);
 | 
				
			||||||
      sdbRelease(pSdb, pVgroup);
 | 
					      sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
| 
						 | 
					@ -344,8 +383,8 @@ static int32_t mndSetCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj
 | 
				
			||||||
    STransAction action = {0};
 | 
					    STransAction action = {0};
 | 
				
			||||||
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
 | 
					    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
 | 
				
			||||||
    action.pCont = pMsg;
 | 
					    action.pCont = pMsg;
 | 
				
			||||||
    action.contLen = htonl(pMsg->head.contLen);
 | 
					    action.contLen = contLen;
 | 
				
			||||||
    action.msgType = TSDB_MSG_TYPE_CREATE_STB_IN;
 | 
					    action.msgType = TDMT_VND_CREATE_STB;
 | 
				
			||||||
    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
					    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
				
			||||||
      free(pMsg);
 | 
					      free(pMsg);
 | 
				
			||||||
      sdbCancelFetch(pSdb, pIter);
 | 
					      sdbCancelFetch(pSdb, pIter);
 | 
				
			||||||
| 
						 | 
					@ -359,9 +398,9 @@ static int32_t mndSetCreateStbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndSetCreateStbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
 | 
					static int32_t mndSetCreateStbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
 | 
				
			||||||
  SSdb   *pSdb = pMnode->pSdb;
 | 
					  SSdb *  pSdb = pMnode->pSdb;
 | 
				
			||||||
  SVgObj *pVgroup = NULL;
 | 
					  SVgObj *pVgroup = NULL;
 | 
				
			||||||
  void   *pIter = NULL;
 | 
					  void *  pIter = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while (1) {
 | 
					  while (1) {
 | 
				
			||||||
    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
 | 
					    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
 | 
				
			||||||
| 
						 | 
					@ -380,7 +419,7 @@ static int32_t mndSetCreateStbUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj
 | 
				
			||||||
    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
 | 
					    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
 | 
				
			||||||
    action.pCont = pMsg;
 | 
					    action.pCont = pMsg;
 | 
				
			||||||
    action.contLen = sizeof(SDropStbInternalMsg);
 | 
					    action.contLen = sizeof(SDropStbInternalMsg);
 | 
				
			||||||
    action.msgType = TSDB_MSG_TYPE_DROP_STB_IN;
 | 
					    action.msgType = TDMT_VND_DROP_STB;
 | 
				
			||||||
    if (mndTransAppendUndoAction(pTrans, &action) != 0) {
 | 
					    if (mndTransAppendUndoAction(pTrans, &action) != 0) {
 | 
				
			||||||
      free(pMsg);
 | 
					      free(pMsg);
 | 
				
			||||||
      sdbCancelFetch(pSdb, pIter);
 | 
					      sdbCancelFetch(pSdb, pIter);
 | 
				
			||||||
| 
						 | 
					@ -415,7 +454,7 @@ static int32_t mndCreateStb(SMnode *pMnode, SMnodeMsg *pMsg, SCreateStbMsg *pCre
 | 
				
			||||||
  memcpy(stbObj.pSchema, pCreate->pSchema, totalSize);
 | 
					  memcpy(stbObj.pSchema, pCreate->pSchema, totalSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int32_t code = 0;
 | 
					  int32_t code = 0;
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("stb:%s, failed to create since %s", pCreate->name, terrstr());
 | 
					    mError("stb:%s, failed to create since %s", pCreate->name, terrstr());
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
| 
						 | 
					@ -461,7 +500,7 @@ CREATE_STB_OVER:
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndProcessCreateStbMsg(SMnodeMsg *pMsg) {
 | 
					static int32_t mndProcessCreateStbMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
  SMnode        *pMnode = pMsg->pMnode;
 | 
					  SMnode *       pMnode = pMsg->pMnode;
 | 
				
			||||||
  SCreateStbMsg *pCreate = pMsg->rpcMsg.pCont;
 | 
					  SCreateStbMsg *pCreate = pMsg->rpcMsg.pCont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mDebug("stb:%s, start to create", pCreate->name);
 | 
					  mDebug("stb:%s, start to create", pCreate->name);
 | 
				
			||||||
| 
						 | 
					@ -484,6 +523,15 @@ static int32_t mndProcessCreateStbMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // topic should have different name with stb
 | 
				
			||||||
 | 
					  SStbObj *pTopic = mndAcquireStb(pMnode, pCreate->name);
 | 
				
			||||||
 | 
					  if (pTopic != NULL) {
 | 
				
			||||||
 | 
					    sdbRelease(pMnode->pSdb, pTopic);
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_NAME_CONFLICT_WITH_TOPIC;
 | 
				
			||||||
 | 
					    mError("stb:%s, failed to create since %s", pCreate->name, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SDbObj *pDb = mndAcquireDbByStb(pMnode, pCreate->name);
 | 
					  SDbObj *pDb = mndAcquireDbByStb(pMnode, pCreate->name);
 | 
				
			||||||
  if (pDb == NULL) {
 | 
					  if (pDb == NULL) {
 | 
				
			||||||
    terrno = TSDB_CODE_MND_DB_NOT_SELECTED;
 | 
					    terrno = TSDB_CODE_MND_DB_NOT_SELECTED;
 | 
				
			||||||
| 
						 | 
					@ -536,7 +584,7 @@ static int32_t mndCheckAlterStbMsg(SAlterStbMsg *pAlter) {
 | 
				
			||||||
static int32_t mndUpdateStb(SMnode *pMnode, SMnodeMsg *pMsg, SStbObj *pOldStb, SStbObj *pNewStb) { return 0; }
 | 
					static int32_t mndUpdateStb(SMnode *pMnode, SMnodeMsg *pMsg, SStbObj *pOldStb, SStbObj *pNewStb) { return 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndProcessAlterStbMsg(SMnodeMsg *pMsg) {
 | 
					static int32_t mndProcessAlterStbMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
  SMnode       *pMnode = pMsg->pMnode;
 | 
					  SMnode *      pMnode = pMsg->pMnode;
 | 
				
			||||||
  SAlterStbMsg *pAlter = pMsg->rpcMsg.pCont;
 | 
					  SAlterStbMsg *pAlter = pMsg->rpcMsg.pCont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mDebug("stb:%s, start to alter", pAlter->name);
 | 
					  mDebug("stb:%s, start to alter", pAlter->name);
 | 
				
			||||||
| 
						 | 
					@ -605,7 +653,7 @@ static int32_t mndSetDropStbUndoActions(SMnode *pMnode, STrans *pTrans, SStbObj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndDropStb(SMnode *pMnode, SMnodeMsg *pMsg, SStbObj *pStb) {
 | 
					static int32_t mndDropStb(SMnode *pMnode, SMnodeMsg *pMsg, SStbObj *pStb) {
 | 
				
			||||||
  int32_t code = -1;
 | 
					  int32_t code = -1;
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("stb:%s, failed to drop since %s", pStb->name, terrstr());
 | 
					    mError("stb:%s, failed to drop since %s", pStb->name, terrstr());
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
| 
						 | 
					@ -650,7 +698,7 @@ DROP_STB_OVER:
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndProcessDropStbMsg(SMnodeMsg *pMsg) {
 | 
					static int32_t mndProcessDropStbMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
  SMnode      *pMnode = pMsg->pMnode;
 | 
					  SMnode *     pMnode = pMsg->pMnode;
 | 
				
			||||||
  SDropStbMsg *pDrop = pMsg->rpcMsg.pCont;
 | 
					  SDropStbMsg *pDrop = pMsg->rpcMsg.pCont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mDebug("stb:%s, start to drop", pDrop->name);
 | 
					  mDebug("stb:%s, start to drop", pDrop->name);
 | 
				
			||||||
| 
						 | 
					@ -685,7 +733,7 @@ static int32_t mndProcessDropStbInRsp(SMnodeMsg *pMsg) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndProcessStbMetaMsg(SMnodeMsg *pMsg) {
 | 
					static int32_t mndProcessStbMetaMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
  SMnode        *pMnode = pMsg->pMnode;
 | 
					  SMnode *       pMnode = pMsg->pMnode;
 | 
				
			||||||
  STableInfoMsg *pInfo = pMsg->rpcMsg.pCont;
 | 
					  STableInfoMsg *pInfo = pMsg->rpcMsg.pCont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mDebug("stb:%s, start to retrieve meta", pInfo->tableFname);
 | 
					  mDebug("stb:%s, start to retrieve meta", pInfo->tableFname);
 | 
				
			||||||
| 
						 | 
					@ -757,7 +805,7 @@ static int32_t mndGetNumOfStbs(SMnode *pMnode, char *dbName, int32_t *pNumOfStbs
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int32_t numOfStbs = 0;
 | 
					  int32_t numOfStbs = 0;
 | 
				
			||||||
  void   *pIter = NULL;
 | 
					  void *  pIter = NULL;
 | 
				
			||||||
  while (1) {
 | 
					  while (1) {
 | 
				
			||||||
    SStbObj *pStb = NULL;
 | 
					    SStbObj *pStb = NULL;
 | 
				
			||||||
    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
 | 
					    pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb);
 | 
				
			||||||
| 
						 | 
					@ -776,7 +824,7 @@ static int32_t mndGetNumOfStbs(SMnode *pMnode, char *dbName, int32_t *pNumOfStbs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndGetStbMeta(SMnodeMsg *pMsg, SShowObj *pShow, STableMetaMsg *pMeta) {
 | 
					static int32_t mndGetStbMeta(SMnodeMsg *pMsg, SShowObj *pShow, STableMetaMsg *pMeta) {
 | 
				
			||||||
  SMnode *pMnode = pMsg->pMnode;
 | 
					  SMnode *pMnode = pMsg->pMnode;
 | 
				
			||||||
  SSdb   *pSdb = pMnode->pSdb;
 | 
					  SSdb *  pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (mndGetNumOfStbs(pMnode, pShow->db, &pShow->numOfRows) != 0) {
 | 
					  if (mndGetNumOfStbs(pMnode, pShow->db, &pShow->numOfRows) != 0) {
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
| 
						 | 
					@ -825,8 +873,8 @@ static int32_t mndGetStbMeta(SMnodeMsg *pMsg, SShowObj *pShow, STableMetaMsg *pM
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void mndExtractTableName(char *tableId, char *name) {
 | 
					static void mndExtractTableName(char *tableId, char *name) {
 | 
				
			||||||
  int pos = -1;
 | 
					  int32_t pos = -1;
 | 
				
			||||||
  int num = 0;
 | 
					  int32_t num = 0;
 | 
				
			||||||
  for (pos = 0; tableId[pos] != 0; ++pos) {
 | 
					  for (pos = 0; tableId[pos] != 0; ++pos) {
 | 
				
			||||||
    if (tableId[pos] == '.') num++;
 | 
					    if (tableId[pos] == '.') num++;
 | 
				
			||||||
    if (num == 2) break;
 | 
					    if (num == 2) break;
 | 
				
			||||||
| 
						 | 
					@ -838,12 +886,12 @@ static void mndExtractTableName(char *tableId, char *name) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndRetrieveStb(SMnodeMsg *pMsg, SShowObj *pShow, char *data, int32_t rows) {
 | 
					static int32_t mndRetrieveStb(SMnodeMsg *pMsg, SShowObj *pShow, char *data, int32_t rows) {
 | 
				
			||||||
  SMnode  *pMnode = pMsg->pMnode;
 | 
					  SMnode * pMnode = pMsg->pMnode;
 | 
				
			||||||
  SSdb    *pSdb = pMnode->pSdb;
 | 
					  SSdb *   pSdb = pMnode->pSdb;
 | 
				
			||||||
  int32_t  numOfRows = 0;
 | 
					  int32_t  numOfRows = 0;
 | 
				
			||||||
  SStbObj *pStb = NULL;
 | 
					  SStbObj *pStb = NULL;
 | 
				
			||||||
  int32_t  cols = 0;
 | 
					  int32_t  cols = 0;
 | 
				
			||||||
  char    *pWrite;
 | 
					  char *   pWrite;
 | 
				
			||||||
  char     prefix[64] = {0};
 | 
					  char     prefix[64] = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tstrncpy(prefix, pShow->db, 64);
 | 
					  tstrncpy(prefix, pShow->db, 64);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,26 +14,54 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _DEFAULT_SOURCE
 | 
					#define _DEFAULT_SOURCE
 | 
				
			||||||
#include "os.h"
 | 
					#include "mndSync.h"
 | 
				
			||||||
#include "mndInt.h"
 | 
					 | 
				
			||||||
#include "mndTrans.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32_t mndInitSync(SMnode *pMnode) { return 0; }
 | 
					int32_t mndInitSync(SMnode *pMnode) {
 | 
				
			||||||
void    mndCleanupSync(SMnode *pMnode) {}
 | 
					  SSyncMgmt *pMgmt = &pMnode->syncMgmt;
 | 
				
			||||||
 | 
					  tsem_init(&pMgmt->syncSem, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pMgmt->state = TAOS_SYNC_STATE_LEADER;
 | 
				
			||||||
 | 
					  pMgmt->pSyncNode = NULL;
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void mndCleanupSync(SMnode *pMnode) {
 | 
				
			||||||
 | 
					  SSyncMgmt *pMgmt = &pMnode->syncMgmt;
 | 
				
			||||||
 | 
					  tsem_destroy(&pMgmt->syncSem);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSyncApplyCb(struct SSyncFSM *fsm, SyncIndex index, const SSyncBuffer *buf, void *pData) {
 | 
				
			||||||
 | 
					  SMnode    *pMnode = pData;
 | 
				
			||||||
 | 
					  SSyncMgmt *pMgmt = &pMnode->syncMgmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pMgmt->errCode = 0;
 | 
				
			||||||
 | 
					  tsem_post(&pMgmt->syncSem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw) {
 | 
					int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw) {
 | 
				
			||||||
  int32_t code = 0;
 | 
					#if 1
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					  if (pMnode->replica == 1) return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // int32_t  len = sdbGetRawTotalSize(pRaw);
 | 
					  SSyncMgmt *pMgmt = &pMnode->syncMgmt;
 | 
				
			||||||
  // SSdbRaw *pReceived = calloc(1, len);
 | 
					  pMgmt->errCode = 0;
 | 
				
			||||||
  // memcpy(pReceived, pRaw, len);
 | 
					 | 
				
			||||||
  // mDebug("trans:%d, data:%p recv from sync, code:0x%x pMsg:%p", pMsg->id, pReceived, code & 0xFFFF, pMsg);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // mndTransApply(pMnode, pReceived, code);
 | 
					  SSyncBuffer buf = {.data = pRaw, .len = sdbGetRawTotalSize(pRaw)};
 | 
				
			||||||
  return code;
 | 
					
 | 
				
			||||||
 | 
					  bool    isWeak = false;
 | 
				
			||||||
 | 
					  int32_t code = syncPropose(pMgmt->pSyncNode, &buf, pMnode, isWeak);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (code != 0) return code;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tsem_wait(&pMgmt->syncSem);
 | 
				
			||||||
 | 
					  return pMgmt->errCode;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool mndIsMaster(SMnode *pMnode) {
 | 
					bool mndIsMaster(SMnode *pMnode) {
 | 
				
			||||||
  // pMnode->role = TAOS_SYNC_STATE_LEADER;
 | 
					  SSyncMgmt *pMgmt = &pMnode->syncMgmt;
 | 
				
			||||||
  return true;
 | 
					  return pMgmt->state == TAOS_SYNC_STATE_LEADER;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,857 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is free software: you can use, redistribute, and/or modify
 | 
				
			||||||
 | 
					 * it under the terms of the GNU Affero General Public License, version 3
 | 
				
			||||||
 | 
					 * or later ("AGPL"), as published by the Free Software Foundation.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is distributed in the hope that it will be useful, but WITHOUT
 | 
				
			||||||
 | 
					 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
				
			||||||
 | 
					 * FITNESS FOR A PARTICULAR PURPOSE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You should have received a copy of the GNU Affero General Public License
 | 
				
			||||||
 | 
					 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define _DEFAULT_SOURCE
 | 
				
			||||||
 | 
					#include "mndDb.h"
 | 
				
			||||||
 | 
					#include "mndDnode.h"
 | 
				
			||||||
 | 
					#include "mndMnode.h"
 | 
				
			||||||
 | 
					#include "mndShow.h"
 | 
				
			||||||
 | 
					#include "mndStb.h"
 | 
				
			||||||
 | 
					#include "mndTrans.h"
 | 
				
			||||||
 | 
					#include "mndUser.h"
 | 
				
			||||||
 | 
					#include "mndVgroup.h"
 | 
				
			||||||
 | 
					#include "tname.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MND_TOPIC_VER_NUMBER 1
 | 
				
			||||||
 | 
					#define MND_TOPIC_RESERVE_SIZE 64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static SSdbRaw *mndTopicActionEncode(STopicObj *pTopic);
 | 
				
			||||||
 | 
					static SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw);
 | 
				
			||||||
 | 
					static int32_t  mndTopicActionInsert(SSdb *pSdb, STopicObj *pTopic);
 | 
				
			||||||
 | 
					static int32_t  mndTopicActionDelete(SSdb *pSdb, STopicObj *pTopic);
 | 
				
			||||||
 | 
					static int32_t  mndTopicActionUpdate(SSdb *pSdb, STopicObj *pTopic, STopicObj *pNewTopic);
 | 
				
			||||||
 | 
					static int32_t  mndProcessCreateTopicMsg(SMnodeMsg *pMsg);
 | 
				
			||||||
 | 
					static int32_t  mndProcessAlterTopicMsg(SMnodeMsg *pMsg);
 | 
				
			||||||
 | 
					static int32_t  mndProcessDropTopicMsg(SMnodeMsg *pMsg);
 | 
				
			||||||
 | 
					static int32_t  mndProcessCreateTopicInRsp(SMnodeMsg *pMsg);
 | 
				
			||||||
 | 
					static int32_t  mndProcessAlterTopicInRsp(SMnodeMsg *pMsg);
 | 
				
			||||||
 | 
					static int32_t  mndProcessDropTopicInRsp(SMnodeMsg *pMsg);
 | 
				
			||||||
 | 
					static int32_t  mndProcessTopicMetaMsg(SMnodeMsg *pMsg);
 | 
				
			||||||
 | 
					static int32_t  mndGetTopicMeta(SMnodeMsg *pMsg, SShowObj *pShow, STableMetaMsg *pMeta);
 | 
				
			||||||
 | 
					static int32_t  mndRetrieveTopic(SMnodeMsg *pMsg, SShowObj *pShow, char *data, int32_t rows);
 | 
				
			||||||
 | 
					static void     mndCancelGetNextTopic(SMnode *pMnode, void *pIter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int32_t mndInitTopic(SMnode *pMnode) {
 | 
				
			||||||
 | 
					  SSdbTable table = {.sdbType = SDB_TOPIC,
 | 
				
			||||||
 | 
					                     .keyType = SDB_KEY_BINARY,
 | 
				
			||||||
 | 
					                     .encodeFp = (SdbEncodeFp)mndTopicActionEncode,
 | 
				
			||||||
 | 
					                     .decodeFp = (SdbDecodeFp)mndTopicActionDecode,
 | 
				
			||||||
 | 
					                     .insertFp = (SdbInsertFp)mndTopicActionInsert,
 | 
				
			||||||
 | 
					                     .updateFp = (SdbUpdateFp)mndTopicActionUpdate,
 | 
				
			||||||
 | 
					                     .deleteFp = (SdbDeleteFp)mndTopicActionDelete};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_TOPIC, mndProcessCreateTopicMsg);
 | 
				
			||||||
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_TOPIC, mndProcessAlterTopicMsg);
 | 
				
			||||||
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_DROP_TOPIC, mndProcessDropTopicMsg);
 | 
				
			||||||
 | 
					  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_TOPIC_RSP, mndProcessCreateTopicInRsp);
 | 
				
			||||||
 | 
					  mndSetMsgHandle(pMnode, TDMT_VND_ALTER_TOPIC_RSP, mndProcessAlterTopicInRsp);
 | 
				
			||||||
 | 
					  mndSetMsgHandle(pMnode, TDMT_VND_DROP_TOPIC_RSP, mndProcessDropTopicInRsp);
 | 
				
			||||||
 | 
					  mndSetMsgHandle(pMnode, TDMT_VND_TABLE_META, mndProcessTopicMetaMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /*mndAddShowMetaHandle(pMnode, TSDB_MGMT_TOPIC, mndGetTopicMeta);*/
 | 
				
			||||||
 | 
					  /*mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TOPIC, mndRetrieveTopic);*/
 | 
				
			||||||
 | 
					  /*mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TOPIC, mndCancelGetNextTopic);*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_TOPIC, mndProcessCreateTopicMsg);
 | 
				
			||||||
 | 
					  mndSetMsgHandle(pMnode, TDMT_VND_CREATE_TOPIC_RSP, mndProcessCreateTopicInRsp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return sdbSetTable(pMnode->pSdb, table);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void mndCleanupTopic(SMnode *pMnode) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static SSdbRaw *mndTopicActionEncode(STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  int32_t  size = sizeof(STopicObj) + MND_TOPIC_RESERVE_SIZE;
 | 
				
			||||||
 | 
					  SSdbRaw *pRaw = sdbAllocRaw(SDB_TOPIC, MND_TOPIC_VER_NUMBER, size);
 | 
				
			||||||
 | 
					  if (pRaw == NULL) return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int32_t dataPos = 0;
 | 
				
			||||||
 | 
					  SDB_SET_BINARY(pRaw, dataPos, pTopic->name, TSDB_TABLE_FNAME_LEN);
 | 
				
			||||||
 | 
					  SDB_SET_BINARY(pRaw, dataPos, pTopic->db, TSDB_FULL_DB_NAME_LEN);
 | 
				
			||||||
 | 
					  SDB_SET_INT64(pRaw, dataPos, pTopic->createTime);
 | 
				
			||||||
 | 
					  SDB_SET_INT64(pRaw, dataPos, pTopic->updateTime);
 | 
				
			||||||
 | 
					  SDB_SET_INT64(pRaw, dataPos, pTopic->uid);
 | 
				
			||||||
 | 
					  SDB_SET_INT64(pRaw, dataPos, pTopic->dbUid);
 | 
				
			||||||
 | 
					  SDB_SET_INT32(pRaw, dataPos, pTopic->version);
 | 
				
			||||||
 | 
					  SDB_SET_INT32(pRaw, dataPos, pTopic->execLen);
 | 
				
			||||||
 | 
					  SDB_SET_BINARY(pRaw, dataPos, pTopic->executor, pTopic->execLen);
 | 
				
			||||||
 | 
					  SDB_SET_INT32(pRaw, dataPos, pTopic->sqlLen);
 | 
				
			||||||
 | 
					  SDB_SET_BINARY(pRaw, dataPos, pTopic->sql, pTopic->sqlLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SDB_SET_RESERVE(pRaw, dataPos, MND_TOPIC_RESERVE_SIZE);
 | 
				
			||||||
 | 
					  SDB_SET_DATALEN(pRaw, dataPos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return pRaw;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) {
 | 
				
			||||||
 | 
					  int8_t sver = 0;
 | 
				
			||||||
 | 
					  if (sdbGetRawSoftVer(pRaw, &sver) != 0) return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (sver != MND_TOPIC_VER_NUMBER) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
 | 
				
			||||||
 | 
					    mError("failed to decode topic since %s", terrstr());
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int32_t    size = sizeof(STopicObj) + TSDB_MAX_COLUMNS * sizeof(SSchema);
 | 
				
			||||||
 | 
					  SSdbRow   *pRow = sdbAllocRow(size);
 | 
				
			||||||
 | 
					  STopicObj *pTopic = sdbGetRowObj(pRow);
 | 
				
			||||||
 | 
					  if (pTopic == NULL) return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int32_t dataPos = 0;
 | 
				
			||||||
 | 
					  SDB_GET_BINARY(pRaw, pRow, dataPos, pTopic->name, TSDB_TABLE_FNAME_LEN);
 | 
				
			||||||
 | 
					  SDB_GET_BINARY(pRaw, pRow, dataPos, pTopic->db, TSDB_FULL_DB_NAME_LEN);
 | 
				
			||||||
 | 
					  SDB_GET_INT64(pRaw, pRow, dataPos, &pTopic->createTime);
 | 
				
			||||||
 | 
					  SDB_GET_INT64(pRaw, pRow, dataPos, &pTopic->updateTime);
 | 
				
			||||||
 | 
					  SDB_GET_INT64(pRaw, pRow, dataPos, &pTopic->uid);
 | 
				
			||||||
 | 
					  SDB_GET_INT64(pRaw, pRow, dataPos, &pTopic->dbUid);
 | 
				
			||||||
 | 
					  SDB_GET_INT32(pRaw, pRow, dataPos, &pTopic->version);
 | 
				
			||||||
 | 
					  SDB_GET_INT32(pRaw, pRow, dataPos, &pTopic->execLen);
 | 
				
			||||||
 | 
					  SDB_GET_BINARY(pRaw, pRow, dataPos, pTopic->executor, pTopic->execLen);
 | 
				
			||||||
 | 
					  SDB_GET_INT32(pRaw, pRow, dataPos, &pTopic->sqlLen);
 | 
				
			||||||
 | 
					  SDB_GET_BINARY(pRaw, pRow, dataPos, pTopic->sql, pTopic->sqlLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SDB_GET_RESERVE(pRaw, pRow, dataPos, MND_TOPIC_RESERVE_SIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return pRow;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndTopicActionInsert(SSdb *pSdb, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  mTrace("topic:%s, perform insert action", pTopic->name);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndTopicActionDelete(SSdb *pSdb, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  mTrace("topic:%s, perform delete action", pTopic->name);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndTopicActionUpdate(SSdb *pSdb, STopicObj *pOldTopic, STopicObj *pNewTopic) {
 | 
				
			||||||
 | 
					  mTrace("topic:%s, perform update action", pOldTopic->name);
 | 
				
			||||||
 | 
					  atomic_exchange_32(&pOldTopic->updateTime, pNewTopic->updateTime);
 | 
				
			||||||
 | 
					  atomic_exchange_32(&pOldTopic->version, pNewTopic->version);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  taosWLockLatch(&pOldTopic->lock);
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pOldTopic->numOfColumns = pNewTopic->numOfColumns;
 | 
				
			||||||
 | 
					  pOldTopic->numOfTags = pNewTopic->numOfTags;
 | 
				
			||||||
 | 
					  int32_t totalCols = pNewTopic->numOfTags + pNewTopic->numOfColumns;
 | 
				
			||||||
 | 
					  int32_t totalSize = totalCols * sizeof(SSchema);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (pOldTopic->numOfTags + pOldTopic->numOfColumns < totalCols) {
 | 
				
			||||||
 | 
					    void *pSchema = malloc(totalSize);
 | 
				
			||||||
 | 
					    if (pSchema != NULL) {
 | 
				
			||||||
 | 
					      free(pOldTopic->pSchema);
 | 
				
			||||||
 | 
					      pOldTopic->pSchema = pSchema;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  memcpy(pOldTopic->pSchema, pNewTopic->pSchema, totalSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  taosWUnLockLatch(&pOldTopic->lock);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					STopicObj *mndAcquireTopic(SMnode *pMnode, char *topicName) {
 | 
				
			||||||
 | 
					  SSdb      *pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					  STopicObj *pTopic = sdbAcquire(pSdb, SDB_TOPIC, topicName);
 | 
				
			||||||
 | 
					  if (pTopic == NULL) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_TOPIC_NOT_EXIST;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return pTopic;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void mndReleaseTopic(SMnode *pMnode, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  SSdb *pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					  sdbRelease(pSdb, pTopic);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static SDbObj *mndAcquireDbByTopic(SMnode *pMnode, char *topicName) {
 | 
				
			||||||
 | 
					  SName name = {0};
 | 
				
			||||||
 | 
					  tNameFromString(&name, topicName, T_NAME_ACCT | T_NAME_DB | T_NAME_TOPIC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  char db[TSDB_TABLE_FNAME_LEN] = {0};
 | 
				
			||||||
 | 
					  tNameGetFullDbName(&name, db);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return mndAcquireDb(pMnode, db);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static SCreateTopicInternalMsg *mndBuildCreateTopicMsg(SMnode *pMnode, SVgObj *pVgroup, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  int32_t totalCols = 0;
 | 
				
			||||||
 | 
					  int32_t contLen = sizeof(SCreateTopicInternalMsg) + pTopic->execLen + pTopic->sqlLen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SCreateTopicInternalMsg *pCreate = calloc(1, contLen);
 | 
				
			||||||
 | 
					  if (pCreate == NULL) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pCreate->head.contLen = htonl(contLen);
 | 
				
			||||||
 | 
					  pCreate->head.vgId = htonl(pVgroup->vgId);
 | 
				
			||||||
 | 
					  memcpy(pCreate->name, pTopic->name, TSDB_TABLE_FNAME_LEN);
 | 
				
			||||||
 | 
					  pCreate->tuid = htobe64(pTopic->uid);
 | 
				
			||||||
 | 
					  pCreate->sverson = htonl(pTopic->version);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pCreate->sql = malloc(pTopic->sqlLen);
 | 
				
			||||||
 | 
					  if (pCreate->sql == NULL) {
 | 
				
			||||||
 | 
					    free(pCreate);
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  memcpy(pCreate->sql, pTopic->sql, pTopic->sqlLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pCreate->executor = malloc(pTopic->execLen);
 | 
				
			||||||
 | 
					  if (pCreate->executor == NULL) {
 | 
				
			||||||
 | 
					    free(pCreate);
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  memcpy(pCreate->executor, pTopic->executor, pTopic->execLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return pCreate;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static SDropTopicInternalMsg *mndBuildDropTopicMsg(SMnode *pMnode, SVgObj *pVgroup, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  int32_t contLen = sizeof(SDropTopicInternalMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SDropTopicInternalMsg *pDrop = calloc(1, contLen);
 | 
				
			||||||
 | 
					  if (pDrop == NULL) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pDrop->head.contLen = htonl(contLen);
 | 
				
			||||||
 | 
					  pDrop->head.vgId = htonl(pVgroup->vgId);
 | 
				
			||||||
 | 
					  memcpy(pDrop->name, pTopic->name, TSDB_TABLE_FNAME_LEN);
 | 
				
			||||||
 | 
					  pDrop->tuid = htobe64(pTopic->uid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return pDrop;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndCheckCreateTopicMsg(SCreateTopicMsg *pCreate) {
 | 
				
			||||||
 | 
					  // deserialize and other stuff
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetCreateTopicRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  SSdbRaw *pRedoRaw = mndTopicActionEncode(pTopic);
 | 
				
			||||||
 | 
					  if (pRedoRaw == NULL) return -1;
 | 
				
			||||||
 | 
					  if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) return -1;
 | 
				
			||||||
 | 
					  if (sdbSetRawStatus(pRedoRaw, SDB_STATUS_CREATING) != 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetCreateTopicUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  SSdbRaw *pUndoRaw = mndTopicActionEncode(pTopic);
 | 
				
			||||||
 | 
					  if (pUndoRaw == NULL) return -1;
 | 
				
			||||||
 | 
					  if (mndTransAppendUndolog(pTrans, pUndoRaw) != 0) return -1;
 | 
				
			||||||
 | 
					  if (sdbSetRawStatus(pUndoRaw, SDB_STATUS_DROPPED) != 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetCreateTopicCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  SSdbRaw *pCommitRaw = mndTopicActionEncode(pTopic);
 | 
				
			||||||
 | 
					  if (pCommitRaw == NULL) return -1;
 | 
				
			||||||
 | 
					  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
 | 
				
			||||||
 | 
					  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY) != 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetCreateTopicRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  SSdb   *pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					  SVgObj *pVgroup = NULL;
 | 
				
			||||||
 | 
					  void   *pIter = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (1) {
 | 
				
			||||||
 | 
					    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
 | 
				
			||||||
 | 
					    if (pIter == NULL) break;
 | 
				
			||||||
 | 
					    if (pVgroup->dbUid != pDb->uid) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SCreateTopicInternalMsg *pMsg = mndBuildCreateTopicMsg(pMnode, pVgroup, pTopic);
 | 
				
			||||||
 | 
					    if (pMsg == NULL) {
 | 
				
			||||||
 | 
					      sdbCancelFetch(pSdb, pIter);
 | 
				
			||||||
 | 
					      sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					      terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    STransAction action = {0};
 | 
				
			||||||
 | 
					    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
 | 
				
			||||||
 | 
					    action.pCont = pMsg;
 | 
				
			||||||
 | 
					    action.contLen = htonl(pMsg->head.contLen);
 | 
				
			||||||
 | 
					    action.msgType = TDMT_VND_CREATE_TOPIC;
 | 
				
			||||||
 | 
					    if (mndTransAppendRedoAction(pTrans, &action) != 0) {
 | 
				
			||||||
 | 
					      free(pMsg);
 | 
				
			||||||
 | 
					      sdbCancelFetch(pSdb, pIter);
 | 
				
			||||||
 | 
					      sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetCreateTopicUndoActions(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  SSdb   *pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					  SVgObj *pVgroup = NULL;
 | 
				
			||||||
 | 
					  void   *pIter = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (1) {
 | 
				
			||||||
 | 
					    pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
 | 
				
			||||||
 | 
					    if (pIter == NULL) break;
 | 
				
			||||||
 | 
					    if (pVgroup->dbUid != pDb->uid) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SDropTopicInternalMsg *pMsg = mndBuildDropTopicMsg(pMnode, pVgroup, pTopic);
 | 
				
			||||||
 | 
					    if (pMsg == NULL) {
 | 
				
			||||||
 | 
					      sdbCancelFetch(pSdb, pIter);
 | 
				
			||||||
 | 
					      sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					      terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    STransAction action = {0};
 | 
				
			||||||
 | 
					    action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
 | 
				
			||||||
 | 
					    action.pCont = pMsg;
 | 
				
			||||||
 | 
					    action.contLen = sizeof(SDropTopicInternalMsg);
 | 
				
			||||||
 | 
					    action.msgType = TDMT_VND_DROP_TOPIC;
 | 
				
			||||||
 | 
					    if (mndTransAppendUndoAction(pTrans, &action) != 0) {
 | 
				
			||||||
 | 
					      free(pMsg);
 | 
				
			||||||
 | 
					      sdbCancelFetch(pSdb, pIter);
 | 
				
			||||||
 | 
					      sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    sdbRelease(pSdb, pVgroup);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndCreateTopic(SMnode *pMnode, SMnodeMsg *pMsg, SCreateTopicMsg *pCreate, SDbObj *pDb) {
 | 
				
			||||||
 | 
					  STopicObj topicObj = {0};
 | 
				
			||||||
 | 
					  tstrncpy(topicObj.name, pCreate->name, TSDB_TABLE_FNAME_LEN);
 | 
				
			||||||
 | 
					  tstrncpy(topicObj.db, pDb->name, TSDB_FULL_DB_NAME_LEN);
 | 
				
			||||||
 | 
					  topicObj.createTime = taosGetTimestampMs();
 | 
				
			||||||
 | 
					  topicObj.updateTime = topicObj.createTime;
 | 
				
			||||||
 | 
					  topicObj.uid = mndGenerateUid(pCreate->name, TSDB_TABLE_FNAME_LEN);
 | 
				
			||||||
 | 
					  topicObj.dbUid = pDb->uid;
 | 
				
			||||||
 | 
					  topicObj.version = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					  int32_t totalCols = topicObj.numOfColumns + topicObj.numOfTags;
 | 
				
			||||||
 | 
					  int32_t totalSize = totalCols * sizeof(SSchema);
 | 
				
			||||||
 | 
					  topicObj.sql = malloc(totalSize);
 | 
				
			||||||
 | 
					  if (topicObj.sql == NULL) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  memcpy(topicObj.sql, pCreate->sql, totalSize);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int32_t code = 0;
 | 
				
			||||||
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  mDebug("trans:%d, used to create topic:%s", pTrans->id, pCreate->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndSetCreateTopicRedoLogs(pMnode, pTrans, pDb, &topicObj) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to set redo log since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    goto CREATE_TOPIC_OVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndSetCreateTopicUndoLogs(pMnode, pTrans, pDb, &topicObj) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to set undo log since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    goto CREATE_TOPIC_OVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndSetCreateTopicCommitLogs(pMnode, pTrans, pDb, &topicObj) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to set commit log since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    goto CREATE_TOPIC_OVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndSetCreateTopicRedoActions(pMnode, pTrans, pDb, &topicObj) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to set redo actions since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    goto CREATE_TOPIC_OVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndSetCreateTopicUndoActions(pMnode, pTrans, pDb, &topicObj) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to set redo actions since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    goto CREATE_TOPIC_OVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndTransPrepare(pMnode, pTrans) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    mndTransDrop(pTrans);
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  code = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE_TOPIC_OVER:
 | 
				
			||||||
 | 
					  mndTransDrop(pTrans);
 | 
				
			||||||
 | 
					  return code;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndProcessCreateTopicMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
 | 
					  SMnode          *pMnode = pMsg->pMnode;
 | 
				
			||||||
 | 
					  SCreateTopicMsg *pCreate = pMsg->rpcMsg.pCont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mDebug("topic:%s, start to create", pCreate->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndCheckCreateTopicMsg(pCreate) != 0) {
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  STopicObj *pTopic = mndAcquireTopic(pMnode, pCreate->name);
 | 
				
			||||||
 | 
					  if (pTopic != NULL) {
 | 
				
			||||||
 | 
					    sdbRelease(pMnode->pSdb, pTopic);
 | 
				
			||||||
 | 
					    if (pCreate->igExists) {
 | 
				
			||||||
 | 
					      mDebug("topic:%s, already exist, ignore exist is set", pCreate->name);
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      terrno = TSDB_CODE_MND_TOPIC_ALREADY_EXIST;
 | 
				
			||||||
 | 
					      mError("db:%s, failed to create since %s", pCreate->name, terrstr());
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // topic should have different name with stb
 | 
				
			||||||
 | 
					  SStbObj *pStb = mndAcquireStb(pMnode, pCreate->name);
 | 
				
			||||||
 | 
					  if (pStb != NULL) {
 | 
				
			||||||
 | 
					    sdbRelease(pMnode->pSdb, pStb);
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_NAME_CONFLICT_WITH_STB;
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SDbObj *pDb = mndAcquireDbByTopic(pMnode, pCreate->name);
 | 
				
			||||||
 | 
					  if (pDb == NULL) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_DB_NOT_SELECTED;
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int32_t code = mndCreateTopic(pMnode, pMsg, pCreate, pDb);
 | 
				
			||||||
 | 
					  mndReleaseDb(pMnode, pDb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (code != 0) {
 | 
				
			||||||
 | 
					    terrno = code;
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return TSDB_CODE_MND_ACTION_IN_PROGRESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndCheckAlterTopicMsg(SAlterTopicMsg *pAlter) {
 | 
				
			||||||
 | 
					  SSchema *pSchema = &pAlter->schema;
 | 
				
			||||||
 | 
					  pSchema->colId = htonl(pSchema->colId);
 | 
				
			||||||
 | 
					  pSchema->bytes = htonl(pSchema->bytes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (pSchema->type <= 0) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_INVALID_TOPIC_OPTION;
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (pSchema->colId < 0 || pSchema->colId >= (TSDB_MAX_COLUMNS + TSDB_MAX_TAGS)) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_INVALID_TOPIC_OPTION;
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (pSchema->bytes <= 0) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_INVALID_TOPIC_OPTION;
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (pSchema->name[0] == 0) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_INVALID_TOPIC_OPTION;
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndUpdateTopic(SMnode *pMnode, SMnodeMsg *pMsg, STopicObj *pOldTopic, STopicObj *pNewTopic) { return 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndProcessAlterTopicMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
 | 
					  SMnode         *pMnode = pMsg->pMnode;
 | 
				
			||||||
 | 
					  SAlterTopicMsg *pAlter = pMsg->rpcMsg.pCont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mDebug("topic:%s, start to alter", pAlter->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndCheckAlterTopicMsg(pAlter) != 0) {
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to alter since %s", pAlter->name, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  STopicObj *pTopic = mndAcquireTopic(pMnode, pAlter->name);
 | 
				
			||||||
 | 
					  if (pTopic == NULL) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_TOPIC_NOT_EXIST;
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to alter since %s", pAlter->name, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  STopicObj topicObj = {0};
 | 
				
			||||||
 | 
					  memcpy(&topicObj, pTopic, sizeof(STopicObj));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int32_t code = mndUpdateTopic(pMnode, pMsg, pTopic, &topicObj);
 | 
				
			||||||
 | 
					  mndReleaseTopic(pMnode, pTopic);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (code != 0) {
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to alter since %s", pAlter->name, tstrerror(code));
 | 
				
			||||||
 | 
					    return code;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return TSDB_CODE_MND_ACTION_IN_PROGRESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndProcessAlterTopicInRsp(SMnodeMsg *pMsg) {
 | 
				
			||||||
 | 
					  mndTransHandleActionRsp(pMsg);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetDropTopicRedoLogs(SMnode *pMnode, STrans *pTrans, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  SSdbRaw *pRedoRaw = mndTopicActionEncode(pTopic);
 | 
				
			||||||
 | 
					  if (pRedoRaw == NULL) return -1;
 | 
				
			||||||
 | 
					  if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) return -1;
 | 
				
			||||||
 | 
					  if (sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING) != 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetDropTopicUndoLogs(SMnode *pMnode, STrans *pTrans, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  SSdbRaw *pUndoRaw = mndTopicActionEncode(pTopic);
 | 
				
			||||||
 | 
					  if (pUndoRaw == NULL) return -1;
 | 
				
			||||||
 | 
					  if (mndTransAppendUndolog(pTrans, pUndoRaw) != 0) return -1;
 | 
				
			||||||
 | 
					  if (sdbSetRawStatus(pUndoRaw, SDB_STATUS_READY) != 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetDropTopicCommitLogs(SMnode *pMnode, STrans *pTrans, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  SSdbRaw *pCommitRaw = mndTopicActionEncode(pTopic);
 | 
				
			||||||
 | 
					  if (pCommitRaw == NULL) return -1;
 | 
				
			||||||
 | 
					  if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
 | 
				
			||||||
 | 
					  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED) != 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetDropTopicRedoActions(SMnode *pMnode, STrans *pTrans, STopicObj *pTopic) { return 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndSetDropTopicUndoActions(SMnode *pMnode, STrans *pTrans, STopicObj *pTopic) { return 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndDropTopic(SMnode *pMnode, SMnodeMsg *pMsg, STopicObj *pTopic) {
 | 
				
			||||||
 | 
					  int32_t code = -1;
 | 
				
			||||||
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to drop since %s", pTopic->name, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  mDebug("trans:%d, used to drop topic:%s", pTrans->id, pTopic->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndSetDropTopicRedoLogs(pMnode, pTrans, pTopic) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to set redo log since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    goto DROP_TOPIC_OVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndSetDropTopicUndoLogs(pMnode, pTrans, pTopic) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to set undo log since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    goto DROP_TOPIC_OVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndSetDropTopicCommitLogs(pMnode, pTrans, pTopic) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to set commit log since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    goto DROP_TOPIC_OVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndSetDropTopicRedoActions(pMnode, pTrans, pTopic) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to set redo actions since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    goto DROP_TOPIC_OVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndSetDropTopicUndoActions(pMnode, pTrans, pTopic) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to set redo actions since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    goto DROP_TOPIC_OVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndTransPrepare(pMnode, pTrans) != 0) {
 | 
				
			||||||
 | 
					    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
 | 
				
			||||||
 | 
					    goto DROP_TOPIC_OVER;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  code = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP_TOPIC_OVER:
 | 
				
			||||||
 | 
					  mndTransDrop(pTrans);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndProcessDropTopicMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
 | 
					  SMnode        *pMnode = pMsg->pMnode;
 | 
				
			||||||
 | 
					  SDropTopicMsg *pDrop = pMsg->rpcMsg.pCont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mDebug("topic:%s, start to drop", pDrop->name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  STopicObj *pTopic = mndAcquireTopic(pMnode, pDrop->name);
 | 
				
			||||||
 | 
					  if (pTopic == NULL) {
 | 
				
			||||||
 | 
					    if (pDrop->igNotExists) {
 | 
				
			||||||
 | 
					      mDebug("topic:%s, not exist, ignore not exist is set", pDrop->name);
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      terrno = TSDB_CODE_MND_TOPIC_NOT_EXIST;
 | 
				
			||||||
 | 
					      mError("topic:%s, failed to drop since %s", pDrop->name, terrstr());
 | 
				
			||||||
 | 
					      return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int32_t code = mndDropTopic(pMnode, pMsg, pTopic);
 | 
				
			||||||
 | 
					  mndReleaseTopic(pMnode, pTopic);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (code != 0) {
 | 
				
			||||||
 | 
					    terrno = code;
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to drop since %s", pDrop->name, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return TSDB_CODE_MND_ACTION_IN_PROGRESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndProcessDropTopicInRsp(SMnodeMsg *pMsg) {
 | 
				
			||||||
 | 
					  mndTransHandleActionRsp(pMsg);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndProcessTopicMetaMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
 | 
					  SMnode        *pMnode = pMsg->pMnode;
 | 
				
			||||||
 | 
					  STableInfoMsg *pInfo = pMsg->rpcMsg.pCont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mDebug("topic:%s, start to retrieve meta", pInfo->tableFname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					  SDbObj *pDb = mndAcquireDbByTopic(pMnode, pInfo->tableFname);
 | 
				
			||||||
 | 
					  if (pDb == NULL) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_DB_NOT_SELECTED;
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to retrieve meta since %s", pInfo->tableFname, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  STopicObj *pTopic = mndAcquireTopic(pMnode, pInfo->tableFname);
 | 
				
			||||||
 | 
					  if (pTopic == NULL) {
 | 
				
			||||||
 | 
					    mndReleaseDb(pMnode, pDb);
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_INVALID_TOPIC;
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to get meta since %s", pInfo->tableFname, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  taosRLockLatch(&pTopic->lock);
 | 
				
			||||||
 | 
					  int32_t totalCols = pTopic->numOfColumns + pTopic->numOfTags;
 | 
				
			||||||
 | 
					  int32_t contLen = sizeof(STableMetaMsg) + totalCols * sizeof(SSchema);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  STableMetaMsg *pMeta = rpcMallocCont(contLen);
 | 
				
			||||||
 | 
					  if (pMeta == NULL) {
 | 
				
			||||||
 | 
					    taosRUnLockLatch(&pTopic->lock);
 | 
				
			||||||
 | 
					    mndReleaseDb(pMnode, pDb);
 | 
				
			||||||
 | 
					    mndReleaseTopic(pMnode, pTopic);
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
				
			||||||
 | 
					    mError("topic:%s, failed to get meta since %s", pInfo->tableFname, terrstr());
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  memcpy(pMeta->topicFname, pTopic->name, TSDB_TABLE_FNAME_LEN);
 | 
				
			||||||
 | 
					  pMeta->numOfTags = htonl(pTopic->numOfTags);
 | 
				
			||||||
 | 
					  pMeta->numOfColumns = htonl(pTopic->numOfColumns);
 | 
				
			||||||
 | 
					  pMeta->precision = pDb->cfg.precision;
 | 
				
			||||||
 | 
					  pMeta->tableType = TSDB_SUPER_TABLE;
 | 
				
			||||||
 | 
					  pMeta->update = pDb->cfg.update;
 | 
				
			||||||
 | 
					  pMeta->sversion = htonl(pTopic->version);
 | 
				
			||||||
 | 
					  pMeta->tuid = htonl(pTopic->uid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (int32_t i = 0; i < totalCols; ++i) {
 | 
				
			||||||
 | 
					    SSchema *pSchema = &pMeta->pSchema[i];
 | 
				
			||||||
 | 
					    SSchema *pSrcSchema = &pTopic->pSchema[i];
 | 
				
			||||||
 | 
					    memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
 | 
				
			||||||
 | 
					    pSchema->type = pSrcSchema->type;
 | 
				
			||||||
 | 
					    pSchema->colId = htonl(pSrcSchema->colId);
 | 
				
			||||||
 | 
					    pSchema->bytes = htonl(pSrcSchema->bytes);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  taosRUnLockLatch(&pTopic->lock);
 | 
				
			||||||
 | 
					  mndReleaseDb(pMnode, pDb);
 | 
				
			||||||
 | 
					  mndReleaseTopic(pMnode, pTopic);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pMsg->pCont = pMeta;
 | 
				
			||||||
 | 
					  pMsg->contLen = contLen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mDebug("topic:%s, meta is retrieved, cols:%d tags:%d", pInfo->tableFname, pTopic->numOfColumns, pTopic->numOfTags);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndProcessCreateTopicInRsp(SMnodeMsg *pMsg) {
 | 
				
			||||||
 | 
					  mndTransHandleActionRsp(pMsg);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndGetNumOfTopics(SMnode *pMnode, char *dbName, int32_t *pNumOfTopics) {
 | 
				
			||||||
 | 
					  SSdb *pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SDbObj *pDb = mndAcquireDb(pMnode, dbName);
 | 
				
			||||||
 | 
					  if (pDb == NULL) {
 | 
				
			||||||
 | 
					    terrno = TSDB_CODE_MND_DB_NOT_SELECTED;
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int32_t numOfTopics = 0;
 | 
				
			||||||
 | 
					  void   *pIter = NULL;
 | 
				
			||||||
 | 
					  while (1) {
 | 
				
			||||||
 | 
					    STopicObj *pTopic = NULL;
 | 
				
			||||||
 | 
					    pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
 | 
				
			||||||
 | 
					    if (pIter == NULL) break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (strcmp(pTopic->db, dbName) == 0) {
 | 
				
			||||||
 | 
					      numOfTopics++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sdbRelease(pSdb, pTopic);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  *pNumOfTopics = numOfTopics;
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndGetTopicMeta(SMnodeMsg *pMsg, SShowObj *pShow, STableMetaMsg *pMeta) {
 | 
				
			||||||
 | 
					  SMnode *pMnode = pMsg->pMnode;
 | 
				
			||||||
 | 
					  SSdb   *pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mndGetNumOfTopics(pMnode, pShow->db, &pShow->numOfRows) != 0) {
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int32_t  cols = 0;
 | 
				
			||||||
 | 
					  SSchema *pSchema = pMeta->pSchema;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pShow->bytes[cols] = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE;
 | 
				
			||||||
 | 
					  pSchema[cols].type = TSDB_DATA_TYPE_BINARY;
 | 
				
			||||||
 | 
					  strcpy(pSchema[cols].name, "name");
 | 
				
			||||||
 | 
					  pSchema[cols].bytes = htonl(pShow->bytes[cols]);
 | 
				
			||||||
 | 
					  cols++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pShow->bytes[cols] = 8;
 | 
				
			||||||
 | 
					  pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP;
 | 
				
			||||||
 | 
					  strcpy(pSchema[cols].name, "create_time");
 | 
				
			||||||
 | 
					  pSchema[cols].bytes = htonl(pShow->bytes[cols]);
 | 
				
			||||||
 | 
					  cols++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pShow->bytes[cols] = 4;
 | 
				
			||||||
 | 
					  pSchema[cols].type = TSDB_DATA_TYPE_INT;
 | 
				
			||||||
 | 
					  strcpy(pSchema[cols].name, "columns");
 | 
				
			||||||
 | 
					  pSchema[cols].bytes = htonl(pShow->bytes[cols]);
 | 
				
			||||||
 | 
					  cols++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pShow->bytes[cols] = 4;
 | 
				
			||||||
 | 
					  pSchema[cols].type = TSDB_DATA_TYPE_INT;
 | 
				
			||||||
 | 
					  strcpy(pSchema[cols].name, "tags");
 | 
				
			||||||
 | 
					  pSchema[cols].bytes = htonl(pShow->bytes[cols]);
 | 
				
			||||||
 | 
					  cols++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pMeta->numOfColumns = htonl(cols);
 | 
				
			||||||
 | 
					  pShow->numOfColumns = cols;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pShow->offset[0] = 0;
 | 
				
			||||||
 | 
					  for (int32_t i = 1; i < cols; ++i) {
 | 
				
			||||||
 | 
					    pShow->offset[i] = pShow->offset[i - 1] + pShow->bytes[i - 1];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pShow->numOfRows = sdbGetSize(pSdb, SDB_TOPIC);
 | 
				
			||||||
 | 
					  pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1];
 | 
				
			||||||
 | 
					  strcpy(pMeta->tbFname, mndShowStr(pShow->type));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void mndExtractTableName(char *tableId, char *name) {
 | 
				
			||||||
 | 
					  int32_t pos = -1;
 | 
				
			||||||
 | 
					  int32_t num = 0;
 | 
				
			||||||
 | 
					  for (pos = 0; tableId[pos] != 0; ++pos) {
 | 
				
			||||||
 | 
					    if (tableId[pos] == '.') num++;
 | 
				
			||||||
 | 
					    if (num == 2) break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (num == 2) {
 | 
				
			||||||
 | 
					    strcpy(name, tableId + pos + 1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndRetrieveTopic(SMnodeMsg *pMsg, SShowObj *pShow, char *data, int32_t rows) {
 | 
				
			||||||
 | 
					  SMnode    *pMnode = pMsg->pMnode;
 | 
				
			||||||
 | 
					  SSdb      *pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					  int32_t    numOfRows = 0;
 | 
				
			||||||
 | 
					  STopicObj *pTopic = NULL;
 | 
				
			||||||
 | 
					  int32_t    cols = 0;
 | 
				
			||||||
 | 
					  char      *pWrite;
 | 
				
			||||||
 | 
					  char       prefix[64] = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tstrncpy(prefix, pShow->db, 64);
 | 
				
			||||||
 | 
					  strcat(prefix, TS_PATH_DELIMITER);
 | 
				
			||||||
 | 
					  int32_t prefixLen = (int32_t)strlen(prefix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (numOfRows < rows) {
 | 
				
			||||||
 | 
					    pShow->pIter = sdbFetch(pSdb, SDB_TOPIC, pShow->pIter, (void **)&pTopic);
 | 
				
			||||||
 | 
					    if (pShow->pIter == NULL) break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (strncmp(pTopic->name, prefix, prefixLen) != 0) {
 | 
				
			||||||
 | 
					      sdbRelease(pSdb, pTopic);
 | 
				
			||||||
 | 
					      continue;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cols = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    char topicName[TSDB_TABLE_NAME_LEN] = {0};
 | 
				
			||||||
 | 
					    tstrncpy(topicName, pTopic->name + prefixLen, TSDB_TABLE_NAME_LEN);
 | 
				
			||||||
 | 
					    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
 | 
				
			||||||
 | 
					    STR_TO_VARSTR(pWrite, topicName);
 | 
				
			||||||
 | 
					    cols++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
 | 
				
			||||||
 | 
					    *(int64_t *)pWrite = pTopic->createTime;
 | 
				
			||||||
 | 
					    cols++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;*/
 | 
				
			||||||
 | 
					    /**(int32_t *)pWrite = pTopic->numOfColumns;*/
 | 
				
			||||||
 | 
					    /*cols++;*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;*/
 | 
				
			||||||
 | 
					    /**(int32_t *)pWrite = pTopic->numOfTags;*/
 | 
				
			||||||
 | 
					    /*cols++;*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    numOfRows++;
 | 
				
			||||||
 | 
					    sdbRelease(pSdb, pTopic);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pShow->numOfReads += numOfRows;
 | 
				
			||||||
 | 
					  mndVacuumResult(data, pShow->numOfColumns, numOfRows, rows, pShow);
 | 
				
			||||||
 | 
					  return numOfRows;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void mndCancelGetNextTopic(SMnode *pMnode, void *pIter) {
 | 
				
			||||||
 | 
					  SSdb *pSdb = pMnode->pSdb;
 | 
				
			||||||
 | 
					  sdbCancelFetch(pSdb, pIter);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -17,9 +17,9 @@
 | 
				
			||||||
#include "mndTrans.h"
 | 
					#include "mndTrans.h"
 | 
				
			||||||
#include "mndSync.h"
 | 
					#include "mndSync.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSDB_TRANS_VER_NUMBER 1
 | 
					#define MND_TRANS_VER_NUMBER 1
 | 
				
			||||||
#define TSDB_TRN_ARRAY_SIZE 8
 | 
					#define MND_TRANS_ARRAY_SIZE 8
 | 
				
			||||||
#define TSDB_TRN_RESERVE_SIZE 64
 | 
					#define MND_TRANS_RESERVE_SIZE 64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static SSdbRaw *mndTransActionEncode(STrans *pTrans);
 | 
					static SSdbRaw *mndTransActionEncode(STrans *pTrans);
 | 
				
			||||||
static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw);
 | 
					static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw);
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,6 @@ static int32_t  mndTransActionInsert(SSdb *pSdb, STrans *pTrans);
 | 
				
			||||||
static int32_t  mndTransActionUpdate(SSdb *pSdb, STrans *OldTrans, STrans *pOldTrans);
 | 
					static int32_t  mndTransActionUpdate(SSdb *pSdb, STrans *OldTrans, STrans *pOldTrans);
 | 
				
			||||||
static int32_t  mndTransActionDelete(SSdb *pSdb, STrans *pTrans);
 | 
					static int32_t  mndTransActionDelete(SSdb *pSdb, STrans *pTrans);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void    mndTransSetRpcHandle(STrans *pTrans, void *rpcHandle);
 | 
					 | 
				
			||||||
static void    mndTransSendRpcRsp(STrans *pTrans, int32_t code);
 | 
					static void    mndTransSendRpcRsp(STrans *pTrans, int32_t code);
 | 
				
			||||||
static int32_t mndTransAppendLog(SArray *pArray, SSdbRaw *pRaw);
 | 
					static int32_t mndTransAppendLog(SArray *pArray, SSdbRaw *pRaw);
 | 
				
			||||||
static int32_t mndTransAppendAction(SArray *pArray, STransAction *pAction);
 | 
					static int32_t mndTransAppendAction(SArray *pArray, STransAction *pAction);
 | 
				
			||||||
| 
						 | 
					@ -40,7 +39,7 @@ static int32_t mndTransExecuteUndoLogs(SMnode *pMnode, STrans *pTrans);
 | 
				
			||||||
static int32_t mndTransExecuteCommitLogs(SMnode *pMnode, STrans *pTrans);
 | 
					static int32_t mndTransExecuteCommitLogs(SMnode *pMnode, STrans *pTrans);
 | 
				
			||||||
static int32_t mndTransExecuteRedoActions(SMnode *pMnode, STrans *pTrans);
 | 
					static int32_t mndTransExecuteRedoActions(SMnode *pMnode, STrans *pTrans);
 | 
				
			||||||
static int32_t mndTransExecuteUndoActions(SMnode *pMnode, STrans *pTrans);
 | 
					static int32_t mndTransExecuteUndoActions(SMnode *pMnode, STrans *pTrans);
 | 
				
			||||||
static int32_t mndTransPerformPrepareStage(SMnode *pMnode, STrans *pTrans);
 | 
					static void    mndTransPerformPrepareStage(SMnode *pMnode, STrans *pTrans);
 | 
				
			||||||
static int32_t mndTransPerformExecuteStage(SMnode *pMnode, STrans *pTrans);
 | 
					static int32_t mndTransPerformExecuteStage(SMnode *pMnode, STrans *pTrans);
 | 
				
			||||||
static int32_t mndTransPerformCommitStage(SMnode *pMnode, STrans *pTrans);
 | 
					static int32_t mndTransPerformCommitStage(SMnode *pMnode, STrans *pTrans);
 | 
				
			||||||
static int32_t mndTransPerformRollbackStage(SMnode *pMnode, STrans *pTrans);
 | 
					static int32_t mndTransPerformRollbackStage(SMnode *pMnode, STrans *pTrans);
 | 
				
			||||||
| 
						 | 
					@ -61,7 +60,7 @@ int32_t mndInitTrans(SMnode *pMnode) {
 | 
				
			||||||
void mndCleanupTrans(SMnode *pMnode) {}
 | 
					void mndCleanupTrans(SMnode *pMnode) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static SSdbRaw *mndTransActionEncode(STrans *pTrans) {
 | 
					static SSdbRaw *mndTransActionEncode(STrans *pTrans) {
 | 
				
			||||||
  int32_t rawDataLen = sizeof(STrans) + TSDB_TRN_RESERVE_SIZE;
 | 
					  int32_t rawDataLen = sizeof(STrans) + MND_TRANS_RESERVE_SIZE;
 | 
				
			||||||
  int32_t redoLogNum = taosArrayGetSize(pTrans->redoLogs);
 | 
					  int32_t redoLogNum = taosArrayGetSize(pTrans->redoLogs);
 | 
				
			||||||
  int32_t undoLogNum = taosArrayGetSize(pTrans->undoLogs);
 | 
					  int32_t undoLogNum = taosArrayGetSize(pTrans->undoLogs);
 | 
				
			||||||
  int32_t commitLogNum = taosArrayGetSize(pTrans->commitLogs);
 | 
					  int32_t commitLogNum = taosArrayGetSize(pTrans->commitLogs);
 | 
				
			||||||
| 
						 | 
					@ -93,7 +92,7 @@ static SSdbRaw *mndTransActionEncode(STrans *pTrans) {
 | 
				
			||||||
    rawDataLen += (sizeof(STransAction) + pAction->contLen);
 | 
					    rawDataLen += (sizeof(STransAction) + pAction->contLen);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SSdbRaw *pRaw = sdbAllocRaw(SDB_TRANS, TSDB_TRANS_VER_NUMBER, rawDataLen);
 | 
					  SSdbRaw *pRaw = sdbAllocRaw(SDB_TRANS, MND_TRANS_VER_NUMBER, rawDataLen);
 | 
				
			||||||
  if (pRaw == NULL) {
 | 
					  if (pRaw == NULL) {
 | 
				
			||||||
    mError("trans:%d, failed to alloc raw since %s", pTrans->id, terrstr());
 | 
					    mError("trans:%d, failed to alloc raw since %s", pTrans->id, terrstr());
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
| 
						 | 
					@ -132,7 +131,7 @@ static SSdbRaw *mndTransActionEncode(STrans *pTrans) {
 | 
				
			||||||
  for (int32_t i = 0; i < redoActionNum; ++i) {
 | 
					  for (int32_t i = 0; i < redoActionNum; ++i) {
 | 
				
			||||||
    STransAction *pAction = taosArrayGet(pTrans->redoActions, i);
 | 
					    STransAction *pAction = taosArrayGet(pTrans->redoActions, i);
 | 
				
			||||||
    SDB_SET_BINARY(pRaw, dataPos, (void *)&pAction->epSet, sizeof(SEpSet));
 | 
					    SDB_SET_BINARY(pRaw, dataPos, (void *)&pAction->epSet, sizeof(SEpSet));
 | 
				
			||||||
    SDB_SET_INT8(pRaw, dataPos, pAction->msgType)
 | 
					    SDB_SET_INT16(pRaw, dataPos, pAction->msgType)
 | 
				
			||||||
    SDB_SET_INT32(pRaw, dataPos, pAction->contLen)
 | 
					    SDB_SET_INT32(pRaw, dataPos, pAction->contLen)
 | 
				
			||||||
    SDB_SET_BINARY(pRaw, dataPos, pAction->pCont, pAction->contLen);
 | 
					    SDB_SET_BINARY(pRaw, dataPos, pAction->pCont, pAction->contLen);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -140,12 +139,12 @@ static SSdbRaw *mndTransActionEncode(STrans *pTrans) {
 | 
				
			||||||
  for (int32_t i = 0; i < undoActionNum; ++i) {
 | 
					  for (int32_t i = 0; i < undoActionNum; ++i) {
 | 
				
			||||||
    STransAction *pAction = taosArrayGet(pTrans->undoActions, i);
 | 
					    STransAction *pAction = taosArrayGet(pTrans->undoActions, i);
 | 
				
			||||||
    SDB_SET_BINARY(pRaw, dataPos, (void *)&pAction->epSet, sizeof(SEpSet));
 | 
					    SDB_SET_BINARY(pRaw, dataPos, (void *)&pAction->epSet, sizeof(SEpSet));
 | 
				
			||||||
    SDB_SET_INT8(pRaw, dataPos, pAction->msgType)
 | 
					    SDB_SET_INT16(pRaw, dataPos, pAction->msgType)
 | 
				
			||||||
    SDB_SET_INT32(pRaw, dataPos, pAction->contLen)
 | 
					    SDB_SET_INT32(pRaw, dataPos, pAction->contLen)
 | 
				
			||||||
    SDB_SET_BINARY(pRaw, dataPos, (void *)pAction->pCont, pAction->contLen);
 | 
					    SDB_SET_BINARY(pRaw, dataPos, (void *)pAction->pCont, pAction->contLen);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SDB_SET_RESERVE(pRaw, dataPos, TSDB_TRN_RESERVE_SIZE)
 | 
					  SDB_SET_RESERVE(pRaw, dataPos, MND_TRANS_RESERVE_SIZE)
 | 
				
			||||||
  SDB_SET_DATALEN(pRaw, dataPos);
 | 
					  SDB_SET_DATALEN(pRaw, dataPos);
 | 
				
			||||||
  mTrace("trans:%d, encode to raw:%p, len:%d", pTrans->id, pRaw, dataPos);
 | 
					  mTrace("trans:%d, encode to raw:%p, len:%d", pTrans->id, pRaw, dataPos);
 | 
				
			||||||
  return pRaw;
 | 
					  return pRaw;
 | 
				
			||||||
| 
						 | 
					@ -155,12 +154,9 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) {
 | 
				
			||||||
  int32_t code = 0;
 | 
					  int32_t code = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int8_t sver = 0;
 | 
					  int8_t sver = 0;
 | 
				
			||||||
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) {
 | 
					  if (sdbGetRawSoftVer(pRaw, &sver) != 0) return NULL;
 | 
				
			||||||
    mError("failed to get soft ver from raw:%p since %s", pRaw, terrstr());
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (sver != TSDB_TRANS_VER_NUMBER) {
 | 
					  if (sver != MND_TRANS_VER_NUMBER) {
 | 
				
			||||||
    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
 | 
					    terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
 | 
				
			||||||
    mError("failed to get check soft ver from raw:%p since %s", pRaw, terrstr());
 | 
					    mError("failed to get check soft ver from raw:%p since %s", pRaw, terrstr());
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
| 
						 | 
					@ -173,11 +169,11 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) {
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pTrans->redoLogs = taosArrayInit(TSDB_TRN_ARRAY_SIZE, sizeof(void *));
 | 
					  pTrans->redoLogs = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(void *));
 | 
				
			||||||
  pTrans->undoLogs = taosArrayInit(TSDB_TRN_ARRAY_SIZE, sizeof(void *));
 | 
					  pTrans->undoLogs = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(void *));
 | 
				
			||||||
  pTrans->commitLogs = taosArrayInit(TSDB_TRN_ARRAY_SIZE, sizeof(void *));
 | 
					  pTrans->commitLogs = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(void *));
 | 
				
			||||||
  pTrans->redoActions = taosArrayInit(TSDB_TRN_ARRAY_SIZE, sizeof(STransAction));
 | 
					  pTrans->redoActions = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(STransAction));
 | 
				
			||||||
  pTrans->undoActions = taosArrayInit(TSDB_TRN_ARRAY_SIZE, sizeof(STransAction));
 | 
					  pTrans->undoActions = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(STransAction));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pTrans->redoLogs == NULL || pTrans->undoLogs == NULL || pTrans->commitLogs == NULL ||
 | 
					  if (pTrans->redoLogs == NULL || pTrans->undoLogs == NULL || pTrans->commitLogs == NULL ||
 | 
				
			||||||
      pTrans->redoActions == NULL || pTrans->undoActions == NULL) {
 | 
					      pTrans->redoActions == NULL || pTrans->undoActions == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -243,7 +239,7 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) {
 | 
				
			||||||
  for (int32_t i = 0; i < redoActionNum; ++i) {
 | 
					  for (int32_t i = 0; i < redoActionNum; ++i) {
 | 
				
			||||||
    STransAction action = {0};
 | 
					    STransAction action = {0};
 | 
				
			||||||
    SDB_GET_BINARY(pRaw, pRow, dataPos, (void *)&action.epSet, sizeof(SEpSet));
 | 
					    SDB_GET_BINARY(pRaw, pRow, dataPos, (void *)&action.epSet, sizeof(SEpSet));
 | 
				
			||||||
    SDB_GET_INT8(pRaw, pRow, dataPos, &action.msgType)
 | 
					    SDB_GET_INT16(pRaw, pRow, dataPos, &action.msgType)
 | 
				
			||||||
    SDB_GET_INT32(pRaw, pRow, dataPos, &action.contLen)
 | 
					    SDB_GET_INT32(pRaw, pRow, dataPos, &action.contLen)
 | 
				
			||||||
    action.pCont = malloc(action.contLen);
 | 
					    action.pCont = malloc(action.contLen);
 | 
				
			||||||
    if (action.pCont == NULL) {
 | 
					    if (action.pCont == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -262,7 +258,7 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) {
 | 
				
			||||||
  for (int32_t i = 0; i < undoActionNum; ++i) {
 | 
					  for (int32_t i = 0; i < undoActionNum; ++i) {
 | 
				
			||||||
    STransAction action = {0};
 | 
					    STransAction action = {0};
 | 
				
			||||||
    SDB_GET_BINARY(pRaw, pRow, dataPos, (void *)&action.epSet, sizeof(SEpSet));
 | 
					    SDB_GET_BINARY(pRaw, pRow, dataPos, (void *)&action.epSet, sizeof(SEpSet));
 | 
				
			||||||
    SDB_GET_INT8(pRaw, pRow, dataPos, &action.msgType)
 | 
					    SDB_GET_INT16(pRaw, pRow, dataPos, &action.msgType)
 | 
				
			||||||
    SDB_GET_INT32(pRaw, pRow, dataPos, &action.contLen)
 | 
					    SDB_GET_INT32(pRaw, pRow, dataPos, &action.contLen)
 | 
				
			||||||
    action.pCont = malloc(action.contLen);
 | 
					    action.pCont = malloc(action.contLen);
 | 
				
			||||||
    if (action.pCont == NULL) {
 | 
					    if (action.pCont == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -278,7 +274,7 @@ static SSdbRow *mndTransActionDecode(SSdbRaw *pRaw) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SDB_GET_RESERVE(pRaw, pRow, dataPos, TSDB_TRN_RESERVE_SIZE)
 | 
					  SDB_GET_RESERVE(pRaw, pRow, dataPos, MND_TRANS_RESERVE_SIZE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TRANS_DECODE_OVER:
 | 
					TRANS_DECODE_OVER:
 | 
				
			||||||
  if (code != 0) {
 | 
					  if (code != 0) {
 | 
				
			||||||
| 
						 | 
					@ -358,7 +354,7 @@ char *mndTransPolicyStr(ETrnPolicy policy) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, void *rpcHandle) {
 | 
					STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, SRpcMsg *pMsg) {
 | 
				
			||||||
  STrans *pTrans = calloc(1, sizeof(STrans));
 | 
					  STrans *pTrans = calloc(1, sizeof(STrans));
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
					    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
				
			||||||
| 
						 | 
					@ -369,12 +365,13 @@ STrans *mndTransCreate(SMnode *pMnode, ETrnPolicy policy, void *rpcHandle) {
 | 
				
			||||||
  pTrans->id = sdbGetMaxId(pMnode->pSdb, SDB_TRANS);
 | 
					  pTrans->id = sdbGetMaxId(pMnode->pSdb, SDB_TRANS);
 | 
				
			||||||
  pTrans->stage = TRN_STAGE_PREPARE;
 | 
					  pTrans->stage = TRN_STAGE_PREPARE;
 | 
				
			||||||
  pTrans->policy = policy;
 | 
					  pTrans->policy = policy;
 | 
				
			||||||
  pTrans->rpcHandle = rpcHandle;
 | 
					  pTrans->rpcHandle = pMsg->handle;
 | 
				
			||||||
  pTrans->redoLogs = taosArrayInit(TSDB_TRN_ARRAY_SIZE, sizeof(void *));
 | 
					  pTrans->rpcAHandle = pMsg->ahandle;
 | 
				
			||||||
  pTrans->undoLogs = taosArrayInit(TSDB_TRN_ARRAY_SIZE, sizeof(void *));
 | 
					  pTrans->redoLogs = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(void *));
 | 
				
			||||||
  pTrans->commitLogs = taosArrayInit(TSDB_TRN_ARRAY_SIZE, sizeof(void *));
 | 
					  pTrans->undoLogs = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(void *));
 | 
				
			||||||
  pTrans->redoActions = taosArrayInit(TSDB_TRN_ARRAY_SIZE, sizeof(STransAction));
 | 
					  pTrans->commitLogs = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(void *));
 | 
				
			||||||
  pTrans->undoActions = taosArrayInit(TSDB_TRN_ARRAY_SIZE, sizeof(STransAction));
 | 
					  pTrans->redoActions = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(STransAction));
 | 
				
			||||||
 | 
					  pTrans->undoActions = taosArrayInit(MND_TRANS_ARRAY_SIZE, sizeof(STransAction));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pTrans->redoLogs == NULL || pTrans->undoLogs == NULL || pTrans->commitLogs == NULL ||
 | 
					  if (pTrans->redoLogs == NULL || pTrans->undoLogs == NULL || pTrans->commitLogs == NULL ||
 | 
				
			||||||
      pTrans->redoActions == NULL || pTrans->undoActions == NULL) {
 | 
					      pTrans->redoActions == NULL || pTrans->undoActions == NULL) {
 | 
				
			||||||
| 
						 | 
					@ -416,11 +413,6 @@ void mndTransDrop(STrans *pTrans) {
 | 
				
			||||||
  tfree(pTrans);
 | 
					  tfree(pTrans);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void mndTransSetRpcHandle(STrans *pTrans, void *rpcHandle) {
 | 
					 | 
				
			||||||
  pTrans->rpcHandle = rpcHandle;
 | 
					 | 
				
			||||||
  mTrace("trans:%d, set rpc handle:%p", pTrans->id, rpcHandle);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int32_t mndTransAppendLog(SArray *pArray, SSdbRaw *pRaw) {
 | 
					static int32_t mndTransAppendLog(SArray *pArray, SSdbRaw *pRaw) {
 | 
				
			||||||
  if (pArray == NULL || pRaw == NULL) {
 | 
					  if (pArray == NULL || pRaw == NULL) {
 | 
				
			||||||
    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
					    terrno = TSDB_CODE_OUT_OF_MEMORY;
 | 
				
			||||||
| 
						 | 
					@ -466,13 +458,13 @@ static int32_t mndTransAppendAction(SArray *pArray, STransAction *pAction) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32_t mndTransAppendRedoAction(STrans *pTrans, STransAction *pAction) {
 | 
					int32_t mndTransAppendRedoAction(STrans *pTrans, STransAction *pAction) {
 | 
				
			||||||
  int32_t code = mndTransAppendAction(pTrans->redoActions, pAction);
 | 
					  int32_t code = mndTransAppendAction(pTrans->redoActions, pAction);
 | 
				
			||||||
  mTrace("trans:%d, msg:%s append to redo actions, code:0x%x", pTrans->id, taosMsg[pAction->msgType], code);
 | 
					  mTrace("trans:%d, msg:%s append to redo actions, code:0x%x", pTrans->id, TMSG_INFO(pAction->msgType), code);
 | 
				
			||||||
  return code;
 | 
					  return code;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int32_t mndTransAppendUndoAction(STrans *pTrans, STransAction *pAction) {
 | 
					int32_t mndTransAppendUndoAction(STrans *pTrans, STransAction *pAction) {
 | 
				
			||||||
  int32_t code = mndTransAppendAction(pTrans->undoActions, pAction);
 | 
					  int32_t code = mndTransAppendAction(pTrans->undoActions, pAction);
 | 
				
			||||||
  mTrace("trans:%d, msg:%s append to undo actions, code:0x%x", pTrans->id, taosMsg[pAction->msgType], code);
 | 
					  mTrace("trans:%d, msg:%s append to undo actions, code:0x%x", pTrans->id, TMSG_INFO(pAction->msgType), code);
 | 
				
			||||||
  return code;
 | 
					  return code;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -504,11 +496,12 @@ int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  STrans *pNewTrans = mndAcquireTrans(pMnode, pTrans->id);
 | 
					  STrans *pNewTrans = mndAcquireTrans(pMnode, pTrans->id);
 | 
				
			||||||
  if (pNewTrans == NULL) {
 | 
					  if (pNewTrans == NULL) {
 | 
				
			||||||
    mError("trans:%d, failed to ready from sdb since %s", pTrans->id, terrstr());
 | 
					    mError("trans:%d, failed to read from sdb since %s", pTrans->id, terrstr());
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pNewTrans->rpcHandle = pTrans->rpcHandle;
 | 
					  pNewTrans->rpcHandle = pTrans->rpcHandle;
 | 
				
			||||||
 | 
					  pNewTrans->rpcAHandle = pTrans->rpcAHandle;
 | 
				
			||||||
  mndTransExecute(pMnode, pNewTrans);
 | 
					  mndTransExecute(pMnode, pNewTrans);
 | 
				
			||||||
  mndReleaseTrans(pMnode, pNewTrans);
 | 
					  mndReleaseTrans(pMnode, pNewTrans);
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
| 
						 | 
					@ -526,19 +519,17 @@ int32_t mndTransCommit(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (taosArrayGetSize(pTrans->commitLogs) != 0) {
 | 
					  if (taosArrayGetSize(pTrans->commitLogs) != 0) {
 | 
				
			||||||
    mTrace("trans:%d, sync to other nodes", pTrans->id);
 | 
					    mTrace("trans:%d, sync to other nodes", pTrans->id);
 | 
				
			||||||
    int32_t code = mndSyncPropose(pMnode, pRaw);
 | 
					    if (mndSyncPropose(pMnode, pRaw) != 0) {
 | 
				
			||||||
    if (code != 0) {
 | 
					 | 
				
			||||||
      mError("trans:%d, failed to sync since %s", pTrans->id, terrstr());
 | 
					      mError("trans:%d, failed to sync since %s", pTrans->id, terrstr());
 | 
				
			||||||
      sdbFreeRaw(pRaw);
 | 
					      sdbFreeRaw(pRaw);
 | 
				
			||||||
      return -1;
 | 
					      return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    mTrace("trans:%d, sync finished", pTrans->id);
 | 
					    mTrace("trans:%d, sync finished", pTrans->id);
 | 
				
			||||||
    code = sdbWrite(pMnode->pSdb, pRaw);
 | 
					  }
 | 
				
			||||||
    if (code != 0) {
 | 
					
 | 
				
			||||||
      mError("trans:%d, failed to write sdb since %s", pTrans->id, terrstr());
 | 
					  if (sdbWrite(pMnode->pSdb, pRaw) != 0) {
 | 
				
			||||||
      return -1;
 | 
					    mError("trans:%d, failed to write sdb since %s", pTrans->id, terrstr());
 | 
				
			||||||
    }
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mDebug("trans:%d, commit finished", pTrans->id);
 | 
					  mDebug("trans:%d, commit finished", pTrans->id);
 | 
				
			||||||
| 
						 | 
					@ -576,10 +567,11 @@ int32_t mndTransRollback(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void mndTransSendRpcRsp(STrans *pTrans, int32_t code) {
 | 
					static void mndTransSendRpcRsp(STrans *pTrans, int32_t code) {
 | 
				
			||||||
  if (code == TSDB_CODE_MND_ACTION_IN_PROGRESS) return;
 | 
					  if (code == TSDB_CODE_MND_ACTION_IN_PROGRESS) return;
 | 
				
			||||||
  mDebug("trans:%d, send rpc rsp, RPC:%p code:0x%x", pTrans->id, pTrans->rpcHandle, code & 0xFFFF);
 | 
					  mDebug("trans:%d, send rpc rsp, RPC:%p ahandle:%p code:0x%x", pTrans->id, pTrans->rpcHandle, pTrans->rpcAHandle,
 | 
				
			||||||
 | 
					         code & 0xFFFF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pTrans->rpcHandle != NULL) {
 | 
					  if (pTrans->rpcHandle != NULL) {
 | 
				
			||||||
    SRpcMsg rspMsg = {.handle = pTrans->rpcHandle, .code = code};
 | 
					    SRpcMsg rspMsg = {.handle = pTrans->rpcHandle, .code = code, .ahandle = pTrans->rpcAHandle};
 | 
				
			||||||
    rpcSendResponse(&rspMsg);
 | 
					    rpcSendResponse(&rspMsg);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -614,7 +606,7 @@ void mndTransHandleActionRsp(SMnodeMsg *pMsg) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int32_t actionNum = taosArrayGetSize(pTrans->redoActions);
 | 
					  int32_t actionNum = taosArrayGetSize(pTrans->redoActions);
 | 
				
			||||||
  if (action < 0 || action > actionNum) {
 | 
					  if (action < 0 || action >= actionNum) {
 | 
				
			||||||
    mError("trans:%d, invalid action:%d", transId, action);
 | 
					    mError("trans:%d, invalid action:%d", transId, action);
 | 
				
			||||||
    goto HANDLE_ACTION_RSP_OVER;
 | 
					    goto HANDLE_ACTION_RSP_OVER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -636,6 +628,8 @@ static int32_t mndTransExecuteLogs(SMnode *pMnode, SArray *pArray) {
 | 
				
			||||||
  SSdb   *pSdb = pMnode->pSdb;
 | 
					  SSdb   *pSdb = pMnode->pSdb;
 | 
				
			||||||
  int32_t arraySize = taosArrayGetSize(pArray);
 | 
					  int32_t arraySize = taosArrayGetSize(pArray);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (arraySize == 0) return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (int32_t i = 0; i < arraySize; ++i) {
 | 
					  for (int32_t i = 0; i < arraySize; ++i) {
 | 
				
			||||||
    SSdbRaw *pRaw = taosArrayGetP(pArray, i);
 | 
					    SSdbRaw *pRaw = taosArrayGetP(pArray, i);
 | 
				
			||||||
    int32_t  code = sdbWriteNotFree(pSdb, pRaw);
 | 
					    int32_t  code = sdbWriteNotFree(pSdb, pRaw);
 | 
				
			||||||
| 
						 | 
					@ -648,45 +642,15 @@ static int32_t mndTransExecuteLogs(SMnode *pMnode, SArray *pArray) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndTransExecuteRedoLogs(SMnode *pMnode, STrans *pTrans) {
 | 
					static int32_t mndTransExecuteRedoLogs(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
  int32_t code = 0;
 | 
					  return mndTransExecuteLogs(pMnode, pTrans->redoLogs);
 | 
				
			||||||
  if (taosArrayGetSize(pTrans->redoLogs) != 0) {
 | 
					 | 
				
			||||||
    code = mndTransExecuteLogs(pMnode, pTrans->redoLogs);
 | 
					 | 
				
			||||||
    if (code != 0) {
 | 
					 | 
				
			||||||
      mError("trans:%d, failed to execute redo logs since %s", pTrans->id, terrstr())
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      mDebug("trans:%d, execute redo logs finished", pTrans->id)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return code;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndTransExecuteUndoLogs(SMnode *pMnode, STrans *pTrans) {
 | 
					static int32_t mndTransExecuteUndoLogs(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
  int32_t code = 0;
 | 
					  return mndTransExecuteLogs(pMnode, pTrans->undoLogs);
 | 
				
			||||||
  if (taosArrayGetSize(pTrans->undoLogs) != 0) {
 | 
					 | 
				
			||||||
    code = mndTransExecuteLogs(pMnode, pTrans->undoLogs);
 | 
					 | 
				
			||||||
    if (code != 0) {
 | 
					 | 
				
			||||||
      mError("trans:%d, failed to execute undo logs since %s", pTrans->id, terrstr())
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      mDebug("trans:%d, execute undo logs finished", pTrans->id)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return code;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndTransExecuteCommitLogs(SMnode *pMnode, STrans *pTrans) {
 | 
					static int32_t mndTransExecuteCommitLogs(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
  int32_t code = 0;
 | 
					  return mndTransExecuteLogs(pMnode, pTrans->commitLogs);
 | 
				
			||||||
  if (taosArrayGetSize(pTrans->commitLogs) != 0) {
 | 
					 | 
				
			||||||
    code = mndTransExecuteLogs(pMnode, pTrans->commitLogs);
 | 
					 | 
				
			||||||
    if (code != 0) {
 | 
					 | 
				
			||||||
      mError("trans:%d, failed to execute commit logs since %s", pTrans->id, terrstr())
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      mDebug("trans:%d, execute commit logs finished", pTrans->id)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return code;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndTransExecuteActions(SMnode *pMnode, STrans *pTrans, SArray *pArray) {
 | 
					static int32_t mndTransExecuteActions(SMnode *pMnode, STrans *pTrans, SArray *pArray) {
 | 
				
			||||||
| 
						 | 
					@ -696,7 +660,9 @@ static int32_t mndTransExecuteActions(SMnode *pMnode, STrans *pTrans, SArray *pA
 | 
				
			||||||
  for (int32_t action = 0; action < numOfActions; ++action) {
 | 
					  for (int32_t action = 0; action < numOfActions; ++action) {
 | 
				
			||||||
    STransAction *pAction = taosArrayGet(pArray, action);
 | 
					    STransAction *pAction = taosArrayGet(pArray, action);
 | 
				
			||||||
    if (pAction == NULL) continue;
 | 
					    if (pAction == NULL) continue;
 | 
				
			||||||
    if (pAction->msgReceived && pAction->errCode == 0) continue;
 | 
					    // if (pAction->msgSent && !pAction->msgReceived) continue;
 | 
				
			||||||
 | 
					    // if (pAction->msgSent && pAction->msgReceived && pAction->errCode == 0) continue;
 | 
				
			||||||
 | 
					    if (pAction->msgSent) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int64_t signature = pTrans->id;
 | 
					    int64_t signature = pTrans->id;
 | 
				
			||||||
    signature = (signature << 32);
 | 
					    signature = (signature << 32);
 | 
				
			||||||
| 
						 | 
					@ -718,25 +684,25 @@ static int32_t mndTransExecuteActions(SMnode *pMnode, STrans *pTrans, SArray *pA
 | 
				
			||||||
    mndSendMsgToDnode(pMnode, &pAction->epSet, &rpcMsg);
 | 
					    mndSendMsgToDnode(pMnode, &pAction->epSet, &rpcMsg);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int32_t numOfReceivedMsgs = 0;
 | 
					  int32_t numOfReceived = 0;
 | 
				
			||||||
  int32_t errorCode = 0;
 | 
					  int32_t errCode = 0;
 | 
				
			||||||
  for (int32_t action = 0; action < numOfActions; ++action) {
 | 
					  for (int32_t action = 0; action < numOfActions; ++action) {
 | 
				
			||||||
    STransAction *pAction = taosArrayGet(pArray, action);
 | 
					    STransAction *pAction = taosArrayGet(pArray, action);
 | 
				
			||||||
    if (pAction == NULL) continue;
 | 
					    if (pAction == NULL) continue;
 | 
				
			||||||
    if (pAction->msgSent && pAction->msgReceived) {
 | 
					    if (pAction->msgSent && pAction->msgReceived) {
 | 
				
			||||||
      numOfReceivedMsgs++;
 | 
					      numOfReceived++;
 | 
				
			||||||
      if (pAction->errCode != 0) {
 | 
					      if (pAction->errCode != 0) {
 | 
				
			||||||
        errorCode = pAction->errCode;
 | 
					        errCode = pAction->errCode;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (numOfReceivedMsgs == numOfActions) {
 | 
					  if (numOfReceived == numOfActions) {
 | 
				
			||||||
    mDebug("trans:%d, all %d actions executed, code:0x%x", pTrans->id, numOfActions, errorCode);
 | 
					    mDebug("trans:%d, all %d actions executed, code:0x%x", pTrans->id, numOfActions, errCode);
 | 
				
			||||||
    terrno = errorCode;
 | 
					    terrno = errCode;
 | 
				
			||||||
    return errorCode;
 | 
					    return errCode;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    mDebug("trans:%d, %d of %d actions executed, code:0x%x", pTrans->id, numOfReceivedMsgs, numOfActions, errorCode);
 | 
					    mDebug("trans:%d, %d of %d actions executed, code:0x%x", pTrans->id, numOfReceived, numOfActions, errCode);
 | 
				
			||||||
    return TSDB_CODE_MND_ACTION_IN_PROGRESS;
 | 
					    return TSDB_CODE_MND_ACTION_IN_PROGRESS;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -749,7 +715,7 @@ static int32_t mndTransExecuteUndoActions(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
  return mndTransExecuteActions(pMnode, pTrans, pTrans->undoActions);
 | 
					  return mndTransExecuteActions(pMnode, pTrans, pTrans->undoActions);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndTransPerformPrepareStage(SMnode *pMnode, STrans *pTrans) {
 | 
					static void mndTransPerformPrepareStage(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
  int32_t code = mndTransExecuteRedoLogs(pMnode, pTrans);
 | 
					  int32_t code = mndTransExecuteRedoLogs(pMnode, pTrans);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (code == 0) {
 | 
					  if (code == 0) {
 | 
				
			||||||
| 
						 | 
					@ -759,8 +725,6 @@ static int32_t mndTransPerformPrepareStage(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
    pTrans->stage = TRN_STAGE_ROLLBACK;
 | 
					    pTrans->stage = TRN_STAGE_ROLLBACK;
 | 
				
			||||||
    mError("trans:%d, stage from prepare to rollback since %s", pTrans->id, terrstr());
 | 
					    mError("trans:%d, stage from prepare to rollback since %s", pTrans->id, terrstr());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return 0;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndTransPerformExecuteStage(SMnode *pMnode, STrans *pTrans) {
 | 
					static int32_t mndTransPerformExecuteStage(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
| 
						 | 
					@ -771,18 +735,18 @@ static int32_t mndTransPerformExecuteStage(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
    mDebug("trans:%d, stage from execute to commit", pTrans->id);
 | 
					    mDebug("trans:%d, stage from execute to commit", pTrans->id);
 | 
				
			||||||
  } else if (code == TSDB_CODE_MND_ACTION_IN_PROGRESS) {
 | 
					  } else if (code == TSDB_CODE_MND_ACTION_IN_PROGRESS) {
 | 
				
			||||||
    mDebug("trans:%d, stage keep on execute since %s", pTrans->id, tstrerror(code));
 | 
					    mDebug("trans:%d, stage keep on execute since %s", pTrans->id, tstrerror(code));
 | 
				
			||||||
    return code;
 | 
					 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    if (pTrans->policy == TRN_POLICY_ROLLBACK) {
 | 
					    if (pTrans->policy == TRN_POLICY_ROLLBACK) {
 | 
				
			||||||
      pTrans->stage = TRN_STAGE_ROLLBACK;
 | 
					      pTrans->stage = TRN_STAGE_ROLLBACK;
 | 
				
			||||||
      mError("trans:%d, stage from execute to rollback since %s", pTrans->id, terrstr());
 | 
					      mError("trans:%d, stage from execute to rollback since %s", pTrans->id, terrstr());
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      pTrans->stage = TRN_STAGE_EXECUTE;
 | 
					      pTrans->stage = TRN_STAGE_EXECUTE;
 | 
				
			||||||
 | 
					      pTrans->retryTimes++;
 | 
				
			||||||
      mError("trans:%d, stage keep on execute since %s", pTrans->id, terrstr());
 | 
					      mError("trans:%d, stage keep on execute since %s", pTrans->id, terrstr());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return 0;
 | 
					  return code;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndTransPerformCommitStage(SMnode *pMnode, STrans *pTrans) {
 | 
					static int32_t mndTransPerformCommitStage(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
| 
						 | 
					@ -798,6 +762,7 @@ static int32_t mndTransPerformRollbackStage(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
    mDebug("trans:%d, rollbacked", pTrans->id);
 | 
					    mDebug("trans:%d, rollbacked", pTrans->id);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    pTrans->stage = TRN_STAGE_ROLLBACK;
 | 
					    pTrans->stage = TRN_STAGE_ROLLBACK;
 | 
				
			||||||
 | 
					    pTrans->retryTimes++;
 | 
				
			||||||
    mError("trans:%d, stage keep on rollback since %s", pTrans->id, terrstr());
 | 
					    mError("trans:%d, stage keep on rollback since %s", pTrans->id, terrstr());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -810,7 +775,7 @@ static void mndTransExecute(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
  while (code == 0) {
 | 
					  while (code == 0) {
 | 
				
			||||||
    switch (pTrans->stage) {
 | 
					    switch (pTrans->stage) {
 | 
				
			||||||
      case TRN_STAGE_PREPARE:
 | 
					      case TRN_STAGE_PREPARE:
 | 
				
			||||||
        code = mndTransPerformPrepareStage(pMnode, pTrans);
 | 
					        mndTransPerformPrepareStage(pMnode, pTrans);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case TRN_STAGE_EXECUTE:
 | 
					      case TRN_STAGE_EXECUTE:
 | 
				
			||||||
        code = mndTransPerformExecuteStage(pMnode, pTrans);
 | 
					        code = mndTransPerformExecuteStage(pMnode, pTrans);
 | 
				
			||||||
| 
						 | 
					@ -822,9 +787,9 @@ static void mndTransExecute(SMnode *pMnode, STrans *pTrans) {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case TRN_STAGE_ROLLBACK:
 | 
					      case TRN_STAGE_ROLLBACK:
 | 
				
			||||||
        code = mndTransPerformRollbackStage(pMnode, pTrans);
 | 
					        code = mndTransRollback(pMnode, pTrans);
 | 
				
			||||||
        if (code == 0) {
 | 
					        if (code == 0) {
 | 
				
			||||||
          code = mndTransRollback(pMnode, pTrans);
 | 
					          mndTransPerformRollbackStage(pMnode, pTrans);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,9 +47,9 @@ int32_t mndInitUser(SMnode *pMnode) {
 | 
				
			||||||
                     .updateFp = (SdbUpdateFp)mndUserActionUpdate,
 | 
					                     .updateFp = (SdbUpdateFp)mndUserActionUpdate,
 | 
				
			||||||
                     .deleteFp = (SdbDeleteFp)mndUserActionDelete};
 | 
					                     .deleteFp = (SdbDeleteFp)mndUserActionDelete};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CREATE_USER, mndProcessCreateUserMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_USER, mndProcessCreateUserMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_ALTER_USER, mndProcessAlterUserMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_USER, mndProcessAlterUserMsg);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_DROP_USER, mndProcessDropUserMsg);
 | 
					  mndSetMsgHandle(pMnode, TDMT_MND_DROP_USER, mndProcessDropUserMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_USER, mndGetUserMeta);
 | 
					  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_USER, mndGetUserMeta);
 | 
				
			||||||
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_USER, mndRetrieveUsers);
 | 
					  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_USER, mndRetrieveUsers);
 | 
				
			||||||
| 
						 | 
					@ -197,7 +197,7 @@ static int32_t mndCreateUser(SMnode *pMnode, char *acct, char *user, char *pass,
 | 
				
			||||||
  userObj.updateTime = userObj.createdTime;
 | 
					  userObj.updateTime = userObj.createdTime;
 | 
				
			||||||
  userObj.superUser = 0;
 | 
					  userObj.superUser = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("user:%s, failed to create since %s", user, terrstr());
 | 
					    mError("user:%s, failed to create since %s", user, terrstr());
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
| 
						 | 
					@ -267,7 +267,7 @@ static int32_t mndProcessCreateUserMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndUpdateUser(SMnode *pMnode, SUserObj *pOldUser, SUserObj *pNewUser, SMnodeMsg *pMsg) {
 | 
					static int32_t mndUpdateUser(SMnode *pMnode, SUserObj *pOldUser, SUserObj *pNewUser, SMnodeMsg *pMsg) {
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("user:%s, failed to update since %s", pOldUser->user, terrstr());
 | 
					    mError("user:%s, failed to update since %s", pOldUser->user, terrstr());
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
| 
						 | 
					@ -342,7 +342,7 @@ static int32_t mndProcessAlterUserMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndDropUser(SMnode *pMnode, SMnodeMsg *pMsg, SUserObj *pUser) {
 | 
					static int32_t mndDropUser(SMnode *pMnode, SMnodeMsg *pMsg, SUserObj *pUser) {
 | 
				
			||||||
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, pMsg->rpcMsg.handle);
 | 
					  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, &pMsg->rpcMsg);
 | 
				
			||||||
  if (pTrans == NULL) {
 | 
					  if (pTrans == NULL) {
 | 
				
			||||||
    mError("user:%s, failed to drop since %s", pUser->user, terrstr());
 | 
					    mError("user:%s, failed to drop since %s", pUser->user, terrstr());
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,11 +51,11 @@ int32_t mndInitVgroup(SMnode *pMnode) {
 | 
				
			||||||
                     .updateFp = (SdbUpdateFp)mndVgroupActionDelete,
 | 
					                     .updateFp = (SdbUpdateFp)mndVgroupActionDelete,
 | 
				
			||||||
                     .deleteFp = (SdbDeleteFp)mndVgroupActionUpdate};
 | 
					                     .deleteFp = (SdbDeleteFp)mndVgroupActionUpdate};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_CREATE_VNODE_IN_RSP, mndProcessCreateVnodeRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_DND_CREATE_VNODE_RSP, mndProcessCreateVnodeRsp);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_ALTER_VNODE_IN_RSP, mndProcessAlterVnodeRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_DND_ALTER_VNODE_RSP, mndProcessAlterVnodeRsp);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_DROP_VNODE_IN_RSP, mndProcessDropVnodeRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_DND_DROP_VNODE_RSP, mndProcessDropVnodeRsp);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_SYNC_VNODE_IN_RSP, mndProcessSyncVnodeRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_DND_SYNC_VNODE_RSP, mndProcessSyncVnodeRsp);
 | 
				
			||||||
  mndSetMsgHandle(pMnode, TSDB_MSG_TYPE_COMPACT_VNODE_IN_RSP, mndProcessCompactVnodeRsp);
 | 
					  mndSetMsgHandle(pMnode, TDMT_DND_COMPACT_VNODE_RSP, mndProcessCompactVnodeRsp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_VGROUP, mndGetVgroupMeta);
 | 
					  mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_VGROUP, mndGetVgroupMeta);
 | 
				
			||||||
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_VGROUP, mndRetrieveVgroups);
 | 
					  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_VGROUP, mndRetrieveVgroups);
 | 
				
			||||||
| 
						 | 
					@ -337,8 +337,16 @@ static int32_t mndProcessCreateVnodeRsp(SMnodeMsg *pMsg) {
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndProcessAlterVnodeRsp(SMnodeMsg *pMsg) { return 0; }
 | 
					static int32_t mndProcessAlterVnodeRsp(SMnodeMsg *pMsg) {
 | 
				
			||||||
static int32_t mndProcessDropVnodeRsp(SMnodeMsg *pMsg) { return 0; }
 | 
					  mndTransHandleActionRsp(pMsg);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32_t mndProcessDropVnodeRsp(SMnodeMsg *pMsg) {
 | 
				
			||||||
 | 
					  mndTransHandleActionRsp(pMsg);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t mndProcessSyncVnodeRsp(SMnodeMsg *pMsg) { return 0; }
 | 
					static int32_t mndProcessSyncVnodeRsp(SMnodeMsg *pMsg) { return 0; }
 | 
				
			||||||
static int32_t mndProcessCompactVnodeRsp(SMnodeMsg *pMsg) { return 0; }
 | 
					static int32_t mndProcessCompactVnodeRsp(SMnodeMsg *pMsg) { return 0; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,7 @@
 | 
				
			||||||
#include "mndStb.h"
 | 
					#include "mndStb.h"
 | 
				
			||||||
#include "mndSync.h"
 | 
					#include "mndSync.h"
 | 
				
			||||||
#include "mndTelem.h"
 | 
					#include "mndTelem.h"
 | 
				
			||||||
 | 
					#include "mndTopic.h"
 | 
				
			||||||
#include "mndTrans.h"
 | 
					#include "mndTrans.h"
 | 
				
			||||||
#include "mndUser.h"
 | 
					#include "mndUser.h"
 | 
				
			||||||
#include "mndVgroup.h"
 | 
					#include "mndVgroup.h"
 | 
				
			||||||
| 
						 | 
					@ -132,6 +133,7 @@ static int32_t mndInitSteps(SMnode *pMnode) {
 | 
				
			||||||
  if (mndAllocStep(pMnode, "mnode-db", mndInitDb, mndCleanupDb) != 0) return -1;
 | 
					  if (mndAllocStep(pMnode, "mnode-db", mndInitDb, mndCleanupDb) != 0) return -1;
 | 
				
			||||||
  if (mndAllocStep(pMnode, "mnode-vgroup", mndInitVgroup, mndCleanupVgroup) != 0) return -1;
 | 
					  if (mndAllocStep(pMnode, "mnode-vgroup", mndInitVgroup, mndCleanupVgroup) != 0) return -1;
 | 
				
			||||||
  if (mndAllocStep(pMnode, "mnode-stb", mndInitStb, mndCleanupStb) != 0) return -1;
 | 
					  if (mndAllocStep(pMnode, "mnode-stb", mndInitStb, mndCleanupStb) != 0) return -1;
 | 
				
			||||||
 | 
					  if (mndAllocStep(pMnode, "mnode-topic", mndInitTopic, mndCleanupTopic) != 0) return -1;
 | 
				
			||||||
  if (mndAllocStep(pMnode, "mnode-func", mndInitFunc, mndCleanupFunc) != 0) return -1;
 | 
					  if (mndAllocStep(pMnode, "mnode-func", mndInitFunc, mndCleanupFunc) != 0) return -1;
 | 
				
			||||||
  if (pMnode->clusterId <= 0) {
 | 
					  if (pMnode->clusterId <= 0) {
 | 
				
			||||||
    if (mndAllocStep(pMnode, "mnode-sdb-deploy", mndDeploySdb, NULL) != 0) return -1;
 | 
					    if (mndAllocStep(pMnode, "mnode-sdb-deploy", mndDeploySdb, NULL) != 0) return -1;
 | 
				
			||||||
| 
						 | 
					@ -200,7 +202,6 @@ static int32_t mndSetOptions(SMnode *pMnode, const SMnodeOpt *pOption) {
 | 
				
			||||||
  pMnode->selfIndex = pOption->selfIndex;
 | 
					  pMnode->selfIndex = pOption->selfIndex;
 | 
				
			||||||
  memcpy(&pMnode->replicas, pOption->replicas, sizeof(SReplica) * TSDB_MAX_REPLICA);
 | 
					  memcpy(&pMnode->replicas, pOption->replicas, sizeof(SReplica) * TSDB_MAX_REPLICA);
 | 
				
			||||||
  pMnode->pDnode = pOption->pDnode;
 | 
					  pMnode->pDnode = pOption->pDnode;
 | 
				
			||||||
  pMnode->putMsgToApplyMsgFp = pOption->putMsgToApplyMsgFp;
 | 
					 | 
				
			||||||
  pMnode->sendMsgToDnodeFp = pOption->sendMsgToDnodeFp;
 | 
					  pMnode->sendMsgToDnodeFp = pOption->sendMsgToDnodeFp;
 | 
				
			||||||
  pMnode->sendMsgToMnodeFp = pOption->sendMsgToMnodeFp;
 | 
					  pMnode->sendMsgToMnodeFp = pOption->sendMsgToMnodeFp;
 | 
				
			||||||
  pMnode->sendRedirectMsgFp = pOption->sendRedirectMsgFp;
 | 
					  pMnode->sendRedirectMsgFp = pOption->sendRedirectMsgFp;
 | 
				
			||||||
| 
						 | 
					@ -215,8 +216,7 @@ static int32_t mndSetOptions(SMnode *pMnode, const SMnodeOpt *pOption) {
 | 
				
			||||||
  pMnode->cfg.buildinfo = strdup(pOption->cfg.buildinfo);
 | 
					  pMnode->cfg.buildinfo = strdup(pOption->cfg.buildinfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pMnode->sendMsgToDnodeFp == NULL || pMnode->sendMsgToMnodeFp == NULL || pMnode->sendRedirectMsgFp == NULL ||
 | 
					  if (pMnode->sendMsgToDnodeFp == NULL || pMnode->sendMsgToMnodeFp == NULL || pMnode->sendRedirectMsgFp == NULL ||
 | 
				
			||||||
      pMnode->putMsgToApplyMsgFp == NULL || pMnode->dnodeId < 0 || pMnode->clusterId < 0 ||
 | 
					      pMnode->dnodeId < 0 || pMnode->clusterId < 0 || pMnode->cfg.statusInterval < 1) {
 | 
				
			||||||
      pMnode->cfg.statusInterval < 1) {
 | 
					 | 
				
			||||||
    terrno = TSDB_CODE_MND_INVALID_OPTIONS;
 | 
					    terrno = TSDB_CODE_MND_INVALID_OPTIONS;
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -372,11 +372,11 @@ void mndSendRsp(SMnodeMsg *pMsg, int32_t code) {
 | 
				
			||||||
static void mndProcessRpcMsg(SMnodeMsg *pMsg) {
 | 
					static void mndProcessRpcMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
  SMnode *pMnode = pMsg->pMnode;
 | 
					  SMnode *pMnode = pMsg->pMnode;
 | 
				
			||||||
  int32_t code = 0;
 | 
					  int32_t code = 0;
 | 
				
			||||||
  int32_t msgType = pMsg->rpcMsg.msgType;
 | 
					  tmsg_t  msgType = pMsg->rpcMsg.msgType;
 | 
				
			||||||
  void   *ahandle = pMsg->rpcMsg.ahandle;
 | 
					  void   *ahandle = pMsg->rpcMsg.ahandle;
 | 
				
			||||||
  bool    isReq = (msgType & 1U);
 | 
					  bool    isReq = (msgType & 1U);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mTrace("msg:%p, app:%p type:%s will be processed", pMsg, ahandle, taosMsg[msgType]);
 | 
					  mTrace("msg:%p, app:%p type:%s will be processed", pMsg, ahandle, TMSG_INFO(msgType));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (isReq && !mndIsMaster(pMnode)) {
 | 
					  if (isReq && !mndIsMaster(pMnode)) {
 | 
				
			||||||
    code = TSDB_CODE_APP_NOT_READY;
 | 
					    code = TSDB_CODE_APP_NOT_READY;
 | 
				
			||||||
| 
						 | 
					@ -390,10 +390,10 @@ static void mndProcessRpcMsg(SMnodeMsg *pMsg) {
 | 
				
			||||||
    goto PROCESS_RPC_END;
 | 
					    goto PROCESS_RPC_END;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  MndMsgFp fp = pMnode->msgFp[msgType];
 | 
					  MndMsgFp fp = pMnode->msgFp[TMSG_INDEX(msgType)];
 | 
				
			||||||
  if (fp == NULL) {
 | 
					  if (fp == NULL) {
 | 
				
			||||||
    code = TSDB_CODE_MSG_NOT_PROCESSED;
 | 
					    code = TSDB_CODE_MSG_NOT_PROCESSED;
 | 
				
			||||||
    mError("msg:%p, app:%p failed to process since not handle", pMsg, ahandle);
 | 
					    mError("msg:%p, app:%p failed to process since no handle", pMsg, ahandle);
 | 
				
			||||||
    goto PROCESS_RPC_END;
 | 
					    goto PROCESS_RPC_END;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -423,9 +423,10 @@ PROCESS_RPC_END:
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void mndSetMsgHandle(SMnode *pMnode, int32_t msgType, MndMsgFp fp) {
 | 
					void mndSetMsgHandle(SMnode *pMnode, tmsg_t msgType, MndMsgFp fp) {
 | 
				
			||||||
  if (msgType >= 0 && msgType < TSDB_MSG_TYPE_MAX) {
 | 
					  tmsg_t type = TMSG_INDEX(msgType);
 | 
				
			||||||
    pMnode->msgFp[msgType] = fp;
 | 
					  if (type >= 0 && type < TDMT_MAX) {
 | 
				
			||||||
 | 
					    pMnode->msgFp[type] = fp;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -435,8 +436,6 @@ void mndProcessWriteMsg(SMnodeMsg *pMsg) { mndProcessRpcMsg(pMsg); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void mndProcessSyncMsg(SMnodeMsg *pMsg) { mndProcessRpcMsg(pMsg); }
 | 
					void mndProcessSyncMsg(SMnodeMsg *pMsg) { mndProcessRpcMsg(pMsg); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void mndProcessApplyMsg(SMnodeMsg *pMsg) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uint64_t mndGenerateUid(char *name, int32_t len) {
 | 
					uint64_t mndGenerateUid(char *name, int32_t len) {
 | 
				
			||||||
  int64_t  us = taosGetTimestampUs();
 | 
					  int64_t  us = taosGetTimestampUs();
 | 
				
			||||||
  int32_t  hashval = MurmurHash3_32(name, len);
 | 
					  int32_t  hashval = MurmurHash3_32(name, len);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
#include "sdb.h"
 | 
					#include "sdb.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "thash.h"
 | 
					#include "thash.h"
 | 
				
			||||||
#include "tlockfree.h"
 | 
					#include "tlockfree.h"
 | 
				
			||||||
#include "tlog.h"
 | 
					#include "tlog.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -199,6 +199,7 @@ void *sdbAcquire(SSdb *pSdb, ESdbType type, void *pKey) {
 | 
				
			||||||
  SSdbRow *pRow = *ppRow;
 | 
					  SSdbRow *pRow = *ppRow;
 | 
				
			||||||
  switch (pRow->status) {
 | 
					  switch (pRow->status) {
 | 
				
			||||||
    case SDB_STATUS_READY:
 | 
					    case SDB_STATUS_READY:
 | 
				
			||||||
 | 
					    case SDB_STATUS_UPDATING:
 | 
				
			||||||
      atomic_add_fetch_32(&pRow->refCount, 1);
 | 
					      atomic_add_fetch_32(&pRow->refCount, 1);
 | 
				
			||||||
      pRet = pRow->pObj;
 | 
					      pRet = pRow->pObj;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,5 +20,5 @@ target_link_libraries(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# test
 | 
					# test
 | 
				
			||||||
if(${BUILD_TEST})
 | 
					if(${BUILD_TEST})
 | 
				
			||||||
   add_subdirectory(test)
 | 
					#    add_subdirectory(test)
 | 
				
			||||||
endif(${BUILD_TEST})
 | 
					endif(${BUILD_TEST})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,17 +22,14 @@
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SVArenaNode    SVArenaNode;
 | 
					typedef struct SVArenaNode {
 | 
				
			||||||
typedef struct SVMemAllocator SVMemAllocator;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct SVArenaNode {
 | 
					 | 
				
			||||||
  TD_SLIST_NODE(SVArenaNode);
 | 
					  TD_SLIST_NODE(SVArenaNode);
 | 
				
			||||||
  uint64_t size;  // current node size
 | 
					  uint64_t size;  // current node size
 | 
				
			||||||
  void *   ptr;
 | 
					  void *   ptr;
 | 
				
			||||||
  char     data[];
 | 
					  char     data[];
 | 
				
			||||||
};
 | 
					} SVArenaNode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct SVMemAllocator {
 | 
					typedef struct SVMemAllocator {
 | 
				
			||||||
  T_REF_DECLARE()
 | 
					  T_REF_DECLARE()
 | 
				
			||||||
  TD_DLIST_NODE(SVMemAllocator);
 | 
					  TD_DLIST_NODE(SVMemAllocator);
 | 
				
			||||||
  uint64_t     capacity;
 | 
					  uint64_t     capacity;
 | 
				
			||||||
| 
						 | 
					@ -40,7 +37,7 @@ struct SVMemAllocator {
 | 
				
			||||||
  uint64_t     lsize;
 | 
					  uint64_t     lsize;
 | 
				
			||||||
  SVArenaNode *pNode;
 | 
					  SVArenaNode *pNode;
 | 
				
			||||||
  TD_SLIST(SVArenaNode) nlist;
 | 
					  TD_SLIST(SVArenaNode) nlist;
 | 
				
			||||||
};
 | 
					} SVMemAllocator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SVMemAllocator *vmaCreate(uint64_t capacity, uint64_t ssize, uint64_t lsize);
 | 
					SVMemAllocator *vmaCreate(uint64_t capacity, uint64_t ssize, uint64_t lsize);
 | 
				
			||||||
void            vmaDestroy(SVMemAllocator *pVMA);
 | 
					void            vmaDestroy(SVMemAllocator *pVMA);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,15 +18,15 @@
 | 
				
			||||||
static int   vnodeBuildCreateTableReq(void **buf, const SVCreateTableReq *pReq);
 | 
					static int   vnodeBuildCreateTableReq(void **buf, const SVCreateTableReq *pReq);
 | 
				
			||||||
static void *vnodeParseCreateTableReq(void *buf, SVCreateTableReq *pReq);
 | 
					static void *vnodeParseCreateTableReq(void *buf, SVCreateTableReq *pReq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int vnodeBuildReq(void **buf, const SVnodeReq *pReq, uint8_t type) {
 | 
					int vnodeBuildReq(void **buf, const SVnodeReq *pReq, tmsg_t type) {
 | 
				
			||||||
  int tsize = 0;
 | 
					  int tsize = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tsize += taosEncodeFixedU64(buf, pReq->ver);
 | 
					  tsize += taosEncodeFixedU64(buf, pReq->ver);
 | 
				
			||||||
  switch (type) {
 | 
					  switch (type) {
 | 
				
			||||||
    case TSDB_MSG_TYPE_CREATE_TABLE:
 | 
					    case TDMT_MND_CREATE_TABLE:
 | 
				
			||||||
      tsize += vnodeBuildCreateTableReq(buf, &(pReq->ctReq));
 | 
					      tsize += vnodeBuildCreateTableReq(buf, &(pReq->ctReq));
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_SUBMIT:
 | 
					    case TDMT_VND_SUBMIT:
 | 
				
			||||||
      /* code */
 | 
					      /* code */
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
| 
						 | 
					@ -36,11 +36,11 @@ int vnodeBuildReq(void **buf, const SVnodeReq *pReq, uint8_t type) {
 | 
				
			||||||
  return tsize;
 | 
					  return tsize;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void *vnodeParseReq(void *buf, SVnodeReq *pReq, uint8_t type) {
 | 
					void *vnodeParseReq(void *buf, SVnodeReq *pReq, tmsg_t type) {
 | 
				
			||||||
  buf = taosDecodeFixedU64(buf, &(pReq->ver));
 | 
					  buf = taosDecodeFixedU64(buf, &(pReq->ver));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (type) {
 | 
					  switch (type) {
 | 
				
			||||||
    case TSDB_MSG_TYPE_CREATE_TABLE:
 | 
					    case TDMT_MND_CREATE_TABLE:
 | 
				
			||||||
      buf = vnodeParseCreateTableReq(buf, &(pReq->ctReq));
 | 
					      buf = vnodeParseCreateTableReq(buf, &(pReq->ctReq));
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int vnodeProcessNoWalWMsgs(SVnode *pVnode, SRpcMsg *pMsg) {
 | 
					int vnodeProcessNoWalWMsgs(SVnode *pVnode, SRpcMsg *pMsg) {
 | 
				
			||||||
  switch (pMsg->msgType) {
 | 
					  switch (pMsg->msgType) {
 | 
				
			||||||
    case TSDB_MSG_TYPE_MQ_SET_CUR:
 | 
					    case TDMT_VND_MQ_SET_CUR:
 | 
				
			||||||
      if (tqSetCursor(pVnode->pTq, pMsg->pCont) < 0) {
 | 
					      if (tqSetCursor(pVnode->pTq, pMsg->pCont) < 0) {
 | 
				
			||||||
        // TODO: handle error
 | 
					        // TODO: handle error
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,7 @@ int vnodeProcessWMsgs(SVnode *pVnode, SArray *pMsgs) {
 | 
				
			||||||
    pMsg = *(SRpcMsg **)taosArrayGet(pMsgs, i);
 | 
					    pMsg = *(SRpcMsg **)taosArrayGet(pMsgs, i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ser request version
 | 
					    // ser request version
 | 
				
			||||||
    void *  pBuf = pMsg->pCont;
 | 
					    void *  pBuf = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead));
 | 
				
			||||||
    int64_t ver = pVnode->state.processed++;
 | 
					    int64_t ver = pVnode->state.processed++;
 | 
				
			||||||
    taosEncodeFixedU64(&pBuf, ver);
 | 
					    taosEncodeFixedU64(&pBuf, ver);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,8 +51,9 @@ int vnodeProcessWMsgs(SVnode *pVnode, SArray *pMsgs) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
 | 
					int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
 | 
				
			||||||
  SVnodeReq vReq;
 | 
					  SVnodeReq     vReq;
 | 
				
			||||||
  void *    ptr = vnodeMalloc(pVnode, pMsg->contLen);
 | 
					  SVCreateTbReq vCreateTbReq;
 | 
				
			||||||
 | 
					  void *        ptr = vnodeMalloc(pVnode, pMsg->contLen);
 | 
				
			||||||
  if (ptr == NULL) {
 | 
					  if (ptr == NULL) {
 | 
				
			||||||
    // TODO: handle error
 | 
					    // TODO: handle error
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -62,34 +63,33 @@ int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // todo: change the interface here
 | 
					  // todo: change the interface here
 | 
				
			||||||
  uint64_t ver;
 | 
					  uint64_t ver;
 | 
				
			||||||
  taosDecodeFixedU64(pMsg->pCont, &ver);
 | 
					  taosDecodeFixedU64(POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead)), &ver);
 | 
				
			||||||
  if (tqPushMsg(pVnode->pTq, ptr, ver) < 0) {
 | 
					  if (tqPushMsg(pVnode->pTq, ptr, ver) < 0) {
 | 
				
			||||||
    // TODO: handle error
 | 
					    // TODO: handle error
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  vnodeParseReq(pMsg->pCont, &vReq, pMsg->msgType);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  switch (pMsg->msgType) {
 | 
					  switch (pMsg->msgType) {
 | 
				
			||||||
    case TSDB_MSG_TYPE_CREATE_STB_IN:
 | 
					    case TDMT_VND_CREATE_STB:
 | 
				
			||||||
    case TSDB_MSG_TYPE_CREATE_TABLE:
 | 
					      tDeserializeSVCreateTbReq(POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead)), &vCreateTbReq);
 | 
				
			||||||
      if (metaCreateTable(pVnode->pMeta, &(vReq.ctReq)) < 0) {
 | 
					      if (metaCreateTable(pVnode->pMeta, &(vCreateTbReq)) < 0) {
 | 
				
			||||||
        // TODO: handle error
 | 
					        // TODO: handle error
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // TODO: maybe need to clear the requst struct
 | 
					      // TODO: maybe need to clear the requst struct
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_DROP_STB_IN:
 | 
					    case TDMT_VND_DROP_STB:
 | 
				
			||||||
    case TSDB_MSG_TYPE_DROP_TABLE:
 | 
					    case TDMT_MND_DROP_TABLE:
 | 
				
			||||||
      if (metaDropTable(pVnode->pMeta, vReq.dtReq.uid) < 0) {
 | 
					      if (metaDropTable(pVnode->pMeta, vReq.dtReq.uid) < 0) {
 | 
				
			||||||
        // TODO: handle error
 | 
					        // TODO: handle error
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case TSDB_MSG_TYPE_SUBMIT:
 | 
					    case TDMT_VND_SUBMIT:
 | 
				
			||||||
      if (tsdbInsertData(pVnode->pTsdb, (SSubmitMsg *)ptr) < 0) {
 | 
					      if (tsdbInsertData(pVnode->pTsdb, (SSubmitMsg *)ptr) < 0) {
 | 
				
			||||||
        // TODO: handle error
 | 
					        // TODO: handle error
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
 | 
					      ASSERT(0);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -84,14 +84,14 @@ static void vtBuildCreateStbReq(tb_uid_t suid, char *tbname, SRpcMsg **ppMsg) {
 | 
				
			||||||
  SVnodeReq vCreateSTbReq;
 | 
					  SVnodeReq vCreateSTbReq;
 | 
				
			||||||
  vnodeSetCreateStbReq(&vCreateSTbReq, tbname, UINT32_MAX, UINT32_MAX, suid, pSchema, pTagSchema);
 | 
					  vnodeSetCreateStbReq(&vCreateSTbReq, tbname, UINT32_MAX, UINT32_MAX, suid, pSchema, pTagSchema);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  zs = vnodeBuildReq(NULL, &vCreateSTbReq, TSDB_MSG_TYPE_CREATE_TABLE);
 | 
					  zs = vnodeBuildReq(NULL, &vCreateSTbReq, TDMT_MND_CREATE_TABLE);
 | 
				
			||||||
  pMsg = (SRpcMsg *)malloc(sizeof(SRpcMsg) + zs);
 | 
					  pMsg = (SRpcMsg *)malloc(sizeof(SRpcMsg) + zs);
 | 
				
			||||||
  pMsg->msgType = TSDB_MSG_TYPE_CREATE_TABLE;
 | 
					  pMsg->msgType = TDMT_MND_CREATE_TABLE;
 | 
				
			||||||
  pMsg->contLen = zs;
 | 
					  pMsg->contLen = zs;
 | 
				
			||||||
  pMsg->pCont = POINTER_SHIFT(pMsg, sizeof(SRpcMsg));
 | 
					  pMsg->pCont = POINTER_SHIFT(pMsg, sizeof(SRpcMsg));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pBuf = pMsg->pCont;
 | 
					  pBuf = pMsg->pCont;
 | 
				
			||||||
  vnodeBuildReq(&pBuf, &vCreateSTbReq, TSDB_MSG_TYPE_CREATE_TABLE);
 | 
					  vnodeBuildReq(&pBuf, &vCreateSTbReq, TDMT_MND_CREATE_TABLE);
 | 
				
			||||||
  META_CLEAR_TB_CFG(&vCreateSTbReq);
 | 
					  META_CLEAR_TB_CFG(&vCreateSTbReq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tdFreeSchema(pSchema);
 | 
					  tdFreeSchema(pSchema);
 | 
				
			||||||
| 
						 | 
					@ -108,14 +108,14 @@ static void vtBuildCreateCtbReq(tb_uid_t suid, char *tbname, SRpcMsg **ppMsg) {
 | 
				
			||||||
  SVnodeReq vCreateCTbReq;
 | 
					  SVnodeReq vCreateCTbReq;
 | 
				
			||||||
  vnodeSetCreateCtbReq(&vCreateCTbReq, tbname, UINT32_MAX, UINT32_MAX, suid, pTag);
 | 
					  vnodeSetCreateCtbReq(&vCreateCTbReq, tbname, UINT32_MAX, UINT32_MAX, suid, pTag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tz = vnodeBuildReq(NULL, &vCreateCTbReq, TSDB_MSG_TYPE_CREATE_TABLE);
 | 
					  tz = vnodeBuildReq(NULL, &vCreateCTbReq, TDMT_MND_CREATE_TABLE);
 | 
				
			||||||
  pMsg = (SRpcMsg *)malloc(sizeof(SRpcMsg) + tz);
 | 
					  pMsg = (SRpcMsg *)malloc(sizeof(SRpcMsg) + tz);
 | 
				
			||||||
  pMsg->msgType = TSDB_MSG_TYPE_CREATE_TABLE;
 | 
					  pMsg->msgType = TDMT_MND_CREATE_TABLE;
 | 
				
			||||||
  pMsg->contLen = tz;
 | 
					  pMsg->contLen = tz;
 | 
				
			||||||
  pMsg->pCont = POINTER_SHIFT(pMsg, sizeof(*pMsg));
 | 
					  pMsg->pCont = POINTER_SHIFT(pMsg, sizeof(*pMsg));
 | 
				
			||||||
  void *pBuf = pMsg->pCont;
 | 
					  void *pBuf = pMsg->pCont;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  vnodeBuildReq(&pBuf, &vCreateCTbReq, TSDB_MSG_TYPE_CREATE_TABLE);
 | 
					  vnodeBuildReq(&pBuf, &vCreateCTbReq, TDMT_MND_CREATE_TABLE);
 | 
				
			||||||
  META_CLEAR_TB_CFG(&vCreateCTbReq);
 | 
					  META_CLEAR_TB_CFG(&vCreateCTbReq);
 | 
				
			||||||
  free(pTag);
 | 
					  free(pTag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -133,7 +133,7 @@ static void vtBuildSubmitReq(SRpcMsg **ppMsg) {
 | 
				
			||||||
  int         tz = 1024;  // TODO
 | 
					  int         tz = 1024;  // TODO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pMsg = (SRpcMsg *)malloc(sizeof(*pMsg) + tz);
 | 
					  pMsg = (SRpcMsg *)malloc(sizeof(*pMsg) + tz);
 | 
				
			||||||
  pMsg->msgType = TSDB_MSG_TYPE_SUBMIT;
 | 
					  pMsg->msgType = TDMT_VND_SUBMIT;
 | 
				
			||||||
  pMsg->contLen = tz;
 | 
					  pMsg->contLen = tz;
 | 
				
			||||||
  pMsg->pCont = POINTER_SHIFT(pMsg, sizeof(*pMsg));
 | 
					  pMsg->pCont = POINTER_SHIFT(pMsg, sizeof(*pMsg));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,11 +22,11 @@
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define META_SUPER_TABLE 0
 | 
					#define META_SUPER_TABLE TD_SUPER_TABLE
 | 
				
			||||||
#define META_CHILD_TABLE 1
 | 
					#define META_CHILD_TABLE TD_CHILD_TABLE
 | 
				
			||||||
#define META_NORMAL_TABLE 2
 | 
					#define META_NORMAL_TABLE TD_NORMAL_TABLE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int    metaValidateTbOptions(SMeta *pMeta, const STbCfg *);
 | 
					int    metaValidateTbCfg(SMeta *pMeta, const STbCfg *);
 | 
				
			||||||
size_t metaEncodeTbObjFromTbOptions(const STbCfg *, void *pBuf, size_t bsize);
 | 
					size_t metaEncodeTbObjFromTbOptions(const STbCfg *, void *pBuf, size_t bsize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -125,11 +125,11 @@ void metaCloseDB(SMeta *pMeta) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int metaSaveTableToDB(SMeta *pMeta, STbCfg *pTbCfg) {
 | 
					int metaSaveTableToDB(SMeta *pMeta, STbCfg *pTbCfg) {
 | 
				
			||||||
  tb_uid_t  uid;
 | 
					  tb_uid_t uid;
 | 
				
			||||||
  char      buf[512];
 | 
					  char     buf[512];
 | 
				
			||||||
  void *    pBuf;
 | 
					  void *   pBuf;
 | 
				
			||||||
  DBT       key, value;
 | 
					  DBT      key, value;
 | 
				
			||||||
  STSchema *pSchema = NULL;
 | 
					  SSchema *pSchema = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pTbCfg->type == META_SUPER_TABLE) {
 | 
					  if (pTbCfg->type == META_SUPER_TABLE) {
 | 
				
			||||||
    uid = pTbCfg->stbCfg.suid;
 | 
					    uid = pTbCfg->stbCfg.suid;
 | 
				
			||||||
| 
						 | 
					@ -156,9 +156,12 @@ int metaSaveTableToDB(SMeta *pMeta, STbCfg *pTbCfg) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // save schema
 | 
					  // save schema
 | 
				
			||||||
 | 
					  uint32_t ncols;
 | 
				
			||||||
  if (pTbCfg->type == META_SUPER_TABLE) {
 | 
					  if (pTbCfg->type == META_SUPER_TABLE) {
 | 
				
			||||||
 | 
					    ncols = pTbCfg->stbCfg.nCols;
 | 
				
			||||||
    pSchema = pTbCfg->stbCfg.pSchema;
 | 
					    pSchema = pTbCfg->stbCfg.pSchema;
 | 
				
			||||||
  } else if (pTbCfg->type == META_NORMAL_TABLE) {
 | 
					  } else if (pTbCfg->type == META_NORMAL_TABLE) {
 | 
				
			||||||
 | 
					    ncols = pTbCfg->ntbCfg.nCols;
 | 
				
			||||||
    pSchema = pTbCfg->ntbCfg.pSchema;
 | 
					    pSchema = pTbCfg->ntbCfg.pSchema;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -166,12 +169,18 @@ int metaSaveTableToDB(SMeta *pMeta, STbCfg *pTbCfg) {
 | 
				
			||||||
    pBuf = buf;
 | 
					    pBuf = buf;
 | 
				
			||||||
    memset(&key, 0, sizeof(key));
 | 
					    memset(&key, 0, sizeof(key));
 | 
				
			||||||
    memset(&value, 0, sizeof(key));
 | 
					    memset(&value, 0, sizeof(key));
 | 
				
			||||||
    SSchemaKey schemaKey = {uid, schemaVersion(pSchema)};
 | 
					    SSchemaKey schemaKey = {uid, 0 /*TODO*/};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    key.data = &schemaKey;
 | 
					    key.data = &schemaKey;
 | 
				
			||||||
    key.size = sizeof(schemaKey);
 | 
					    key.size = sizeof(schemaKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tdEncodeSchema(&pBuf, pSchema);
 | 
					    taosEncodeFixedU32(&pBuf, ncols);
 | 
				
			||||||
 | 
					    for (size_t i = 0; i < ncols; i++) {
 | 
				
			||||||
 | 
					      taosEncodeFixedI8(&pBuf, pSchema[i].type);
 | 
				
			||||||
 | 
					      taosEncodeFixedI32(&pBuf, pSchema[i].colId);
 | 
				
			||||||
 | 
					      taosEncodeFixedI32(&pBuf, pSchema[i].bytes);
 | 
				
			||||||
 | 
					      taosEncodeString(&pBuf, pSchema[i].name);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    value.data = buf;
 | 
					    value.data = buf;
 | 
				
			||||||
    value.size = POINTER_DISTANCE(pBuf, buf);
 | 
					    value.size = POINTER_DISTANCE(pBuf, buf);
 | 
				
			||||||
| 
						 | 
					@ -367,7 +376,15 @@ static int metaEncodeTbInfo(void **buf, STbCfg *pTbCfg) {
 | 
				
			||||||
  tsize += taosEncodeFixedU8(buf, pTbCfg->type);
 | 
					  tsize += taosEncodeFixedU8(buf, pTbCfg->type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pTbCfg->type == META_SUPER_TABLE) {
 | 
					  if (pTbCfg->type == META_SUPER_TABLE) {
 | 
				
			||||||
    tsize += tdEncodeSchema(buf, pTbCfg->stbCfg.pTagSchema);
 | 
					    tsize += taosEncodeVariantU32(buf, pTbCfg->stbCfg.nTagCols);
 | 
				
			||||||
 | 
					    for (uint32_t i = 0; i < pTbCfg->stbCfg.nTagCols; i++) {
 | 
				
			||||||
 | 
					      tsize += taosEncodeFixedI8(buf, pTbCfg->stbCfg.pSchema[i].type);
 | 
				
			||||||
 | 
					      tsize += taosEncodeFixedI32(buf, pTbCfg->stbCfg.pSchema[i].colId);
 | 
				
			||||||
 | 
					      tsize += taosEncodeFixedI32(buf, pTbCfg->stbCfg.pSchema[i].bytes);
 | 
				
			||||||
 | 
					      tsize += taosEncodeString(buf, pTbCfg->stbCfg.pSchema[i].name);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // tsize += tdEncodeSchema(buf, pTbCfg->stbCfg.pTagSchema);
 | 
				
			||||||
  } else if (pTbCfg->type == META_CHILD_TABLE) {
 | 
					  } else if (pTbCfg->type == META_CHILD_TABLE) {
 | 
				
			||||||
    tsize += taosEncodeFixedU64(buf, pTbCfg->ctbCfg.suid);
 | 
					    tsize += taosEncodeFixedU64(buf, pTbCfg->ctbCfg.suid);
 | 
				
			||||||
    tsize += tdEncodeKVRow(buf, pTbCfg->ctbCfg.pTag);
 | 
					    tsize += tdEncodeKVRow(buf, pTbCfg->ctbCfg.pTag);
 | 
				
			||||||
| 
						 | 
					@ -386,7 +403,14 @@ static void *metaDecodeTbInfo(void *buf, STbCfg *pTbCfg) {
 | 
				
			||||||
  buf = taosDecodeFixedU8(buf, &(pTbCfg->type));
 | 
					  buf = taosDecodeFixedU8(buf, &(pTbCfg->type));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pTbCfg->type == META_SUPER_TABLE) {
 | 
					  if (pTbCfg->type == META_SUPER_TABLE) {
 | 
				
			||||||
    buf = tdDecodeSchema(buf, &(pTbCfg->stbCfg.pTagSchema));
 | 
					    buf = taosDecodeVariantU32(buf, pTbCfg->stbCfg.nTagCols);
 | 
				
			||||||
 | 
					    pTbCfg->stbCfg.pTagSchema = (SSchema *)malloc(sizeof(SSchema) * pTbCfg->stbCfg.nTagCols);
 | 
				
			||||||
 | 
					    for (uint32_t i = 0; i < pTbCfg->stbCfg.nTagCols; i++) {
 | 
				
			||||||
 | 
					      buf = taosDecodeFixedI8(buf, &pTbCfg->stbCfg.pSchema[i].type);
 | 
				
			||||||
 | 
					      buf = taosDecodeFixedI32(buf, &pTbCfg->stbCfg.pSchema[i].colId);
 | 
				
			||||||
 | 
					      buf = taosDecodeFixedI32(buf, &pTbCfg->stbCfg.pSchema[i].bytes);
 | 
				
			||||||
 | 
					      buf = taosDecodeStringTo(buf, pTbCfg->stbCfg.pSchema[i].name);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  } else if (pTbCfg->type == META_CHILD_TABLE) {
 | 
					  } else if (pTbCfg->type == META_CHILD_TABLE) {
 | 
				
			||||||
    buf = taosDecodeFixedU64(buf, &(pTbCfg->ctbCfg.suid));
 | 
					    buf = taosDecodeFixedU64(buf, &(pTbCfg->ctbCfg.suid));
 | 
				
			||||||
    buf = tdDecodeKVRow(buf, &(pTbCfg->ctbCfg.pTag));
 | 
					    buf = tdDecodeKVRow(buf, &(pTbCfg->ctbCfg.pTag));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int metaCreateTable(SMeta *pMeta, STbCfg *pTbCfg) {
 | 
					int metaCreateTable(SMeta *pMeta, STbCfg *pTbCfg) {
 | 
				
			||||||
  // Validate the tbOptions
 | 
					  // Validate the tbOptions
 | 
				
			||||||
  if (metaValidateTbOptions(pMeta, pTbCfg) < 0) {
 | 
					  if (metaValidateTbCfg(pMeta, pTbCfg) < 0) {
 | 
				
			||||||
    // TODO: handle error
 | 
					    // TODO: handle error
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@
 | 
				
			||||||
#include "metaDef.h"
 | 
					#include "metaDef.h"
 | 
				
			||||||
#include "tcoding.h"
 | 
					#include "tcoding.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int metaValidateTbOptions(SMeta *pMeta, const STbCfg *pTbOptions) {
 | 
					int metaValidateTbCfg(SMeta *pMeta, const STbCfg *pTbOptions) {
 | 
				
			||||||
  // TODO
 | 
					  // TODO
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@
 | 
				
			||||||
#define _TD_TSDB_DEF_H_
 | 
					#define _TD_TSDB_DEF_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "mallocator.h"
 | 
					#include "mallocator.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tlist.h"
 | 
					#include "tlist.h"
 | 
				
			||||||
#include "thash.h"
 | 
					#include "thash.h"
 | 
				
			||||||
#include "tskiplist.h"
 | 
					#include "tskiplist.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tarray.h"
 | 
					#include "tarray.h"
 | 
				
			||||||
#include "query.h"
 | 
					#include "query.h"
 | 
				
			||||||
#include "tglobal.h"
 | 
					#include "tglobal.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,7 +49,7 @@ int32_t ctgGetDBVgroupFromMnode(struct SCatalog* pCatalog, void *pRpc, const SEp
 | 
				
			||||||
  SEpSet *pVnodeEpSet = NULL;
 | 
					  SEpSet *pVnodeEpSet = NULL;
 | 
				
			||||||
  int32_t msgLen = 0;
 | 
					  int32_t msgLen = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  CTG_ERR_RET(queryBuildMsg[TSDB_MSG_TYPE_USE_DB](input, &msg, 0, &msgLen));
 | 
					  CTG_ERR_RET(queryBuildMsg[TDMT_MND_USE_DB](input, &msg, 0, &msgLen));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  char *pMsg = rpcMallocCont(msgLen);
 | 
					  char *pMsg = rpcMallocCont(msgLen);
 | 
				
			||||||
  if (NULL == pMsg) {
 | 
					  if (NULL == pMsg) {
 | 
				
			||||||
| 
						 | 
					@ -63,7 +63,7 @@ int32_t ctgGetDBVgroupFromMnode(struct SCatalog* pCatalog, void *pRpc, const SEp
 | 
				
			||||||
  tfree(msg);
 | 
					  tfree(msg);
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  SRpcMsg rpcMsg = {
 | 
					  SRpcMsg rpcMsg = {
 | 
				
			||||||
      .msgType = TSDB_MSG_TYPE_USE_DB,
 | 
					      .msgType = TDMT_MND_USE_DB,
 | 
				
			||||||
      .pCont   = pMsg,
 | 
					      .pCont   = pMsg,
 | 
				
			||||||
      .contLen = msgLen,
 | 
					      .contLen = msgLen,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -76,7 +76,7 @@ int32_t ctgGetDBVgroupFromMnode(struct SCatalog* pCatalog, void *pRpc, const SEp
 | 
				
			||||||
    CTG_ERR_RET(rpcRsp.code);
 | 
					    CTG_ERR_RET(rpcRsp.code);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  CTG_ERR_RET(queryProcessMsgRsp[TSDB_MSG_TYPE_USE_DB](out, rpcRsp.pCont, rpcRsp.contLen));
 | 
					  CTG_ERR_RET(queryProcessMsgRsp[TDMT_MND_USE_DB](out, rpcRsp.pCont, rpcRsp.contLen));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return TSDB_CODE_SUCCESS;
 | 
					  return TSDB_CODE_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -161,10 +161,10 @@ int32_t ctgGetTableMetaFromMnode(struct SCatalog* pCatalog, void *pRpc, const SE
 | 
				
			||||||
  SEpSet *pVnodeEpSet = NULL;
 | 
					  SEpSet *pVnodeEpSet = NULL;
 | 
				
			||||||
  int32_t msgLen = 0;
 | 
					  int32_t msgLen = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  CTG_ERR_RET(queryBuildMsg[TSDB_MSG_TYPE_TABLE_META](&bInput, &msg, 0, &msgLen));
 | 
					  CTG_ERR_RET(queryBuildMsg[TDMT_VND_TABLE_META](&bInput, &msg, 0, &msgLen));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg rpcMsg = {
 | 
					  SRpcMsg rpcMsg = {
 | 
				
			||||||
      .msgType = TSDB_MSG_TYPE_TABLE_META,
 | 
					      .msgType = TDMT_VND_TABLE_META,
 | 
				
			||||||
      .pCont   = msg,
 | 
					      .pCont   = msg,
 | 
				
			||||||
      .contLen = msgLen,
 | 
					      .contLen = msgLen,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -181,7 +181,7 @@ int32_t ctgGetTableMetaFromMnode(struct SCatalog* pCatalog, void *pRpc, const SE
 | 
				
			||||||
    CTG_ERR_RET(rpcRsp.code);
 | 
					    CTG_ERR_RET(rpcRsp.code);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  CTG_ERR_RET(queryProcessMsgRsp[TSDB_MSG_TYPE_TABLE_META](output, rpcRsp.pCont, rpcRsp.contLen));
 | 
					  CTG_ERR_RET(queryProcessMsgRsp[TDMT_VND_TABLE_META](output, rpcRsp.pCont, rpcRsp.contLen));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return TSDB_CODE_SUCCESS;
 | 
					  return TSDB_CODE_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,7 +80,7 @@ void sendCreateDbMsg(void *shandle, SEpSet *pEpSet) {
 | 
				
			||||||
  SRpcMsg rpcMsg = {0};
 | 
					  SRpcMsg rpcMsg = {0};
 | 
				
			||||||
  rpcMsg.pCont = pReq;
 | 
					  rpcMsg.pCont = pReq;
 | 
				
			||||||
  rpcMsg.contLen = sizeof(SCreateDbMsg);
 | 
					  rpcMsg.contLen = sizeof(SCreateDbMsg);
 | 
				
			||||||
  rpcMsg.msgType = TSDB_MSG_TYPE_CREATE_DB;
 | 
					  rpcMsg.msgType = TDMT_MND_CREATE_DB;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SRpcMsg rpcRsp = {0};
 | 
					  SRpcMsg rpcRsp = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "thash.h"
 | 
					#include "thash.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "executil.h"
 | 
					#include "executil.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#include <function.h>
 | 
					#include <function.h>
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tglobal.h"
 | 
					#include "tglobal.h"
 | 
				
			||||||
#include "ttime.h"
 | 
					#include "ttime.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@ extern "C" {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "taosdef.h"
 | 
					#include "taosdef.h"
 | 
				
			||||||
#include "tskiplist.h"
 | 
					#include "tskiplist.h"
 | 
				
			||||||
#include "function.h"
 | 
					#include "function.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@
 | 
				
			||||||
#include "tscalarfunction.h"
 | 
					#include "tscalarfunction.h"
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
#include "taosdef.h"
 | 
					#include "taosdef.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tglobal.h"
 | 
					#include "tglobal.h"
 | 
				
			||||||
#include "thash.h"
 | 
					#include "thash.h"
 | 
				
			||||||
#include "ttypes.h"
 | 
					#include "ttypes.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "exception.h"
 | 
					#include "exception.h"
 | 
				
			||||||
#include "taosdef.h"
 | 
					#include "taosdef.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tarray.h"
 | 
					#include "tarray.h"
 | 
				
			||||||
#include "tbuffer.h"
 | 
					#include "tbuffer.h"
 | 
				
			||||||
#include "tcompare.h"
 | 
					#include "tcompare.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@
 | 
				
			||||||
#include "os.h"
 | 
					#include "os.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "taosdef.h"
 | 
					#include "taosdef.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "ttypes.h"
 | 
					#include "ttypes.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "tfill.h"
 | 
					#include "tfill.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "thistogram.h"
 | 
					#include "thistogram.h"
 | 
				
			||||||
#include "taosdef.h"
 | 
					#include "taosdef.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "tlosertree.h"
 | 
					#include "tlosertree.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +37,17 @@ typedef struct IndexCache {
 | 
				
			||||||
  SSkipList* skiplist;
 | 
					  SSkipList* skiplist;
 | 
				
			||||||
} IndexCache;
 | 
					} IndexCache;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct CacheTerm {
 | 
				
			||||||
 | 
					  // key
 | 
				
			||||||
 | 
					  int32_t colId;
 | 
				
			||||||
 | 
					  int32_t nColVal;
 | 
				
			||||||
 | 
					  char*   colVal;
 | 
				
			||||||
 | 
					  int32_t version;
 | 
				
			||||||
 | 
					  // value
 | 
				
			||||||
 | 
					  uint64_t           uid;
 | 
				
			||||||
 | 
					  int8_t             colType;
 | 
				
			||||||
 | 
					  SIndexOperOnColumn operaType;
 | 
				
			||||||
 | 
					} CacheTerm;
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
IndexCache* indexCacheCreate();
 | 
					IndexCache* indexCacheCreate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,6 +58,7 @@ int indexCachePut(void* cache, SIndexTerm* term, int16_t colId, int32_t version,
 | 
				
			||||||
// int indexCacheGet(void *cache, uint64_t *rst);
 | 
					// int indexCacheGet(void *cache, uint64_t *rst);
 | 
				
			||||||
int indexCacheSearch(void* cache, SIndexTermQuery* query, int16_t colId, int32_t version, SArray* result, STermValueType* s);
 | 
					int indexCacheSearch(void* cache, SIndexTermQuery* query, int16_t colId, int32_t version, SArray* result, STermValueType* s);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void indexCacheDebug(IndexCache* cache);
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,7 +41,7 @@ static pthread_once_t isInit = PTHREAD_ONCE_INIT;
 | 
				
			||||||
static void           indexInit();
 | 
					static void           indexInit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int indexTermSearch(SIndex* sIdx, SIndexTermQuery* term, SArray** result);
 | 
					static int indexTermSearch(SIndex* sIdx, SIndexTermQuery* term, SArray** result);
 | 
				
			||||||
static int indexFlushCacheToTindex(SIndex* sIdx);
 | 
					static int indexFlushCacheTFile(SIndex* sIdx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void indexInterResultsDestroy(SArray* results);
 | 
					static void indexInterResultsDestroy(SArray* results);
 | 
				
			||||||
static int  indexMergeFinalResults(SArray* interResults, EIndexOperatorType oType, SArray* finalResult);
 | 
					static int  indexMergeFinalResults(SArray* interResults, EIndexOperatorType oType, SArray* finalResult);
 | 
				
			||||||
| 
						 | 
					@ -353,7 +353,7 @@ static int indexMergeFinalResults(SArray* interResults, EIndexOperatorType oType
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static int indexFlushCacheToTindex(SIndex* sIdx) {
 | 
					static int indexFlushCacheTFile(SIndex* sIdx) {
 | 
				
			||||||
  if (sIdx == NULL) { return -1; }
 | 
					  if (sIdx == NULL) { return -1; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  indexWarn("suid %" PRIu64 " merge cache into tindex", sIdx->suid);
 | 
					  indexWarn("suid %" PRIu64 " merge cache into tindex", sIdx->suid);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,81 +20,88 @@
 | 
				
			||||||
#define MAX_INDEX_KEY_LEN 256  // test only, change later
 | 
					#define MAX_INDEX_KEY_LEN 256  // test only, change later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ref index_cache.h:22
 | 
					// ref index_cache.h:22
 | 
				
			||||||
#define CACHE_KEY_LEN(p) \
 | 
					//#define CACHE_KEY_LEN(p) \
 | 
				
			||||||
  (sizeof(int32_t) + sizeof(uint16_t) + sizeof(p->colType) + sizeof(p->nColVal) + p->nColVal + sizeof(uint64_t) + sizeof(p->operType))
 | 
					//  (sizeof(int32_t) + sizeof(uint16_t) + sizeof(p->colType) + sizeof(p->nColVal) + p->nColVal + sizeof(uint64_t) + sizeof(p->operType))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static char* getIndexKey(const void* pData) {
 | 
					static void cacheTermDestroy(CacheTerm* ct) {
 | 
				
			||||||
  return NULL;
 | 
					  if (ct == NULL) { return; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  free(ct->colVal);
 | 
				
			||||||
 | 
					  free(ct);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					static char* getIndexKey(const void* pData) {
 | 
				
			||||||
 | 
					  CacheTerm* p = (CacheTerm*)pData;
 | 
				
			||||||
 | 
					  return (char*)p;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int32_t compareKey(const void* l, const void* r) {
 | 
					static int32_t compareKey(const void* l, const void* r) {
 | 
				
			||||||
  char* lp = (char*)l;
 | 
					  CacheTerm* lt = (CacheTerm*)l;
 | 
				
			||||||
  char* rp = (char*)r;
 | 
					  CacheTerm* rt = (CacheTerm*)r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // skip total len, not compare
 | 
					  // compare colId
 | 
				
			||||||
  int32_t ll, rl;  // len
 | 
					  if (lt->colId != rt->colId) { return lt->colId - rt->colId; }
 | 
				
			||||||
  memcpy(&ll, lp, sizeof(int32_t));
 | 
					 | 
				
			||||||
  memcpy(&rl, rp, sizeof(int32_t));
 | 
					 | 
				
			||||||
  lp += sizeof(int32_t);
 | 
					 | 
				
			||||||
  rp += sizeof(int32_t);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // compare field id
 | 
					  // compare colVal
 | 
				
			||||||
  int16_t lf, rf;  // field id
 | 
					  int i, j;
 | 
				
			||||||
  memcpy(&lf, lp, sizeof(lf));
 | 
					  for (i = 0, j = 0; i < lt->nColVal && j < rt->nColVal; i++, j++) {
 | 
				
			||||||
  memcpy(&rf, rp, sizeof(rf));
 | 
					    if (lt->colVal[i] == rt->colVal[j]) {
 | 
				
			||||||
  if (lf != rf) { return lf < rf ? -1 : 1; }
 | 
					 | 
				
			||||||
  lp += sizeof(lf);
 | 
					 | 
				
			||||||
  rp += sizeof(rf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // compare field type
 | 
					 | 
				
			||||||
  int8_t lft, rft;
 | 
					 | 
				
			||||||
  memcpy(&lft, lp, sizeof(lft));
 | 
					 | 
				
			||||||
  memcpy(&rft, rp, sizeof(rft));
 | 
					 | 
				
			||||||
  lp += sizeof(lft);
 | 
					 | 
				
			||||||
  rp += sizeof(rft);
 | 
					 | 
				
			||||||
  assert(rft == rft);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // skip value len
 | 
					 | 
				
			||||||
  int32_t lfl, rfl;
 | 
					 | 
				
			||||||
  memcpy(&lfl, lp, sizeof(lfl));
 | 
					 | 
				
			||||||
  memcpy(&rfl, rp, sizeof(rfl));
 | 
					 | 
				
			||||||
  lp += sizeof(lfl);
 | 
					 | 
				
			||||||
  rp += sizeof(rfl);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // compare value
 | 
					 | 
				
			||||||
  int32_t i, j;
 | 
					 | 
				
			||||||
  for (i = 0, j = 0; i < lfl && j < rfl; i++, j++) {
 | 
					 | 
				
			||||||
    if (lp[i] == rp[j]) {
 | 
					 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      return lp[i] < rp[j] ? -1 : 1;
 | 
					      return lt->colVal[i] < rt->colVal[j] ? -1 : 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (i < lfl) {
 | 
					  if (i < lt->nColVal) {
 | 
				
			||||||
    return 1;
 | 
					    return 1;
 | 
				
			||||||
  } else if (j < rfl) {
 | 
					  } else if (j < rt->nColVal) {
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  lp += lfl;
 | 
					  // compare version
 | 
				
			||||||
  rp += rfl;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // skip uid
 | 
					  return rt->version - lt->version;
 | 
				
			||||||
  uint64_t lu, ru;
 | 
					 | 
				
			||||||
  memcpy(&lu, lp, sizeof(lu));
 | 
					 | 
				
			||||||
  memcpy(&ru, rp, sizeof(ru));
 | 
					 | 
				
			||||||
  lp += sizeof(lu);
 | 
					 | 
				
			||||||
  rp += sizeof(ru);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // compare version, desc order
 | 
					  // char*      lp = (char*)l;
 | 
				
			||||||
  int32_t lv, rv;
 | 
					  // char*      rp = (char*)r;
 | 
				
			||||||
  memcpy(&lv, lp, sizeof(lv));
 | 
					 | 
				
			||||||
  memcpy(&rv, rp, sizeof(rv));
 | 
					 | 
				
			||||||
  if (lv != rv) { return lv > rv ? -1 : 1; }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  lp += sizeof(lv);
 | 
					  //// compare col id
 | 
				
			||||||
  rp += sizeof(rv);
 | 
					  // int16_t lf, rf;  // cold id
 | 
				
			||||||
  // not care item type
 | 
					  // memcpy(&lf, lp, sizeof(lf));
 | 
				
			||||||
 | 
					  // memcpy(&rf, rp, sizeof(rf));
 | 
				
			||||||
 | 
					  // if (lf != rf) { return lf < rf ? -1 : 1; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return 0;
 | 
					  // lp += sizeof(lf);
 | 
				
			||||||
 | 
					  // rp += sizeof(rf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //// skip value len
 | 
				
			||||||
 | 
					  // int32_t lfl, rfl;
 | 
				
			||||||
 | 
					  // memcpy(&lfl, lp, sizeof(lfl));
 | 
				
			||||||
 | 
					  // memcpy(&rfl, rp, sizeof(rfl));
 | 
				
			||||||
 | 
					  // lp += sizeof(lfl);
 | 
				
			||||||
 | 
					  // rp += sizeof(rfl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //// compare value
 | 
				
			||||||
 | 
					  // int32_t i, j;
 | 
				
			||||||
 | 
					  // for (i = 0, j = 0; i < lfl && j < rfl; i++, j++) {
 | 
				
			||||||
 | 
					  //  if (lp[i] == rp[j]) {
 | 
				
			||||||
 | 
					  //    continue;
 | 
				
			||||||
 | 
					  //  } else {
 | 
				
			||||||
 | 
					  //    return lp[i] < rp[j] ? -1 : 1;
 | 
				
			||||||
 | 
					  //  }
 | 
				
			||||||
 | 
					  //}
 | 
				
			||||||
 | 
					  // if (i < lfl) {
 | 
				
			||||||
 | 
					  //  return 1;
 | 
				
			||||||
 | 
					  //} else if (j < rfl) {
 | 
				
			||||||
 | 
					  //  return -1;
 | 
				
			||||||
 | 
					  //}
 | 
				
			||||||
 | 
					  // lp += lfl;
 | 
				
			||||||
 | 
					  // rp += rfl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //// compare version, desc order
 | 
				
			||||||
 | 
					  // int32_t lv, rv;
 | 
				
			||||||
 | 
					  // memcpy(&lv, lp, sizeof(lv));
 | 
				
			||||||
 | 
					  // memcpy(&rv, rp, sizeof(rv));
 | 
				
			||||||
 | 
					  // if (lv != rv) { return lv < rv ? 1 : -1; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
IndexCache* indexCacheCreate() {
 | 
					IndexCache* indexCacheCreate() {
 | 
				
			||||||
  IndexCache* cache = calloc(1, sizeof(IndexCache));
 | 
					  IndexCache* cache = calloc(1, sizeof(IndexCache));
 | 
				
			||||||
| 
						 | 
					@ -106,6 +113,18 @@ IndexCache* indexCacheCreate() {
 | 
				
			||||||
      tSkipListCreate(MAX_SKIP_LIST_LEVEL, TSDB_DATA_TYPE_BINARY, MAX_INDEX_KEY_LEN, compareKey, SL_ALLOW_DUP_KEY, getIndexKey);
 | 
					      tSkipListCreate(MAX_SKIP_LIST_LEVEL, TSDB_DATA_TYPE_BINARY, MAX_INDEX_KEY_LEN, compareKey, SL_ALLOW_DUP_KEY, getIndexKey);
 | 
				
			||||||
  return cache;
 | 
					  return cache;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					void indexCacheDebug(IndexCache* cache) {
 | 
				
			||||||
 | 
					  SSkipListIterator* iter = tSkipListCreateIter(cache->skiplist);
 | 
				
			||||||
 | 
					  while (tSkipListIterNext(iter)) {
 | 
				
			||||||
 | 
					    SSkipListNode* node = tSkipListIterGet(iter);
 | 
				
			||||||
 | 
					    CacheTerm*     ct = (CacheTerm*)SL_GET_NODE_DATA(node);
 | 
				
			||||||
 | 
					    if (ct != NULL) {
 | 
				
			||||||
 | 
					      // TODO, add more debug info
 | 
				
			||||||
 | 
					      indexInfo("{colId:%d, colVal: %s, version: %d} \t", ct->colId, ct->colVal, ct->version);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  tSkipListDestroyIter(iter);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void indexCacheDestroy(void* cache) {
 | 
					void indexCacheDestroy(void* cache) {
 | 
				
			||||||
  IndexCache* pCache = cache;
 | 
					  IndexCache* pCache = cache;
 | 
				
			||||||
| 
						 | 
					@ -119,24 +138,20 @@ int indexCachePut(void* cache, SIndexTerm* term, int16_t colId, int32_t version,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  IndexCache* pCache = cache;
 | 
					  IndexCache* pCache = cache;
 | 
				
			||||||
  // encode data
 | 
					  // encode data
 | 
				
			||||||
  int32_t total = CACHE_KEY_LEN(term);
 | 
					  CacheTerm* ct = calloc(1, sizeof(CacheTerm));
 | 
				
			||||||
 | 
					  if (cache == NULL) { return -1; }
 | 
				
			||||||
 | 
					  // set up key
 | 
				
			||||||
 | 
					  ct->colId = colId;
 | 
				
			||||||
 | 
					  ct->colType = term->colType;
 | 
				
			||||||
 | 
					  ct->nColVal = term->nColVal;
 | 
				
			||||||
 | 
					  ct->colVal = (char*)calloc(1, sizeof(char) * (ct->nColVal + 1));
 | 
				
			||||||
 | 
					  memcpy(ct->colVal, term->colVal, ct->nColVal);
 | 
				
			||||||
 | 
					  ct->version = version;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  char* buf = calloc(1, total);
 | 
					  ct->uid = uid;
 | 
				
			||||||
  char* p = buf;
 | 
					  ct->operaType = term->operType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SERIALIZE_VAR_TO_BUF(p, total, int32_t);
 | 
					  tSkipListPut(pCache->skiplist, (char*)ct);
 | 
				
			||||||
  SERIALIZE_VAR_TO_BUF(p, colId, int16_t);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SERIALIZE_MEM_TO_BUF(p, term, colType);
 | 
					 | 
				
			||||||
  SERIALIZE_MEM_TO_BUF(p, term, nColVal);
 | 
					 | 
				
			||||||
  SERIALIZE_STR_MEM_TO_BUF(p, term, colVal, term->nColVal);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SERIALIZE_VAR_TO_BUF(p, version, int32_t);
 | 
					 | 
				
			||||||
  SERIALIZE_VAR_TO_BUF(p, uid, uint64_t);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  SERIALIZE_MEM_TO_BUF(p, term, operType);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  tSkipListPut(pCache->skiplist, (void*)buf);
 | 
					 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
  // encode end
 | 
					  // encode end
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -150,8 +165,39 @@ int indexCacheSearch(void* cache, SIndexTermQuery* query, int16_t colId, int32_t
 | 
				
			||||||
  SIndexTerm*     term = query->term;
 | 
					  SIndexTerm*     term = query->term;
 | 
				
			||||||
  EIndexQueryType qtype = query->qType;
 | 
					  EIndexQueryType qtype = query->qType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int32_t keyLen = CACHE_KEY_LEN(term);
 | 
					  CacheTerm* ct = calloc(1, sizeof(CacheTerm));
 | 
				
			||||||
  char*   buf = calloc(1, keyLen);
 | 
					  if (ct == NULL) { return -1; }
 | 
				
			||||||
 | 
					  ct->colId = colId;
 | 
				
			||||||
 | 
					  ct->nColVal = term->nColVal;
 | 
				
			||||||
 | 
					  ct->colVal = calloc(1, sizeof(char) * (ct->nColVal + 1));
 | 
				
			||||||
 | 
					  memcpy(ct->colVal, term->colVal, ct->nColVal);
 | 
				
			||||||
 | 
					  ct->version = version;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  char* key = getIndexKey(ct);
 | 
				
			||||||
 | 
					  // TODO handle multi situation later, and refactor
 | 
				
			||||||
 | 
					  SSkipListIterator* iter = tSkipListCreateIterFromVal(pCache->skiplist, key, TSDB_DATA_TYPE_BINARY, TSDB_ORDER_ASC);
 | 
				
			||||||
 | 
					  while (tSkipListIterNext(iter)) {
 | 
				
			||||||
 | 
					    SSkipListNode* node = tSkipListIterGet(iter);
 | 
				
			||||||
 | 
					    if (node != NULL) {
 | 
				
			||||||
 | 
					      CacheTerm* c = (CacheTerm*)SL_GET_NODE_DATA(node);
 | 
				
			||||||
 | 
					      if (c->operaType == ADD_VALUE || qtype == QUERY_TERM) {
 | 
				
			||||||
 | 
					        if (c->nColVal == ct->nColVal && strncmp(c->colVal, ct->colVal, c->nColVal) == 0) {
 | 
				
			||||||
 | 
					          taosArrayPush(result, &c->uid);
 | 
				
			||||||
 | 
					          *s = kTypeValue;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } else if (c->operaType == DEL_VALUE) {
 | 
				
			||||||
 | 
					        // table is del, not need
 | 
				
			||||||
 | 
					        *s = kTypeDeletion;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  tSkipListDestroyIter(iter);
 | 
				
			||||||
 | 
					  cacheTermDestroy(ct);
 | 
				
			||||||
 | 
					  // int32_t keyLen = CACHE_KEY_LEN(term);
 | 
				
			||||||
 | 
					  // char*   buf = calloc(1, keyLen);
 | 
				
			||||||
  if (qtype == QUERY_TERM) {
 | 
					  if (qtype == QUERY_TERM) {
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
  } else if (qtype == QUERY_PREFIX) {
 | 
					  } else if (qtype == QUERY_PREFIX) {
 | 
				
			||||||
| 
						 | 
					@ -161,6 +207,5 @@ int indexCacheSearch(void* cache, SIndexTermQuery* query, int16_t colId, int32_t
 | 
				
			||||||
  } else if (qtype == QUERY_REGEX) {
 | 
					  } else if (qtype == QUERY_REGEX) {
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -462,7 +462,9 @@ static int tfileCompare(const void* a, const void* b) {
 | 
				
			||||||
  size_t aLen = strlen(aName);
 | 
					  size_t aLen = strlen(aName);
 | 
				
			||||||
  size_t bLen = strlen(bName);
 | 
					  size_t bLen = strlen(bName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return strncmp(aName, bName, aLen > bLen ? aLen : bLen);
 | 
					  int ret = strncmp(aName, bName, aLen > bLen ? aLen : bLen);
 | 
				
			||||||
 | 
					  if (ret == 0) { return ret; }
 | 
				
			||||||
 | 
					  return ret < 0 ? -1 : 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
// tfile name suid-colId-version.tindex
 | 
					// tfile name suid-colId-version.tindex
 | 
				
			||||||
static void tfileGenFileName(char* filename, uint64_t suid, int colId, int version) {
 | 
					static void tfileGenFileName(char* filename, uint64_t suid, int colId, int version) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,12 +16,30 @@
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
#include "index.h"
 | 
					#include "index.h"
 | 
				
			||||||
#include "indexInt.h"
 | 
					#include "indexInt.h"
 | 
				
			||||||
 | 
					#include "index_cache.h"
 | 
				
			||||||
#include "index_fst.h"
 | 
					#include "index_fst.h"
 | 
				
			||||||
#include "index_fst_counting_writer.h"
 | 
					#include "index_fst_counting_writer.h"
 | 
				
			||||||
#include "index_fst_util.h"
 | 
					#include "index_fst_util.h"
 | 
				
			||||||
#include "index_tfile.h"
 | 
					#include "index_tfile.h"
 | 
				
			||||||
 | 
					#include "tskiplist.h"
 | 
				
			||||||
#include "tutil.h"
 | 
					#include "tutil.h"
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
 | 
					class DebugInfo {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  DebugInfo(const char* str) : info(str) {
 | 
				
			||||||
 | 
					    std::cout << "------------" << info << "\t"
 | 
				
			||||||
 | 
					              << "begin"
 | 
				
			||||||
 | 
					              << "-------------" << std::endl;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  ~DebugInfo() {
 | 
				
			||||||
 | 
					    std::cout << "-----------" << info << "\t"
 | 
				
			||||||
 | 
					              << "end"
 | 
				
			||||||
 | 
					              << "--------------" << std::endl;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 private:
 | 
				
			||||||
 | 
					  std::string info;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
class FstWriter {
 | 
					class FstWriter {
 | 
				
			||||||
 public:
 | 
					 public:
 | 
				
			||||||
  FstWriter() {
 | 
					  FstWriter() {
 | 
				
			||||||
| 
						 | 
					@ -110,58 +128,6 @@ class FstReadMemory {
 | 
				
			||||||
  size_t             _size;
 | 
					  size_t             _size;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TEST(IndexTest, index_create_test) {
 | 
					 | 
				
			||||||
//  SIndexOpts *opts = indexOptsCreate();
 | 
					 | 
				
			||||||
//  SIndex *index = indexOpen(opts, "./test");
 | 
					 | 
				
			||||||
//  if (index == NULL) {
 | 
					 | 
				
			||||||
//    std::cout << "index open failed" << std::endl;
 | 
					 | 
				
			||||||
//  }
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  // write
 | 
					 | 
				
			||||||
//  for (int i = 0; i < 100000; i++) {
 | 
					 | 
				
			||||||
//    SIndexMultiTerm* terms = indexMultiTermCreate();
 | 
					 | 
				
			||||||
//    std::string val = "field";
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//    indexMultiTermAdd(terms, "tag1", strlen("tag1"), val.c_str(), val.size());
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//    val.append(std::to_string(i));
 | 
					 | 
				
			||||||
//    indexMultiTermAdd(terms, "tag2", strlen("tag2"), val.c_str(), val.size());
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//    val.insert(0, std::to_string(i));
 | 
					 | 
				
			||||||
//    indexMultiTermAdd(terms, "tag3", strlen("tag3"), val.c_str(), val.size());
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//    val.append("const");
 | 
					 | 
				
			||||||
//    indexMultiTermAdd(terms, "tag4", strlen("tag4"), val.c_str(), val.size());
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//    indexPut(index, terms, i);
 | 
					 | 
				
			||||||
//    indexMultiTermDestroy(terms);
 | 
					 | 
				
			||||||
//  }
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  // query
 | 
					 | 
				
			||||||
//  SIndexMultiTermQuery *multiQuery = indexMultiTermQueryCreate(MUST);
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  indexMultiTermQueryAdd(multiQuery, "tag1", strlen("tag1"), "field", strlen("field"), QUERY_PREFIX);
 | 
					 | 
				
			||||||
//  indexMultiTermQueryAdd(multiQuery, "tag3", strlen("tag3"), "0field0", strlen("0field0"), QUERY_TERM);
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  SArray *result = (SArray *)taosArrayInit(10, sizeof(int));
 | 
					 | 
				
			||||||
//  indexSearch(index, multiQuery, result);
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  std::cout << "taos'size : " << taosArrayGetSize(result) << std::endl;
 | 
					 | 
				
			||||||
//  for (int i = 0;  i < taosArrayGetSize(result); i++) {
 | 
					 | 
				
			||||||
//    int *v = (int *)taosArrayGet(result, i);
 | 
					 | 
				
			||||||
//    std::cout << "value --->" << *v  << std::endl;
 | 
					 | 
				
			||||||
//  }
 | 
					 | 
				
			||||||
//  // add more test case
 | 
					 | 
				
			||||||
//  indexMultiTermQueryDestroy(multiQuery);
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  indexOptsDestroy(opts);
 | 
					 | 
				
			||||||
//  indexClose(index);
 | 
					 | 
				
			||||||
//  //
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define L 100
 | 
					#define L 100
 | 
				
			||||||
#define M 100
 | 
					#define M 100
 | 
				
			||||||
#define N 100
 | 
					#define N 100
 | 
				
			||||||
| 
						 | 
					@ -183,7 +149,6 @@ int Performance_fstWriteRecords(FstWriter* b) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return L * M * N;
 | 
					  return L * M * N;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
void Performance_fstReadRecords(FstReadMemory* m) {
 | 
					void Performance_fstReadRecords(FstReadMemory* m) {
 | 
				
			||||||
  std::string str("aa");
 | 
					  std::string str("aa");
 | 
				
			||||||
  for (int i = 0; i < M; i++) {
 | 
					  for (int i = 0; i < M; i++) {
 | 
				
			||||||
| 
						 | 
					@ -218,7 +183,6 @@ void checkFstPerf() {
 | 
				
			||||||
  Performance_fstReadRecords(m);
 | 
					  Performance_fstReadRecords(m);
 | 
				
			||||||
  delete m;
 | 
					  delete m;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
void checkFstPrefixSearch() {
 | 
					void checkFstPrefixSearch() {
 | 
				
			||||||
  FstWriter*  fw = new FstWriter;
 | 
					  FstWriter*  fw = new FstWriter;
 | 
				
			||||||
  int64_t     s = taosGetTimestampUs();
 | 
					  int64_t     s = taosGetTimestampUs();
 | 
				
			||||||
| 
						 | 
					@ -296,7 +260,6 @@ void validateFst() {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  delete m;
 | 
					  delete m;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
class IndexEnv : public ::testing::Test {
 | 
					class IndexEnv : public ::testing::Test {
 | 
				
			||||||
 protected:
 | 
					 protected:
 | 
				
			||||||
  virtual void SetUp() {
 | 
					  virtual void SetUp() {
 | 
				
			||||||
| 
						 | 
					@ -315,44 +278,51 @@ class IndexEnv : public ::testing::Test {
 | 
				
			||||||
  SIndex*     index;
 | 
					  SIndex*     index;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TEST_F(IndexEnv, testPut) {
 | 
					/// TEST_F(IndexEnv, testPut) {
 | 
				
			||||||
//  // single index column
 | 
					//  /  // single index column
 | 
				
			||||||
//  {
 | 
					//      / {
 | 
				
			||||||
//    std::string colName("tag1"), colVal("Hello world");
 | 
					//    / std::string colName("tag1"), colVal("Hello world");
 | 
				
			||||||
//    SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(),
 | 
					//    / SIndexTerm* term =
 | 
				
			||||||
//    colVal.size()); SIndexMultiTerm* terms = indexMultiTermCreate(); indexMultiTermAdd(terms, term);
 | 
					//        indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), / colVal.size());
 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//    for (size_t i = 0; i < 100; i++) {
 | 
					 | 
				
			||||||
//      int tableId = i;
 | 
					 | 
				
			||||||
//      int ret = indexPut(index, terms, tableId);
 | 
					 | 
				
			||||||
//      assert(ret == 0);
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
//    indexMultiTermDestroy(terms);
 | 
					 | 
				
			||||||
//  }
 | 
					 | 
				
			||||||
//  // multi index column
 | 
					 | 
				
			||||||
//  {
 | 
					 | 
				
			||||||
//    SIndexMultiTerm* terms = indexMultiTermCreate();
 | 
					//    SIndexMultiTerm* terms = indexMultiTermCreate();
 | 
				
			||||||
//    {
 | 
					//    indexMultiTermAdd(terms, term);
 | 
				
			||||||
//      std::string colName("tag1"), colVal("Hello world");
 | 
					//    / / for (size_t i = 0; i < 100; i++) {
 | 
				
			||||||
//      SIndexTerm* term =
 | 
					//      / int tableId = i;
 | 
				
			||||||
//          indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
					//      / int ret = indexPut(index, terms, tableId);
 | 
				
			||||||
//      indexMultiTermAdd(terms, term);
 | 
					//      / assert(ret == 0);
 | 
				
			||||||
 | 
					//      /
 | 
				
			||||||
//    }
 | 
					//    }
 | 
				
			||||||
//    {
 | 
					//    / indexMultiTermDestroy(terms);
 | 
				
			||||||
//      std::string colName("tag2"), colVal("Hello world");
 | 
					//    /
 | 
				
			||||||
//      SIndexTerm* term =
 | 
					 | 
				
			||||||
//          indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
					 | 
				
			||||||
//      indexMultiTermAdd(terms, term);
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//    for (int i = 0; i < 100; i++) {
 | 
					 | 
				
			||||||
//      int tableId = i;
 | 
					 | 
				
			||||||
//      int ret = indexPut(index, terms, tableId);
 | 
					 | 
				
			||||||
//      assert(ret == 0);
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
//    indexMultiTermDestroy(terms);
 | 
					 | 
				
			||||||
//  }
 | 
					//  }
 | 
				
			||||||
//  //
 | 
					//  /  // multi index column
 | 
				
			||||||
 | 
					//      / {
 | 
				
			||||||
 | 
					//    / SIndexMultiTerm* terms = indexMultiTermCreate();
 | 
				
			||||||
 | 
					//    / {
 | 
				
			||||||
 | 
					//      / std::string colName("tag1"), colVal("Hello world");
 | 
				
			||||||
 | 
					//      / SIndexTerm* term =
 | 
				
			||||||
 | 
					//          / indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
				
			||||||
 | 
					//      / indexMultiTermAdd(terms, term);
 | 
				
			||||||
 | 
					//      /
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    / {
 | 
				
			||||||
 | 
					//      / std::string colName("tag2"), colVal("Hello world");
 | 
				
			||||||
 | 
					//      / SIndexTerm* term =
 | 
				
			||||||
 | 
					//          / indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
				
			||||||
 | 
					//      / indexMultiTermAdd(terms, term);
 | 
				
			||||||
 | 
					//      /
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    / / for (int i = 0; i < 100; i++) {
 | 
				
			||||||
 | 
					//      / int tableId = i;
 | 
				
			||||||
 | 
					//      / int ret = indexPut(index, terms, tableId);
 | 
				
			||||||
 | 
					//      / assert(ret == 0);
 | 
				
			||||||
 | 
					//      /
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					//    / indexMultiTermDestroy(terms);
 | 
				
			||||||
 | 
					//    /
 | 
				
			||||||
 | 
					//  }
 | 
				
			||||||
 | 
					//  /  //
 | 
				
			||||||
 | 
					//      /
 | 
				
			||||||
//}
 | 
					//}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TFileObj {
 | 
					class TFileObj {
 | 
				
			||||||
| 
						 | 
					@ -421,6 +391,7 @@ class TFileObj {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int colId_;
 | 
					  int colId_;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class IndexTFileEnv : public ::testing::Test {
 | 
					class IndexTFileEnv : public ::testing::Test {
 | 
				
			||||||
 protected:
 | 
					 protected:
 | 
				
			||||||
  virtual void SetUp() {
 | 
					  virtual void SetUp() {
 | 
				
			||||||
| 
						 | 
					@ -428,22 +399,6 @@ class IndexTFileEnv : public ::testing::Test {
 | 
				
			||||||
    taosMkDir(dir.c_str());
 | 
					    taosMkDir(dir.c_str());
 | 
				
			||||||
    tfInit();
 | 
					    tfInit();
 | 
				
			||||||
    fObj = new TFileObj(dir, colName);
 | 
					    fObj = new TFileObj(dir, colName);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    // std::string colName("voltage");
 | 
					 | 
				
			||||||
    // header.suid = 1;
 | 
					 | 
				
			||||||
    // header.version = 1;
 | 
					 | 
				
			||||||
    // memcpy(header.colName, colName.c_str(), colName.size());
 | 
					 | 
				
			||||||
    // header.colType = TSDB_DATA_TYPE_BINARY;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // std::string path(dir);
 | 
					 | 
				
			||||||
    // int         colId = 2;
 | 
					 | 
				
			||||||
    // char        buf[64] = {0};
 | 
					 | 
				
			||||||
    // sprintf(buf, "%" PRIu64 "-%d-%d.tindex", header.suid, colId, header.version);
 | 
					 | 
				
			||||||
    // path.append("/").append(buf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // ctx = writerCtxCreate(TFile, path.c_str(), false, 64 * 1024 * 1024);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // twrite = tfileWriterCreate(ctx, &header);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  virtual void TearDown() {
 | 
					  virtual void TearDown() {
 | 
				
			||||||
| 
						 | 
					@ -460,16 +415,8 @@ class IndexTFileEnv : public ::testing::Test {
 | 
				
			||||||
  int coldId = 2;
 | 
					  int coldId = 2;
 | 
				
			||||||
  int version = 1;
 | 
					  int version = 1;
 | 
				
			||||||
  int colType = TSDB_DATA_TYPE_BINARY;
 | 
					  int colType = TSDB_DATA_TYPE_BINARY;
 | 
				
			||||||
 | 
					 | 
				
			||||||
  // WriterCtx*   ctx = NULL;
 | 
					 | 
				
			||||||
  // TFileHeader  header;
 | 
					 | 
				
			||||||
  // TFileWriter* twrite = NULL;
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// static TFileWriter* genTFileWriter(const char* path, TFileHeader* header) {
 | 
					 | 
				
			||||||
//  char       buf[128] = {0};
 | 
					 | 
				
			||||||
//  WriterCtx* ctx = writerCtxCreate(TFile, path, false, )
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
static TFileValue* genTFileValue(const char* val) {
 | 
					static TFileValue* genTFileValue(const char* val) {
 | 
				
			||||||
  TFileValue* tv = (TFileValue*)calloc(1, sizeof(TFileValue));
 | 
					  TFileValue* tv = (TFileValue*)calloc(1, sizeof(TFileValue));
 | 
				
			||||||
  int32_t     vlen = strlen(val) + 1;
 | 
					  int32_t     vlen = strlen(val) + 1;
 | 
				
			||||||
| 
						 | 
					@ -489,10 +436,9 @@ static void destroyTFileValue(void* val) {
 | 
				
			||||||
  taosArrayDestroy(tv->tableId);
 | 
					  taosArrayDestroy(tv->tableId);
 | 
				
			||||||
  free(tv);
 | 
					  free(tv);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
TEST_F(IndexTFileEnv, test_tfile_write) {
 | 
					TEST_F(IndexTFileEnv, test_tfile_write) {
 | 
				
			||||||
  TFileValue* v1 = genTFileValue("c");
 | 
					  TFileValue* v1 = genTFileValue("c");
 | 
				
			||||||
  TFileValue* v2 = genTFileValue("a");
 | 
					  TFileValue* v2 = genTFileValue("ab");
 | 
				
			||||||
  TFileValue* v3 = genTFileValue("b");
 | 
					  TFileValue* v3 = genTFileValue("b");
 | 
				
			||||||
  TFileValue* v4 = genTFileValue("d");
 | 
					  TFileValue* v4 = genTFileValue("d");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -510,7 +456,7 @@ TEST_F(IndexTFileEnv, test_tfile_write) {
 | 
				
			||||||
  taosArrayDestroy(data);
 | 
					  taosArrayDestroy(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::string colName("voltage");
 | 
					  std::string colName("voltage");
 | 
				
			||||||
  std::string colVal("b");
 | 
					  std::string colVal("ab");
 | 
				
			||||||
  SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
					  SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
				
			||||||
  SIndexTermQuery query = {.term = term, .qType = QUERY_TERM};
 | 
					  SIndexTermQuery query = {.term = term, .qType = QUERY_TERM};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -521,3 +467,110 @@ TEST_F(IndexTFileEnv, test_tfile_write) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // tfileWriterDestroy(twrite);
 | 
					  // tfileWriterDestroy(twrite);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					class CacheObj {
 | 
				
			||||||
 | 
					 public:
 | 
				
			||||||
 | 
					  CacheObj() {
 | 
				
			||||||
 | 
					    // TODO
 | 
				
			||||||
 | 
					    cache = indexCacheCreate();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  int Put(SIndexTerm* term, int16_t colId, int32_t version, uint64_t uid) {
 | 
				
			||||||
 | 
					    int ret = indexCachePut(cache, term, colId, version, uid);
 | 
				
			||||||
 | 
					    if (ret != 0) {
 | 
				
			||||||
 | 
					      //
 | 
				
			||||||
 | 
					      std::cout << "failed to put into cache: " << ret << std::endl;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  int Get(SIndexTermQuery* query, int16_t colId, int32_t version, SArray* result, STermValueType* s) {
 | 
				
			||||||
 | 
					    int ret = indexCacheSearch(cache, query, colId, version, result, s);
 | 
				
			||||||
 | 
					    if (ret != 0) {
 | 
				
			||||||
 | 
					      //
 | 
				
			||||||
 | 
					      std::cout << "failed to get from cache:" << ret << std::endl;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  ~CacheObj() {
 | 
				
			||||||
 | 
					    // TODO
 | 
				
			||||||
 | 
					    indexCacheDestroy(cache);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 private:
 | 
				
			||||||
 | 
					  IndexCache* cache = NULL;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class IndexCacheEnv : public ::testing::Test {
 | 
				
			||||||
 | 
					 protected:
 | 
				
			||||||
 | 
					  virtual void SetUp() {
 | 
				
			||||||
 | 
					    // TODO
 | 
				
			||||||
 | 
					    coj = new CacheObj();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  virtual void TearDown() {
 | 
				
			||||||
 | 
					    delete coj;
 | 
				
			||||||
 | 
					    // formate
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  CacheObj* coj;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_TERM_KEY_LEN 128
 | 
				
			||||||
 | 
					TEST_F(IndexCacheEnv, cache_test) {
 | 
				
			||||||
 | 
					  int     version = 0;
 | 
				
			||||||
 | 
					  int16_t colId = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint64_t    suid = 0;
 | 
				
			||||||
 | 
					  std::string colName("voltage");
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    std::string colVal("v1");
 | 
				
			||||||
 | 
					    SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
				
			||||||
 | 
					    coj->Put(term, colId, version++, suid++);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    std::string colVal("v3");
 | 
				
			||||||
 | 
					    SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
				
			||||||
 | 
					    coj->Put(term, colId, version++, suid++);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    std::string colVal("v2");
 | 
				
			||||||
 | 
					    SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
				
			||||||
 | 
					    coj->Put(term, colId, version++, suid++);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    std::string colVal("v3");
 | 
				
			||||||
 | 
					    SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
				
			||||||
 | 
					    coj->Put(term, colId, version++, suid++);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    std::string colVal("v3");
 | 
				
			||||||
 | 
					    SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
				
			||||||
 | 
					    coj->Put(term, colId, version++, suid++);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    std::string colVal("v4");
 | 
				
			||||||
 | 
					    for (size_t i = 0; i < 100; i++) {
 | 
				
			||||||
 | 
					      colVal[colVal.size() - 1] = 'a' + i;
 | 
				
			||||||
 | 
					      SIndexTerm* term =
 | 
				
			||||||
 | 
					          indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
				
			||||||
 | 
					      coj->Put(term, colId, version++, suid++);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    std::string colVal("v3");
 | 
				
			||||||
 | 
					    SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
				
			||||||
 | 
					    SIndexTermQuery query = {.term = term, .qType = QUERY_TERM};
 | 
				
			||||||
 | 
					    SArray*         ret = (SArray*)taosArrayInit(4, sizeof(suid));
 | 
				
			||||||
 | 
					    STermValueType  valType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    coj->Get(&query, colId, 10000, ret, &valType);
 | 
				
			||||||
 | 
					    assert(taosArrayGetSize(ret) == 3);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    std::string colVal("v2");
 | 
				
			||||||
 | 
					    SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), colVal.c_str(), colVal.size());
 | 
				
			||||||
 | 
					    SIndexTermQuery query = {.term = term, .qType = QUERY_TERM};
 | 
				
			||||||
 | 
					    SArray*         ret = (SArray*)taosArrayInit(4, sizeof(suid));
 | 
				
			||||||
 | 
					    STermValueType  valType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    coj->Get(&query, colId, 10000, ret, &valType);
 | 
				
			||||||
 | 
					    assert(taosArrayGetSize(ret) == 1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
#define TDENGINE_ASTTOMSG_H
 | 
					#define TDENGINE_ASTTOMSG_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "parserInt.h"
 | 
					#include "parserInt.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SCreateUserMsg* buildUserManipulationMsg(SSqlInfo* pInfo, int32_t* outputLen, int64_t id, char* msgBuf, int32_t msgLen);
 | 
					SCreateUserMsg* buildUserManipulationMsg(SSqlInfo* pInfo, int32_t* outputLen, int64_t id, char* msgBuf, int32_t msgLen);
 | 
				
			||||||
SCreateAcctMsg* buildAcctManipulationMsg(SSqlInfo* pInfo, int32_t* outputLen, int64_t id, char* msgBuf, int32_t msgLen);
 | 
					SCreateAcctMsg* buildAcctManipulationMsg(SSqlInfo* pInfo, int32_t* outputLen, int64_t id, char* msgBuf, int32_t msgLen);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4358,7 +4358,7 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, SDclStm
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      pDcl->pMsg = (char*)buildUserManipulationMsg(pInfo, &pDcl->msgLen, pCtx->requestId, msgBuf, msgBufLen);
 | 
					      pDcl->pMsg = (char*)buildUserManipulationMsg(pInfo, &pDcl->msgLen, pCtx->requestId, msgBuf, msgBufLen);
 | 
				
			||||||
      pDcl->msgType = (pInfo->type == TSDB_SQL_CREATE_USER)? TSDB_MSG_TYPE_CREATE_USER:TSDB_MSG_TYPE_ALTER_USER;
 | 
					      pDcl->msgType = (pInfo->type == TSDB_SQL_CREATE_USER)? TDMT_MND_CREATE_USER:TDMT_MND_ALTER_USER;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4395,20 +4395,20 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, SDclStm
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      pDcl->pMsg = (char*)buildAcctManipulationMsg(pInfo, &pDcl->msgLen, pCtx->requestId, msgBuf, msgBufLen);
 | 
					      pDcl->pMsg = (char*)buildAcctManipulationMsg(pInfo, &pDcl->msgLen, pCtx->requestId, msgBuf, msgBufLen);
 | 
				
			||||||
      pDcl->msgType = (pInfo->type == TSDB_SQL_CREATE_ACCT)? TSDB_MSG_TYPE_CREATE_ACCT:TSDB_MSG_TYPE_ALTER_ACCT;
 | 
					      pDcl->msgType = (pInfo->type == TSDB_SQL_CREATE_ACCT)? TDMT_MND_CREATE_ACCT:TDMT_MND_ALTER_ACCT;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case TSDB_SQL_DROP_ACCT:
 | 
					    case TSDB_SQL_DROP_ACCT:
 | 
				
			||||||
    case TSDB_SQL_DROP_USER: {
 | 
					    case TSDB_SQL_DROP_USER: {
 | 
				
			||||||
      pDcl->pMsg = (char*)buildDropUserMsg(pInfo, &pDcl->msgLen, pCtx->requestId, msgBuf, msgBufLen);
 | 
					      pDcl->pMsg = (char*)buildDropUserMsg(pInfo, &pDcl->msgLen, pCtx->requestId, msgBuf, msgBufLen);
 | 
				
			||||||
      pDcl->msgType = (pInfo->type == TSDB_SQL_DROP_ACCT)? TSDB_MSG_TYPE_DROP_ACCT:TSDB_MSG_TYPE_DROP_USER;
 | 
					      pDcl->msgType = (pInfo->type == TSDB_SQL_DROP_ACCT)? TDMT_MND_DROP_ACCT:TDMT_MND_DROP_USER;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    case TSDB_SQL_SHOW: {
 | 
					    case TSDB_SQL_SHOW: {
 | 
				
			||||||
      code = setShowInfo(&pInfo->pMiscInfo->showOpt, pCtx, (void**)&pDcl->pMsg, &pDcl->msgLen, pMsgBuf);
 | 
					      code = setShowInfo(&pInfo->pMiscInfo->showOpt, pCtx, (void**)&pDcl->pMsg, &pDcl->msgLen, pMsgBuf);
 | 
				
			||||||
      pDcl->msgType = TSDB_MSG_TYPE_SHOW;
 | 
					      pDcl->msgType = TDMT_MND_SHOW;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4431,7 +4431,7 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, SDclStm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      pDcl->pMsg = (char*)pUseDbMsg;
 | 
					      pDcl->pMsg = (char*)pUseDbMsg;
 | 
				
			||||||
      pDcl->msgLen = sizeof(SUseDbMsg);
 | 
					      pDcl->msgLen = sizeof(SUseDbMsg);
 | 
				
			||||||
      pDcl->msgType = TSDB_MSG_TYPE_USE_DB;
 | 
					      pDcl->msgType = TDMT_MND_USE_DB;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4457,11 +4457,9 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, SDclStm
 | 
				
			||||||
        return TSDB_CODE_TSC_INVALID_OPERATION;
 | 
					        return TSDB_CODE_TSC_INVALID_OPERATION;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      strncpy(pCreateMsg->db, token.z, token.n);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      pDcl->pMsg = (char*)pCreateMsg;
 | 
					      pDcl->pMsg = (char*)pCreateMsg;
 | 
				
			||||||
      pDcl->msgLen = sizeof(SCreateDbMsg);
 | 
					      pDcl->msgLen = sizeof(SCreateDbMsg);
 | 
				
			||||||
      pDcl->msgType = (pInfo->type == TSDB_SQL_CREATE_DB)? TSDB_MSG_TYPE_CREATE_DB:TSDB_MSG_TYPE_ALTER_DB;
 | 
					      pDcl->msgType = (pInfo->type == TSDB_SQL_CREATE_DB)? TDMT_MND_CREATE_DB:TDMT_MND_ALTER_DB;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4483,7 +4481,7 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, SDclStm
 | 
				
			||||||
      pDropDbMsg->ignoreNotExists = pInfo->pMiscInfo->existsCheck ? 1 : 0;
 | 
					      pDropDbMsg->ignoreNotExists = pInfo->pMiscInfo->existsCheck ? 1 : 0;
 | 
				
			||||||
      assert(code == TSDB_CODE_SUCCESS && name.type == TSDB_DB_NAME_T);
 | 
					      assert(code == TSDB_CODE_SUCCESS && name.type == TSDB_DB_NAME_T);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      pDcl->msgType = TSDB_MSG_TYPE_DROP_DB;
 | 
					      pDcl->msgType = TDMT_MND_DROP_DB;
 | 
				
			||||||
      pDcl->msgLen = sizeof(SDropDbMsg);
 | 
					      pDcl->msgLen = sizeof(SDropDbMsg);
 | 
				
			||||||
      pDcl->pMsg = (char*)pDropDbMsg;
 | 
					      pDcl->pMsg = (char*)pDropDbMsg;
 | 
				
			||||||
      return TSDB_CODE_SUCCESS;
 | 
					      return TSDB_CODE_SUCCESS;
 | 
				
			||||||
| 
						 | 
					@ -4497,7 +4495,7 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, SDclStm
 | 
				
			||||||
          return code;
 | 
					          return code;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        pDcl->pMsg = (char*)buildCreateTableMsg(pCreateTable, &pDcl->msgLen, pCtx, pMsgBuf);
 | 
					        pDcl->pMsg = (char*)buildCreateTableMsg(pCreateTable, &pDcl->msgLen, pCtx, pMsgBuf);
 | 
				
			||||||
        pDcl->msgType = (pCreateTable->type == TSQL_CREATE_TABLE)? TSDB_MSG_TYPE_CREATE_TABLE:TSDB_MSG_TYPE_CREATE_STB;
 | 
					        pDcl->msgType = (pCreateTable->type == TSQL_CREATE_TABLE)? TDMT_MND_CREATE_TABLE:TDMT_MND_CREATE_STB;
 | 
				
			||||||
      } else if (pCreateTable->type == TSQL_CREATE_CTABLE) {
 | 
					      } else if (pCreateTable->type == TSQL_CREATE_CTABLE) {
 | 
				
			||||||
        //        if ((code = doCheckForCreateFromStable(pSql, pInfo)) != TSDB_CODE_SUCCESS) {
 | 
					        //        if ((code = doCheckForCreateFromStable(pSql, pInfo)) != TSDB_CODE_SUCCESS) {
 | 
				
			||||||
        //          return code;
 | 
					        //          return code;
 | 
				
			||||||
| 
						 | 
					@ -4517,7 +4515,7 @@ int32_t qParserValidateDclSqlNode(SSqlInfo* pInfo, SParseBasicCtx* pCtx, SDclStm
 | 
				
			||||||
        return terrno;
 | 
					        return terrno;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      pDcl->msgType = TSDB_MSG_TYPE_DROP_STB;
 | 
					      pDcl->msgType = TDMT_MND_DROP_STB;
 | 
				
			||||||
      return TSDB_CODE_SUCCESS;
 | 
					      return TSDB_CODE_SUCCESS;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@
 | 
				
			||||||
#include "catalog.h"
 | 
					#include "catalog.h"
 | 
				
			||||||
#include "parserUtil.h"
 | 
					#include "parserUtil.h"
 | 
				
			||||||
#include "queryInfoUtil.h"
 | 
					#include "queryInfoUtil.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define IS_RAW_PAYLOAD(t) \
 | 
					#define IS_RAW_PAYLOAD(t) \
 | 
				
			||||||
  (((int)(t)) == PAYLOAD_TYPE_RAW)  // 0: K-V payload for non-prepare insert, 1: rawPayload for prepare insert
 | 
					  (((int)(t)) == PAYLOAD_TYPE_RAW)  // 0: K-V payload for non-prepare insert, 1: rawPayload for prepare insert
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@ bool isInsertSql(const char* pStr, size_t length) {
 | 
				
			||||||
  } while (1);
 | 
					  } while (1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool qIsDclQuery(const SQueryNode* pQuery) {
 | 
					bool qIsDdlQuery(const SQueryNode* pQuery) {
 | 
				
			||||||
  return TSDB_SQL_INSERT != pQuery->type && TSDB_SQL_SELECT != pQuery->type;
 | 
					  return TSDB_SQL_INSERT != pQuery->type && TSDB_SQL_SELECT != pQuery->type;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -227,3 +227,7 @@ void qParserClearupMetaRequestInfo(SCatalogReq* pMetaReq) {
 | 
				
			||||||
  taosArrayDestroy(pMetaReq->pTableName);
 | 
					  taosArrayDestroy(pMetaReq->pTableName);
 | 
				
			||||||
  taosArrayDestroy(pMetaReq->pUdf);
 | 
					  taosArrayDestroy(pMetaReq->pUdf);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void qDestoryQuery(SQueryNode* pQuery) {
 | 
				
			||||||
 | 
					  // todo
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
#include "parser.h"
 | 
					#include "parser.h"
 | 
				
			||||||
#include "taoserror.h"
 | 
					#include "taoserror.h"
 | 
				
			||||||
#include "tutil.h"
 | 
					#include "tutil.h"
 | 
				
			||||||
| 
						 | 
					@ -1825,7 +1825,7 @@ int tscTransferTableNameList(SSqlObj *pSql, const char *pNameList, int32_t lengt
 | 
				
			||||||
  SSqlCmd *pCmd = &pSql->cmd;
 | 
					  SSqlCmd *pCmd = &pSql->cmd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pCmd->command = TSDB_SQL_MULTI_META;
 | 
					  pCmd->command = TSDB_SQL_MULTI_META;
 | 
				
			||||||
  pCmd->msgType = TSDB_MSG_TYPE_TABLES_META;
 | 
					  pCmd->msgType = TDMT_VND_TABLES_META;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int   code = TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH;
 | 
					  int   code = TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH;
 | 
				
			||||||
  char *str = (char *)pNameList;
 | 
					  char *str = (char *)pNameList;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,7 @@ extern "C" {
 | 
				
			||||||
#include "tarray.h"
 | 
					#include "tarray.h"
 | 
				
			||||||
#include "planner.h"
 | 
					#include "planner.h"
 | 
				
			||||||
#include "parser.h"
 | 
					#include "parser.h"
 | 
				
			||||||
#include "taosmsg.h"
 | 
					#include "tmsg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define QNODE_TAGSCAN       1
 | 
					#define QNODE_TAGSCAN       1
 | 
				
			||||||
#define QNODE_TABLESCAN     2
 | 
					#define QNODE_TABLESCAN     2
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue