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 29 30 31 32 33 34 35 36 37 38 39 40 41

typedef enum _TAOS_SYNC_ROLE {
  TAOS_SYNC_ROLE_OFFLINE,
  TAOS_SYNC_ROLE_UNSYNCED,
  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 已提交
42 43
  uint16_t  nodePort;  // node sync Port
  char      nodeFqdn[TSDB_FQDN_LEN]; // node FQDN  
J
Jeff Tao 已提交
44 45 46 47 48 49 50
} 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 已提交
51 52 53 54 55 56

typedef struct {
  int       selfIndex;
  uint32_t  nodeId[TAOS_SYNC_MAX_REPLICA];
  int       role[TAOS_SYNC_MAX_REPLICA];  
} SNodesRole;
陶建辉(Jeff)'s avatar
陶建辉(Jeff) 已提交
57 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.
*/
typedef uint32_t (*FGetFileInfo)(void *ahandle, char *name, uint32_t *index, uint32_t eindex, int32_t *size, uint64_t *fversion); 
J
Jeff Tao 已提交
67 68 69 70 71 72 73 74 75 76 77 78 79 80

// 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);

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

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

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

typedef void* tsync_h;

J
Jeff Tao 已提交
105
tsync_h syncStart(const SSyncInfo *);
J
Jeff Tao 已提交
106
void    syncStop(tsync_h shandle);
107 108
int32_t syncReconfig(tsync_h shandle, const SSyncCfg *);
int32_t syncForwardToPeer(tsync_h shandle, void *pHead, void *mhandle, int qtype);
J
Jeff Tao 已提交
109 110 111 112 113 114
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 已提交
115
//global configurable parameters
J
Jeff Tao 已提交
116 117 118
extern  int   tsMaxSyncNum;
extern  int   tsSyncTcpThreads;
extern  int   tsMaxWatchFiles;
J
Jeff Tao 已提交
119
extern  int   tsSyncTimer;
J
Jeff Tao 已提交
120
extern  int   tsMaxFwdInfo; 
J
Jeff Tao 已提交
121
extern  int   sDebugFlag;
J
jtao1735 已提交
122
extern  char  tsArbitrator[];
S
slguan 已提交
123
extern  uint16_t tsSyncPort;
J
Jeff Tao 已提交
124 125 126 127 128 129

#ifdef __cplusplus
}
#endif

#endif  // TDENGINE_SYNC_H