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)
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