Hello Ján,

On 2024-Sep-10, Pecsök Ján wrote:

> After upgrade of Posgres from version 13.5 to 16.2 we experience following 
> error:
> could not extend file "pg_tblspc/16401/PG_16_202307071/17820/3968302971" with 
> FileFallocate(): No space left on device
> 
> We cannot easily replicate problem. It happens at randomly every 1-2 weeks of 
> intensive query computation.
> Was there some changes in space allocation from Posgres 13.5  to Posgres  
> 16.2?
> 
> Database has  size 91TB and has 27TB more space available.

Yes, there were some changes in that area.  I have a report from
somebody running EPAS 16 which has a problem that looks pretty much the
same as yours -- and the code is essentially identical.  I gave them the
attached patch, hoping that it would shed some light ... but so far,
we've been unable to capture any useful intel.

I'm going to propose this patch for the next set of minors, but that's
in November, so if you're in a hurry and want to risk rebuilding
Postgres and see if you get any better error messages with it than with
the original, here it is.  (Note that the patch doesn't change any
behavior, it just report more things when a problem occurs.)

I'm CCing Thomas Munro and Andres Freund, who authored the new code.

-- 
Álvaro Herrera               48°01'N 7°57'E  —  https://www.EnterpriseDB.com/
"El sudor es la mejor cura para un pensamiento enfermo" (Bardia)
>From bf5b7b137687a90cb3523f815c015eb5d95fd85c Mon Sep 17 00:00:00 2001
From: Alvaro Herrera <alvaro.herr...@enterprisedb.com>
Date: Fri, 5 Jul 2024 12:51:42 +0200
Subject: [PATCH] Add some debugging around mdzeroextend

This is all new code, so it could have bugs.
---
 src/backend/storage/file/fd.c |  7 +++++++
 src/backend/storage/smgr/md.c | 12 ++++++++----
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index 16b3e8f9058..a5db22b9b37 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -2347,6 +2347,13 @@ retry:
 	 */
 	if (returnCode != EINVAL && returnCode != EOPNOTSUPP)
 		return -1;
+
+	if (returnCode != EOPNOTSUPP)
+		ereport(WARNING,
+				errcode(ERRCODE_WARNING),
+				errmsg("could not allocate additional %lld bytes from position %lld in file \"%s\", retrying by zeroing: %m",
+					   (long long) amount, (long long) offset,
+					   VfdCache[file].fileName));
 #endif
 
 	return FileZero(file, offset, amount, wait_event_info);
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index fdecbad1709..ac5e325f8ec 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -580,15 +580,17 @@ mdzeroextend(SMgrRelation reln, ForkNumber forknum,
 		if (numblocks > 8)
 		{
 			int			ret;
+			off_t		addbytes = (off_t) BLCKSZ * numblocks;
 
 			ret = FileFallocate(v->mdfd_vfd,
-								seekpos, (off_t) BLCKSZ * numblocks,
+								seekpos, addbytes,
 								WAIT_EVENT_DATA_FILE_EXTEND);
 			if (ret != 0)
 			{
 				ereport(ERROR,
 						errcode_for_file_access(),
-						errmsg("could not extend file \"%s\" with FileFallocate(): %m",
+						errmsg("could not allocate additional %lld bytes from position %lld in file \"%s\": %m",
+							   (long long) addbytes, (long long) seekpos,
 							   FilePathName(v->mdfd_vfd)),
 						errhint("Check free disk space."));
 			}
@@ -596,6 +598,7 @@ mdzeroextend(SMgrRelation reln, ForkNumber forknum,
 		else
 		{
 			int			ret;
+			off_t		addbytes = (off_t) BLCKSZ * numblocks;
 
 			/*
 			 * Even if we don't want to use fallocate, we can still extend a
@@ -605,12 +608,13 @@ mdzeroextend(SMgrRelation reln, ForkNumber forknum,
 			 * whole length of the extension.
 			 */
 			ret = FileZero(v->mdfd_vfd,
-						   seekpos, (off_t) BLCKSZ * numblocks,
+						   seekpos, addbytes,
 						   WAIT_EVENT_DATA_FILE_EXTEND);
 			if (ret < 0)
 				ereport(ERROR,
 						errcode_for_file_access(),
-						errmsg("could not extend file \"%s\": %m",
+						errmsg("could not zero additional %lld bytes from position %lld file \"%s\": %m",
+							   (long long) addbytes, (long long) seekpos,
 							   FilePathName(v->mdfd_vfd)),
 						errhint("Check free disk space."));
 		}
-- 
2.39.2

Reply via email to