8
8
* Portions Copyright (c) 1994, Regents of the University of California
9
9
*
10
10
* IDENTIFICATION
11
- * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.6 2003/08/08 21:41:27 momjian Exp $
11
+ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.7 2003/09/29 23:40:26 tgl Exp $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -109,7 +109,8 @@ _bt_restore_page(Page page, char *from, int len)
109
109
static void
110
110
_bt_restore_meta (Relation reln , XLogRecPtr lsn ,
111
111
BlockNumber root , uint32 level ,
112
- BlockNumber fastroot , uint32 fastlevel )
112
+ BlockNumber fastroot , uint32 fastlevel ,
113
+ bool markvalid )
113
114
{
114
115
Buffer metabuf ;
115
116
Page metapg ;
@@ -124,7 +125,7 @@ _bt_restore_meta(Relation reln, XLogRecPtr lsn,
124
125
_bt_pageinit (metapg , BufferGetPageSize (metabuf ));
125
126
126
127
md = BTPageGetMeta (metapg );
127
- md -> btm_magic = BTREE_MAGIC ;
128
+ md -> btm_magic = markvalid ? BTREE_MAGIC : 0 ;
128
129
md -> btm_version = BTREE_VERSION ;
129
130
md -> btm_root = root ;
130
131
md -> btm_level = level ;
@@ -213,7 +214,8 @@ btree_xlog_insert(bool redo, bool isleaf, bool ismeta,
213
214
if (ismeta )
214
215
_bt_restore_meta (reln , lsn ,
215
216
md .root , md .level ,
216
- md .fastroot , md .fastlevel );
217
+ md .fastroot , md .fastlevel ,
218
+ true);
217
219
}
218
220
219
221
/* Forget any split this insertion completes */
@@ -562,7 +564,8 @@ btree_xlog_delete_page(bool redo, bool ismeta,
562
564
sizeof (xl_btree_metadata ));
563
565
_bt_restore_meta (reln , lsn ,
564
566
md .root , md .level ,
565
- md .fastroot , md .fastlevel );
567
+ md .fastroot , md .fastlevel ,
568
+ true);
566
569
}
567
570
}
568
571
}
@@ -607,7 +610,8 @@ btree_xlog_newroot(bool redo, XLogRecPtr lsn, XLogRecord *record)
607
610
608
611
_bt_restore_meta (reln , lsn ,
609
612
xlrec -> rootblk , xlrec -> level ,
610
- xlrec -> rootblk , xlrec -> level );
613
+ xlrec -> rootblk , xlrec -> level ,
614
+ true);
611
615
612
616
/* Check to see if this satisfies any incomplete insertions */
613
617
if (record -> xl_len > SizeOfBtreeNewroot &&
@@ -621,7 +625,8 @@ btree_xlog_newroot(bool redo, XLogRecPtr lsn, XLogRecord *record)
621
625
}
622
626
623
627
static void
624
- btree_xlog_newmeta (bool redo , XLogRecPtr lsn , XLogRecord * record )
628
+ btree_xlog_newmeta (bool redo , XLogRecPtr lsn , XLogRecord * record ,
629
+ bool markvalid )
625
630
{
626
631
xl_btree_newmeta * xlrec = (xl_btree_newmeta * ) XLogRecGetData (record );
627
632
Relation reln ;
@@ -635,7 +640,8 @@ btree_xlog_newmeta(bool redo, XLogRecPtr lsn, XLogRecord *record)
635
640
636
641
_bt_restore_meta (reln , lsn ,
637
642
xlrec -> meta .root , xlrec -> meta .level ,
638
- xlrec -> meta .fastroot , xlrec -> meta .fastlevel );
643
+ xlrec -> meta .fastroot , xlrec -> meta .fastlevel ,
644
+ markvalid );
639
645
}
640
646
641
647
static void
@@ -707,11 +713,14 @@ btree_redo(XLogRecPtr lsn, XLogRecord *record)
707
713
btree_xlog_newroot (true, lsn , record );
708
714
break ;
709
715
case XLOG_BTREE_NEWMETA :
710
- btree_xlog_newmeta (true, lsn , record );
716
+ btree_xlog_newmeta (true, lsn , record , true );
711
717
break ;
712
718
case XLOG_BTREE_NEWPAGE :
713
719
btree_xlog_newpage (true, lsn , record );
714
720
break ;
721
+ case XLOG_BTREE_INVALIDMETA :
722
+ btree_xlog_newmeta (true, lsn , record , false);
723
+ break ;
715
724
default :
716
725
elog (PANIC , "btree_redo: unknown op code %u" , info );
717
726
}
@@ -758,11 +767,14 @@ btree_undo(XLogRecPtr lsn, XLogRecord *record)
758
767
btree_xlog_newroot (false, lsn , record );
759
768
break ;
760
769
case XLOG_BTREE_NEWMETA :
761
- btree_xlog_newmeta (false, lsn , record );
770
+ btree_xlog_newmeta (false, lsn , record , true );
762
771
break ;
763
772
case XLOG_BTREE_NEWPAGE :
764
773
btree_xlog_newpage (false, lsn , record );
765
774
break ;
775
+ case XLOG_BTREE_INVALIDMETA :
776
+ btree_xlog_newmeta (false, lsn , record , false);
777
+ break ;
766
778
default :
767
779
elog (PANIC , "btree_undo: unknown op code %u" , info );
768
780
}
@@ -895,6 +907,16 @@ btree_desc(char *buf, uint8 xl_info, char *rec)
895
907
xlrec -> blkno );
896
908
break ;
897
909
}
910
+ case XLOG_BTREE_INVALIDMETA :
911
+ {
912
+ xl_btree_newmeta * xlrec = (xl_btree_newmeta * ) rec ;
913
+
914
+ sprintf (buf + strlen (buf ), "invalidmeta: node %u/%u; root %u lev %u fast %u lev %u" ,
915
+ xlrec -> node .tblNode , xlrec -> node .relNode ,
916
+ xlrec -> meta .root , xlrec -> meta .level ,
917
+ xlrec -> meta .fastroot , xlrec -> meta .fastlevel );
918
+ break ;
919
+ }
898
920
default :
899
921
strcat (buf , "UNKNOWN" );
900
922
break ;
0 commit comments