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 26

typedef enum _TAOS_SYNC_ROLE {
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 34
} ESyncRole;

typedef enum _TAOS_SYNC_STATUS {
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 
83
typedef void     (*FNotifyFlowCtrl)(int32_t vgId, int32_t mseconds);
84

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

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

S
Shengliang Guan 已提交
102
typedef void *tsync_h;
J
Jeff Tao 已提交
103

S
Shengliang Guan 已提交
104 105 106
int32_t syncInit();
void    syncCleanUp();

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

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

J
Jeff Tao 已提交
117
//global configurable parameters
S
Shengliang Guan 已提交
118 119 120 121 122 123 124 125
extern int32_t  tsMaxSyncNum;
extern int32_t  tsSyncTcpThreads;
extern int32_t  tsMaxWatchFiles;
extern int32_t  tsSyncTimer;
extern int32_t  tsMaxFwdInfo;
extern int32_t  sDebugFlag;
extern char     tsArbitrator[];
extern uint16_t tsSyncPort;
J
Jeff Tao 已提交
126 127 128 129 130 131

#ifdef __cplusplus
}
#endif

#endif  // TDENGINE_SYNC_H