tsync.h 4.3 KB
Newer Older
J
Jeff Tao 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 * 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 TDENGINE_SYNC_H
#define TDENGINE_SYNC_H

#ifdef __cplusplus
extern "C" {
#endif

#define TAOS_SYNC_MAX_REPLICA 5
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
24
#define TAOS_SYNC_MAX_INDEX   0x7FFFFFFF
J
Jeff Tao 已提交
25

S
Shengliang Guan 已提交
26
typedef enum {
S
TD-2157  
Shengliang Guan 已提交
27 28 29 30 31
  TAOS_SYNC_ROLE_OFFLINE  = 0,
  TAOS_SYNC_ROLE_UNSYNCED = 1,
  TAOS_SYNC_ROLE_SYNCING  = 2,
  TAOS_SYNC_ROLE_SLAVE    = 3,
  TAOS_SYNC_ROLE_MASTER   = 4
J
Jeff Tao 已提交
32 33
} ESyncRole;

S
Shengliang Guan 已提交
34
typedef enum {
S
TD-2157  
Shengliang Guan 已提交
35 36 37 38
  TAOS_SYNC_STATUS_INIT  = 0,
  TAOS_SYNC_STATUS_START = 1,
  TAOS_SYNC_STATUS_FILE  = 2,
  TAOS_SYNC_STATUS_CACHE = 3
J
Jeff Tao 已提交
39 40 41 42
} ESyncStatus;

typedef struct {
  uint32_t  nodeId;    // node ID assigned by TDengine
J
jtao1735 已提交
43 44
  uint16_t  nodePort;  // node sync Port
  char      nodeFqdn[TSDB_FQDN_LEN]; // node FQDN  
J
Jeff Tao 已提交
45 46 47 48 49 50 51
} SNodeInfo;

typedef struct {
  int8_t     quorum;    // number of confirms required, >=1 
  int8_t     replica;   // number of replications, >=1
  SNodeInfo  nodeInfo[TAOS_SYNC_MAX_REPLICA];
} SSyncCfg;
J
Jeff Tao 已提交
52 53

typedef struct {
S
Shengliang Guan 已提交
54 55 56
  int32_t  selfIndex;
  uint32_t nodeId[TAOS_SYNC_MAX_REPLICA];
  int32_t  role[TAOS_SYNC_MAX_REPLICA];
J
Jeff Tao 已提交
57
} SNodesRole;
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
58 59 60 61 62 63 64 65 66

/* 
  if name is empty(name[0] is zero), get the file from index or after, but not larger than eindex. If a file
  is found between index and eindex, index shall be updated, name shall be set, size shall be set to 
  file size, and file magic number shall be returned. 

  if name is provided(name[0] is not zero), get the named file at the specified index. If not there, return
  zero. If it is there, set the size to file size, and return file magic number. Index shall not be updated.
*/
67
typedef uint32_t (*FGetFileInfo)(int32_t vgId, char *name, uint32_t *index, uint32_t eindex, int64_t *size, uint64_t *fversion); 
J
Jeff Tao 已提交
68 69 70

// get the wal file from index or after
// return value, -1: error, 1:more wal files, 0:last WAL. if name[0]==0, no WAL file
71
typedef int32_t  (*FGetWalInfo)(int32_t vgId, char *fileName, int64_t *fileId); 
J
Jeff Tao 已提交
72
 
S
TD-1918  
Shengliang Guan 已提交
73
// when a forward pkt is received, call this to handle data
74
typedef int32_t  (*FWriteToCache)(int32_t vgId, void *pHead, int32_t qtype, void *pMsg);
J
Jeff Tao 已提交
75 76

// when forward is confirmed by peer, master call this API to notify app
77
typedef void     (*FConfirmForward)(int32_t vgId, void *mhandle, int32_t code);
J
Jeff Tao 已提交
78 79

// when role is changed, call this to notify app
80
typedef void     (*FNotifyRole)(int32_t vgId, int8_t role);
J
Jeff Tao 已提交
81

82
// if a number of retrieving data failed, call this to start flow control 
S
Shengliang Guan 已提交
83
typedef void     (*FNotifyFlowCtrl)(int32_t vgId, int32_t level);
84

85
// when data file is synced successfully, notity app
86
typedef int32_t  (*FNotifyFileSynced)(int32_t vgId, uint64_t fversion);
87

S
TD-1926  
Shengliang Guan 已提交
88
// get file version
S
TD-1926  
Shengliang Guan 已提交
89
typedef int32_t  (*FGetVersion)(int32_t vgId, uint64_t *fver, uint64_t *vver);
S
TD-1926  
Shengliang Guan 已提交
90

J
Jeff Tao 已提交
91
typedef struct {
S
Shengliang Guan 已提交
92 93 94
  int32_t  vgId;       // vgroup ID
  uint64_t version;    // initial version
  SSyncCfg syncCfg;    // configuration from mgmt
S
TD-2166  
Shengliang Guan 已提交
95
  char     path[TSDB_FILENAME_LEN];  // path to the file
S
Shengliang Guan 已提交
96 97 98 99 100 101
  FGetFileInfo      getFileInfo;
  FGetWalInfo       getWalInfo;
  FWriteToCache     writeToCache;
  FConfirmForward   confirmForward;
  FNotifyRole       notifyRole;
  FNotifyFlowCtrl   notifyFlowCtrl;
102
  FNotifyFileSynced notifyFileSynced;
S
TD-1926  
Shengliang Guan 已提交
103
  FGetVersion       getVersion;
J
Jeff Tao 已提交
104 105
} SSyncInfo;

S
Shengliang Guan 已提交
106
typedef void *tsync_h;
J
Jeff Tao 已提交
107

S
Shengliang Guan 已提交
108 109 110
int32_t syncInit();
void    syncCleanUp();

陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
111 112 113
int64_t syncStart(const SSyncInfo *);
void    syncStop(int64_t rid);
int32_t syncReconfig(int64_t rid, const SSyncCfg *);
S
Shengliang Guan 已提交
114
int32_t syncForwardToPeer(int64_t rid, void *pHead, void *mhandle, int32_t qtype);
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
115
void    syncConfirmForward(int64_t rid, uint64_t version, int32_t code);
S
Shengliang Guan 已提交
116 117
void    syncRecover(int64_t rid);  // recover from other nodes:
int32_t syncGetNodesRole(int64_t rid, SNodesRole *);
J
Jeff Tao 已提交
118

S
Shengliang Guan 已提交
119
extern char *syncRole[];
J
Jeff Tao 已提交
120

J
Jeff Tao 已提交
121
//global configurable parameters
S
Shengliang Guan 已提交
122 123 124
extern int32_t  sDebugFlag;
extern char     tsArbitrator[];
extern uint16_t tsSyncPort;
J
Jeff Tao 已提交
125 126 127 128 129 130

#ifdef __cplusplus
}
#endif

#endif  // TDENGINE_SYNC_H