Provide a build-time option to store large relations as single files, rather
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 10 Mar 2008 20:06:27 +0000 (20:06 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 10 Mar 2008 20:06:27 +0000 (20:06 +0000)
than dividing them into 1GB segments as has been our longtime practice.  This
requires working support for large files in the operating system; at least for
the time being, it won't be the default.

Zdenek Kotala

12 files changed:
configure
configure.in
doc/src/sgml/installation.sgml
doc/src/sgml/storage.sgml
src/backend/storage/file/buffile.c
src/backend/storage/file/fd.c
src/backend/storage/smgr/md.c
src/backend/utils/sort/tuplestore.c
src/include/pg_config.h.in
src/include/pg_config_manual.h
src/include/storage/buffile.h
src/include/storage/fd.h

index 99b0722ca1be568afebd85564a496a0776851fac..476ce76c8ad5672ad56ad5d1237a7e3ea3d662dc 100755 (executable)
--- a/configure
+++ b/configure
@@ -1357,6 +1357,7 @@ Optional Features:
   --enable-debug          build with debugging symbols (-g)
   --enable-profiling      build with profiling enabled
   --enable-dtrace         build with DTrace support
+  --disable-segmented-files disable data file segmentation (requires largefile support)
   --enable-depend         turn on automatic dependency tracking
   --enable-cassert        enable assertion checks (for debugging)
   --enable-thread-safety  make client libraries thread-safe
@@ -2541,6 +2542,36 @@ fi
 
 
 
+#
+# Data file segmentation
+#
+
+pgac_args="$pgac_args enable_segmented_files"
+
+# Check whether --enable-segmented-files was given.
+if test "${enable_segmented_files+set}" = set; then
+  enableval=$enable_segmented_files;
+  case $enableval in
+    yes)
+      :
+      ;;
+    no)
+      :
+      ;;
+    *)
+      { { echo "$as_me:$LINENO: error: no argument expected for --enable-segmented-files option" >&5
+echo "$as_me: error: no argument expected for --enable-segmented-files option" >&2;}
+   { (exit 1); exit 1; }; }
+      ;;
+  esac
+
+else
+  enable_segmented_files=yes
+
+fi
+
+
+
 #
 # C compiler
 #
 
 fi
 
+# Check for largefile support (must be after AC_SYS_LARGEFILE)
+{ echo "$as_me:$LINENO: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_off_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef off_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+    test -z "$ac_c_werror_flag" ||
+    test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_type_off_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+   ac_cv_type_off_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of off_t" >&5
+echo $ECHO_N "checking size of off_t... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_off_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef off_t ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+    test -z "$ac_c_werror_flag" ||
+    test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef off_t ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+    test -z "$ac_c_werror_flag" ||
+    test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+   ac_lo=`expr $ac_mid + 1`
+           if test $ac_lo -le $ac_mid; then
+             ac_lo= ac_hi=
+             break
+           fi
+           ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef off_t ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+    test -z "$ac_c_werror_flag" ||
+    test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef off_t ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+    test -z "$ac_c_werror_flag" ||
+    test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+   ac_hi=`expr '(' $ac_mid ')' - 1`
+           if test $ac_mid -le $ac_hi; then
+             ac_lo= ac_hi=
+             break
+           fi
+           ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+   ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef off_t ac__type_sizeof_;
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+    test -z "$ac_c_werror_flag" ||
+    test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+   ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_off_t=$ac_lo;;
+'') if test "$ac_cv_type_off_t" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (off_t)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (off_t)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_off_t=0
+   fi ;;
+esac
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+   typedef off_t ac__type_sizeof_;
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+    {
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+   return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+   return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_off_t=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+if test "$ac_cv_type_off_t" = yes; then
+     { { echo "$as_me:$LINENO: error: cannot compute sizeof (off_t)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (off_t)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+   else
+     ac_cv_sizeof_off_t=0
+   fi
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_off_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_off_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_OFF_T $ac_cv_sizeof_off_t
+_ACEOF
+
+
+
+if test "$ac_cv_sizeof_off_t" -lt 8 -o "$enable_segmented_files" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_SEGMENTED_FILES 1
+_ACEOF
+
+fi
+
 # SunOS doesn't handle negative byte comparisons properly with +/- return
 { echo "$as_me:$LINENO: checking for working memcmp" >&5
 echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6; }
index 2bdc37198462cbe9bde945a2ea56c2f301dd005e..020009785c62166bef35b0d122ff7d290360cb60 100644 (file)
@@ -1,5 +1,5 @@
 dnl Process this file with autoconf to produce a configure script.
-dnl $PostgreSQL: pgsql/configure.in,v 1.552 2008/02/24 05:21:54 tgl Exp $
+dnl $PostgreSQL: pgsql/configure.in,v 1.553 2008/03/10 20:06:27 tgl Exp $
 dnl
 dnl Developers, please strive to achieve this order:
 dnl
@@ -217,6 +217,12 @@ fi
 AC_SUBST(DTRACEFLAGS)])
 AC_SUBST(enable_dtrace)
 
+#
+# Data file segmentation
+#
+PGAC_ARG_BOOL(enable, segmented-files, yes,
+              [  --disable-segmented-files disable data file segmentation (requires largefile support)])
+
 #
 # C compiler
 #
@@ -1411,6 +1417,13 @@ if test $ac_cv_func_fseeko = yes; then
 AC_SYS_LARGEFILE
 fi
 
+# Check for largefile support (must be after AC_SYS_LARGEFILE)
+AC_CHECK_SIZEOF([off_t])
+
+if test "$ac_cv_sizeof_off_t" -lt 8 -o "$enable_segmented_files" = "yes"; then 
+  AC_DEFINE([USE_SEGMENTED_FILES], 1, [Define to split data files into 1GB segments.]) 
+fi
+
 # SunOS doesn't handle negative byte comparisons properly with +/- return
 AC_FUNC_MEMCMP
 
index a99900234665196dd186771d089820a507331203..95a3f10be67822caa369e2b41795b290d1de6da0 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/installation.sgml,v 1.303 2008/03/06 21:37:33 momjian Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/installation.sgml,v 1.304 2008/03/10 20:06:27 tgl Exp $ -->
 
 <chapter id="installation">
  <title><![%standalone-include[<productname>PostgreSQL</>]]>
@@ -1025,6 +1025,20 @@ su - postgres
        </listitem>
       </varlistentry>
 
+      <varlistentry>
+       <term><option>--disable-segmented-files</option></term>
+       <listitem>
+        <para>
+         Store large tables as single operating-system files, rather than
+         dividing them into 1GB segments as is the default.  This option
+         is ignored unless the operating system has <quote>largefile</>
+         support (which most do, nowadays).  It can be helpful to reduce
+         the number of file descriptors consumed when working with very
+         large tables.
+        </para>
+       </listitem>
+      </varlistentry>
+
       <varlistentry>
        <term><option>--disable-spinlocks</option></term>
        <listitem>
index fe9ae611bf1e1b8fd49ba6ff4d92ac57ca52a115..7ba0c1e343f0e481ee6e91811f304380a987881d 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/storage.sgml,v 1.21 2007/11/23 00:24:12 ishii Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/storage.sgml,v 1.22 2008/03/10 20:06:27 tgl Exp $ -->
 
 <chapter id="storage">
 
@@ -138,10 +138,14 @@ Avoid assuming that filenode and table OID are the same.
 </caution>
 
 <para>
-When a table or index exceeds 1 GB, it is divided into gigabyte-sized
+When a table or index exceeds 1 GB, it is normally divided into gigabyte-sized
 <firstterm>segments</>.  The first segment's file name is the same as the
 filenode; subsequent segments are named filenode.1, filenode.2, etc.
 This arrangement avoids problems on platforms that have file size limitations.
+(But if the platform does not have such a limitation, and
+<option>--disable-segmented-files</option> was specified when
+<productname>PostgreSQL</> was built, then each table or index is stored
+as a single file, without segmentation.)
 The contents of tables and indexes are discussed further in
 <xref linkend="storage-page-layout">.
 </para>
index 8d79e9574b81d48c7b0a4e7cae8826c82f517a79..94e5c67911a143921767f16de5ee785a914809fb 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/storage/file/buffile.c,v 1.29 2008/01/01 19:45:51 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/storage/file/buffile.c,v 1.30 2008/03/10 20:06:27 tgl Exp $
  *
  * NOTES:
  *
 #include "storage/buffile.h"
 
 /*
- * The maximum safe file size is presumed to be RELSEG_SIZE * BLCKSZ.
- * Note we adhere to this limit whether or not LET_OS_MANAGE_FILESIZE
- * is defined, although md.c ignores it when that symbol is defined.
- * The reason for doing this is that we'd like large temporary BufFiles
- * to be spread across multiple tablespaces when available.
+ * We break BufFiles into gigabyte-sized segments, whether or not
+ * USE_SEGMENTED_FILES is defined.  The reason is that we'd like large
+ * temporary BufFiles to be spread across multiple tablespaces when available.
  */
-#define MAX_PHYSICAL_FILESIZE  (RELSEG_SIZE * BLCKSZ)
+#define MAX_PHYSICAL_FILESIZE  0x40000000
+#define BUFFILE_SEG_SIZE       (MAX_PHYSICAL_FILESIZE / BLCKSZ)
 
 /*
  * This data structure represents a buffered file that consists of one or
@@ -56,7 +55,7 @@ struct BufFile
    int         numFiles;       /* number of physical files in set */
    /* all files except the last have length exactly MAX_PHYSICAL_FILESIZE */
    File       *files;          /* palloc'd array with numFiles entries */
-   long       *offsets;        /* palloc'd array with numFiles entries */
+   off_t      *offsets;        /* palloc'd array with numFiles entries */
 
    /*
     * offsets[i] is the current seek position of files[i].  We use this to
@@ -72,7 +71,7 @@ struct BufFile
     * Position as seen by user of BufFile is (curFile, curOffset + pos).
     */
    int         curFile;        /* file index (0..n) part of current pos */
-   int         curOffset;      /* offset part of current pos */
+   off_t       curOffset;      /* offset part of current pos */
    int         pos;            /* next read/write position in buffer */
    int         nbytes;         /* total # of valid bytes in buffer */
    char        buffer[BLCKSZ];
@@ -97,7 +96,7 @@ makeBufFile(File firstfile)
    file->numFiles = 1;
    file->files = (File *) palloc(sizeof(File));
    file->files[0] = firstfile;
-   file->offsets = (long *) palloc(sizeof(long));
+   file->offsets = (off_t *) palloc(sizeof(off_t));
    file->offsets[0] = 0L;
    file->isTemp = false;
    file->isInterXact = false;
@@ -124,8 +123,8 @@ extendBufFile(BufFile *file)
 
    file->files = (File *) repalloc(file->files,
                                    (file->numFiles + 1) * sizeof(File));
-   file->offsets = (long *) repalloc(file->offsets,
-                                     (file->numFiles + 1) * sizeof(long));
+   file->offsets = (off_t *) repalloc(file->offsets,
+                                     (file->numFiles + 1) * sizeof(off_t));
    file->files[file->numFiles] = pfile;
    file->offsets[file->numFiles] = 0L;
    file->numFiles++;
@@ -279,9 +278,9 @@ BufFileDumpBuffer(BufFile *file)
        bytestowrite = file->nbytes - wpos;
        if (file->isTemp)
        {
-           long        availbytes = MAX_PHYSICAL_FILESIZE - file->curOffset;
+           off_t       availbytes = MAX_PHYSICAL_FILESIZE - file->curOffset;
 
-           if ((long) bytestowrite > availbytes)
+           if ((off_t) bytestowrite > availbytes)
                bytestowrite = (int) availbytes;
        }
 
@@ -451,10 +450,10 @@ BufFileFlush(BufFile *file)
  * impossible seek is attempted.
  */
 int
-BufFileSeek(BufFile *file, int fileno, long offset, int whence)
+BufFileSeek(BufFile *file, int fileno, off_t offset, int whence)
 {
    int         newFile;
-   long        newOffset;
+   off_t       newOffset;
 
    switch (whence)
    {
@@ -469,7 +468,7 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence)
            /*
             * Relative seek considers only the signed offset, ignoring
             * fileno. Note that large offsets (> 1 gig) risk overflow in this
-            * add...
+            * add, unless we have 64-bit off_t.
             */
            newFile = file->curFile;
            newOffset = (file->curOffset + file->pos) + offset;
@@ -537,7 +536,7 @@ BufFileSeek(BufFile *file, int fileno, long offset, int whence)
 }
 
 void
-BufFileTell(BufFile *file, int *fileno, long *offset)
+BufFileTell(BufFile *file, int *fileno, off_t *offset)
 {
    *fileno = file->curFile;
    *offset = file->curOffset + file->pos;
@@ -558,8 +557,8 @@ int
 BufFileSeekBlock(BufFile *file, long blknum)
 {
    return BufFileSeek(file,
-                      (int) (blknum / RELSEG_SIZE),
-                      (blknum % RELSEG_SIZE) * BLCKSZ,
+                      (int) (blknum / BUFFILE_SEG_SIZE),
+                      (off_t) (blknum % BUFFILE_SEG_SIZE) * BLCKSZ,
                       SEEK_SET);
 }
 
@@ -575,7 +574,7 @@ BufFileTellBlock(BufFile *file)
    long        blknum;
 
    blknum = (file->curOffset + file->pos) / BLCKSZ;
-   blknum += file->curFile * RELSEG_SIZE;
+   blknum += file->curFile * BUFFILE_SEG_SIZE;
    return blknum;
 }
 
index 2a0108fcee0f00eb0bddd478e5ae9d9673f3208d..edce52155f6c14367a3c6dbde6f9f77de71cfabe 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/storage/file/fd.c,v 1.143 2008/01/01 19:45:51 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/storage/file/fd.c,v 1.144 2008/03/10 20:06:27 tgl Exp $
  *
  * NOTES:
  *
@@ -115,7 +115,7 @@ static int  max_safe_fds = 32;  /* default if not changed */
 
 #define FileIsNotOpen(file) (VfdCache[file].fd == VFD_CLOSED)
 
-#define FileUnknownPos (-1L)
+#define FileUnknownPos ((off_t) -1)
 
 /* these are the assigned bits in fdstate below: */
 #define FD_TEMPORARY       (1 << 0)    /* T = delete when closed */
@@ -123,13 +123,13 @@ static int    max_safe_fds = 32;  /* default if not changed */
 
 typedef struct vfd
 {
-   signed short fd;            /* current FD, or VFD_CLOSED if none */
+   int         fd;             /* current FD, or VFD_CLOSED if none */
    unsigned short fdstate;     /* bitflags for VFD's state */
-   SubTransactionId create_subid;      /* for TEMPORARY fds, creating subxact */
+   SubTransactionId create_subid;  /* for TEMPORARY fds, creating subxact */
    File        nextFree;       /* link to next free VFD, if in freelist */
    File        lruMoreRecently;    /* doubly linked recency-of-use list */
    File        lruLessRecently;
-   long        seekPos;        /* current logical file position */
+   off_t       seekPos;        /* current logical file position */
    char       *fileName;       /* name of file, or NULL for unused VFD */
    /* NB: fileName is malloc'd, and must be free'd when closing the VFD */
    int         fileFlags;      /* open(2) flags for (re)opening the file */
@@ -544,8 +544,8 @@ LruDelete(File file)
    Delete(file);
 
    /* save the seek position */
-   vfdP->seekPos = (long) lseek(vfdP->fd, 0L, SEEK_CUR);
-   Assert(vfdP->seekPos != -1L);
+   vfdP->seekPos = lseek(vfdP->fd, (off_t) 0, SEEK_CUR);
+   Assert(vfdP->seekPos != (off_t) -1);
 
    /* close the file */
    if (close(vfdP->fd))
@@ -616,12 +616,12 @@ LruInsert(File file)
        }
 
        /* seek to the right position */
-       if (vfdP->seekPos != 0L)
+       if (vfdP->seekPos != (off_t) 0)
        {
-           long        returnValue;
+           off_t       returnValue;
 
-           returnValue = (long) lseek(vfdP->fd, vfdP->seekPos, SEEK_SET);
-           Assert(returnValue != -1L);
+           returnValue = lseek(vfdP->fd, vfdP->seekPos, SEEK_SET);
+           Assert(returnValue != (off_t) -1);
        }
    }
 
@@ -1027,9 +1027,10 @@ FileRead(File file, char *buffer, int amount)
 
    Assert(FileIsValid(file));
 
-   DO_DB(elog(LOG, "FileRead: %d (%s) %ld %d %p",
+   DO_DB(elog(LOG, "FileRead: %d (%s) " INT64_FORMAT " %d %p",
               file, VfdCache[file].fileName,
-              VfdCache[file].seekPos, amount, buffer));
+              (int64) VfdCache[file].seekPos,
+              amount, buffer));
 
    returnCode = FileAccess(file);
    if (returnCode < 0)
@@ -1081,9 +1082,10 @@ FileWrite(File file, char *buffer, int amount)
 
    Assert(FileIsValid(file));
 
-   DO_DB(elog(LOG, "FileWrite: %d (%s) %ld %d %p",
+   DO_DB(elog(LOG, "FileWrite: %d (%s) " INT64_FORMAT " %d %p",
               file, VfdCache[file].fileName,
-              VfdCache[file].seekPos, amount, buffer));
+              (int64) VfdCache[file].seekPos,
+              amount, buffer));
 
    returnCode = FileAccess(file);
    if (returnCode < 0)
@@ -1146,16 +1148,17 @@ FileSync(File file)
    return pg_fsync(VfdCache[file].fd);
 }
 
-long
-FileSeek(File file, long offset, int whence)
+off_t
+FileSeek(File file, off_t offset, int whence)
 {
    int         returnCode;
 
    Assert(FileIsValid(file));
 
-   DO_DB(elog(LOG, "FileSeek: %d (%s) %ld %ld %d",
+   DO_DB(elog(LOG, "FileSeek: %d (%s) " INT64_FORMAT " " INT64_FORMAT " %d",
               file, VfdCache[file].fileName,
-              VfdCache[file].seekPos, offset, whence));
+              (int64) VfdCache[file].seekPos,
+              (int64) offset, whence));
 
    if (FileIsNotOpen(file))
    {
@@ -1163,7 +1166,8 @@ FileSeek(File file, long offset, int whence)
        {
            case SEEK_SET:
                if (offset < 0)
-                   elog(ERROR, "invalid seek offset: %ld", offset);
+                   elog(ERROR, "invalid seek offset: " INT64_FORMAT,
+                        (int64) offset);
                VfdCache[file].seekPos = offset;
                break;
            case SEEK_CUR:
@@ -1187,7 +1191,8 @@ FileSeek(File file, long offset, int whence)
        {
            case SEEK_SET:
                if (offset < 0)
-                   elog(ERROR, "invalid seek offset: %ld", offset);
+                   elog(ERROR, "invalid seek offset: " INT64_FORMAT,
+                        (int64) offset);
                if (VfdCache[file].seekPos != offset)
                    VfdCache[file].seekPos = lseek(VfdCache[file].fd,
                                                   offset, whence);
@@ -1213,7 +1218,7 @@ FileSeek(File file, long offset, int whence)
  * XXX not actually used but here for completeness
  */
 #ifdef NOT_USED
-long
+off_t
 FileTell(File file)
 {
    Assert(FileIsValid(file));
@@ -1224,7 +1229,7 @@ FileTell(File file)
 #endif
 
 int
-FileTruncate(File file, long offset)
+FileTruncate(File file, off_t offset)
 {
    int         returnCode;
 
@@ -1237,7 +1242,7 @@ FileTruncate(File file, long offset)
    if (returnCode < 0)
        return returnCode;
 
-   returnCode = ftruncate(VfdCache[file].fd, (size_t) offset);
+   returnCode = ftruncate(VfdCache[file].fd, offset);
    return returnCode;
 }
 
index 543574be400309e48f78fce33355880f5929c2df..6ea4a00b017b74045424d2493b0d1c307256fb52 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/storage/smgr/md.c,v 1.135 2008/01/01 19:45:52 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/storage/smgr/md.c,v 1.136 2008/03/10 20:06:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
  *
  * All MdfdVec objects are palloc'd in the MdCxt memory context.
  *
- * Defining LET_OS_MANAGE_FILESIZE disables the segmentation logic,
- * for use on machines that support large files.  Beware that that
- * code has not been tested in a long time and is probably bit-rotted.
+ * On platforms that support large files, USE_SEGMENTED_FILES can be
+ * #undef'd to disable the segmentation logic.  In that case each
+ * relation is a single operating-system file.
  */
 
 typedef struct _MdfdVec
 {
    File        mdfd_vfd;       /* fd number in fd.c's pool */
    BlockNumber mdfd_segno;     /* segment number, from 0 */
-#ifndef LET_OS_MANAGE_FILESIZE /* for large relations */
+#ifdef USE_SEGMENTED_FILES
    struct _MdfdVec *mdfd_chain;    /* next segment, or NULL */
 #endif
 } MdfdVec;
@@ -162,7 +162,7 @@ static void register_dirty_segment(SMgrRelation reln, MdfdVec *seg);
 static void register_unlink(RelFileNode rnode);
 static MdfdVec *_fdvec_alloc(void);
 
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
 static MdfdVec *_mdfd_openseg(SMgrRelation reln, BlockNumber segno,
              int oflags);
 #endif
@@ -258,7 +258,7 @@ mdcreate(SMgrRelation reln, bool isRedo)
 
    reln->md_fd->mdfd_vfd = fd;
    reln->md_fd->mdfd_segno = 0;
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
    reln->md_fd->mdfd_chain = NULL;
 #endif
 }
@@ -344,7 +344,7 @@ mdunlink(RelFileNode rnode, bool isRedo)
                            rnode.relNode)));
    }
 
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
    /* Delete the additional segments, if any */
    else
    {
@@ -395,7 +395,7 @@ mdunlink(RelFileNode rnode, bool isRedo)
 void
 mdextend(SMgrRelation reln, BlockNumber blocknum, char *buffer, bool isTemp)
 {
-   long        seekpos;
+   off_t       seekpos;
    int         nbytes;
    MdfdVec    *v;
 
@@ -420,11 +420,11 @@ mdextend(SMgrRelation reln, BlockNumber blocknum, char *buffer, bool isTemp)
 
    v = _mdfd_getseg(reln, blocknum, isTemp, EXTENSION_CREATE);
 
-#ifndef LET_OS_MANAGE_FILESIZE
-   seekpos = (long) (BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE)));
-   Assert(seekpos < BLCKSZ * RELSEG_SIZE);
+#ifdef USE_SEGMENTED_FILES
+   seekpos = (off_t) BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE));
+   Assert(seekpos < (off_t) BLCKSZ * RELSEG_SIZE);
 #else
-   seekpos = (long) (BLCKSZ * (blocknum));
+   seekpos = (off_t) BLCKSZ * blocknum;
 #endif
 
    /*
@@ -469,7 +469,7 @@ mdextend(SMgrRelation reln, BlockNumber blocknum, char *buffer, bool isTemp)
    if (!isTemp)
        register_dirty_segment(reln, v);
 
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
    Assert(_mdnblocks(reln, v) <= ((BlockNumber) RELSEG_SIZE));
 #endif
 }
@@ -530,7 +530,7 @@ mdopen(SMgrRelation reln, ExtensionBehavior behavior)
 
    mdfd->mdfd_vfd = fd;
    mdfd->mdfd_segno = 0;
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
    mdfd->mdfd_chain = NULL;
    Assert(_mdnblocks(reln, mdfd) <= ((BlockNumber) RELSEG_SIZE));
 #endif
@@ -552,7 +552,7 @@ mdclose(SMgrRelation reln)
 
    reln->md_fd = NULL;         /* prevent dangling pointer after error */
 
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
    while (v != NULL)
    {
        MdfdVec    *ov = v;
@@ -577,17 +577,17 @@ mdclose(SMgrRelation reln)
 void
 mdread(SMgrRelation reln, BlockNumber blocknum, char *buffer)
 {
-   long        seekpos;
+   off_t       seekpos;
    int         nbytes;
    MdfdVec    *v;
 
    v = _mdfd_getseg(reln, blocknum, false, EXTENSION_FAIL);
 
-#ifndef LET_OS_MANAGE_FILESIZE
-   seekpos = (long) (BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE)));
-   Assert(seekpos < BLCKSZ * RELSEG_SIZE);
+#ifdef USE_SEGMENTED_FILES
+   seekpos = (off_t) BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE));
+   Assert(seekpos < (off_t) BLCKSZ * RELSEG_SIZE);
 #else
-   seekpos = (long) (BLCKSZ * (blocknum));
+   seekpos = (off_t) BLCKSZ * blocknum;
 #endif
 
    if (FileSeek(v->mdfd_vfd, seekpos, SEEK_SET) != seekpos)
@@ -642,7 +642,7 @@ mdread(SMgrRelation reln, BlockNumber blocknum, char *buffer)
 void
 mdwrite(SMgrRelation reln, BlockNumber blocknum, char *buffer, bool isTemp)
 {
-   long        seekpos;
+   off_t       seekpos;
    int         nbytes;
    MdfdVec    *v;
 
@@ -653,11 +653,11 @@ mdwrite(SMgrRelation reln, BlockNumber blocknum, char *buffer, bool isTemp)
 
    v = _mdfd_getseg(reln, blocknum, isTemp, EXTENSION_FAIL);
 
-#ifndef LET_OS_MANAGE_FILESIZE
-   seekpos = (long) (BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE)));
-   Assert(seekpos < BLCKSZ * RELSEG_SIZE);
+#ifdef USE_SEGMENTED_FILES
+   seekpos = (off_t) BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE));
+   Assert(seekpos < (off_t) BLCKSZ * RELSEG_SIZE);
 #else
-   seekpos = (long) (BLCKSZ * (blocknum));
+   seekpos = (off_t) BLCKSZ * blocknum;
 #endif
 
    if (FileSeek(v->mdfd_vfd, seekpos, SEEK_SET) != seekpos)
@@ -708,7 +708,7 @@ mdnblocks(SMgrRelation reln)
 {
    MdfdVec    *v = mdopen(reln, EXTENSION_FAIL);
 
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
    BlockNumber nblocks;
    BlockNumber segno = 0;
 
@@ -778,7 +778,7 @@ mdtruncate(SMgrRelation reln, BlockNumber nblocks, bool isTemp)
    MdfdVec    *v;
    BlockNumber curnblk;
 
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
    BlockNumber priorblocks;
 #endif
 
@@ -804,7 +804,7 @@ mdtruncate(SMgrRelation reln, BlockNumber nblocks, bool isTemp)
 
    v = mdopen(reln, EXTENSION_FAIL);
 
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
    priorblocks = 0;
    while (v != NULL)
    {
@@ -843,7 +843,7 @@ mdtruncate(SMgrRelation reln, BlockNumber nblocks, bool isTemp)
             */
            BlockNumber lastsegblocks = nblocks - priorblocks;
 
-           if (FileTruncate(v->mdfd_vfd, lastsegblocks * BLCKSZ) < 0)
+           if (FileTruncate(v->mdfd_vfd, (off_t) lastsegblocks * BLCKSZ) < 0)
                ereport(ERROR,
                        (errcode_for_file_access(),
                         errmsg("could not truncate relation %u/%u/%u to %u blocks: %m",
@@ -867,7 +867,8 @@ mdtruncate(SMgrRelation reln, BlockNumber nblocks, bool isTemp)
        priorblocks += RELSEG_SIZE;
    }
 #else
-   if (FileTruncate(v->mdfd_vfd, nblocks * BLCKSZ) < 0)
+   /* For unsegmented files, it's a lot easier */
+   if (FileTruncate(v->mdfd_vfd, (off_t) nblocks * BLCKSZ) < 0)
        ereport(ERROR,
                (errcode_for_file_access(),
              errmsg("could not truncate relation %u/%u/%u to %u blocks: %m",
@@ -900,7 +901,7 @@ mdimmedsync(SMgrRelation reln)
 
    v = mdopen(reln, EXTENSION_FAIL);
 
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
    while (v != NULL)
    {
        if (FileSync(v->mdfd_vfd) < 0)
@@ -917,8 +918,7 @@ mdimmedsync(SMgrRelation reln)
    if (FileSync(v->mdfd_vfd) < 0)
        ereport(ERROR,
                (errcode_for_file_access(),
-                errmsg("could not fsync segment %u of relation %u/%u/%u: %m",
-                       v->mdfd_segno,
+                errmsg("could not fsync relation %u/%u/%u: %m",
                        reln->smgr_rnode.spcNode,
                        reln->smgr_rnode.dbNode,
                        reln->smgr_rnode.relNode)));
@@ -1453,7 +1453,7 @@ _fdvec_alloc(void)
    return (MdfdVec *) MemoryContextAlloc(MdCxt, sizeof(MdfdVec));
 }
 
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
 
 /*
  * Open the specified segment of the relation,
@@ -1499,7 +1499,7 @@ _mdfd_openseg(SMgrRelation reln, BlockNumber segno, int oflags)
    /* all done */
    return v;
 }
-#endif   /* LET_OS_MANAGE_FILESIZE */
+#endif   /* USE_SEGMENTED_FILES */
 
 /*
  * _mdfd_getseg() -- Find the segment of the relation holding the
@@ -1515,7 +1515,7 @@ _mdfd_getseg(SMgrRelation reln, BlockNumber blkno, bool isTemp,
 {
    MdfdVec    *v = mdopen(reln, behavior);
 
-#ifndef LET_OS_MANAGE_FILESIZE
+#ifdef USE_SEGMENTED_FILES
    BlockNumber targetseg;
    BlockNumber nextsegno;
 
@@ -1588,7 +1588,7 @@ _mdfd_getseg(SMgrRelation reln, BlockNumber blkno, bool isTemp,
 static BlockNumber
 _mdnblocks(SMgrRelation reln, MdfdVec *seg)
 {
-   long        len;
+   off_t       len;
 
    len = FileSeek(seg->mdfd_vfd, 0L, SEEK_END);
    if (len < 0)
index e297579674a23354ccfd527999f62114f9223b04..d6c192993e2de40b1db4821894ec972d07360176 100644 (file)
@@ -38,7 +38,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/sort/tuplestore.c,v 1.36 2008/01/01 19:45:55 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/sort/tuplestore.c,v 1.37 2008/03/10 20:06:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -134,14 +134,14 @@ struct Tuplestorestate
    bool        eof_reached;    /* read reached EOF (always valid) */
    int         current;        /* next array index (valid if INMEM) */
    int         readpos_file;   /* file# (valid if WRITEFILE and not eof) */
-   long        readpos_offset; /* offset (valid if WRITEFILE and not eof) */
+   off_t       readpos_offset; /* offset (valid if WRITEFILE and not eof) */
    int         writepos_file;  /* file# (valid if READFILE) */
-   long        writepos_offset;    /* offset (valid if READFILE) */
+   off_t       writepos_offset; /* offset (valid if READFILE) */
 
    /* markpos_xxx holds marked position for mark and restore */
    int         markpos_current;    /* saved "current" */
    int         markpos_file;   /* saved "readpos_file" */
-   long        markpos_offset; /* saved "readpos_offset" */
+   off_t       markpos_offset; /* saved "readpos_offset" */
 };
 
 #define COPYTUP(state,tup) ((*(state)->copytup) (state, tup))
index b48e261cbf5dfad800c05769c51c1c04def5589f..24b7c0dc86dc0b11e563985b575a271c1688329a 100644 (file)
    your system. */
 #undef PTHREAD_CREATE_JOINABLE
 
+/* The size of `off_t', as computed by sizeof. */
+#undef SIZEOF_OFF_T
+
 /* The size of `size_t', as computed by sizeof. */
 #undef SIZEOF_SIZE_T
 
 /* Use replacement snprintf() functions. */
 #undef USE_REPL_SNPRINTF
 
+/* Define to split data files into 1GB segments. */
+#undef USE_SEGMENTED_FILES
+
 /* Define to build with (Open)SSL support. (--with-openssl) */
 #undef USE_SSL
 
index 0a1e8233d3eea14665a1dd46f6369ec4d3b73e1b..c0d546761a8655d0c09ac89cd3b774a0661ffb81 100644 (file)
@@ -6,7 +6,7 @@
  * for developers. If you edit any of these, be sure to do a *full*
  * rebuild (and an initdb if noted).
  *
- * $PostgreSQL: pgsql/src/include/pg_config_manual.h,v 1.28 2008/02/29 20:58:33 alvherre Exp $
+ * $PostgreSQL: pgsql/src/include/pg_config_manual.h,v 1.29 2008/03/10 20:06:27 tgl Exp $
  *------------------------------------------------------------------------
  */
 
@@ -27,8 +27,9 @@
 
 /*
  * 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.
+ * file when USE_SEGMENTED_FILES is defined.  Thus, the maximum size 
+ * of a single file is RELSEG_SIZE * BLCKSZ; relations bigger than that 
+ * are divided into multiple files.
  *
  * RELSEG_SIZE * BLCKSZ must be less than your OS' limit on file size.
  * This is often 2 GB or 4GB in a 32-bit operating system, unless you
  * in the direction of a small limit.  (Besides, a power-of-2 value
  * saves a few cycles in md.c.)
  *
+ * When not using segmented files, RELSEG_SIZE is set to zero so that
+ * this behavior can be distinguished in pg_control.
+ *
  * Changing RELSEG_SIZE requires an initdb.
  */
+#ifdef USE_SEGMENTED_FILES
 #define RELSEG_SIZE (0x40000000 / BLCKSZ)
+#else
+#define RELSEG_SIZE 0
+#endif
 
 /*
  * Size of a WAL file block.  This need have no particular relation to BLCKSZ.
index 3313e43ea0dc1c627768f96c2ab475f975b6b302..e50ec2f8344c063d56f97b4a65ae64301b797c72 100644 (file)
@@ -18,7 +18,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/storage/buffile.h,v 1.23 2008/01/01 19:45:58 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/storage/buffile.h,v 1.24 2008/03/10 20:06:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -38,8 +38,8 @@ extern BufFile *BufFileCreateTemp(bool interXact);
 extern void BufFileClose(BufFile *file);
 extern size_t BufFileRead(BufFile *file, void *ptr, size_t size);
 extern size_t BufFileWrite(BufFile *file, void *ptr, size_t size);
-extern int BufFileSeek(BufFile *file, int fileno, long offset, int whence);
-extern void BufFileTell(BufFile *file, int *fileno, long *offset);
+extern int BufFileSeek(BufFile *file, int fileno, off_t offset, int whence);
+extern void BufFileTell(BufFile *file, int *fileno, off_t *offset);
 extern int BufFileSeekBlock(BufFile *file, long blknum);
 
 #endif   /* BUFFILE_H */
index f5862bf82b388bcfcb85e0b82f5160bb5a43b61e..05c2a625255d7b1f5a1fd8f524d9f3c3e1a08784 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/storage/fd.h,v 1.61 2008/01/01 19:45:58 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/storage/fd.h,v 1.62 2008/03/10 20:06:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -65,8 +65,8 @@ extern void FileClose(File file);
 extern int FileRead(File file, char *buffer, int amount);
 extern int FileWrite(File file, char *buffer, int amount);
 extern int FileSync(File file);
-extern long FileSeek(File file, long offset, int whence);
-extern int FileTruncate(File file, long offset);
+extern off_t FileSeek(File file, off_t offset, int whence);
+extern int FileTruncate(File file, off_t offset);
 
 /* Operations that allow use of regular stdio --- USE WITH CAUTION */
 extern FILE *AllocateFile(const char *name, const char *mode);