0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #ifndef XA_CMN
0035 #define XA_CMN
0036
0037 #ifdef __cplusplus
0038 extern "C" {
0039 #endif
0040
0041
0042 #include <stdint.h>
0043 #include <sys_mqueue.h>
0044 #include <xa.h>
0045
0046 #include <ndrxdcmn.h>
0047 #include <stdint.h>
0048 #include <nstopwatch.h>
0049 #include <exhash.h>
0050 #include <tx.h>
0051
0052
0053
0054 #define NDRX_LOCK_WAIT_TIME 5000
0055 #define TOUT_CHECK_TIME 1
0056 #define COPY_MODE_FOREGROUND 0x1
0057 #define COPY_MODE_BACKGROUND 0x2
0058 #define COPY_MODE_ACQLOCK 0x4
0059
0060
0061
0062 #define ATMI_XA_TPBEGIN 'b'
0063 #define ATMI_XA_TPCOMMIT 'c'
0064 #define ATMI_XA_TPABORT 'a'
0065
0066 #define ATMI_XA_TPJOIN 'j'
0067
0068 #define ATMI_XA_PRINTTRANS 'p'
0069 #define ATMI_XA_ABORTTRANS 'r'
0070 #define ATMI_XA_COMMITTRANS 'm'
0071 #define ATMI_XA_STATUS 's'
0072
0073
0074 #define ATMI_XA_RECOVERLOCAL 'l'
0075 #define ATMI_XA_COMMITLOCAL 'o'
0076 #define ATMI_XA_ABORTLOCAL 't'
0077 #define ATMI_XA_FORGETLOCAL 'f'
0078
0079
0080
0081 #define ATMI_XA_TMREGISTER 'R'
0082 #define ATMI_XA_TMPREPARE 'P'
0083 #define ATMI_XA_TMCOMMIT 'C'
0084 #define ATMI_XA_TMABORT 'A'
0085 #define ATMI_XA_TMFORGET 'F'
0086 #define ATMI_XA_RMSTATUS 'S'
0087
0088
0089 #define XA_RM_STATUS_NULL 0
0090 #define XA_RM_STATUS_NONE 'n'
0091 #define XA_RM_STATUS_IDLE 'i'
0092 #define XA_RM_STATUS_ACTIVE 'j'
0093 #define XA_RM_STATUS_ACT_AB 'k'
0094 #define XA_RM_STATUS_PREP 'p'
0095 #define XA_RM_STATUS_ABORTED 'a'
0096 #define XA_RM_STATUS_ABFORGET_HAZ 'e'
0097 #define XA_RM_STATUS_ABFORGET_HEU 'f'
0098
0099 #define XA_RM_STATUS_UNKOWN 'u'
0100 #define XA_RM_STATUS_ABORT_HEURIS 'b'
0101 #define XA_RM_STATUS_ABORT_HAZARD 'd'
0102 #define XA_RM_STATUS_COMMITTED 'c'
0103 #define XA_RM_STATUS_COMMITTED_RO 'r'
0104 #define XA_RM_STATUS_COMMIT_HEURIS 'h'
0105 #define XA_RM_STATUS_COMMIT_HAZARD 'z'
0106 #define XA_RM_STATUS_COMFORGET_HAZ 'g'
0107 #define XA_RM_STATUS_COMFORGET_HEU 'l'
0108
0109
0110
0111 #define XA_TX_STAGE_NULL 0
0112 #define XA_TX_STAGE_ACTIVE 5
0113
0114 #define XA_TX_STAGE_ABORTING 20
0115 #define XA_TX_STAGE_ABORTED_HAZARD 25
0116 #define XA_TX_STAGE_ABORTED_HEURIS 30
0117 #define XA_TX_STAGE_ABORTED 35
0118
0119
0120
0121
0122 #define XA_TX_STAGE_ABFORGETTING 36
0123 #define XA_TX_STAGE_ABFORGOT_HAZ 37
0124 #define XA_TX_STAGE_ABFORGOT_HEU 38
0125
0126
0127 #define XA_TX_STAGE_PREPARING 40
0128 #define XA_TX_STAGE_PREPRO 41
0129 #define XA_TX_STAGE_PREPARED 42
0130
0131
0132
0133
0134 #define XA_TX_STAGE_COMMITTING 50
0135 #define XA_TX_STAGE_COMMITTED_HAZARD 55
0136 #define XA_TX_STAGE_COMMITTED_HEURIS 65
0137 #define XA_TX_STAGE_COMMITTED 70
0138
0139
0140
0141
0142 #define XA_TX_STAGE_COMFORGETTING 80
0143 #define XA_TX_STAGE_COMFORGOT_HAZ 85
0144 #define XA_TX_STAGE_COMFORGOT_HEU 87
0145
0146 #define XA_TX_STAGE_MAX_NEVER 100
0147 #define XA_TX_STAGE_MIN_NEVER -1
0148
0149 #define XA_TX_COPY(X,Y)\
0150 X->tmtxflags = Y->tmtxflags;\
0151 strcpy(X->tmxid, Y->tmxid);\
0152 X->tmrmid = Y->tmrmid;\
0153 X->tmnodeid = Y->tmnodeid;\
0154 X->tmsrvid = Y->tmsrvid;\
0155 strcpy(X->tmknownrms, Y->tmknownrms);
0156
0157 #define XA_TX_ZERO(X)\
0158 X->tmtxflags = 0;\
0159 X->tmxid[0] = EXEOS;\
0160 X->tmrmid = 0;\
0161 X->tmnodeid = 0;\
0162 X->tmsrvid = 0;\
0163 X->tmknownrms[0] = EXEOS;
0164
0165 #define TMFLAGS_RMIDKNOWN 0x00000002
0166 #define TMFLAGS_TPTXCOMMITDLOG 0x00000004
0167 #define TMFLAGS_TPNOSTARTXID 0x00000010
0168 #define TMFLAGS_DYNAMIC_REG 0x00000020
0169 #define TMFLAGS_NOCON 0x00000040
0170
0171 #define XA_OP_NOP 0
0172 #define XA_OP_START 1
0173 #define XA_OP_END 2
0174 #define XA_OP_PREPARE 3
0175 #define XA_OP_COMMIT 4
0176 #define XA_OP_ROLLBACK 5
0177 #define XA_OP_FORGET 6
0178 #define XA_OP_OPEN 7
0179 #define XA_OP_RECOVER 8
0180 #define XA_OP_CLOSE 9
0181
0182
0183
0184
0185
0186
0187
0188 #define XA_TXINFO_NOFLAGS 0x00000000
0189 #define XA_TXINFO_NOBTID 0x00000001
0190 #define XA_TXINFO_INITIATOR 0x00000002
0191 #define XA_TXINFO_AXREG_CLD 0x00000004
0192
0193
0194
0195 #define XA
0196
0197
0198
0199
0200
0201
0202
0203 struct atmi_xa_tx_cd
0204 {
0205 int cd;
0206 EX_hash_handle hh;
0207 };
0208
0209 typedef struct atmi_xa_tx_cd atmi_xa_tx_cd_t;
0210
0211
0212
0213
0214 struct atmi_xa_tx_info
0215 {
0216 ATMI_XA_TX_INFO_FIELDS;
0217
0218 long btid;
0219 int tranid_flags;
0220
0221
0222
0223 atmi_xa_tx_cd_t *call_cds;
0224
0225 atmi_xa_tx_cd_t *conv_cds;
0226
0227 EX_hash_handle hh;
0228 };
0229 typedef struct atmi_xa_tx_info atmi_xa_tx_info_t;
0230
0231
0232 struct atmi_xa_curtx
0233 {
0234 int is_xa_open;
0235 int is_xa_conn_error;
0236 atmi_xa_tx_info_t *tx_tab;
0237
0238
0239
0240
0241
0242
0243
0244
0245 atmi_xa_tx_info_t *txinfo;
0246
0247 };
0248 typedef struct atmi_xa_curtx atmi_xa_curtx_t;
0249
0250
0251
0252
0253
0254 struct atmi_xa_rm_status_btid
0255 {
0256 char rmstatus;
0257 int rmerrorcode;
0258 short rmreason;
0259 long btid;
0260 short rmid;
0261
0262 EX_hash_handle hh;
0263 };
0264 typedef struct atmi_xa_rm_status_btid atmi_xa_rm_status_btid_t;
0265
0266
0267
0268
0269 struct atmi_xa_rm_status
0270 {
0271 #if 0
0272 char rmstatus;
0273 int rmerrorcode;
0274 short rmreason;
0275 #endif
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285 atmi_xa_rm_status_btid_t *btid_hash;
0286
0287 long tidcounter;
0288 };
0289 typedef struct atmi_xa_rm_status atmi_xa_rm_status_t;
0290
0291
0292
0293
0294
0295 struct atmi_xa_log
0296 {
0297 ATMI_XA_TX_INFO_FIELDS;
0298
0299
0300 unsigned long long t_start;
0301 unsigned long long t_update;
0302
0303 short txstage;
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315 atmi_xa_rm_status_t rmstatus[NDRX_MAX_RMS];
0316
0317 char fname[PATH_MAX+1];
0318 FILE *f;
0319
0320
0321 long trycount;
0322
0323 ndrx_stopwatch_t ttimer;
0324 long txtout;
0325
0326 int is_background;
0327 uint64_t lockthreadid;
0328
0329 int log_version;
0330
0331 long sg_sequence;
0332
0333 EX_hash_handle hh;
0334 };
0335 typedef struct atmi_xa_log atmi_xa_log_t;
0336
0337
0338 typedef struct atmi_xa_log_list atmi_xa_log_list_t;
0339 struct atmi_xa_log_list
0340 {
0341 atmi_xa_log_t p_tl;
0342
0343
0344 atmi_xa_log_list_t *next;
0345 };
0346
0347
0348
0349
0350 struct rmstate_driver
0351 {
0352 short txstage;
0353 char rmstatus;
0354 int op;
0355
0356 int min_retcode;
0357 int max_retcode;
0358 char next_rmstatus;
0359 short next_txstage;
0360 };
0361 typedef struct rmstate_driver rmstatus_driver_t;
0362
0363
0364
0365
0366 struct txaction_driver
0367 {
0368 short txstage;
0369 char rmstatus;
0370 int op;
0371 };
0372 typedef struct txaction_driver txaction_driver_t;
0373
0374
0375
0376
0377 struct txstate_descriptor
0378 {
0379 short txstage;
0380 short txs_stage_min;
0381 short txs_min_complete;
0382 short txs_max_complete;
0383 char descr[64];
0384 int allow_jump;
0385 };
0386 typedef struct txstate_descriptor txstage_descriptor_t;
0387
0388
0389 struct txstate2tperrno
0390 {
0391 short txstage;
0392 int master_op;
0393 int tpe;
0394 };
0395 typedef struct txstate2tperrno txstate2tperrno_t;
0396
0397
0398
0399
0400
0401
0402
0403
0404 extern NDRX_API int atmi_xa_init(void);
0405 extern NDRX_API void atmi_xa_uninit(void);
0406 extern NDRX_API int atmi_xa_open_entry(void);
0407 extern NDRX_API int atmi_xa_close_entry(int for_retry);
0408 extern NDRX_API int atmi_xa_start_entry(XID *xid, long flags, int ping_try);
0409 extern NDRX_API int atmi_xa_end_entry(XID *xid, long flags, int aborting);
0410 extern NDRX_API int atmi_xa_prepare_entry(XID *xid, long flags);
0411 extern NDRX_API int atmi_xa_commit_entry(XID *xid, long flags);
0412 extern NDRX_API int atmi_xa_rollback_entry(XID *xid, long flags);
0413 extern NDRX_API int atmi_xa_recover_entry(XID *xids, long count, int rmid, long flags);
0414 extern NDRX_API int atmi_xa_forget_entry(XID *xid, long flags);
0415
0416 extern NDRX_API UBFH* atmi_xa_call_tm_generic(char cmd, int call_any, short rmid,
0417 atmi_xa_tx_info_t *p_xai, long flags, long btid);
0418 extern NDRX_API UBFH* atmi_xa_call_tm_generic_fb(char cmd, char *svcnm_spec, int call_any, short rmid,
0419 atmi_xa_tx_info_t *p_xai, UBFH *p_ub);
0420 extern NDRX_API UBFH* atmi_xa_call_tm_rmstatus(atmi_xa_tx_info_t *p_xai, char rmstatus);
0421
0422
0423 extern NDRX_API char * atmi_xa_serialize_xid(XID *xid, char *xid_str_out);
0424 extern NDRX_API void atmi_xa_xid_str_get_info(char *xid_str, short *p_nodeid,
0425 short *p_srvid, unsigned char *p_rmid_start,
0426 unsigned char *p_rmid_cur, long *p_btid);
0427
0428 extern NDRX_API void atmi_xa_xid_get_info(XID *xid, short *p_nodeid,
0429 short *p_srvid, unsigned char *p_rmid_start,
0430 unsigned char *p_rmid_cur, long *p_btid);
0431
0432 extern NDRX_API XID* atmi_xa_deserialize_xid(unsigned char *xid_str, XID *xid_out);
0433 extern NDRX_API int atmi_xa_load_tx_info(UBFH *p_ub, atmi_xa_tx_info_t *p_xai);
0434 extern NDRX_API void atmi_xa_print_knownrms(int dbglev, char *msg, char *tmknownrms);
0435 extern NDRX_API int atmi_xa_update_known_rms(char *dst_tmknownrms, char *src_tmknownrms);
0436 extern NDRX_API int atmi_xa_is_current_rm_known(char *tmknownrms);
0437 extern NDRX_API void atmi_xa_curtx_del(atmi_xa_tx_info_t *p_txinfo);
0438
0439 extern NDRX_API UBFH * atmi_xa_alloc_tm_call(char cmd);
0440 extern NDRX_API int atmi_xa_reset_tm_call(UBFH *p_ub);
0441 extern NDRX_API int atmi_xa_set_curtx_from_xai(atmi_xa_tx_info_t *p_xai);
0442 extern NDRX_API void atmi_xa_reset_curtx(void);
0443 extern NDRX_API void atmi_xa_print_knownrms(int dbglev, char *msg, char *tmknownrms);
0444 extern NDRX_API int atmi_xa_read_tx_info(UBFH *p_ub, atmi_xa_tx_info_t *p_xai, int flags);
0445 extern NDRX_API XID* atmi_xa_get_branch_xid(atmi_xa_tx_info_t *p_xai, long btid);
0446 extern NDRX_API void atmi_xa_cpy_xai_to_call(tp_command_call_t *call, atmi_xa_tx_info_t *p_xai);
0447
0448
0449 extern NDRX_API int atmi_xa_cd_reg(atmi_xa_tx_cd_t **cds, int cd);
0450 extern NDRX_API atmi_xa_tx_cd_t * atmi_xa_cd_find(atmi_xa_tx_cd_t **cds, int cd);
0451 extern NDRX_API int atmi_xa_cd_isanyreg(atmi_xa_tx_cd_t **cds);
0452 extern NDRX_API void atmi_xa_cd_unreg(atmi_xa_tx_cd_t **cds, int cd);
0453 extern NDRX_API int atmi_xa_cd_unregall(atmi_xa_tx_cd_t **cds);
0454 extern NDRX_API int ndrx_tmfilter_common(char *svcnm);
0455 extern NDRX_API int ndrx_tmfilter_srv(char *svcnm);
0456
0457
0458 extern NDRX_API int ndrx_tpopen(void);
0459 extern NDRX_API int ndrx_tpclose(void);
0460 extern NDRX_API int ndrx_tpbegin(unsigned long timeout, long flags);
0461 extern NDRX_API int ndrx_tpcommit(long flags);
0462 extern NDRX_API int ndrx_tpabort(long flags, int call_xa_end);
0463 extern NDRX_API int ndrx_tpsuspend (TPTRANID *tranid, long flags, int is_contexting);
0464 extern NDRX_API int ndrx_tpresume (TPTRANID *tranid, long flags);
0465 extern NDRX_API int ndrx_tpscmt(long flags);
0466 extern NDRX_API int ndrx_tx_info(TXINFO * txinfo);
0467
0468 extern NDRX_API int _tp_srv_join_or_new_from_call(tp_command_call_t *call, int is_ax_reg_callback);
0469 extern NDRX_API int _tp_srv_join_or_new(atmi_xa_tx_info_t *p_xai, int is_ax_reg_callback,
0470 int *p_is_known, long join_flag, int tranid_flags);
0471 extern NDRX_API int _tp_srv_disassoc_tx(int rollback_on_fail, int *end_fail);
0472 extern NDRX_API int _tp_srv_tell_tx_fail(void);
0473
0474
0475 extern NDRX_API rmstatus_driver_t* xa_status_get_next_by_op(short txstage, char rmstatus,
0476 int op, int op_retcode,
0477 atmi_xa_tx_info_t *p_xai,
0478 short rmid, long btid);
0479 extern NDRX_API rmstatus_driver_t* xa_status_get_next_by_new_status(short txstage,
0480 char next_rmstatus);
0481 extern NDRX_API int xa_status_get_op(short txstage, char rmstatus);
0482 extern NDRX_API txstage_descriptor_t* xa_stage_get_descr(short txstage);
0483 extern NDRX_API int xa_txstage2tperrno(short txstage, int master_op);
0484
0485 extern NDRX_API atmi_xa_curtx_t *ndrx_get_G_atmi_xa_curtx(void);
0486
0487 #ifdef __cplusplus
0488 }
0489 #endif
0490
0491 #endif
0492
0493