diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml index 5849cbb839a..10d277f5659 100644 --- a/.cirrus.tasks.yml +++ b/.cirrus.tasks.yml @@ -471,6 +471,7 @@ task: --enable-cassert --enable-injection-points --enable-debug \ --enable-tap-tests --enable-nls \ --with-segsize-blocks=6 \ + --with-liburing \ \ ${LINUX_CONFIGURE_FEATURES} \ \ diff --git a/configure b/configure index fac1e9a4e39..c6d762dc999 100755 --- a/configure +++ b/configure @@ -712,6 +712,9 @@ LIBCURL_LIBS LIBCURL_CFLAGS with_libcurl with_uuid +LIBURING_LIBS +LIBURING_CFLAGS +with_liburing with_readline with_systemd with_selinux @@ -865,6 +868,7 @@ with_selinux with_systemd with_readline with_libedit_preferred +with_liburing with_uuid with_ossp_uuid with_libcurl @@ -898,6 +902,8 @@ PKG_CONFIG_PATH PKG_CONFIG_LIBDIR ICU_CFLAGS ICU_LIBS +LIBURING_CFLAGS +LIBURING_LIBS LIBCURL_CFLAGS LIBCURL_LIBS XML2_CONFIG @@ -1578,6 +1584,7 @@ Optional Packages: --without-readline do not use GNU Readline nor BSD Libedit for editing --with-libedit-preferred prefer BSD Libedit over GNU Readline + --with-liburing build with io_uring support, for asynchronous I/O --with-uuid=LIB build contrib/uuid-ossp using LIB (bsd,e2fs,ossp) --with-ossp-uuid obsolete spelling of --with-uuid=ossp --with-libcurl build with libcurl support @@ -1614,6 +1621,10 @@ Some influential environment variables: path overriding pkg-config's built-in search path ICU_CFLAGS C compiler flags for ICU, overriding pkg-config ICU_LIBS linker flags for ICU, overriding pkg-config + LIBURING_CFLAGS + C compiler flags for LIBURING, overriding pkg-config + LIBURING_LIBS + linker flags for LIBURING, overriding pkg-config LIBCURL_CFLAGS C compiler flags for LIBCURL, overriding pkg-config LIBCURL_LIBS @@ -8692,6 +8703,134 @@ fi +# +# liburing +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with liburing support" >&5 +$as_echo_n "checking whether to build with liburing support... " >&6; } + + + +# Check whether --with-liburing was given. +if test "${with_liburing+set}" = set; then : + withval=$with_liburing; + case $withval in + yes) + +$as_echo "#define USE_LIBURING 1" >>confdefs.h + + ;; + no) + : + ;; + *) + as_fn_error $? "no argument expected for --with-liburing option" "$LINENO" 5 + ;; + esac + +else + with_liburing=no + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_liburing" >&5 +$as_echo "$with_liburing" >&6; } + + +if test "$with_liburing" = yes; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for liburing" >&5 +$as_echo_n "checking for liburing... " >&6; } + +if test -n "$LIBURING_CFLAGS"; then + pkg_cv_LIBURING_CFLAGS="$LIBURING_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"liburing\""; } >&5 + ($PKG_CONFIG --exists --print-errors "liburing") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBURING_CFLAGS=`$PKG_CONFIG --cflags "liburing" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBURING_LIBS"; then + pkg_cv_LIBURING_LIBS="$LIBURING_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"liburing\""; } >&5 + ($PKG_CONFIG --exists --print-errors "liburing") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBURING_LIBS=`$PKG_CONFIG --libs "liburing" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBURING_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "liburing" 2>&1` + else + LIBURING_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "liburing" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBURING_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (liburing) were not met: + +$LIBURING_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables LIBURING_CFLAGS +and LIBURING_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables LIBURING_CFLAGS +and LIBURING_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + LIBURING_CFLAGS=$pkg_cv_LIBURING_CFLAGS + LIBURING_LIBS=$pkg_cv_LIBURING_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +fi +fi # # UUID library diff --git a/configure.ac b/configure.ac index b6d02f5ecc7..ecbc2734829 100644 --- a/configure.ac +++ b/configure.ac @@ -975,6 +975,18 @@ AC_SUBST(with_readline) PGAC_ARG_BOOL(with, libedit-preferred, no, [prefer BSD Libedit over GNU Readline]) +# +# liburing +# +AC_MSG_CHECKING([whether to build with liburing support]) +PGAC_ARG_BOOL(with, liburing, no, [build with io_uring support, for asynchronous I/O], + [AC_DEFINE([USE_LIBURING], 1, [Define to build with io_uring support. (--with-liburing)])]) +AC_MSG_RESULT([$with_liburing]) +AC_SUBST(with_liburing) + +if test "$with_liburing" = yes; then + PKG_CHECK_MODULES(LIBURING, liburing) +fi # # UUID library diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index e076cefa3b9..cc28f041330 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -1156,6 +1156,24 @@ build-postgresql: + + + + + Build with liburing, enabling io_uring support for asynchronous I/O. + + + To detect the required compiler and linker options, PostgreSQL will + query pkg-config. + + + To use a liburing installation that is in an unusual location, you + can set pkg-config-related environment + variables (see its documentation). + + + + @@ -2611,6 +2629,22 @@ ninja install + + + + + Build with liburing, enabling io_uring support for asynchronous I/O. + Defaults to auto. + + + + To use a liburing installation that is in an unusual location, you + can set pkg-config-related environment + variables (see its documentation). + + + + diff --git a/meson.build b/meson.build index 7cf518a2765..108e3678071 100644 --- a/meson.build +++ b/meson.build @@ -944,6 +944,18 @@ endif +############################################################### +# Library: liburing +############################################################### + +liburingopt = get_option('liburing') +liburing = dependency('liburing', required: liburingopt) +if liburing.found() + cdata.set('USE_LIBURING', 1) +endif + + + ############################################################### # Library: libxml ############################################################### @@ -3164,6 +3176,7 @@ backend_both_deps += [ icu_i18n, ldap, libintl, + liburing, libxml, lz4, pam, @@ -3819,6 +3832,7 @@ if meson.version().version_compare('>=0.57') 'icu': icu, 'ldap': ldap, 'libcurl': libcurl, + 'liburing': liburing, 'libxml': libxml, 'libxslt': libxslt, 'llvm': llvm, diff --git a/meson_options.txt b/meson_options.txt index 702c4517145..dd7126da3a7 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -106,6 +106,9 @@ option('libcurl', type : 'feature', value: 'auto', option('libedit_preferred', type: 'boolean', value: false, description: 'Prefer BSD Libedit over GNU Readline') +option('liburing', type : 'feature', value: 'auto', + description: 'io_uring support, for asynchronous I/O') + option('libxml', type: 'feature', value: 'auto', description: 'XML support') diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 8fe9d61e82a..cce29a37ac5 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -196,6 +196,7 @@ with_gssapi = @with_gssapi@ with_krb_srvnam = @with_krb_srvnam@ with_ldap = @with_ldap@ with_libcurl = @with_libcurl@ +with_liburing = @with_liburing@ with_libxml = @with_libxml@ with_libxslt = @with_libxslt@ with_llvm = @with_llvm@ @@ -222,6 +223,9 @@ krb_srvtab = @krb_srvtab@ ICU_CFLAGS = @ICU_CFLAGS@ ICU_LIBS = @ICU_LIBS@ +LIBURING_CFLAGS = @LIBURING_CFLAGS@ +LIBURING_LIBS = @LIBURING_LIBS@ + TCLSH = @TCLSH@ TCL_LIBS = @TCL_LIBS@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ @@ -246,7 +250,7 @@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ PG_SYSROOT = @PG_SYSROOT@ -override CPPFLAGS := $(ICU_CFLAGS) $(CPPFLAGS) +override CPPFLAGS := $(ICU_CFLAGS) $(LIBURING_CFLAGS) $(CPPFLAGS) ifdef PGXS override CPPFLAGS := -I$(includedir_server) -I$(includedir_internal) $(CPPFLAGS) diff --git a/src/backend/Makefile b/src/backend/Makefile index 42d4a28e5aa..7344c8c7f5c 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -43,9 +43,10 @@ OBJS = \ $(top_builddir)/src/common/libpgcommon_srv.a \ $(top_builddir)/src/port/libpgport_srv.a -# We put libpgport and libpgcommon into OBJS, so remove it from LIBS; also add -# libldap and ICU -LIBS := $(filter-out -lpgport -lpgcommon, $(LIBS)) $(LDAP_LIBS_BE) $(ICU_LIBS) +# We put libpgport and libpgcommon into OBJS, so remove it from LIBS. +LIBS := $(filter-out -lpgport -lpgcommon, $(LIBS)) +# The backend conditionally needs libraries that most executables don't need. +LIBS += $(LDAP_LIBS_BE) $(ICU_LIBS) $(LIBURING_LIBS) # The backend doesn't need everything that's in LIBS, however LIBS := $(filter-out -lreadline -ledit -ltermcap -lncurses -lcurses, $(LIBS)) diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index db6454090d2..f2422241133 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -672,6 +672,9 @@ /* Define to 1 to build with libcurl support. (--with-libcurl) */ #undef USE_LIBCURL +/* Define to build with io_uring support. (--with-liburing) */ +#undef USE_LIBURING + /* Define to 1 to build with XML support. (--with-libxml) */ #undef USE_LIBXML diff --git a/src/makefiles/meson.build b/src/makefiles/meson.build index 60e13d50235..46d8da070e8 100644 --- a/src/makefiles/meson.build +++ b/src/makefiles/meson.build @@ -199,6 +199,8 @@ pgxs_empty = [ 'PTHREAD_CFLAGS', 'PTHREAD_LIBS', 'ICU_LIBS', + + 'LIBURING_CFLAGS', 'LIBURING_LIBS', ] if host_system == 'windows' and cc.get_argument_syntax() != 'msvc' @@ -230,6 +232,7 @@ pgxs_deps = { 'icu': icu, 'ldap': ldap, 'libcurl': libcurl, + 'liburing': liburing, 'libxml': libxml, 'libxslt': libxslt, 'llvm': llvm,