PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
xactdesc.c File Reference
#include "postgres.h"
#include "access/transam.h"
#include "access/xact.h"
#include "catalog/catalog.h"
#include "storage/sinval.h"
#include "storage/standbydefs.h"
#include "utils/timestamp.h"
Include dependency graph for xactdesc.c:

Go to the source code of this file.

Functions

void ParseCommitRecord (uint8 info, xl_xact_commit *xlrec, xl_xact_parsed_commit *parsed)
 
void ParseAbortRecord (uint8 info, xl_xact_abort *xlrec, xl_xact_parsed_abort *parsed)
 
static void xact_desc_commit (StringInfo buf, uint8 info, xl_xact_commit *xlrec, RepOriginId origin_id)
 
static void xact_desc_abort (StringInfo buf, uint8 info, xl_xact_abort *xlrec)
 
static void xact_desc_assignment (StringInfo buf, xl_xact_assignment *xlrec)
 
void xact_desc (StringInfo buf, XLogReaderState *record)
 
const char * xact_identify (uint8 info)
 

Function Documentation

void ParseAbortRecord ( uint8  info,
xl_xact_abort xlrec,
xl_xact_parsed_abort parsed 
)

Definition at line 122 of file xactdesc.c.

References MinSizeOfXactAbort, MinSizeOfXactRelfilenodes, MinSizeOfXactSubxacts, xl_xact_relfilenodes::nrels, xl_xact_parsed_abort::nrels, xl_xact_subxacts::nsubxacts, xl_xact_parsed_abort::nsubxacts, xl_xact_subxacts::subxacts, xl_xact_parsed_abort::subxacts, xl_xact_parsed_abort::twophase_xid, xl_xact_abort::xact_time, xl_xact_parsed_abort::xact_time, XACT_XINFO_HAS_RELFILENODES, XACT_XINFO_HAS_SUBXACTS, XACT_XINFO_HAS_TWOPHASE, xl_xact_twophase::xid, xl_xact_xinfo::xinfo, xl_xact_parsed_abort::xinfo, XLOG_XACT_HAS_INFO, xl_xact_relfilenodes::xnodes, and xl_xact_parsed_abort::xnodes.

Referenced by DecodeXactOp(), recoveryStopsAfter(), recoveryStopsBefore(), xact_desc_abort(), and xact_redo().

123 {
124  char *data = ((char *) xlrec) + MinSizeOfXactAbort;
125 
126  memset(parsed, 0, sizeof(*parsed));
127 
128  parsed->xinfo = 0; /* default, if no XLOG_XACT_HAS_INFO is
129  * present */
130 
131  parsed->xact_time = xlrec->xact_time;
132 
133  if (info & XLOG_XACT_HAS_INFO)
134  {
135  xl_xact_xinfo *xl_xinfo = (xl_xact_xinfo *) data;
136 
137  parsed->xinfo = xl_xinfo->xinfo;
138 
139  data += sizeof(xl_xact_xinfo);
140  }
141 
142  if (parsed->xinfo & XACT_XINFO_HAS_SUBXACTS)
143  {
144  xl_xact_subxacts *xl_subxacts = (xl_xact_subxacts *) data;
145 
146  parsed->nsubxacts = xl_subxacts->nsubxacts;
147  parsed->subxacts = xl_subxacts->subxacts;
148 
149  data += MinSizeOfXactSubxacts;
150  data += parsed->nsubxacts * sizeof(TransactionId);
151  }
152 
153  if (parsed->xinfo & XACT_XINFO_HAS_RELFILENODES)
154  {
155  xl_xact_relfilenodes *xl_relfilenodes = (xl_xact_relfilenodes *) data;
156 
157  parsed->nrels = xl_relfilenodes->nrels;
158  parsed->xnodes = xl_relfilenodes->xnodes;
159 
161  data += xl_relfilenodes->nrels * sizeof(RelFileNode);
162  }
163 
164  if (parsed->xinfo & XACT_XINFO_HAS_TWOPHASE)
165  {
166  xl_xact_twophase *xl_twophase = (xl_xact_twophase *) data;
167 
168  parsed->twophase_xid = xl_twophase->xid;
169 
170  data += sizeof(xl_xact_twophase);
171  }
172 }
struct xl_xact_xinfo xl_xact_xinfo
uint32 TransactionId
Definition: c.h:397
TransactionId xid
Definition: xact.h:246
#define MinSizeOfXactAbort
Definition: xact.h:280
#define XLOG_XACT_HAS_INFO
Definition: xact.h:147
#define XACT_XINFO_HAS_SUBXACTS
Definition: xact.h:154
#define MinSizeOfXactRelfilenodes
Definition: xact.h:235
TimestampTz xact_time
Definition: xact.h:271
RelFileNode xnodes[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:233
#define MinSizeOfXactSubxacts
Definition: xact.h:228
struct RelFileNode RelFileNode
struct xl_xact_twophase xl_xact_twophase
TransactionId * subxacts
Definition: xact.h:317
uint32 xinfo
Definition: xact.h:214
RelFileNode * xnodes
Definition: xact.h:320
int nsubxacts
Definition: xact.h:225
#define XACT_XINFO_HAS_TWOPHASE
Definition: xact.h:157
TransactionId twophase_xid
Definition: xact.h:322
TimestampTz xact_time
Definition: xact.h:313
#define XACT_XINFO_HAS_RELFILENODES
Definition: xact.h:155
TransactionId subxacts[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:226
void ParseCommitRecord ( uint8  info,
xl_xact_commit xlrec,
xl_xact_parsed_commit parsed 
)

Definition at line 35 of file xactdesc.c.

References xl_xact_dbinfo::dbId, xl_xact_parsed_commit::dbId, MinSizeOfXactCommit, MinSizeOfXactInvals, MinSizeOfXactRelfilenodes, MinSizeOfXactSubxacts, xl_xact_invals::msgs, xl_xact_parsed_commit::msgs, xl_xact_invals::nmsgs, xl_xact_parsed_commit::nmsgs, xl_xact_relfilenodes::nrels, xl_xact_parsed_commit::nrels, xl_xact_subxacts::nsubxacts, xl_xact_parsed_commit::nsubxacts, xl_xact_origin::origin_lsn, xl_xact_parsed_commit::origin_lsn, xl_xact_origin::origin_timestamp, xl_xact_parsed_commit::origin_timestamp, xl_xact_subxacts::subxacts, xl_xact_parsed_commit::subxacts, xl_xact_dbinfo::tsId, xl_xact_parsed_commit::tsId, xl_xact_parsed_commit::twophase_xid, xl_xact_commit::xact_time, xl_xact_parsed_commit::xact_time, XACT_XINFO_HAS_DBINFO, XACT_XINFO_HAS_INVALS, XACT_XINFO_HAS_ORIGIN, XACT_XINFO_HAS_RELFILENODES, XACT_XINFO_HAS_SUBXACTS, XACT_XINFO_HAS_TWOPHASE, xl_xact_twophase::xid, xl_xact_xinfo::xinfo, xl_xact_parsed_commit::xinfo, XLOG_XACT_HAS_INFO, xl_xact_relfilenodes::xnodes, and xl_xact_parsed_commit::xnodes.

Referenced by DecodeXactOp(), recoveryStopsAfter(), recoveryStopsBefore(), xact_desc_commit(), and xact_redo().

36 {
37  char *data = ((char *) xlrec) + MinSizeOfXactCommit;
38 
39  memset(parsed, 0, sizeof(*parsed));
40 
41  parsed->xinfo = 0; /* default, if no XLOG_XACT_HAS_INFO is
42  * present */
43 
44  parsed->xact_time = xlrec->xact_time;
45 
46  if (info & XLOG_XACT_HAS_INFO)
47  {
48  xl_xact_xinfo *xl_xinfo = (xl_xact_xinfo *) data;
49 
50  parsed->xinfo = xl_xinfo->xinfo;
51 
52  data += sizeof(xl_xact_xinfo);
53  }
54 
55  if (parsed->xinfo & XACT_XINFO_HAS_DBINFO)
56  {
57  xl_xact_dbinfo *xl_dbinfo = (xl_xact_dbinfo *) data;
58 
59  parsed->dbId = xl_dbinfo->dbId;
60  parsed->tsId = xl_dbinfo->tsId;
61 
62  data += sizeof(xl_xact_dbinfo);
63  }
64 
65  if (parsed->xinfo & XACT_XINFO_HAS_SUBXACTS)
66  {
67  xl_xact_subxacts *xl_subxacts = (xl_xact_subxacts *) data;
68 
69  parsed->nsubxacts = xl_subxacts->nsubxacts;
70  parsed->subxacts = xl_subxacts->subxacts;
71 
72  data += MinSizeOfXactSubxacts;
73  data += parsed->nsubxacts * sizeof(TransactionId);
74  }
75 
76  if (parsed->xinfo & XACT_XINFO_HAS_RELFILENODES)
77  {
78  xl_xact_relfilenodes *xl_relfilenodes = (xl_xact_relfilenodes *) data;
79 
80  parsed->nrels = xl_relfilenodes->nrels;
81  parsed->xnodes = xl_relfilenodes->xnodes;
82 
84  data += xl_relfilenodes->nrels * sizeof(RelFileNode);
85  }
86 
87  if (parsed->xinfo & XACT_XINFO_HAS_INVALS)
88  {
89  xl_xact_invals *xl_invals = (xl_xact_invals *) data;
90 
91  parsed->nmsgs = xl_invals->nmsgs;
92  parsed->msgs = xl_invals->msgs;
93 
94  data += MinSizeOfXactInvals;
95  data += xl_invals->nmsgs * sizeof(SharedInvalidationMessage);
96  }
97 
98  if (parsed->xinfo & XACT_XINFO_HAS_TWOPHASE)
99  {
100  xl_xact_twophase *xl_twophase = (xl_xact_twophase *) data;
101 
102  parsed->twophase_xid = xl_twophase->xid;
103 
104  data += sizeof(xl_xact_twophase);
105  }
106 
107  if (parsed->xinfo & XACT_XINFO_HAS_ORIGIN)
108  {
109  xl_xact_origin xl_origin;
110 
111  /* we're only guaranteed 4 byte alignment, so copy onto stack */
112  memcpy(&xl_origin, data, sizeof(xl_origin));
113 
114  parsed->origin_lsn = xl_origin.origin_lsn;
115  parsed->origin_timestamp = xl_origin.origin_timestamp;
116 
117  data += sizeof(xl_xact_origin);
118  }
119 }
RelFileNode * xnodes
Definition: xact.h:300
#define XACT_XINFO_HAS_ORIGIN
Definition: xact.h:158
struct xl_xact_xinfo xl_xact_xinfo
uint32 TransactionId
Definition: c.h:397
TimestampTz origin_timestamp
Definition: xact.h:308
TransactionId xid
Definition: xact.h:246
TransactionId twophase_xid
Definition: xact.h:305
TransactionId * subxacts
Definition: xact.h:297
#define XLOG_XACT_HAS_INFO
Definition: xact.h:147
SharedInvalidationMessage * msgs
Definition: xact.h:303
XLogRecPtr origin_lsn
Definition: xact.h:307
#define XACT_XINFO_HAS_SUBXACTS
Definition: xact.h:154
struct xl_xact_dbinfo xl_xact_dbinfo
#define MinSizeOfXactRelfilenodes
Definition: xact.h:235
Oid tsId
Definition: xact.h:220
struct xl_xact_origin xl_xact_origin
RelFileNode xnodes[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:233
#define MinSizeOfXactSubxacts
Definition: xact.h:228
#define MinSizeOfXactCommit
Definition: xact.h:267
SharedInvalidationMessage msgs[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:240
struct RelFileNode RelFileNode
TimestampTz xact_time
Definition: xact.h:257
struct xl_xact_twophase xl_xact_twophase
#define MinSizeOfXactInvals
Definition: xact.h:242
#define XACT_XINFO_HAS_DBINFO
Definition: xact.h:153
XLogRecPtr origin_lsn
Definition: xact.h:251
uint32 xinfo
Definition: xact.h:214
int nsubxacts
Definition: xact.h:225
#define XACT_XINFO_HAS_TWOPHASE
Definition: xact.h:157
Oid dbId
Definition: xact.h:219
TimestampTz origin_timestamp
Definition: xact.h:252
#define XACT_XINFO_HAS_INVALS
Definition: xact.h:156
#define XACT_XINFO_HAS_RELFILENODES
Definition: xact.h:155
int nmsgs
Definition: xact.h:239
TransactionId subxacts[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:226
TimestampTz xact_time
Definition: xact.h:289
void xact_desc ( StringInfo  buf,
XLogReaderState record 
)

Definition at line 270 of file xactdesc.c.

References appendStringInfo(), xact_desc_abort(), xact_desc_assignment(), xact_desc_commit(), XLOG_XACT_ABORT, XLOG_XACT_ABORT_PREPARED, XLOG_XACT_ASSIGNMENT, XLOG_XACT_COMMIT, XLOG_XACT_COMMIT_PREPARED, XLOG_XACT_OPMASK, XLogRecGetData, XLogRecGetInfo, XLogRecGetOrigin, and xl_xact_assignment::xtop.

271 {
272  char *rec = XLogRecGetData(record);
273  uint8 info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK;
274 
275  if (info == XLOG_XACT_COMMIT || info == XLOG_XACT_COMMIT_PREPARED)
276  {
277  xl_xact_commit *xlrec = (xl_xact_commit *) rec;
278 
279  xact_desc_commit(buf, XLogRecGetInfo(record), xlrec,
280  XLogRecGetOrigin(record));
281  }
282  else if (info == XLOG_XACT_ABORT || info == XLOG_XACT_ABORT_PREPARED)
283  {
284  xl_xact_abort *xlrec = (xl_xact_abort *) rec;
285 
286  xact_desc_abort(buf, XLogRecGetInfo(record), xlrec);
287  }
288  else if (info == XLOG_XACT_ASSIGNMENT)
289  {
290  xl_xact_assignment *xlrec = (xl_xact_assignment *) rec;
291 
292  /*
293  * Note that we ignore the WAL record's xid, since we're more
294  * interested in the top-level xid that issued the record and which
295  * xids are being reported here.
296  */
297  appendStringInfo(buf, "xtop %u: ", xlrec->xtop);
298  xact_desc_assignment(buf, xlrec);
299  }
300 }
#define XLOG_XACT_COMMIT
Definition: xact.h:134
unsigned char uint8
Definition: c.h:266
TransactionId xtop
Definition: xact.h:183
#define XLogRecGetOrigin(decoder)
Definition: xlogreader.h:217
#define XLogRecGetData(decoder)
Definition: xlogreader.h:218
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:110
#define XLOG_XACT_ABORT_PREPARED
Definition: xact.h:138
static void xact_desc_abort(StringInfo buf, uint8 info, xl_xact_abort *xlrec)
Definition: xactdesc.c:226
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:214
#define XLOG_XACT_ASSIGNMENT
Definition: xact.h:139
#define XLOG_XACT_ABORT
Definition: xact.h:136
#define XLOG_XACT_OPMASK
Definition: xact.h:144
static void xact_desc_assignment(StringInfo buf, xl_xact_assignment *xlrec)
Definition: xactdesc.c:259
#define XLOG_XACT_COMMIT_PREPARED
Definition: xact.h:137
static void xact_desc_commit(StringInfo buf, uint8 info, xl_xact_commit *xlrec, RepOriginId origin_id)
Definition: xactdesc.c:175
static void xact_desc_abort ( StringInfo  buf,
uint8  info,
xl_xact_abort xlrec 
)
static

Definition at line 226 of file xactdesc.c.

References appendStringInfo(), appendStringInfoString(), i, MAIN_FORKNUM, xl_xact_parsed_abort::nrels, xl_xact_parsed_abort::nsubxacts, ParseAbortRecord(), pfree(), relpathperm, xl_xact_parsed_abort::subxacts, timestamptz_to_str(), TransactionIdIsValid, xl_xact_parsed_abort::twophase_xid, xl_xact_abort::xact_time, and xl_xact_parsed_abort::xnodes.

Referenced by xact_desc().

227 {
228  xl_xact_parsed_abort parsed;
229  int i;
230 
231  ParseAbortRecord(info, xlrec, &parsed);
232 
233  /* If this is a prepared xact, show the xid of the original xact */
235  appendStringInfo(buf, "%u: ", parsed.twophase_xid);
236 
238  if (parsed.nrels > 0)
239  {
240  appendStringInfoString(buf, "; rels:");
241  for (i = 0; i < parsed.nrels; i++)
242  {
243  char *path = relpathperm(parsed.xnodes[i], MAIN_FORKNUM);
244 
245  appendStringInfo(buf, " %s", path);
246  pfree(path);
247  }
248  }
249 
250  if (parsed.nsubxacts > 0)
251  {
252  appendStringInfoString(buf, "; subxacts:");
253  for (i = 0; i < parsed.nsubxacts; i++)
254  appendStringInfo(buf, " %u", parsed.subxacts[i]);
255  }
256 }
#define relpathperm(rnode, forknum)
Definition: relpath.h:67
TimestampTz xact_time
Definition: xact.h:271
void pfree(void *pointer)
Definition: mcxt.c:950
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:110
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:189
TransactionId * subxacts
Definition: xact.h:317
RelFileNode * xnodes
Definition: xact.h:320
TransactionId twophase_xid
Definition: xact.h:322
void ParseAbortRecord(uint8 info, xl_xact_abort *xlrec, xl_xact_parsed_abort *parsed)
Definition: xactdesc.c:122
int i
#define TransactionIdIsValid(xid)
Definition: transam.h:41
const char * timestamptz_to_str(TimestampTz t)
Definition: timestamp.c:1709
static void xact_desc_assignment ( StringInfo  buf,
xl_xact_assignment xlrec 
)
static

Definition at line 259 of file xactdesc.c.

References appendStringInfo(), appendStringInfoString(), i, xl_xact_assignment::nsubxacts, and xl_xact_assignment::xsub.

Referenced by xact_desc().

260 {
261  int i;
262 
263  appendStringInfoString(buf, "subxacts:");
264 
265  for (i = 0; i < xlrec->nsubxacts; i++)
266  appendStringInfo(buf, " %u", xlrec->xsub[i]);
267 }
TransactionId xsub[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:185
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:110
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:189
int i
static void xact_desc_commit ( StringInfo  buf,
uint8  info,
xl_xact_commit xlrec,
RepOriginId  origin_id 
)
static

Definition at line 175 of file xactdesc.c.

References appendStringInfo(), appendStringInfoString(), xl_xact_parsed_commit::dbId, i, MAIN_FORKNUM, xl_xact_parsed_commit::msgs, xl_xact_parsed_commit::nmsgs, xl_xact_parsed_commit::nrels, xl_xact_parsed_commit::nsubxacts, xl_xact_parsed_commit::origin_lsn, xl_xact_parsed_commit::origin_timestamp, ParseCommitRecord(), pfree(), relpathperm, standby_desc_invalidations(), xl_xact_parsed_commit::subxacts, timestamptz_to_str(), TransactionIdIsValid, xl_xact_parsed_commit::tsId, xl_xact_parsed_commit::twophase_xid, xl_xact_commit::xact_time, XACT_XINFO_HAS_ORIGIN, XactCompletionForceSyncCommit, XactCompletionRelcacheInitFileInval, xl_xact_parsed_commit::xinfo, and xl_xact_parsed_commit::xnodes.

Referenced by xact_desc().

176 {
177  xl_xact_parsed_commit parsed;
178  int i;
179 
180  ParseCommitRecord(info, xlrec, &parsed);
181 
182  /* If this is a prepared xact, show the xid of the original xact */
184  appendStringInfo(buf, "%u: ", parsed.twophase_xid);
185 
187 
188  if (parsed.nrels > 0)
189  {
190  appendStringInfoString(buf, "; rels:");
191  for (i = 0; i < parsed.nrels; i++)
192  {
193  char *path = relpathperm(parsed.xnodes[i], MAIN_FORKNUM);
194 
195  appendStringInfo(buf, " %s", path);
196  pfree(path);
197  }
198  }
199  if (parsed.nsubxacts > 0)
200  {
201  appendStringInfoString(buf, "; subxacts:");
202  for (i = 0; i < parsed.nsubxacts; i++)
203  appendStringInfo(buf, " %u", parsed.subxacts[i]);
204  }
205  if (parsed.nmsgs > 0)
206  {
208  buf, parsed.nmsgs, parsed.msgs, parsed.dbId, parsed.tsId,
210  }
211 
213  appendStringInfoString(buf, "; sync");
214 
215  if (parsed.xinfo & XACT_XINFO_HAS_ORIGIN)
216  {
217  appendStringInfo(buf, "; origin: node %u, lsn %X/%X, at %s",
218  origin_id,
219  (uint32) (parsed.origin_lsn >> 32),
220  (uint32) parsed.origin_lsn,
222  }
223 }
RelFileNode * xnodes
Definition: xact.h:300
#define relpathperm(rnode, forknum)
Definition: relpath.h:67
#define XACT_XINFO_HAS_ORIGIN
Definition: xact.h:158
#define XactCompletionRelcacheInitFileInval(xinfo)
Definition: xact.h:176
void standby_desc_invalidations(StringInfo buf, int nmsgs, SharedInvalidationMessage *msgs, Oid dbId, Oid tsId, bool relcacheInitFileInval)
Definition: standbydesc.c:98
TimestampTz origin_timestamp
Definition: xact.h:308
TransactionId twophase_xid
Definition: xact.h:305
TransactionId * subxacts
Definition: xact.h:297
SharedInvalidationMessage * msgs
Definition: xact.h:303
XLogRecPtr origin_lsn
Definition: xact.h:307
void pfree(void *pointer)
Definition: mcxt.c:950
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:110
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:189
void ParseCommitRecord(uint8 info, xl_xact_commit *xlrec, xl_xact_parsed_commit *parsed)
Definition: xactdesc.c:35
TimestampTz xact_time
Definition: xact.h:257
unsigned int uint32
Definition: c.h:268
#define XactCompletionForceSyncCommit(xinfo)
Definition: xact.h:178
int i
#define TransactionIdIsValid(xid)
Definition: transam.h:41
const char * timestamptz_to_str(TimestampTz t)
Definition: timestamp.c:1709
const char* xact_identify ( uint8  info)

Definition at line 303 of file xactdesc.c.

References NULL, XLOG_XACT_ABORT, XLOG_XACT_ABORT_PREPARED, XLOG_XACT_ASSIGNMENT, XLOG_XACT_COMMIT, XLOG_XACT_COMMIT_PREPARED, XLOG_XACT_OPMASK, and XLOG_XACT_PREPARE.

304 {
305  const char *id = NULL;
306 
307  switch (info & XLOG_XACT_OPMASK)
308  {
309  case XLOG_XACT_COMMIT:
310  id = "COMMIT";
311  break;
312  case XLOG_XACT_PREPARE:
313  id = "PREPARE";
314  break;
315  case XLOG_XACT_ABORT:
316  id = "ABORT";
317  break;
319  id = "COMMIT_PREPARED";
320  break;
322  id = "ABORT_PREPARED";
323  break;
325  id = "ASSIGNMENT";
326  break;
327  }
328 
329  return id;
330 }
#define XLOG_XACT_COMMIT
Definition: xact.h:134
#define XLOG_XACT_PREPARE
Definition: xact.h:135
#define XLOG_XACT_ABORT_PREPARED
Definition: xact.h:138
#define XLOG_XACT_ASSIGNMENT
Definition: xact.h:139
#define NULL
Definition: c.h:229
#define XLOG_XACT_ABORT
Definition: xact.h:136
#define XLOG_XACT_OPMASK
Definition: xact.h:144
#define XLOG_XACT_COMMIT_PREPARED
Definition: xact.h:137