/* OK to write the page */
from = XLogCtl->pages + Write->curridx * BLCKSZ;
+ errno = 0;
if (write(openLogFile, from, BLCKSZ) != BLCKSZ)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
elog(STOP, "write(logfile %u seg %u off %u) failed: %m",
openLogId, openLogSeg, openLogOff);
+ }
openLogOff += BLCKSZ;
/*
MemSet(zbuffer, 0, sizeof(zbuffer));
for (nbytes = 0; nbytes < XLogSegSize; nbytes += sizeof(zbuffer))
{
+ errno = 0;
if ((int) write(fd, zbuffer, sizeof(zbuffer)) != (int) sizeof(zbuffer))
{
int save_errno = errno;
* space
*/
unlink(tmppath);
- errno = save_errno;
+ /* if write didn't set errno, assume problem is no disk space */
+ errno = save_errno ? save_errno : ENOSPC;
elog(STOP, "ZeroFill(%s) failed: %m", tmppath);
}
elog(STOP, "WriteControlFile failed to create control file (%s): %m",
ControlFilePath);
+ errno = 0;
if (write(fd, buffer, BLCKSZ) != BLCKSZ)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
elog(STOP, "WriteControlFile failed to write control file: %m");
+ }
if (pg_fsync(fd) != 0)
elog(STOP, "WriteControlFile failed to fsync control file: %m");
if (fd < 0)
elog(STOP, "open(\"%s\") failed: %m", ControlFilePath);
+ errno = 0;
if (write(fd, ControlFile, sizeof(ControlFileData)) != sizeof(ControlFileData))
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
elog(STOP, "write(cntlfile) failed: %m");
+ }
if (pg_fsync(fd) != 0)
elog(STOP, "fsync(cntlfile) failed: %m");
use_existent = false;
openLogFile = XLogFileInit(0, 0, &use_existent, false);
+ errno = 0;
if (write(openLogFile, buffer, BLCKSZ) != BLCKSZ)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
elog(STOP, "BootStrapXLOG failed to write logfile: %m");
+ }
if (pg_fsync(openLogFile) != 0)
elog(STOP, "BootStrapXLOG failed to fsync logfile: %m");
elog(STOP, "XLog concurrent activity while data base is shutting down");
/*
- * Remember location of prior checkpoint's earliest info. Oldest item
- * is redo or undo, whichever is older; but watch out for case that
- * undo = 0.
+ * Select point at which we can truncate the log, which we base on the
+ * prior checkpoint's earliest info.
+ *
+ * With UNDO support: oldest item is redo or undo, whichever is older;
+ * but watch out for case that undo = 0.
+ *
+ * Without UNDO support: just use the redo pointer. This allows xlog
+ * space to be freed much faster when there are long-running transactions.
*/
+#ifdef NOT_USED
if (ControlFile->checkPointCopy.undo.xrecoff != 0 &&
XLByteLT(ControlFile->checkPointCopy.undo,
ControlFile->checkPointCopy.redo))
XLByteToSeg(ControlFile->checkPointCopy.undo, _logId, _logSeg);
else
+#endif
XLByteToSeg(ControlFile->checkPointCopy.redo, _logId, _logSeg);
/*