summaryrefslogtreecommitdiff
path: root/src/include/gtm/gtm_client.h
blob: 744118f2368fb9eb7cc6f1d14306ee49e6339ba6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
/*-------------------------------------------------------------------------
 *
 * gtm_client.h
 *
 *
 * Portions Copyright (c) 2012-2014, TransLattice, Inc.
 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 * Portions Copyright (c) 2010-2012 Postgres-XC Development Group
 *
 * $PostgreSQL$
 *
 *-------------------------------------------------------------------------
 */
#ifndef GTM_CLIENT_H
#define GTM_CLIENT_H

#include "gtm/gtm_c.h"
#include "gtm/gtm_seq.h"
#include "gtm/gtm_txn.h"
#include "gtm/gtm_msg.h"
#include "gtm/register.h"
#include "gtm/libpq-fe.h"

typedef union GTM_ResultData
{
	GTM_TransactionHandle		grd_txnhandle;	/* TXN_BEGIN */

	struct
	{
		GlobalTransactionId		gxid;
		GTM_Timestamp			timestamp;
	} grd_gxid_tp;								/* TXN_BEGIN_GETGXID */

	GlobalTransactionId			grd_gxid;			/* TXN_PREPARE		
													 * TXN_START_PREPARED
													 * TXN_ROLLBACK
													 */
	struct {
		GlobalTransactionId			gxid;
													/* TXN_COMMIT
													 * TXN_COMMIT_PREPARED
													 */
		int							status;
	} grd_eof_txn;

	GlobalTransactionId			grd_next_gxid;

	struct
	{
		GTM_TransactionHandle	txnhandle;
		GlobalTransactionId		gxid;
	} grd_txn;									/* TXN_GET_GXID */

	GTM_SequenceKeyData			grd_seqkey;		/* SEQUENCE_INIT
												 * SEQUENCE_RESET
												 * SEQUENCE_CLOSE */
	struct
	{
		GTM_SequenceKeyData		seqkey;
		GTM_Sequence			seqval;
		GTM_Sequence			rangemax;
	} grd_seq;									/* SEQUENCE_GET_CURRENT
												 * SEQUENCE_GET_NEXT */
	struct
	{
		int						seq_count;
		GTM_SeqInfo			   *seq;
	} grd_seq_list;								/* SEQUENCE_GET_LIST */

	struct
	{
		int				txn_count; 				/* TXN_BEGIN_GETGXID_MULTI */
		GlobalTransactionId		txn_gxid[GTM_MAX_GLOBAL_TRANSACTIONS];
		GTM_Timestamp			timestamp;
	} grd_txn_get_multi;

	struct
	{
		int				txn_count;				/* TXN_COMMIT_MULTI */
		int				status[GTM_MAX_GLOBAL_TRANSACTIONS];
	} grd_txn_rc_multi;

	struct
	{
		GTM_TransactionHandle	txnhandle;		/* SNAPSHOT_GXID_GET */
		GlobalTransactionId		gxid;			/* SNAPSHOT_GET */
		int						txn_count;		/* SNAPSHOT_GET_MULTI */
		int						status[GTM_MAX_GLOBAL_TRANSACTIONS];
	} grd_txn_snap_multi;

	struct
	{
		GlobalTransactionId		gxid;
		GlobalTransactionId		prepared_gxid;
		int				nodelen;
		char			*nodestring;
	} grd_txn_get_gid_data;					/* TXN_GET_GID_DATA_RESULT */

	struct
	{
		char				*ptr;
		size_t				len;
	} grd_txn_gid_list;						/* TXN_GXID_LIST_RESULT */

	struct
	{
		GTM_PGXCNodeType	type;			/* NODE_REGISTER */
		size_t				len;
		char				*node_name;		/* NODE_UNREGISTER */
		GlobalTransactionId xmin;
	} grd_node;

	struct
	{
		int				num_node;
		GTM_PGXCNodeInfo		*nodeinfo[MAX_NODES];
	} grd_node_list;

	struct
	{
		GlobalTransactionId		latest_completed_xid;
		GlobalTransactionId		global_xmin;
		int						errcode;
	} grd_report_xmin;						/* REPORT_XMIN */

	/*
	 * TODO
	 * 	TXN_GET_STATUS
	 * 	TXN_GET_ALL_PREPARED
	 */
} GTM_ResultData;

#define GTM_RESULT_COMM_ERROR (-2) /* Communication error */
#define GTM_RESULT_ERROR      (-1)
#define GTM_RESULT_OK         (0)
/*
 * This error is used ion the case where allocated buffer is not large
 * enough to store the errors. It may happen of an allocation failed
 * so it's status is considered as unknown.
 */
#define GTM_RESULT_UNKNOWN    (1)

typedef struct GTM_Result
{
	GTM_ResultType		gr_type;
	int					gr_msglen;
	int					gr_status;
	GTM_ProxyMsgHeader	gr_proxyhdr;
	GTM_ResultData		gr_resdata;
	/*
	 * We keep these two items outside the union to avoid repeated malloc/free
	 * of the xip array. If these items are pushed inside the union, they may
	 * get overwritten by other members in the union
	 */
	int					gr_xip_size;
	GTM_SnapshotData	gr_snapshot;

	/*
	 * Similarly, keep the buffer for proxying data outside the union
	 */
	char		*gr_proxy_data;
	int			gr_proxy_datalen;
} GTM_Result;

/*
 * Connection Management API
 */
GTM_Conn *connect_gtm(const char *connect_string);

int begin_replication_initial_sync(GTM_Conn *);
int end_replication_initial_sync(GTM_Conn *);

size_t get_node_list(GTM_Conn *, GTM_PGXCNodeInfo *, size_t);
GlobalTransactionId get_next_gxid(GTM_Conn *);
uint32 get_txn_gxid_list(GTM_Conn *, GTM_Transactions *);
size_t get_sequence_list(GTM_Conn *, GTM_SeqInfo **);

/*
 * Transaction Management API
 */
GlobalTransactionId begin_transaction(GTM_Conn *conn, GTM_IsolationLevel isolevel,
						  const char *global_sessionid,
						  GTM_Timestamp *timestamp);
int bkup_begin_transaction(GTM_Conn *conn, GTM_IsolationLevel isolevel,
						   bool read_only, const char *global_sessionid,
						   uint32 client_id, GTM_Timestamp timestamp);
int bkup_begin_transaction_gxid(GTM_Conn *conn, GlobalTransactionId gxid,
								GTM_IsolationLevel isolevel, bool read_only,
								const char *global_sessionid,
								uint32 client_id, GTM_Timestamp timestamp);

GlobalTransactionId begin_transaction_autovacuum(GTM_Conn *conn, GTM_IsolationLevel isolevel);
int bkup_begin_transaction_autovacuum(GTM_Conn *conn, GlobalTransactionId gxid,
									  GTM_IsolationLevel isolevel,
									  uint32 client_id);
int commit_transaction(GTM_Conn *conn, GlobalTransactionId gxid,
					   int waited_xid_count,
					   GlobalTransactionId *waited_xids);
int bkup_commit_transaction(GTM_Conn *conn, GlobalTransactionId gxid);
int commit_prepared_transaction(GTM_Conn *conn, GlobalTransactionId gxid,
								GlobalTransactionId prepared_gxid,
								int waited_xid_count,
								GlobalTransactionId *waited_xids);
int bkup_commit_prepared_transaction(GTM_Conn *conn, GlobalTransactionId gxid, GlobalTransactionId prepared_gxid);
int abort_transaction(GTM_Conn *conn, GlobalTransactionId gxid);
int bkup_abort_transaction(GTM_Conn *conn, GlobalTransactionId gxid);
int start_prepared_transaction(GTM_Conn *conn, GlobalTransactionId gxid, char *gid,
							   char *nodestring);
int backup_start_prepared_transaction(GTM_Conn *conn, GlobalTransactionId gxid, char *gid,
									  char *nodestring);
int prepare_transaction(GTM_Conn *conn, GlobalTransactionId gxid);
int bkup_prepare_transaction(GTM_Conn *conn, GlobalTransactionId gxid);
int get_gid_data(GTM_Conn *conn, GTM_IsolationLevel isolevel, char *gid,
				 GlobalTransactionId *gxid,
				 GlobalTransactionId *prepared_gxid,
				 char **nodestring);
/*
 * Multiple Transaction Management API
 */
int
begin_transaction_multi(GTM_Conn *conn, int txn_count, GTM_IsolationLevel *txn_isolation_level,
			bool *txn_read_only, GTMProxy_ConnID *txn_connid,
			int *txn_count_out, GlobalTransactionId *gxid_out, GTM_Timestamp *ts_out);
int
bkup_begin_transaction_multi(GTM_Conn *conn, int txn_count,
							 GlobalTransactionId *gxid, GTM_IsolationLevel *isolevel,
							 bool *read_only,
							 const char *txn_global_sessionid[], 
							 uint32 *client_id,
							 GTMProxy_ConnID *txn_connid);
int
commit_transaction_multi(GTM_Conn *conn, int txn_count, GlobalTransactionId *gxid,
						 int *txn_count_out, int *status_out);
int
bkup_commit_transaction_multi(GTM_Conn *conn, int txn_count,
		GlobalTransactionId *gxid);
int
abort_transaction_multi(GTM_Conn *conn, int txn_count, GlobalTransactionId *gxid,
			int *txn_count_out, int *status_out);
int
bkup_abort_transaction_multi(GTM_Conn *conn, int txn_count, GlobalTransactionId *gxid);
int
snapshot_get_multi(GTM_Conn *conn, int txn_count, GlobalTransactionId *gxid,
		   int *txn_count_out, int *status_out,
		   GlobalTransactionId *xmin_out, GlobalTransactionId *xmax_out,
		   GlobalTransactionId *recent_global_xmin_out, int32 *xcnt_out);

/*
 * Snapshot Management API
 */
GTM_SnapshotData *get_snapshot(GTM_Conn *conn, GlobalTransactionId gxid,
		bool canbe_grouped);

/*
 * Node Registering management API
 */
int node_register(GTM_Conn *conn,
				  GTM_PGXCNodeType type,
				  GTM_PGXCNodePort port,
				  char *node_name,
				  char *datafolder);
int node_register(GTM_Conn *conn, GTM_PGXCNodeType type, GTM_PGXCNodePort port,
		char *node_name, char *datafolder);
int node_register_internal(GTM_Conn *conn, GTM_PGXCNodeType type, const char *host,	GTM_PGXCNodePort port, char *node_name,
						   char *datafolder, GTM_PGXCNodeStatus status);
int bkup_node_register_internal(GTM_Conn *conn, GTM_PGXCNodeType type, const char *host, GTM_PGXCNodePort port,
								char *node_name, char *datafolder,
								GTM_PGXCNodeStatus status);

int node_unregister(GTM_Conn *conn, GTM_PGXCNodeType type, const char *node_name);
int bkup_node_unregister(GTM_Conn *conn, GTM_PGXCNodeType type, const char * node_name);
int backend_disconnect(GTM_Conn *conn, bool is_postmaster, GTM_PGXCNodeType type, char *node_name);
char *node_get_local_addr(GTM_Conn *conn, char *buf, size_t buflen, int *rc);
int register_session(GTM_Conn *conn, const char *coord_name, int coord_procid,
				 int coord_backendid);
int report_global_xmin(GTM_Conn *conn, const char *node_name,
		GTM_PGXCNodeType type, GlobalTransactionId gxid,
		GlobalTransactionId *global_xmin,
		GlobalTransactionId *latest_completed_xid,
		int *errcode);

/*
 * Sequence Management API
 */
int open_sequence(GTM_Conn *conn, GTM_SequenceKey key, GTM_Sequence increment,
				  GTM_Sequence minval, GTM_Sequence maxval,
				  GTM_Sequence startval, bool cycle,
				  GlobalTransactionId gxid);
int bkup_open_sequence(GTM_Conn *conn, GTM_SequenceKey key, GTM_Sequence increment,
					   GTM_Sequence minval, GTM_Sequence maxval,
					   GTM_Sequence startval, bool cycle,
					   GlobalTransactionId gxid);
int alter_sequence(GTM_Conn *conn, GTM_SequenceKey key, GTM_Sequence increment,
				   GTM_Sequence minval, GTM_Sequence maxval,
				   GTM_Sequence startval, GTM_Sequence lastval, bool cycle, bool is_restart);
int bkup_alter_sequence(GTM_Conn *conn, GTM_SequenceKey key, GTM_Sequence increment,
						GTM_Sequence minval, GTM_Sequence maxval,
						GTM_Sequence startval, GTM_Sequence lastval, bool cycle, bool is_restart);
int close_sequence(GTM_Conn *conn, GTM_SequenceKey key, GlobalTransactionId gxid);
int bkup_close_sequence(GTM_Conn *conn, GTM_SequenceKey key, GlobalTransactionId gxid);
int rename_sequence(GTM_Conn *conn, GTM_SequenceKey key,
						GTM_SequenceKey newkey, GlobalTransactionId gxid);
int bkup_rename_sequence(GTM_Conn *conn, GTM_SequenceKey key,
						GTM_SequenceKey newkey, GlobalTransactionId gxid);
int get_current(GTM_Conn *conn, GTM_SequenceKey key,
			char *coord_name, int coord_procid, GTM_Sequence *result);
int get_next(GTM_Conn *conn, GTM_SequenceKey key,
		 char *coord_name, int coord_procid,
		 GTM_Sequence range, GTM_Sequence *result, GTM_Sequence *rangemax);
int bkup_get_next(GTM_Conn *conn, GTM_SequenceKey key,
		 char *coord_name, int coord_procid,
		 GTM_Sequence range, GTM_Sequence *result, GTM_Sequence *rangemax);
int set_val(GTM_Conn *conn, GTM_SequenceKey key, char *coord_name,
		int coord_procid, GTM_Sequence nextval, bool iscalled);
int bkup_set_val(GTM_Conn *conn, GTM_SequenceKey key, char *coord_name,
			 int coord_procid, GTM_Sequence nextval, bool iscalled);
int reset_sequence(GTM_Conn *conn, GTM_SequenceKey key);
int bkup_reset_sequence(GTM_Conn *conn, GTM_SequenceKey key);

/*
 * Barrier
 */
int report_barrier(GTM_Conn *conn, const char *barier_id);
int bkup_report_barrier(GTM_Conn *conn, char *barrier_id);

/*
 * GTM-Standby
 */
int set_begin_end_backup(GTM_Conn *conn, bool begin);
int gtm_sync_standby(GTM_Conn *conn);


#endif