if (v->mdfd_chain == NULL)
{
/*
- * Because we pass O_CREAT, we will create the next segment (with
- * zero length) immediately, if the last segment is of length
- * RELSEG_SIZE. While perhaps not strictly necessary, this keeps
- * the logic simple.
+ * We used to pass O_CREAT here, but that's has the disadvantage
+ * that it might create a segment which has vanished through some
+ * operating system misadventure. In such a case, creating the
+ * segment here undermine _mdfd_getseg's attempts to notice and
+ * report an error upon access to a missing segment.
*/
- v->mdfd_chain = _mdfd_openseg(reln, forknum, segno, O_CREAT);
+ v->mdfd_chain = _mdfd_openseg(reln, forknum, segno, 0);
if (v->mdfd_chain == NULL)
- ereport(ERROR,
- (errcode_for_file_access(),
- errmsg("could not open file \"%s\": %m",
- _mdfd_segpath(reln, forknum, segno))));
+ return segno * ((BlockNumber) RELSEG_SIZE);
}
v = v->mdfd_chain;