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

Commitdeee783

Browse files
committed
WAL
1 parent14f214d commitdeee783

File tree

5 files changed

+187
-23
lines changed

5 files changed

+187
-23
lines changed

‎src/backend/access/heap/heapam.c

Lines changed: 5 additions & 3 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.87 2000/10/1302:02:59 vadim Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.88 2000/10/1312:05:20 vadim Exp $
1212
*
1313
*
1414
* INTERFACE ROUTINES
@@ -2198,7 +2198,8 @@ void heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
21982198
HeapTupleHeaderhtup= (HeapTupleHeader)PageGetItem(page,lp);
21992199

22002200
/* is it our tuple ? */
2201-
if (htup->t_xmin!=record->xl_xid||htup->t_cmin!=xlrec->target.cid)
2201+
if (PageGetSUI(page)!=ThisStartUpID||
2202+
htup->t_xmin!=record->xl_xid||htup->t_cmin!=xlrec->target.cid)
22022203
{
22032204
if (!InRecovery)
22042205
elog(STOP,"heap_insert_undo: invalid target tuple in rollback");
@@ -2394,7 +2395,8 @@ newt:;
23942395
htup= (HeapTupleHeader)PageGetItem(page,lp);
23952396

23962397
/* is it our tuple ? */
2397-
if (htup->t_xmin!=record->xl_xid||htup->t_cmin!=xlrec->target.cid)
2398+
if (PageGetSUI(page)!=ThisStartUpID||
2399+
htup->t_xmin!=record->xl_xid||htup->t_cmin!=xlrec->target.cid)
23982400
{
23992401
if (!InRecovery)
24002402
elog(STOP,"heap_update_undo: invalid new tuple in rollback");

‎src/backend/access/nbtree/nbtinsert.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.65 2000/10/1302:03:00 vadim Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.66 2000/10/1312:05:20 vadim Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -612,6 +612,10 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
612612
OffsetNumbermaxoff;
613613
OffsetNumberi;
614614

615+
#ifdefXLOG
616+
BTItemlhikey;
617+
#endif
618+
615619
rbuf=_bt_getbuf(rel,P_NEW,BT_WRITE);
616620
origpage=BufferGetPage(buf);
617621
leftpage=PageGetTempPage(origpage,sizeof(BTPageOpaqueData));
@@ -680,6 +684,9 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
680684
itemsz=ItemIdGetLength(itemid);
681685
item= (BTItem)PageGetItem(origpage,itemid);
682686
}
687+
#ifdefXLOG
688+
lhikey=item;
689+
#endif
683690
if (PageAddItem(leftpage, (Item)item,itemsz,leftoff,
684691
LP_USED)==InvalidOffsetNumber)
685692
elog(STOP,"btree: failed to add hikey to the left sibling");
@@ -793,12 +800,19 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
793800
memcpy(xlbuf+hsize,&(_xlheapRel->rd_node),sizeof(RelFileNode));
794801
hsize+=sizeof(RelFileNode);
795802
}
803+
else
804+
{
805+
Sizeitemsz=IndexTupleDSize(lhikey->bti_itup)+
806+
(sizeof(BTItemData)-sizeof(IndexTupleData));
807+
memcpy(xlbuf+hsize, (char*)lhikey,itemsz);
808+
hsize+=itemsz;
809+
}
796810
if (newitemonleft)
797811
{
798812
/*
799813
* Read comments in _bt_pgaddtup.
800814
* Actually, seems that in non-leaf splits newitem shouldn't
801-
* go to first data key position.
815+
* go to first data key position on left page.
802816
*/
803817
if (!P_ISLEAF(lopaque)&&itup_off==P_FIRSTDATAKEY(lopaque))
804818
{

‎src/backend/access/nbtree/nbtree.c

Lines changed: 158 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* Portions Copyright (c) 1994, Regents of the University of California
1313
*
1414
* IDENTIFICATION
15-
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.64 2000/10/1302:03:00 vadim Exp $
15+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.65 2000/10/1312:05:20 vadim Exp $
1616
*
1717
*-------------------------------------------------------------------------
1818
*/
@@ -837,7 +837,7 @@ static void btree_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
837837
ItemPointerGetOffsetNumber(&(xlrec->target.tid)),
838838
(char*)xlrec+hsize,
839839
record->xl_len-hsize,
840-
&hnode))
840+
hnode))
841841
elog(STOP,"btree_insert_redo: failed to add item");
842842

843843
PageSetLSN(page,lsn);
@@ -908,7 +908,7 @@ btree_xlog_split(bool redo, bool onleft, XLogRecPtr lsn, XLogRecord *record)
908908
else
909909
{
910910
/* Delete items related to new right sibling */
911-
_bt_thin_left_page(page,record);
911+
_bt_fix_left_page(page,record,onleft);
912912

913913
if (onleft)
914914
{
@@ -924,6 +924,13 @@ btree_xlog_split(bool redo, bool onleft, XLogRecPtr lsn, XLogRecord *record)
924924
memcpy(&hnode, (char*)xlrec+SizeOfBtreeSplit+
925925
sizeof(CommandId),sizeof(RelFileNode));
926926
}
927+
else
928+
{
929+
memcpy(&btdata, (char*)xlrec+hsize,sizeof(BTItemData));
930+
itemsz=IndexTupleDSize(btdata.bti_itup)+
931+
(sizeof(BTItemData)-sizeof(IndexTupleData));
932+
hsize+=itemsz;
933+
}
927934

928935
memcpy(&btdata, (char*)xlrec+hsize,sizeof(BTItemData));
929936
itemsz=IndexTupleDSize(btdata.bti_itup)+
@@ -933,7 +940,7 @@ btree_xlog_split(bool redo, bool onleft, XLogRecPtr lsn, XLogRecord *record)
933940
ItemPointerGetOffsetNumber(&(xlrec->target.tid)),
934941
(char*)xlrec+hsize,
935942
itemsz,
936-
&hnode))
943+
hnode))
937944
elog(STOP,"btree_split_redo: failed to add item");
938945
}
939946
else
@@ -994,6 +1001,13 @@ btree_xlog_split(bool redo, bool onleft, XLogRecPtr lsn, XLogRecord *record)
9941001
pageop->btpo_flags |=BTP_LEAF;
9951002
hsize+= (sizeof(CommandId)+sizeof(RelFileNode));
9961003
}
1004+
else
1005+
{
1006+
memcpy(&btdata, (char*)xlrec+hsize,sizeof(BTItemData));
1007+
itemsz=IndexTupleDSize(btdata.bti_itup)+
1008+
(sizeof(BTItemData)-sizeof(IndexTupleData));
1009+
hsize+=itemsz;
1010+
}
9971011
if (onleft)/* skip target item */
9981012
{
9991013
memcpy(&btdata, (char*)xlrec+hsize,sizeof(BTItemData));
@@ -1198,17 +1212,28 @@ _bt_del_item(Relation reln, Buffer buffer, BTItem btitem, bool insert,
11981212
{
11991213
char*xlrec= (char*)XLogRecGetData(record);
12001214
Pagepage= (Page)BufferGetPage(buffer);
1201-
BTPageOpaquepageop;
1215+
BTPageOpaquepageop= (BTPageOpaque)PageGetSpecialPointer(page);
12021216
BlockNumberblkno;
12031217
OffsetNumberoffno;
12041218
ItemIdlp;
1219+
BTItemitem;
12051220

12061221
for ( ; ; )
12071222
{
1208-
offno=_bt_find_btitem(page,btitem);
1209-
if (offno!=InvalidOffsetNumber)
1223+
OffsetNumbermaxoff=PageGetMaxOffsetNumber(page);
1224+
1225+
for (offno=P_FIRSTDATAKEY(pageop);
1226+
offno <=maxoff;
1227+
offno=OffsetNumberNext(offno))
1228+
{
1229+
lp=PageGetItemId(page,offno);
1230+
item= (BTItem)PageGetItem(page,lp);
1231+
if (BTItemSame(item,btitem))
1232+
break;
1233+
}
1234+
if (offno <=maxoff)
12101235
break;
1211-
pageop=(BTPageOpaque)PageGetSpecialPointer(page);
1236+
offno=InvalidOffsetNumber;
12121237
if (P_RIGHTMOST(pageop))
12131238
break;
12141239
blkno=pageop->btpo_next;
@@ -1221,6 +1246,7 @@ _bt_del_item(Relation reln, Buffer buffer, BTItem btitem, bool insert,
12211246
if (PageIsNew((PageHeader)page))
12221247
elog(STOP,"btree_%s_undo: uninitialized right sibling",
12231248
(insert) ?"insert" :"split");
1249+
pageop= (BTPageOpaque)PageGetSpecialPointer(page);
12241250
if (XLByteLT(PageGetLSN(page),lsn))
12251251
break;
12261252
}
@@ -1250,9 +1276,9 @@ _bt_del_item(Relation reln, Buffer buffer, BTItem btitem, bool insert,
12501276

12511277
memcpy(&cid, (char*)xlrec+hsize,sizeof(CommandId));
12521278
memcpy(&hnode, (char*)xlrec+hsize+sizeof(CommandId),sizeof(RelFileNode));
1253-
result=XLogCheckHeapTuple(hnode,&(btitem->bti_itup.t_tid),
1279+
result=XLogIsOwnerOfTuple(hnode,&(btitem->bti_itup.t_tid),
12541280
record->xl_xid,cid);
1255-
if (result <=0)/* no tuple or not owner */
1281+
if (result<0)/* not owner */
12561282
{
12571283
UnlockAndReleaseBuffer(buffer);
12581284
return;
@@ -1278,7 +1304,7 @@ _bt_del_item(Relation reln, Buffer buffer, BTItem btitem, bool insert,
12781304

12791305
staticbool
12801306
_bt_add_item(Pagepage,OffsetNumberoffno,
1281-
char*item,Sizesize,RelFileNode*hnode)
1307+
char*item,Sizesize,RelFileNodehnode)
12821308
{
12831309
BTPageOpaquepageop= (BTPageOpaque)PageGetSpecialPointer(page);
12841310

@@ -1309,4 +1335,125 @@ _bt_add_item(Page page, OffsetNumber offno,
13091335
return(true);
13101336
}
13111337

1338+
staticbool
1339+
_bt_cleanup_page(Pagepage,RelFileNodehnode)
1340+
{
1341+
OffsetNumbermaxoff=PageGetMaxOffsetNumber(page);
1342+
OffsetNumberoffno;
1343+
ItemIdlp;
1344+
BTItemitem;
1345+
boolresult= false;
1346+
1347+
for (offno=P_FIRSTDATAKEY(pageop);offno <=maxoff; )
1348+
{
1349+
lp=PageGetItemId(page,offno);
1350+
item= (BTItem)PageGetItem(page,lp);
1351+
if (XLogIsValidTuple(hnode,&(item->bti_itup.t_tid))
1352+
offno=OffsetNumberNext(offno);
1353+
else
1354+
{
1355+
PageIndexTupleDelete(page,offno);
1356+
maxoff=PageGetMaxOffsetNumber(page);
1357+
result= true;
1358+
}
1359+
}
1360+
1361+
return(result);
1362+
}
1363+
1364+
/*
1365+
* Remove from left sibling items belonging to right sibling
1366+
* and change P_HIKEY
1367+
*/
1368+
staticvoid
1369+
_bt_fix_left_page(Pagepage,XLogRecord*record,boolonleft)
1370+
{
1371+
char*xlrec= (char*)XLogRecGetData(record);
1372+
BTPageOpaquepageop= (BTPageOpaque)PageGetSpecialPointer(page);
1373+
Sizehsize=SizeOfBtreeSplit;
1374+
RelFileNodehnode;
1375+
BTItemDatabtdata;
1376+
OffsetNumbermaxoff=PageGetMaxOffsetNumber(page);
1377+
OffsetNumberoffno;
1378+
char*item;
1379+
Sizeitemsz;
1380+
char*previtem=NULL;
1381+
char*lhikey=NULL;
1382+
Sizelhisize=0;
1383+
1384+
if (pageop->btpo_flags&BTP_LEAF)
1385+
{
1386+
hsize+= (sizeof(CommandId)+sizeof(RelFileNode));
1387+
memcpy(&hnode, (char*)xlrec+SizeOfBtreeSplit+
1388+
sizeof(CommandId),sizeof(RelFileNode));
1389+
}
1390+
else
1391+
{
1392+
lhikey= (char*)xlrec+hsize;
1393+
memcpy(&btdata,lhikey,sizeof(BTItemData));
1394+
lhisize=IndexTupleDSize(btdata.bti_itup)+
1395+
(sizeof(BTItemData)-sizeof(IndexTupleData));
1396+
hsize+=lhisize;
1397+
}
1398+
1399+
if (!P_RIGHTMOST(pageop))
1400+
PageIndexTupleDelete(page,P_HIKEY);
1401+
1402+
if (onleft)/* skip target item */
1403+
{
1404+
memcpy(&btdata, (char*)xlrec+hsize,sizeof(BTItemData));
1405+
itemsz=IndexTupleDSize(btdata.bti_itup)+
1406+
(sizeof(BTItemData)-sizeof(IndexTupleData));
1407+
hsize+=itemsz;
1408+
}
1409+
1410+
for (item= (char*)xlrec+hsize; ; )
1411+
{
1412+
memcpy(&btdata,item,sizeof(BTItemData));
1413+
for (offno=P_FIRSTDATAKEY(pageop);
1414+
offno <=maxoff;
1415+
offno=OffsetNumberNext(offno))
1416+
{
1417+
ItemIdlp=PageGetItemId(page,offno);
1418+
BTItembtitem= (BTItem)PageGetItem(page,lp);
1419+
1420+
if (BTItemSame(&btdata,btitem))
1421+
{
1422+
PageIndexTupleDelete(page,offno);
1423+
break;
1424+
}
1425+
}
1426+
1427+
itemsz=IndexTupleDSize(btdata.bti_itup)+
1428+
(sizeof(BTItemData)-sizeof(IndexTupleData));
1429+
itemsz=MAXALIGN(itemsz);
1430+
1431+
if (item+itemsz< (char*)record+record->xl_len)
1432+
{
1433+
previtem=item;
1434+
item+=itemsz;
1435+
}
1436+
else
1437+
break;
1438+
}
1439+
1440+
/* time to insert hi-key */
1441+
if (pageop->btpo_flags&BTP_LEAF)
1442+
{
1443+
lhikey= (P_RIGHTMOST(pageop)) ?item :previtem;
1444+
memcpy(&btdata,lhikey,sizeof(BTItemData));
1445+
lhisize=IndexTupleDSize(btdata.bti_itup)+
1446+
(sizeof(BTItemData)-sizeof(IndexTupleData));
1447+
}
1448+
1449+
if (!_bt_add_item(page,
1450+
P_HIKEY,
1451+
lhikey,
1452+
lhisize,
1453+
&hnode))
1454+
elog(STOP,"btree_split_redo: failed to add hi key to left sibling");
1455+
1456+
return;
1457+
}
1458+
13121459
#endif

‎src/backend/access/transam/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
# Makefile for access/transam
55
#
66
# IDENTIFICATION
7-
# $Header: /cvsroot/pgsql/src/backend/access/transam/Makefile,v 1.12 2000/08/31 16:09:46 petere Exp $
7+
# $Header: /cvsroot/pgsql/src/backend/access/transam/Makefile,v 1.13 2000/10/13 12:05:21 vadim Exp $
88
#
99
#-------------------------------------------------------------------------
1010

1111
subdir = src/backend/access/transam
1212
top_builddir = ../../../..
1313
include$(top_builddir)/src/Makefile.global
1414

15-
OBJS = transam.o transsup.o varsup.o xact.o xid.o xlog.o rmgr.o
15+
OBJS = transam.o transsup.o varsup.o xact.o xid.o xlog.oxlogutils.ormgr.o
1616

1717
all: SUBSYS.o
1818

‎src/include/access/nbtree.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $Id: nbtree.h,v 1.44 2000/10/1302:03:02 vadim Exp $
10+
* $Id: nbtree.h,v 1.45 2000/10/1312:05:22 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -259,8 +259,9 @@ typedef struct xl_btree_insert
259259

260260
/*
261261
* This is what we need to know about insert with split -
262-
* 22 + [4+8] + [btitem] + right sibling btitems. Note that we need in
263-
* CommandID and HeapNode (4 + 8 bytes) only for leaf page insert.
262+
* 22 + {4 + 8 | left hi-key} + [btitem] + right sibling btitems. Note that
263+
* we need in CommandID and HeapNode (4 + 8 bytes) for leaf pages
264+
* and in left page hi-key for non-leaf ones.
264265
*/
265266
typedefstructxl_btree_split
266267
{
@@ -271,8 +272,8 @@ typedef struct xl_btree_split
271272
/*
272273
* We log all btitems from the right sibling. If new btitem goes on
273274
* the left sibling then we log it too and it will be the first
274-
* BTItemData at the end of this struct, butafter(for the leaf
275-
*pages) CommandIdandHeapNode.
275+
* BTItemData at the end of this structafterCommandId and HeapNode
276+
*on the leaf pagesandleft page hi-key on non-leaf ones.
276277
*/
277278
}xl_btree_split;
278279

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp