Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitdb2faa9

Browse files
committed
WAL misc
1 parent4b70629 commitdb2faa9

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
voidheap_undo(XLogRecPtrlsn,XLogRecord*record);
9494
voidheap_desc(char*buf,uint8xl_info,char*rec);
9595

96+
XLogRecPtrlog_heap_move(Relationreln,ItemPointerDatafrom,HeapTuplenewtup);
97+
9698
/* comments are in heap_update */
9799
staticxl_heaptid_locked_tuple_;
98100
staticvoid_heap_unlock_tuple(void*data);
101+
staticXLogRecPtrlog_heap_update(Relationreln,ItemPointerDatafrom,
102+
HeapTuplenewtup,boolmove);
99103

100104
staticvoidHeapPageCleanup(Bufferbuffer);
101105

@@ -1706,22 +1710,8 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
17061710
#ifdefXLOG
17071711
/* XLOG stuff */
17081712
{
1709-
xl_heap_updatexlrec;
1710-
XLogRecPtrrecptr;
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+
XLogRecPtrrecptr=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
#ifdefXLOG
20212011

2012+
staticXLogRecPtr
2013+
log_heap_update(Relationreln,ItemPointerDatafrom,
2014+
HeapTuplenewtup,boolmove)
2015+
{
2016+
chartbuf[sizeof(xl_heap_update)+2*sizeof(TransactionId)];
2017+
xl_heap_update*xlrec= (xl_heap_update*)tbuf;
2018+
inthsize=SizeOfHeapUpdate;
2019+
XLogRecPtrrecptr;
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+
TransactionIdxmax;
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(Relationreln,ItemPointerDatafrom,HeapTuplenewtup)
2056+
{
2057+
return(log_heap_update(reln,from,newtup, true));
2058+
}
2059+
20222060
staticvoid
20232061
heap_xlog_delete(boolredo,XLogRecPtrlsn,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
staticvoid
2214-
heap_xlog_update(boolredo,XLogRecPtrlsn,XLogRecord*record)
2256+
heap_xlog_update(boolredo,XLogRecPtrlsn,XLogRecord*record,boolmove)
22152257
{
22162258
xl_heap_update*xlrec= (xl_heap_update*)XLogRecGetData(record);
22172259
Relationreln=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
gotonewt;
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-
chartbuf[MaxTupleSize];
2333-
uint32newlen=record->xl_len-SizeOfHeapUpdate;
2394+
chartbuf[MaxTupleSize];
2395+
inthsize;
2396+
uint32newlen;
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
elseif (info==XLOG_HEAP_DELETE)
24492534
heap_xlog_delete(true,lsn,record);
24502535
elseif (info==XLOG_HEAP_UPDATE)
2451-
heap_xlog_update(true,lsn,record);
2452-
#ifdefNOT_USED
2536+
heap_xlog_update(true,lsn,record, false);
24532537
elseif (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
elseif (info==XLOG_HEAP_DELETE)
24672550
heap_xlog_delete(false,lsn,record);
24682551
elseif (info==XLOG_HEAP_UPDATE)
2469-
heap_xlog_update(false,lsn,record);
2470-
#ifdefNOT_USED
2552+
heap_xlog_update(false,lsn,record, false);
24712553
elseif (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-
elseif (info==XLOG_HEAP_UPDATE)
2593+
elseif (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-
elseif (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)

[8]ページ先頭

©2009-2025 Movatter.jp