Skip to content

Commit db2faa9

Browse files
committed
WAL misc
1 parent 4b70629 commit db2faa9

File tree

7 files changed

+281
-168
lines changed

7 files changed

+281
-168
lines changed

src/backend/access/heap/heapam.c

Lines changed: 125 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.90 2000/10/21 15:43:14 vadim Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.91 2000/10/24 09:56:07 vadim Exp $
1212
*
1313
*
1414
* INTERFACE ROUTINES
@@ -93,9 +93,13 @@ void heap_redo(XLogRecPtr lsn, XLogRecord *record);
9393
void heap_undo(XLogRecPtr lsn, XLogRecord *record);
9494
void heap_desc(char *buf, uint8 xl_info, char* rec);
9595

96+
XLogRecPtr log_heap_move(Relation reln, ItemPointerData from, HeapTuple newtup);
97+
9698
/* comments are in heap_update */
9799
static xl_heaptid _locked_tuple_;
98100
static void _heap_unlock_tuple(void *data);
101+
static XLogRecPtr log_heap_update(Relation reln, ItemPointerData from,
102+
HeapTuple newtup, bool move);
99103

100104
static void HeapPageCleanup(Buffer buffer);
101105

@@ -1706,22 +1710,8 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
17061710
#ifdef XLOG
17071711
/* XLOG stuff */
17081712
{
1709-
xl_heap_update xlrec;
1710-
XLogRecPtr recptr;
1711-
1712-
xlrec.target.node = relation->rd_node;
1713-
xlrec.target.cid = GetCurrentCommandId();
1714-
xlrec.target.tid = oldtup.t_self;
1715-
xlrec.newtid = newtup->t_self;
1716-
xlrec.t_natts = newtup->t_data->t_natts;
1717-
xlrec.t_oid = newtup->t_data->t_oid;
1718-
xlrec.t_hoff = newtup->t_data->t_hoff;
1719-
xlrec.mask = newtup->t_data->t_infomask;
1720-
1721-
recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_UPDATE,
1722-
(char*) &xlrec, SizeOfHeapUpdate,
1723-
(char*) newtup->t_data + offsetof(HeapTupleHeaderData, t_bits),
1724-
newtup->t_len - offsetof(HeapTupleHeaderData, t_bits));
1713+
XLogRecPtr recptr = log_heap_update(relation,
1714+
oldtup.t_self, newtup, false);
17251715

17261716
if (newbuf != buffer)
17271717
{
@@ -2019,6 +2009,54 @@ heap_restrpos(HeapScanDesc scan)
20192009

20202010
#ifdef XLOG
20212011

2012+
static XLogRecPtr
2013+
log_heap_update(Relation reln, ItemPointerData from,
2014+
HeapTuple newtup, bool move)
2015+
{
2016+
char tbuf[sizeof(xl_heap_update) + 2 * sizeof(TransactionId)];
2017+
xl_heap_update *xlrec = (xl_heap_update*) tbuf;
2018+
int hsize = SizeOfHeapUpdate;
2019+
XLogRecPtr recptr;
2020+
2021+
xlrec->target.node = reln->rd_node;
2022+
xlrec->target.tid = from;
2023+
xlrec->newtid = newtup->t_self;
2024+
xlrec->t_natts = newtup->t_data->t_natts;
2025+
xlrec->t_oid = newtup->t_data->t_oid;
2026+
xlrec->t_hoff = newtup->t_data->t_hoff;
2027+
xlrec->mask = newtup->t_data->t_infomask;
2028+
2029+
if (move) /* remember xmin & xmax */
2030+
{
2031+
TransactionId xmax;
2032+
2033+
xlrec->target.cid = (CommandId) newtup->t_data->t_xmin;
2034+
if (newtup->t_data->t_infomask & HEAP_XMAX_INVALID ||
2035+
newtup->t_data->t_infomask & HEAP_MARKED_FOR_UPDATE)
2036+
xmax = InvalidTransactionId;
2037+
else
2038+
xmax = newtup->t_data->t_xmax;
2039+
memcpy(tbuf + hsize, &xmax, sizeof(TransactionId));
2040+
hsize += sizeof(TransactionId);
2041+
}
2042+
else
2043+
xlrec->target.cid = GetCurrentCommandId();
2044+
2045+
recptr = XLogInsert(RM_HEAP_ID,
2046+
(move) ? XLOG_HEAP_MOVE : XLOG_HEAP_UPDATE,
2047+
tbuf, hsize,
2048+
(char*) newtup->t_data + offsetof(HeapTupleHeaderData, t_bits),
2049+
newtup->t_len - offsetof(HeapTupleHeaderData, t_bits));
2050+
2051+
return(recptr);
2052+
}
2053+
2054+
XLogRecPtr
2055+
log_heap_move(Relation reln, ItemPointerData from, HeapTuple newtup)
2056+
{
2057+
return(log_heap_update(reln, from, newtup, true));
2058+
}
2059+
20222060
static void
20232061
heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
20242062
{
@@ -2159,6 +2197,7 @@ heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
21592197
htup->t_hoff = xlrec->t_hoff;
21602198
htup->t_xmin = record->xl_xid;
21612199
htup->t_cmin = xlrec->target.cid;
2200+
htup->t_xmax = htup->t_cmax = 0;
21622201
htup->t_infomask = HEAP_XMAX_INVALID | HEAP_XMIN_COMMITTED | xlrec->mask;
21632202

21642203
offnum = PageAddItem(page, (Item)htup, newlen,
@@ -2210,8 +2249,11 @@ heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
22102249

22112250
}
22122251

2252+
/*
2253+
* Handles UPDATE & MOVE
2254+
*/
22132255
static void
2214-
heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record)
2256+
heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move)
22152257
{
22162258
xl_heap_update *xlrec = (xl_heap_update*) XLogRecGetData(record);
22172259
Relation reln = XLogOpenRelation(redo, RM_HEAP_ID, xlrec->target.node);
@@ -2282,26 +2324,46 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record)
22822324

22832325
if (redo)
22842326
{
2285-
htup->t_xmax = record->xl_xid;
2286-
htup->t_cmax = xlrec->target.cid;
2287-
htup->t_infomask &= ~(HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE);
2288-
htup->t_infomask |= HEAP_XMAX_COMMITTED;
2327+
if (move)
2328+
{
2329+
TransactionIdStore(record->xl_xid, (TransactionId *) &(htup->t_cmin));
2330+
htup->t_infomask &=
2331+
~(HEAP_XMIN_COMMITTED | HEAP_XMIN_INVALID | HEAP_MOVED_IN);
2332+
htup->t_infomask |= HEAP_MOVED_OFF;
2333+
}
2334+
else
2335+
{
2336+
htup->t_xmax = record->xl_xid;
2337+
htup->t_cmax = xlrec->target.cid;
2338+
htup->t_infomask &= ~(HEAP_XMAX_COMMITTED |
2339+
HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE);
2340+
}
22892341
PageSetLSN(page, lsn);
22902342
PageSetSUI(page, ThisStartUpID);
22912343
UnlockAndWriteBuffer(buffer);
22922344
goto newt;
22932345
}
22942346

22952347
/* undo... is it our tuple ? */
2296-
if (htup->t_xmax != record->xl_xid || htup->t_cmax != xlrec->target.cid)
2348+
if ((! move && (htup->t_xmax != record->xl_xid ||
2349+
htup->t_cmax != xlrec->target.cid)) ||
2350+
xlrec->target.cid != (CommandId) htup->t_xmin ||
2351+
htup->t_cmin != (CommandId) record->xl_xid)
22972352
{
22982353
if (!InRecovery)
22992354
elog(STOP, "heap_update_undo: invalid old tuple in rollback");
23002355
UnlockAndReleaseBuffer(buffer);
23012356
}
23022357
else /* undo */
23032358
{
2304-
htup->t_infomask |= HEAP_XMAX_INVALID;
2359+
if (move)
2360+
{
2361+
htup->t_infomask &= ~(HEAP_XMIN_INVALID |
2362+
HEAP_MOVED_IN | HEAP_MOVED_OFF);
2363+
htup->t_infomask |= HEAP_XMIN_COMMITTED;
2364+
}
2365+
else
2366+
htup->t_infomask |= HEAP_XMAX_INVALID;
23052367
UnlockAndWriteBuffer(buffer);
23062368
}
23072369

@@ -2329,25 +2391,45 @@ newt:;
23292391

23302392
if (redo)
23312393
{
2332-
char tbuf[MaxTupleSize];
2333-
uint32 newlen = record->xl_len - SizeOfHeapUpdate;
2394+
char tbuf[MaxTupleSize];
2395+
int hsize;
2396+
uint32 newlen;
23342397

23352398
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
23362399
{
23372400
UnlockAndReleaseBuffer(buffer);
23382401
return;
23392402
}
23402403

2404+
hsize = SizeOfHeapUpdate;
2405+
if (move)
2406+
hsize += sizeof(TransactionId);
2407+
newlen = record->xl_len - hsize;
2408+
23412409
htup = (HeapTupleHeader) tbuf;
23422410
memcpy(tbuf + offsetof(HeapTupleHeaderData, t_bits),
2343-
(char*)xlrec + SizeOfHeapUpdate, newlen);
2411+
(char*)xlrec + hsize, newlen);
23442412
newlen += offsetof(HeapTupleHeaderData, t_bits);
23452413
htup->t_oid = xlrec->t_oid;
23462414
htup->t_natts = xlrec->t_natts;
23472415
htup->t_hoff = xlrec->t_hoff;
2348-
htup->t_xmin = record->xl_xid;
2349-
htup->t_cmin = xlrec->target.cid;
2350-
htup->t_infomask = HEAP_XMAX_INVALID | HEAP_XMIN_COMMITTED | xlrec->mask;
2416+
if (move)
2417+
{
2418+
htup->t_xmin = (TransactionId) xlrec->target.cid;
2419+
memcpy(&(htup->t_xmax),
2420+
(char*)xlrec + SizeOfHeapUpdate, sizeof(TransactionId));
2421+
htup->t_infomask = xlrec->mask;
2422+
htup->t_infomask &= ~(HEAP_XMIN_COMMITTED |
2423+
HEAP_XMIN_INVALID | HEAP_MOVED_OFF);
2424+
htup->t_infomask |= HEAP_MOVED_IN;
2425+
}
2426+
else
2427+
{
2428+
htup->t_xmin = record->xl_xid;
2429+
htup->t_cmin = xlrec->target.cid;
2430+
htup->t_xmax = htup->t_cmax = 0;
2431+
htup->t_infomask = HEAP_XMAX_INVALID | xlrec->mask;
2432+
}
23512433

23522434
offnum = PageAddItem(page, (Item)htup, newlen,
23532435
ItemPointerGetOffsetNumber(&(xlrec->newtid)),
@@ -2385,7 +2467,10 @@ newt:;
23852467

23862468
/* is it our tuple ? */
23872469
Assert(PageGetSUI(page) == ThisStartUpID);
2388-
if (htup->t_xmin != record->xl_xid || htup->t_cmin != xlrec->target.cid)
2470+
if ((! move && (htup->t_xmin != record->xl_xid ||
2471+
htup->t_cmin != xlrec->target.cid)) ||
2472+
xlrec->target.cid != (CommandId) htup->t_xmin ||
2473+
htup->t_cmin != (CommandId) record->xl_xid)
23892474
{
23902475
if (!InRecovery)
23912476
elog(STOP, "heap_update_undo: invalid new tuple in rollback");
@@ -2448,11 +2533,9 @@ void heap_redo(XLogRecPtr lsn, XLogRecord *record)
24482533
else if (info == XLOG_HEAP_DELETE)
24492534
heap_xlog_delete(true, lsn, record);
24502535
else if (info == XLOG_HEAP_UPDATE)
2451-
heap_xlog_update(true, lsn, record);
2452-
#ifdef NOT_USED
2536+
heap_xlog_update(true, lsn, record, false);
24532537
else if (info == XLOG_HEAP_MOVE)
2454-
heap_xlog_move(true, lsn, record);
2455-
#endif
2538+
heap_xlog_update(true, lsn, record, true);
24562539
else
24572540
elog(STOP, "heap_redo: unknown op code %u", info);
24582541
}
@@ -2466,11 +2549,9 @@ void heap_undo(XLogRecPtr lsn, XLogRecord *record)
24662549
else if (info == XLOG_HEAP_DELETE)
24672550
heap_xlog_delete(false, lsn, record);
24682551
else if (info == XLOG_HEAP_UPDATE)
2469-
heap_xlog_update(false, lsn, record);
2470-
#ifdef NOT_USED
2552+
heap_xlog_update(false, lsn, record, false);
24712553
else if (info == XLOG_HEAP_MOVE)
2472-
heap_xlog_move(false, lsn, record);
2473-
#endif
2554+
heap_xlog_update(false, lsn, record, true);
24742555
else
24752556
elog(STOP, "heap_undo: unknown op code %u", info);
24762557
}
@@ -2509,19 +2590,13 @@ heap_desc(char *buf, uint8 xl_info, char* rec)
25092590
strcat(buf, "delete: ");
25102591
out_target(buf, &(xlrec->target));
25112592
}
2512-
else if (info == XLOG_HEAP_UPDATE)
2593+
else if (info == XLOG_HEAP_UPDATE || info == XLOG_HEAP_MOVE)
25132594
{
25142595
xl_heap_update *xlrec = (xl_heap_update*) rec;
2515-
strcat(buf, "update: ");
2516-
out_target(buf, &(xlrec->target));
2517-
sprintf(buf + strlen(buf), "; new %u/%u",
2518-
ItemPointerGetBlockNumber(&(xlrec->newtid)),
2519-
ItemPointerGetOffsetNumber(&(xlrec->newtid)));
2520-
}
2521-
else if (info == XLOG_HEAP_MOVE)
2522-
{
2523-
xl_heap_move *xlrec = (xl_heap_move*) rec;
2524-
strcat(buf, "move: ");
2596+
if (info == XLOG_HEAP_UPDATE)
2597+
strcat(buf, "update: ");
2598+
else
2599+
strcat(buf, "move: ");
25252600
out_target(buf, &(xlrec->target));
25262601
sprintf(buf + strlen(buf), "; new %u/%u",
25272602
ItemPointerGetBlockNumber(&(xlrec->newtid)),

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy