Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit deee783

Browse files
committed
WAL
1 parent 14f214d commit deee783

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/13 02:02:59 vadim Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.88 2000/10/13 12:05:20 vadim Exp $
1212
*
1313
*
1414
* INTERFACE ROUTINES
@@ -2198,7 +2198,8 @@ void heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
21982198
HeapTupleHeader htup = (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/13 02:03:00 vadim Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.66 2000/10/13 12:05:20 vadim Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -612,6 +612,10 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
612612
OffsetNumber maxoff;
613613
OffsetNumber i;
614614

615+
#ifdef XLOG
616+
BTItem lhikey;
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+
#ifdef XLOG
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+
Size itemsz = 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/13 02:03:00 vadim Exp $
15+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.65 2000/10/13 12: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
Page page = (Page) BufferGetPage(buffer);
1201-
BTPageOpaque pageop;
1215+
BTPageOpaque pageop = (BTPageOpaque) PageGetSpecialPointer(page);
12021216
BlockNumber blkno;
12031217
OffsetNumber offno;
12041218
ItemId lp;
1219+
BTItem item;
12051220

12061221
for ( ; ; )
12071222
{
1208-
offno = _bt_find_btitem(page, btitem);
1209-
if (offno != InvalidOffsetNumber)
1223+
OffsetNumber maxoff = 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
static bool
12801306
_bt_add_item(Page page, OffsetNumber offno,
1281-
char* item, Size size, RelFileNode* hnode)
1307+
char* item, Size size, RelFileNode hnode)
12821308
{
12831309
BTPageOpaque pageop = (BTPageOpaque) PageGetSpecialPointer(page);
12841310

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

1338+
static bool
1339+
_bt_cleanup_page(Page page, RelFileNode hnode)
1340+
{
1341+
OffsetNumber maxoff = PageGetMaxOffsetNumber(page);
1342+
OffsetNumber offno;
1343+
ItemId lp;
1344+
BTItem item;
1345+
bool result = 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+
static void
1369+
_bt_fix_left_page(Page page, XLogRecord *record, bool onleft)
1370+
{
1371+
char *xlrec = (char*) XLogRecGetData(record);
1372+
BTPageOpaque pageop = (BTPageOpaque) PageGetSpecialPointer(page);
1373+
Size hsize = SizeOfBtreeSplit;
1374+
RelFileNode hnode;
1375+
BTItemData btdata;
1376+
OffsetNumber maxoff = PageGetMaxOffsetNumber(page);
1377+
OffsetNumber offno;
1378+
char *item;
1379+
Size itemsz;
1380+
char *previtem = NULL;
1381+
char *lhikey = NULL;
1382+
Size lhisize = 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+
ItemId lp = PageGetItemId(page, offno);
1418+
BTItem btitem = (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.o xlogutils.o rmgr.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/13 02:03:02 vadim Exp $
10+
* $Id: nbtree.h,v 1.45 2000/10/13 12: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
typedef struct xl_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, but after (for the leaf
275-
* pages) CommandId and HeapNode.
275+
* BTItemData at the end of this struct after CommandId and HeapNode
276+
* on the leaf pages and left page hi-key on non-leaf ones.
276277
*/
277278
} xl_btree_split;
278279

0 commit comments

Comments
 (0)