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 27 28

typedef enum _TAOS_SYNC_ROLE {
  TAOS_SYNC_ROLE_OFFLINE,
  TAOS_SYNC_ROLE_UNSYNCED,
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
29
  TAOS_SYNC_ROLE_SYNCING,
J
Jeff Tao 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42
  TAOS_SYNC_ROLE_SLAVE,
  TAOS_SYNC_ROLE_MASTER,
} ESyncRole;

typedef enum _TAOS_SYNC_STATUS {
  TAOS_SYNC_STATUS_INIT,
  TAOS_SYNC_STATUS_START,
  TAOS_SYNC_STATUS_FILE,
  TAOS_SYNC_STATUS_CACHE,
} 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 54 55 56 57

typedef struct {
  int       selfIndex;
  uint32_t  nodeId[TAOS_SYNC_MAX_REPLICA];
  int       role[TAOS_SYNC_MAX_REPLICA];  
} 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)(void *ahandle, char *name, uint32_t *index, uint32_t eindex, int64_t *size, uint64_t *fversion); 
J
Jeff Tao 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80 81

// 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
typedef int      (*FGetWalInfo)(void *ahandle, char *name, uint32_t *index); 
 
// when a forward pkt is received, call this to handle data 
typedef int      (*FWriteToCache)(void *ahandle, void *pHead, int type);

// when forward is confirmed by peer, master call this API to notify app
typedef void     (*FConfirmForward)(void *ahandle, void *mhandle, int32_t code);

// when role is changed, call this to notify app
typedef void     (*FNotifyRole)(void *ahandle, int8_t role);

82 83 84
// if a number of retrieving data failed, call this to start flow control 
typedef void     (*FNotifyFlowCtrl)(void *ahandle, int32_t mseconds);

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

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

typedef void* tsync_h;

J
Jeff Tao 已提交
106
tsync_h syncStart(const SSyncInfo *);
J
Jeff Tao 已提交
107
void    syncStop(tsync_h shandle);
108 109
int32_t syncReconfig(tsync_h shandle, const SSyncCfg *);
int32_t syncForwardToPeer(tsync_h shandle, void *pHead, void *mhandle, int qtype);
J
Jeff Tao 已提交
110 111 112 113 114 115
void    syncConfirmForward(tsync_h shandle, uint64_t version, int32_t code);
void    syncRecover(tsync_h shandle);      // recover from other nodes:
int     syncGetNodesRole(tsync_h shandle, SNodesRole *);

extern  char *syncRole[];

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

#ifdef __cplusplus
}
#endif

#endif  // TDENGINE_SYNC_H