diff options
| author | Tom Lane | 2004-08-30 03:52:43 +0000 |
|---|---|---|
| committer | Tom Lane | 2004-08-30 03:52:43 +0000 |
| commit | 303e46ea93251a499fe5f67f583ad361c776f956 (patch) | |
| tree | 98d4bab36f3b85a5f497eb42b1e5ccf85b4bc3d7 | |
| parent | 09c6ac951335cbcf7954d109ee77d6557466224f (diff) | |
Tweak md.c logic to cope with the situation where WAL replay tries to
write into a high-numbered segment of a relation that was later deleted.
We need to temporarily recreate missing segment files, instead of
failing.
| -rw-r--r-- | src/backend/storage/smgr/md.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index 6e7ebed875e..3bb4a05d07b 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/smgr/md.c,v 1.111 2004/08/30 02:54:39 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/storage/smgr/md.c,v 1.112 2004/08/30 03:52:43 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -937,10 +937,19 @@ _mdfd_getseg(SMgrRelation reln, BlockNumber blkno, bool allowNotFound) * "target" block. We should never need to create more than * one new segment per call, so this restriction seems * reasonable. + * + * BUT: when doing WAL recovery, disable this logic and create + * segments unconditionally. In this case it seems better + * to assume the given blkno is good (it presumably came from + * a CRC-checked WAL record); furthermore this lets us cope + * in the case where we are replaying WAL data that has a write + * into a high-numbered segment of a relation that was later + * deleted. We want to go ahead and create the segments so + * we can finish out the replay. */ v->mdfd_chain = _mdfd_openseg(reln, nextsegno, - (segstogo == 1) ? O_CREAT : 0); + (segstogo == 1 || InRecovery) ? O_CREAT : 0); if (v->mdfd_chain == NULL) { if (allowNotFound && errno == ENOENT) |
