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

Commit7ceeeb6

Browse files
committed
New WAL version - CRC and data blocks backup.
1 parentc996c7f commit7ceeeb6

File tree

18 files changed

+1197
-1196
lines changed

18 files changed

+1197
-1196
lines changed

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

Lines changed: 254 additions & 288 deletions
Large diffs are not rendered by default.

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

Lines changed: 108 additions & 104 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.70 2000/12/03 10:27:26 vadim Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.71 2000/12/28 13:00:07 vadim Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -520,39 +520,40 @@ _bt_insertonpg(Relation rel,
520520
{
521521
/* XLOG stuff */
522522
{
523-
charxlbuf[sizeof(xl_btree_insert)+
524-
sizeof(CommandId)+sizeof(RelFileNode)];
525-
xl_btree_insert*xlrec= (xl_btree_insert*)xlbuf;
526-
inthsize=SizeOfBtreeInsert;
527-
BTItemDatatruncitem;
528-
BTItemxlitem=btitem;
529-
Sizexlsize=IndexTupleDSize(btitem->bti_itup)+
530-
(sizeof(BTItemData)-sizeof(IndexTupleData));
523+
xl_btree_insertxlrec;
524+
uint8flag=XLOG_BTREE_INSERT;
531525
XLogRecPtrrecptr;
526+
XLogRecDatardata[2];
532527

533-
xlrec->target.node=rel->rd_node;
534-
ItemPointerSet(&(xlrec->target.tid),BufferGetBlockNumber(buf),newitemoff);
535-
if (P_ISLEAF(lpageop))
536-
{
537-
CommandIdcid=GetCurrentCommandId();
538-
memcpy(xlbuf+hsize,&cid,sizeof(CommandId));
539-
hsize+=sizeof(CommandId);
540-
memcpy(xlbuf+hsize,&(_xlheapRel->rd_node),sizeof(RelFileNode));
541-
hsize+=sizeof(RelFileNode);
542-
}
543-
/*
544-
* Read comments in _bt_pgaddtup
545-
*/
546-
elseif (newitemoff==P_FIRSTDATAKEY(lpageop))
528+
xlrec.target.node=rel->rd_node;
529+
ItemPointerSet(&(xlrec.target.tid),BufferGetBlockNumber(buf),newitemoff);
530+
rdata[0].buffer=InvalidBuffer;
531+
rdata[0].data= (char*)&xlrec;
532+
rdata[0].len=SizeOfBtreeInsert;
533+
rdata[0].next=&(rdata[1]);
534+
535+
/* Read comments in _bt_pgaddtup */
536+
if (!(P_ISLEAF(lpageop))&&newitemoff==P_FIRSTDATAKEY(lpageop))
547537
{
548-
truncitem=*btitem;
538+
BTItemDatatruncitem=*btitem;
539+
549540
truncitem.bti_itup.t_info=sizeof(BTItemData);
550-
xlitem=&truncitem;
551-
xlsize=sizeof(BTItemData);
541+
rdata[1].data= (char*)&truncitem;
542+
rdata[1].len=sizeof(BTItemData);
543+
}
544+
else
545+
{
546+
rdata[1].data= (char*)btitem;
547+
rdata[1].len=IndexTupleDSize(btitem->bti_itup)+
548+
(sizeof(BTItemData)-sizeof(IndexTupleData));
552549
}
550+
rdata[1].buffer=buf;
551+
rdata[1].next=NULL;
553552

554-
recptr=XLogInsert(RM_BTREE_ID,XLOG_BTREE_INSERT,
555-
xlbuf,hsize, (char*)xlitem,xlsize);
553+
if (P_ISLEAF(lpageop))
554+
flag |=XLOG_BTREE_LEAF;
555+
556+
recptr=XLogInsert(RM_BTREE_ID,flag,rdata);
556557

557558
PageSetLSN(page,recptr);
558559
PageSetSUI(page,ThisStartUpID);
@@ -774,71 +775,63 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
774775
*/
775776
START_CRIT_CODE;
776777
{
777-
charxlbuf[sizeof(xl_btree_split)+
778-
sizeof(CommandId)+sizeof(RelFileNode)+BLCKSZ];
779-
xl_btree_split*xlrec= (xl_btree_split*)xlbuf;
780-
inthsize=SizeOfBtreeSplit;
781-
intflag= (newitemonleft) ?
782-
XLOG_BTREE_SPLEFT :XLOG_BTREE_SPLIT;
783-
BlockNumberblkno;
784-
XLogRecPtrrecptr;
785-
786-
xlrec->target.node=rel->rd_node;
787-
ItemPointerSet(&(xlrec->target.tid),*itup_blkno,*itup_off);
788-
if (P_ISLEAF(lopaque))
789-
{
790-
CommandIdcid=GetCurrentCommandId();
791-
memcpy(xlbuf+hsize,&cid,sizeof(CommandId));
792-
hsize+=sizeof(CommandId);
793-
memcpy(xlbuf+hsize,&(_xlheapRel->rd_node),sizeof(RelFileNode));
794-
hsize+=sizeof(RelFileNode);
795-
}
796-
else
797-
{
798-
Sizeitemsz=IndexTupleDSize(lhikey->bti_itup)+
799-
(sizeof(BTItemData)-sizeof(IndexTupleData));
800-
memcpy(xlbuf+hsize, (char*)lhikey,itemsz);
801-
hsize+=itemsz;
802-
}
778+
xl_btree_splitxlrec;
779+
intflag= (newitemonleft) ?
780+
XLOG_BTREE_SPLEFT :XLOG_BTREE_SPLIT;
781+
BlockNumberblkno;
782+
XLogRecPtrrecptr;
783+
XLogRecDatardata[4];
784+
785+
xlrec.target.node=rel->rd_node;
786+
ItemPointerSet(&(xlrec.target.tid),*itup_blkno,*itup_off);
803787
if (newitemonleft)
804788
{
805-
/*
806-
* Read comments in _bt_pgaddtup.
807-
* Actually, seems that in non-leaf splits newitem shouldn't
808-
* go to first data key position on left page.
809-
*/
810-
if (!P_ISLEAF(lopaque)&&*itup_off==P_FIRSTDATAKEY(lopaque))
811-
{
812-
BTItemDatatruncitem=*newitem;
813-
truncitem.bti_itup.t_info=sizeof(BTItemData);
814-
memcpy(xlbuf+hsize,&truncitem,sizeof(BTItemData));
815-
hsize+=sizeof(BTItemData);
816-
}
817-
else
818-
{
819-
Sizeitemsz=IndexTupleDSize(newitem->bti_itup)+
820-
(sizeof(BTItemData)-sizeof(IndexTupleData));
821-
memcpy(xlbuf+hsize, (char*)newitem,itemsz);
822-
hsize+=itemsz;
823-
}
824789
blkno=BufferGetBlockNumber(rbuf);
825-
BlockIdSet(&(xlrec->otherblk),blkno);
790+
BlockIdSet(&(xlrec.otherblk),blkno);
826791
}
827792
else
828793
{
829794
blkno=BufferGetBlockNumber(buf);
830-
BlockIdSet(&(xlrec->otherblk),blkno);
795+
BlockIdSet(&(xlrec.otherblk),blkno);
831796
}
832-
833-
BlockIdSet(&(xlrec->rightblk),ropaque->btpo_next);
834-
797+
BlockIdSet(&(xlrec.parentblk),lopaque->btpo_parent);
798+
BlockIdSet(&(xlrec.leftblk),lopaque->btpo_prev);
799+
BlockIdSet(&(xlrec.rightblk),ropaque->btpo_next);
835800
/*
836801
* Dirrect access to page is not good but faster - we should
837802
* implement some new func in page API.
838803
*/
839-
recptr=XLogInsert(RM_BTREE_ID,flag,xlbuf,
840-
hsize, (char*)rightpage+ ((PageHeader)rightpage)->pd_upper,
841-
((PageHeader)rightpage)->pd_special- ((PageHeader)rightpage)->pd_upper);
804+
xlrec.leftlen= ((PageHeader)leftpage)->pd_special-
805+
((PageHeader)leftpage)->pd_upper;
806+
rdata[0].buffer=InvalidBuffer;
807+
rdata[0].data= (char*)&xlrec;
808+
rdata[0].len=SizeOfBtreeSplit;
809+
rdata[0].next=&(rdata[1]);
810+
811+
rdata[1].buffer=InvalidBuffer;
812+
rdata[1].data= (char*)leftpage+ ((PageHeader)leftpage)->pd_upper;
813+
rdata[1].len=xlrec.leftlen;
814+
rdata[1].next=&(rdata[2]);
815+
816+
rdata[2].buffer=InvalidBuffer;
817+
rdata[2].data= (char*)rightpage+ ((PageHeader)rightpage)->pd_upper;
818+
rdata[2].len= ((PageHeader)rightpage)->pd_special-
819+
((PageHeader)rightpage)->pd_upper;
820+
rdata[2].next=NULL;
821+
822+
if (!P_RIGHTMOST(ropaque))
823+
{
824+
rdata[2].next=&(rdata[3]);
825+
rdata[3].buffer=sbuf;
826+
rdata[3].data=NULL;
827+
rdata[3].len=0;
828+
rdata[3].next=NULL;
829+
}
830+
831+
if (P_ISLEAF(lopaque))
832+
flag |=XLOG_BTREE_LEAF;
833+
834+
recptr=XLogInsert(RM_BTREE_ID,flag,rdata);
842835

843836
PageSetLSN(leftpage,recptr);
844837
PageSetSUI(leftpage,ThisStartUpID);
@@ -1143,25 +1136,29 @@ _bt_getstackbuf(Relation rel, BTStack stack)
11431136
void
11441137
_bt_newroot(Relationrel,Bufferlbuf,Bufferrbuf)
11451138
{
1146-
Bufferrootbuf;
1147-
Pagelpage,
1148-
rpage,
1149-
rootpage;
1150-
BlockNumberlbkno,
1151-
rbkno;
1152-
BlockNumberrootblknum;
1153-
BTPageOpaquerootopaque;
1154-
ItemIditemid;
1155-
BTItemitem;
1156-
Sizeitemsz;
1157-
BTItemnew_item;
1158-
Buffermetabuf;
1139+
Bufferrootbuf;
1140+
Pagelpage,
1141+
rpage,
1142+
rootpage;
1143+
BlockNumberlbkno,
1144+
rbkno;
1145+
BlockNumberrootblknum;
1146+
BTPageOpaquerootopaque;
1147+
ItemIditemid;
1148+
BTItemitem;
1149+
Sizeitemsz;
1150+
BTItemnew_item;
1151+
Buffermetabuf;
1152+
Pagemetapg;
1153+
BTMetaPageData*metad;
11591154

11601155
/* get a new root page */
11611156
rootbuf=_bt_getbuf(rel,P_NEW,BT_WRITE);
11621157
rootpage=BufferGetPage(rootbuf);
11631158
rootblknum=BufferGetBlockNumber(rootbuf);
1164-
metabuf=_bt_getbuf(rel,BTREE_METAPAGE,BT_WRITE);
1159+
metabuf=_bt_getbuf(rel,BTREE_METAPAGE,BT_WRITE);
1160+
metapg=BufferGetPage(metabuf);
1161+
metad=BTPageGetMeta(metapg);
11651162

11661163
/* NO ELOG(ERROR) from here till newroot op is logged */
11671164
START_CRIT_CODE;
@@ -1222,39 +1219,46 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
12221219
elog(STOP,"btree: failed to add rightkey to new root page");
12231220
pfree(new_item);
12241221

1222+
metad->btm_root=rootblknum;
1223+
(metad->btm_level)++;
1224+
12251225
/* XLOG stuff */
12261226
{
12271227
xl_btree_newrootxlrec;
1228-
Pagemetapg=BufferGetPage(metabuf);
1229-
BTMetaPageData*metad=BTPageGetMeta(metapg);
12301228
XLogRecPtrrecptr;
1229+
XLogRecDatardata[2];
12311230

12321231
xlrec.node=rel->rd_node;
1232+
xlrec.level=metad->btm_level;
12331233
BlockIdSet(&(xlrec.rootblk),rootblknum);
1234+
rdata[0].buffer=InvalidBuffer;
1235+
rdata[0].data= (char*)&xlrec;
1236+
rdata[0].len=SizeOfBtreeNewroot;
1237+
rdata[0].next=&(rdata[1]);
12341238

12351239
/*
12361240
* Dirrect access to page is not good but faster - we should
12371241
* implement some new func in page API.
12381242
*/
1239-
recptr=XLogInsert(RM_BTREE_ID,XLOG_BTREE_NEWROOT,
1240-
(char*)&xlrec,SizeOfBtreeNewroot,
1241-
(char*)rootpage+ ((PageHeader)rootpage)->pd_upper,
1242-
((PageHeader)rootpage)->pd_special- ((PageHeader)rootpage)->pd_upper);
1243+
rdata[1].buffer=InvalidBuffer;
1244+
rdata[1].data= (char*)rootpage+ ((PageHeader)rootpage)->pd_upper;
1245+
rdata[1].len= ((PageHeader)rootpage)->pd_special-
1246+
((PageHeader)rootpage)->pd_upper;
1247+
rdata[1].next=NULL;
12431248

1244-
metad->btm_root=rootblknum;
1245-
(metad->btm_level)++;
1249+
recptr=XLogInsert(RM_BTREE_ID,XLOG_BTREE_NEWROOT,rdata);
12461250

12471251
PageSetLSN(rootpage,recptr);
12481252
PageSetSUI(rootpage,ThisStartUpID);
12491253
PageSetLSN(metapg,recptr);
12501254
PageSetSUI(metapg,ThisStartUpID);
12511255

1252-
_bt_wrtbuf(rel,metabuf);
12531256
}
12541257
END_CRIT_CODE;
12551258

12561259
/* write and let go of the new root buffer */
12571260
_bt_wrtbuf(rel,rootbuf);
1261+
_bt_wrtbuf(rel,metabuf);
12581262

12591263
/* update and release new sibling, and finally the old root */
12601264
_bt_wrtbuf(rel,rbuf);

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

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.43 2000/12/03 10:27:26 vadim Exp $
12+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.44 2000/12/28 13:00:07 vadim Exp $
1313
*
1414
*NOTES
1515
* Postgres btree pages look like ordinary relation pages.The opaque
@@ -167,6 +167,9 @@ _bt_getroot(Relation rel, int access)
167167
/* NO ELOG(ERROR) till meta is updated */
168168
START_CRIT_CODE;
169169

170+
metad->btm_root=rootblkno;
171+
metad->btm_level=1;
172+
170173
_bt_pageinit(rootpage,BufferGetPageSize(rootbuf));
171174
rootopaque= (BTPageOpaque)PageGetSpecialPointer(rootpage);
172175
rootopaque->btpo_flags |= (BTP_LEAF |BTP_ROOT);
@@ -175,22 +178,26 @@ _bt_getroot(Relation rel, int access)
175178
{
176179
xl_btree_newrootxlrec;
177180
XLogRecPtrrecptr;
181+
XLogRecDatardata;
178182

179183
xlrec.node=rel->rd_node;
184+
xlrec.level=1;
180185
BlockIdSet(&(xlrec.rootblk),rootblkno);
186+
rdata.buffer=InvalidBuffer;
187+
rdata.data= (char*)&xlrec;
188+
rdata.len=SizeOfBtreeNewroot;
189+
rdata.next=NULL;
181190

182-
recptr=XLogInsert(RM_BTREE_ID,XLOG_BTREE_NEWROOT,
183-
(char*)&xlrec,SizeOfBtreeNewroot,NULL,0);
191+
recptr=XLogInsert(RM_BTREE_ID,
192+
XLOG_BTREE_NEWROOT|XLOG_BTREE_LEAF,&rdata);
184193

185194
PageSetLSN(rootpage,recptr);
186195
PageSetSUI(rootpage,ThisStartUpID);
187196
PageSetLSN(metapg,recptr);
188197
PageSetSUI(metapg,ThisStartUpID);
189198
}
190-
END_CRIT_CODE;
191199

192-
metad->btm_root=rootblkno;
193-
metad->btm_level=1;
200+
END_CRIT_CODE;
194201

195202
_bt_wrtnorelbuf(rel,rootbuf);
196203

@@ -408,11 +415,21 @@ _bt_pagedel(Relation rel, ItemPointer tid)
408415
{
409416
xl_btree_deletexlrec;
410417
XLogRecPtrrecptr;
418+
XLogRecDatardata[2];
411419

412420
xlrec.target.node=rel->rd_node;
413421
xlrec.target.tid=*tid;
414-
recptr=XLogInsert(RM_BTREE_ID,XLOG_BTREE_DELETE,
415-
(char*)&xlrec,SizeOfBtreeDelete,NULL,0);
422+
rdata[0].buffer=InvalidBuffer;
423+
rdata[0].data= (char*)&xlrec;
424+
rdata[0].len=SizeOfBtreeDelete;
425+
rdata[0].next=&(rdata[1]);
426+
427+
rdata[1].buffer=buf;
428+
rdata[1].data=NULL;
429+
rdata[1].len=0;
430+
rdata[1].next=NULL;
431+
432+
recptr=XLogInsert(RM_BTREE_ID,XLOG_BTREE_DELETE,rdata);
416433

417434
PageSetLSN(page,recptr);
418435
PageSetSUI(page,ThisStartUpID);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp