diff options
-rw-r--r-- | .cirrus.yml | 2 | ||||
-rwxr-xr-x | configure | 63 | ||||
-rw-r--r-- | configure.ac | 36 | ||||
-rw-r--r-- | doc/src/sgml/installation.sgml | 28 | ||||
-rw-r--r-- | meson.build | 24 | ||||
-rw-r--r-- | meson_options.txt | 3 |
6 files changed, 132 insertions, 24 deletions
diff --git a/.cirrus.yml b/.cirrus.yml index 0113799a6e2..993af888659 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -323,6 +323,7 @@ task: ./configure \ --enable-cassert --enable-debug --enable-tap-tests \ --enable-nls \ + --with-segsize-blocks=8 \ \ ${LINUX_CONFIGURE_FEATURES} \ \ @@ -491,6 +492,7 @@ task: -Dextra_lib_dirs=${brewpath}/lib \ -Dcassert=true \ -Dssl=openssl -Duuid=e2fs -Ddtrace=auto \ + -Dsegsize_blocks=6 \ -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \ build diff --git a/configure b/configure index 650755a6b1a..62f382c1d13 100755 --- a/configure +++ b/configure @@ -842,6 +842,7 @@ enable_dtrace enable_tap_tests with_blocksize with_segsize +with_segsize_blocks with_wal_blocksize with_CC with_llvm @@ -1551,6 +1552,8 @@ Optional Packages: --with-blocksize=BLOCKSIZE set table block size in kB [8] --with-segsize=SEGSIZE set table segment size in GB [1] + --with-segsize-blocks=SEGSIZE_BLOCKS + set table segment size in blocks [0] --with-wal-blocksize=BLOCKSIZE set WAL block size in kB [8] --with-CC=CMD set compiler (deprecated) @@ -3731,8 +3734,6 @@ _ACEOF # # Relation segment size # -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for segment size" >&5 -$as_echo_n "checking for segment size... " >&6; } @@ -3756,12 +3757,52 @@ else fi -# this expression is set up to avoid unnecessary integer overflow -# blocksize is already guaranteed to be a factor of 1024 -RELSEG_SIZE=`expr '(' 1024 / ${blocksize} ')' '*' ${segsize} '*' 1024` -test $? -eq 0 || exit 1 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${segsize}GB" >&5 + + + +# Check whether --with-segsize-blocks was given. +if test "${with_segsize_blocks+set}" = set; then : + withval=$with_segsize_blocks; + case $withval in + yes) + as_fn_error $? "argument required for --with-segsize-blocks option" "$LINENO" 5 + ;; + no) + as_fn_error $? "argument required for --with-segsize-blocks option" "$LINENO" 5 + ;; + *) + segsize_blocks=$withval + ;; + esac + +else + segsize_blocks=0 +fi + + + +# If --with-segsize-blocks is non-zero, it is used, --with-segsize +# otherwise. segsize-blocks is only really useful for developers wanting to +# test segment related code. Warn if both are used. +if test $segsize_blocks -ne 0 -a $segsize -ne 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: both --with-segsize and --with-segsize-blocks specified, --with-segsize-blocks wins" >&5 +$as_echo "$as_me: WARNING: both --with-segsize and --with-segsize-blocks specified, --with-segsize-blocks wins" >&2;} +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for segment size" >&5 +$as_echo_n "checking for segment size... " >&6; } +if test $segsize_blocks -eq 0; then + # this expression is set up to avoid unnecessary integer overflow + # blocksize is already guaranteed to be a factor of 1024 + RELSEG_SIZE=`expr '(' 1024 / ${blocksize} ')' '*' ${segsize} '*' 1024` + test $? -eq 0 || exit 1 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${segsize}GB" >&5 $as_echo "${segsize}GB" >&6; } +else + RELSEG_SIZE=$segsize_blocks + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${RELSEG_SIZE} blocks" >&5 +$as_echo "${RELSEG_SIZE} blocks" >&6; } +fi cat >>confdefs.h <<_ACEOF @@ -15450,9 +15491,11 @@ _ACEOF -# If we don't have largefile support, can't handle segsize >= 2GB. -if test "$ac_cv_sizeof_off_t" -lt 8 -a "$segsize" != "1"; then - as_fn_error $? "Large file support is not enabled. Segment size cannot be larger than 1GB." "$LINENO" 5 +# If we don't have largefile support, can't handle segment size >= 2GB. +if test "$ac_cv_sizeof_off_t" -lt 8; then + if expr $RELSEG_SIZE '*' $blocksize '>=' 2 '*' 1024 '*' 1024; then + as_fn_error $? "Large file support is not enabled. Segment size cannot be larger than 1GB." "$LINENO" 5 + fi fi # The cast to long int works around a bug in the HP C Compiler diff --git a/configure.ac b/configure.ac index 0df13e5439f..cfb10f59ce7 100644 --- a/configure.ac +++ b/configure.ac @@ -285,15 +285,31 @@ AC_DEFINE_UNQUOTED([BLCKSZ], ${BLCKSZ}, [ # # Relation segment size # -AC_MSG_CHECKING([for segment size]) PGAC_ARG_REQ(with, segsize, [SEGSIZE], [set table segment size in GB [1]], [segsize=$withval], [segsize=1]) -# this expression is set up to avoid unnecessary integer overflow -# blocksize is already guaranteed to be a factor of 1024 -RELSEG_SIZE=`expr '(' 1024 / ${blocksize} ')' '*' ${segsize} '*' 1024` -test $? -eq 0 || exit 1 -AC_MSG_RESULT([${segsize}GB]) +PGAC_ARG_REQ(with, segsize-blocks, [SEGSIZE_BLOCKS], [set table segment size in blocks [0]], + [segsize_blocks=$withval], + [segsize_blocks=0]) + +# If --with-segsize-blocks is non-zero, it is used, --with-segsize +# otherwise. segsize-blocks is only really useful for developers wanting to +# test segment related code. Warn if both are used. +if test $segsize_blocks -ne 0 -a $segsize -ne 1; then + AC_MSG_WARN([both --with-segsize and --with-segsize-blocks specified, --with-segsize-blocks wins]) +fi + +AC_MSG_CHECKING([for segment size]) +if test $segsize_blocks -eq 0; then + # this expression is set up to avoid unnecessary integer overflow + # blocksize is already guaranteed to be a factor of 1024 + RELSEG_SIZE=`expr '(' 1024 / ${blocksize} ')' '*' ${segsize} '*' 1024` + test $? -eq 0 || exit 1 + AC_MSG_RESULT([${segsize}GB]) +else + RELSEG_SIZE=$segsize_blocks + AC_MSG_RESULT([${RELSEG_SIZE} blocks]) +fi AC_DEFINE_UNQUOTED([RELSEG_SIZE], ${RELSEG_SIZE}, [ RELSEG_SIZE is the maximum number of blocks allowed in one disk file. @@ -1733,9 +1749,11 @@ fi dnl Check for largefile support (must be after AC_SYS_LARGEFILE) AC_CHECK_SIZEOF([off_t]) -# If we don't have largefile support, can't handle segsize >= 2GB. -if test "$ac_cv_sizeof_off_t" -lt 8 -a "$segsize" != "1"; then - AC_MSG_ERROR([Large file support is not enabled. Segment size cannot be larger than 1GB.]) +# If we don't have largefile support, can't handle segment size >= 2GB. +if test "$ac_cv_sizeof_off_t" -lt 8; then + if expr $RELSEG_SIZE '*' $blocksize '>=' 2 '*' 1024 '*' 1024; then + AC_MSG_ERROR([Large file support is not enabled. Segment size cannot be larger than 1GB.]) + fi fi AC_CHECK_SIZEOF([bool], [], diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index f64f3290447..ef50d1a6e8f 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -1681,6 +1681,20 @@ build-postgresql: </para> </listitem> </varlistentry> + + <varlistentry> + <term><option>--with-segsize-blocks=SEGSIZE_BLOCKS</option></term> + <listitem> + <para> + Specify the segment size in blocks. If both + <option>--with-segsize</option> and this option are specified, this + option wins. + + This option is only for developers, to test segment related code. + </para> + </listitem> + </varlistentry> + </variablelist> </sect3> @@ -3097,6 +3111,20 @@ ninja install </para> </listitem> </varlistentry> + + <varlistentry> + <term><option>-Dsegsize_blocks=SEGSIZE_BLOCKS</option></term> + <listitem> + <para> + Specify the segment size in blocks. If both + <option>-Dsegsize</option> and this option are specified, this option + wins. + + This option is only for developers, to test segment related code. + </para> + </listitem> + </varlistentry> + </variablelist> </sect3> </sect2> diff --git a/meson.build b/meson.build index 3cb50c0b172..3cc941c7f33 100644 --- a/meson.build +++ b/meson.build @@ -419,7 +419,19 @@ meson_bin = find_program(meson_binpath, native: true) cdata.set('USE_ASSERT_CHECKING', get_option('cassert') ? 1 : false) -cdata.set('BLCKSZ', get_option('blocksize').to_int() * 1024, description: +blocksize = get_option('blocksize').to_int() * 1024 + +if get_option('segsize_blocks') != 0 + if get_option('segsize') != 1 + warning('both segsize and segsize_blocks specified, segsize_blocks wins') + endif + + segsize = get_option('segsize_blocks') +else + segsize = (get_option('segsize') * 1024 * 1024 * 1024) / blocksize +endif + +cdata.set('BLCKSZ', blocksize, description: '''Size of a disk block --- this also limits the size of a tuple. You can set it bigger if you need bigger tuples (although TOAST should reduce the need to have large tuples, since fields can be spread across multiple tuples). @@ -429,7 +441,7 @@ cdata.set('BLCKSZ', get_option('blocksize').to_int() * 1024, description: Changing BLCKSZ requires an initdb.''') cdata.set('XLOG_BLCKSZ', get_option('wal_blocksize').to_int() * 1024) -cdata.set('RELSEG_SIZE', get_option('segsize') * 131072) +cdata.set('RELSEG_SIZE', segsize) cdata.set('DEF_PGPORT', get_option('pgport')) cdata.set_quoted('DEF_PGPORT_STR', get_option('pgport').to_string()) cdata.set_quoted('PG_KRB_SRVNAM', get_option('krb_srvnam')) @@ -3132,9 +3144,11 @@ if meson.version().version_compare('>=0.57') summary( { - 'data block size': cdata.get('BLCKSZ'), - 'WAL block size': cdata.get('XLOG_BLCKSZ') / 1024, - 'segment size': cdata.get('RELSEG_SIZE') / 131072, + 'data block size': '@0@ kB'.format(cdata.get('BLCKSZ') / 1024), + 'WAL block size': '@0@ kB'.format(cdata.get('XLOG_BLCKSZ') / 1024), + 'segment size': get_option('segsize_blocks') != 0 ? + '@0@ blocks'.format(cdata.get('RELSEG_SIZE')) : + '@0@ GB'.format(get_option('segsize')), }, section: 'Data layout', ) diff --git a/meson_options.txt b/meson_options.txt index 2c871969f52..4141fa5b2dd 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -13,6 +13,9 @@ option('wal_blocksize', type : 'combo', option('segsize', type : 'integer', value : 1, description : '''Segment size, in gigabytes''') +option('segsize_blocks', type : 'integer', value: 0, + description : '''Segment size, in blocks''') + # Miscellaneous options |