From 5ce851dcda7c10513b18eb5ea1ed30976f21f174 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 5 Apr 1999 22:25:11 +0000
Subject: [PATCH] Reduce default file size limit to 1Gb, and move the
 configuration constant to config.h.

---
 src/backend/storage/smgr/md.c | 35 ++++++-----------------------------
 src/include/config.h.in       | 17 +++++++++++++++++
 2 files changed, 23 insertions(+), 29 deletions(-)

diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index f411ad8a18a..8d7e4c864b1 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.41 1999/02/13 23:18:35 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.42 1999/04/05 22:25:11 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -33,10 +33,11 @@
  *	The magnetic disk storage manager keeps track of open file descriptors
  *	in its own descriptor pool.  This happens for two reasons.	First, at
  *	transaction boundaries, we walk the list of descriptors and flush
- *	anything that we've dirtied in the current transaction.  Second, we
- *	have to support relations of > 4GBytes.  In order to do this, we break
- *	relations up into chunks of < 2GBytes and store one chunk in each of
- *	several files that represent the relation.
+ *	anything that we've dirtied in the current transaction.  Second, we want
+ *	to support relations larger than the OS' file size limit (often 2GBytes).
+ *	In order to do that, we break relations up into chunks of < 2GBytes
+ *	and store one chunk in each of several files that represent the relation.
+ *	See the BLCKSZ and RELSEG_SIZE configuration constants in include/config.h.
  */
 
 typedef struct _MdfdVec
@@ -59,30 +60,6 @@ static MemoryContext MdCxt;
 #define MDFD_DIRTY		(uint16) 0x01
 #define MDFD_FREE		(uint16) 0x02
 
-/*
- * RELSEG_SIZE appears to be the number of segments that can
- * be in a disk file.  It was defined as 262144 based on 8k
- * blocks, but now that the block size can be changed, this
- * has to be calculated at compile time.  Otherwise, the file
- * size limit would not work out to 2-gig (2147483648).
- *
- * The number needs to be (2 ** 31) / BLCKSZ, but to be keep
- * the math under MAXINT, pre-divide by 256 and use ...
- *
- *			 (((2 ** 23) / BLCKSZ) * (2 ** 8))
- *
- * 07 Jan 98  darrenk
- *
- * Now possibly let the OS handle it...
- *
- * 19 Mar 98  darrenk
- *
- */
-
-#ifndef LET_OS_MANAGE_FILESIZE
-#define RELSEG_SIZE		((8388608 / BLCKSZ) * 256)
-#endif
-
 /* routines declared here */
 static MdfdVec *_mdfd_openseg(Relation reln, int segno, int oflags);
 static MdfdVec *_mdfd_getseg(Relation reln, int blkno, int oflag);
diff --git a/src/include/config.h.in b/src/include/config.h.in
index 74476b3ef9d..49aac61ebbd 100644
--- a/src/include/config.h.in
+++ b/src/include/config.h.in
@@ -27,6 +27,23 @@
  */
 #define BLCKSZ	8192
 
+/*
+ * RELSEG_SIZE is the maximum number of blocks allowed in one disk file.
+ * Thus, the maximum size of a single file is RELSEG_SIZE * BLCKSZ;
+ * relations bigger than that are divided into multiple files.
+ *
+ * CAUTION: RELSEG_SIZE * BLCKSZ must be less than your OS' limit on file size.
+ * This is typically 2Gb or 4Gb in a 32-bit operating system.  By default,
+ * we make the limit one billion bytes to avoid any possible integer-overflow
+ * problems within the OS.  A limit smaller than necessary only means we
+ * divide a large relation into more chunks than necessary, so it seems best
+ * to err in the direction of a small limit.
+ *
+ * CAUTION: you had best do an initdb if you change either BLCKSZ or
+ * RELSEG_SIZE.
+ */
+#define RELSEG_SIZE	(1000000000 / BLCKSZ)
+
 /* 
  * The following is set using configure.  
  */
-- 
GitLab