aio: Basic subsystem initialization
authorAndres Freund <[email protected]>
Mon, 17 Mar 2025 22:51:33 +0000 (18:51 -0400)
committerAndres Freund <[email protected]>
Mon, 17 Mar 2025 22:51:33 +0000 (18:51 -0400)
This commit just does the minimal wiring up of the AIO subsystem, added in the
next commit, to the rest of the system. The next commit contains more details
about motivation and architecture.

This commit is kept separate to make it easier to review, separating the
changes across the tree, from the implementation of the new subsystem.

We discussed squashing this commit with the main commit before merging AIO,
but there has been a mild preference for keeping it separate.

Reviewed-by: Heikki Linnakangas <[email protected]>
Reviewed-by: Noah Misch <[email protected]>
Discussion: https://postgr.es/m/uvrtrknj4kdytuboidbhwclo4gxhswwcpgadptsjvjqcluzmah%40brqs62irg4dt

24 files changed:
doc/src/sgml/config.sgml
src/backend/access/transam/xact.c
src/backend/postmaster/autovacuum.c
src/backend/postmaster/bgwriter.c
src/backend/postmaster/checkpointer.c
src/backend/postmaster/pgarch.c
src/backend/postmaster/walsummarizer.c
src/backend/postmaster/walwriter.c
src/backend/replication/walsender.c
src/backend/storage/aio/Makefile
src/backend/storage/aio/aio.c [new file with mode: 0644]
src/backend/storage/aio/aio_init.c [new file with mode: 0644]
src/backend/storage/aio/meson.build
src/backend/storage/ipc/ipci.c
src/backend/utils/init/postinit.c
src/backend/utils/misc/guc_tables.c
src/backend/utils/misc/postgresql.conf.sample
src/backend/utils/resowner/resowner.c
src/include/storage/aio.h [new file with mode: 0644]
src/include/storage/aio_subsys.h [new file with mode: 0644]
src/include/utils/guc.h
src/include/utils/guc_hooks.h
src/include/utils/resowner.h
src/tools/pgindent/typedefs.list

index 3d62c8bd2748d1bbdd5cf3d3faf30bee513fd431..7ec18bb7627b52d728798239e874a4d31931966f 100644 (file)
@@ -2638,6 +2638,57 @@ include_dir 'conf.d'
         </para>
        </listitem>
       </varlistentry>
+
+      <varlistentry id="guc-io-max-concurrency" xreflabel="io_max_concurrency">
+       <term><varname>io_max_concurrency</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>io_max_concurrency</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Controls the maximum number of I/O operations that one process can
+         execute simultaneously.
+        </para>
+        <para>
+         The default setting of <literal>-1</literal> selects a number based
+         on <xref linkend="guc-shared-buffers"/> and the maximum number of
+         processes (<xref linkend="guc-max-connections"/>, <xref
+         linkend="guc-autovacuum-worker-slots"/>, <xref
+         linkend="guc-max-worker-processes"/> and <xref
+         linkend="guc-max-wal-senders"/>), but not more than
+         <literal>64</literal>.
+        </para>
+        <para>
+         This parameter can only be set at server start.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="guc-io-method" xreflabel="io_method">
+       <term><varname>io_method</varname> (<type>enum</type>)
+       <indexterm>
+        <primary><varname>io_method</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Selects the method for executing asynchronous I/O.
+         Possible values are:
+         <itemizedlist>
+          <listitem>
+           <para>
+            <literal>sync</literal> (execute asynchronous-eligible I/O synchronously)
+           </para>
+          </listitem>
+         </itemizedlist>
+        </para>
+        <para>
+         This parameter can only be set at server start.
+        </para>
+       </listitem>
+      </varlistentry>
+
      </variablelist>
     </sect2>
 
index 1b4f21a88d3a4a0e260f89644338f7013462d0f6..b885513f76541bc165a41ce78f83623703c2410a 100644 (file)
@@ -51,6 +51,7 @@
 #include "replication/origin.h"
 #include "replication/snapbuild.h"
 #include "replication/syncrep.h"
+#include "storage/aio_subsys.h"
 #include "storage/condition_variable.h"
 #include "storage/fd.h"
 #include "storage/lmgr.h"
@@ -2411,6 +2412,8 @@ CommitTransaction(void)
                         RESOURCE_RELEASE_BEFORE_LOCKS,
                         true, true);
 
+   AtEOXact_Aio(true);
+
    /* Check we've released all buffer pins */
    AtEOXact_Buffers(true);
 
@@ -2716,6 +2719,8 @@ PrepareTransaction(void)
                         RESOURCE_RELEASE_BEFORE_LOCKS,
                         true, true);
 
+   AtEOXact_Aio(true);
+
    /* Check we've released all buffer pins */
    AtEOXact_Buffers(true);
 
@@ -2830,6 +2835,8 @@ AbortTransaction(void)
    pgstat_report_wait_end();
    pgstat_progress_end_command();
 
+   pgaio_error_cleanup();
+
    /* Clean up buffer content locks, too */
    UnlockBuffers();
 
@@ -2960,6 +2967,7 @@ AbortTransaction(void)
        ResourceOwnerRelease(TopTransactionResourceOwner,
                             RESOURCE_RELEASE_BEFORE_LOCKS,
                             false, true);
+       AtEOXact_Aio(false);
        AtEOXact_Buffers(false);
        AtEOXact_RelationCache(false);
        AtEOXact_TypeCache();
@@ -5232,6 +5240,9 @@ AbortSubTransaction(void)
 
    pgstat_report_wait_end();
    pgstat_progress_end_command();
+
+   pgaio_error_cleanup();
+
    UnlockBuffers();
 
    /* Reset WAL record construction state */
@@ -5326,6 +5337,7 @@ AbortSubTransaction(void)
                             RESOURCE_RELEASE_BEFORE_LOCKS,
                             false, false);
 
+       AtEOXact_Aio(false);
        AtEOSubXact_RelationCache(false, s->subTransactionId,
                                  s->parent->subTransactionId);
        AtEOSubXact_TypeCache();
index 71c34027c88700875830b2191c5f81a0b5f8439b..2513a8ef8a66568ba949d0c679aa1ae5daf74fab 100644 (file)
@@ -88,6 +88,7 @@
 #include "postmaster/autovacuum.h"
 #include "postmaster/interrupt.h"
 #include "postmaster/postmaster.h"
+#include "storage/aio_subsys.h"
 #include "storage/bufmgr.h"
 #include "storage/ipc.h"
 #include "storage/latch.h"
@@ -465,6 +466,7 @@ AutoVacLauncherMain(const void *startup_data, size_t startup_data_len)
         */
        LWLockReleaseAll();
        pgstat_report_wait_end();
+       pgaio_error_cleanup();
        UnlockBuffers();
        /* this is probably dead code, but let's be safe: */
        if (AuxProcessResourceOwner)
index a688cc5d2a17e55d4f37264bd1c5500b4928a0c8..72f5acceec78d43b185c478f6591dddfd4c8a156 100644 (file)
@@ -38,6 +38,7 @@
 #include "postmaster/auxprocess.h"
 #include "postmaster/bgwriter.h"
 #include "postmaster/interrupt.h"
+#include "storage/aio_subsys.h"
 #include "storage/buf_internals.h"
 #include "storage/bufmgr.h"
 #include "storage/condition_variable.h"
@@ -168,6 +169,7 @@ BackgroundWriterMain(const void *startup_data, size_t startup_data_len)
         */
        LWLockReleaseAll();
        ConditionVariableCancelSleep();
+       pgaio_error_cleanup();
        UnlockBuffers();
        ReleaseAuxProcessResources(false);
        AtEOXact_Buffers(false);
index 0e228d143a0127012776387ed1144a6321b790c8..fda91ffd1ce2dedb6942af3c74cb8a893c1e4545 100644 (file)
@@ -49,6 +49,7 @@
 #include "postmaster/bgwriter.h"
 #include "postmaster/interrupt.h"
 #include "replication/syncrep.h"
+#include "storage/aio_subsys.h"
 #include "storage/bufmgr.h"
 #include "storage/condition_variable.h"
 #include "storage/fd.h"
@@ -276,6 +277,7 @@ CheckpointerMain(const void *startup_data, size_t startup_data_len)
        LWLockReleaseAll();
        ConditionVariableCancelSleep();
        pgstat_report_wait_end();
+       pgaio_error_cleanup();
        UnlockBuffers();
        ReleaseAuxProcessResources(false);
        AtEOXact_Buffers(false);
index dbe4e1d426b4634c044c398dd9363249b91d7516..7e622ae4bd2a705762671eacd9b8b714edb28d7c 100644 (file)
@@ -40,6 +40,7 @@
 #include "postmaster/interrupt.h"
 #include "postmaster/pgarch.h"
 #include "storage/condition_variable.h"
+#include "storage/aio_subsys.h"
 #include "storage/fd.h"
 #include "storage/ipc.h"
 #include "storage/latch.h"
@@ -568,6 +569,7 @@ pgarch_archiveXlog(char *xlog)
        LWLockReleaseAll();
        ConditionVariableCancelSleep();
        pgstat_report_wait_end();
+       pgaio_error_cleanup();
        ReleaseAuxProcessResources(false);
        AtEOXact_Files(false);
        AtEOXact_HashTables(false);
index ccba0f84e6e205116d602e5ec4728d6739a596ad..0fec4f1f871ced417fe1e8275380265d9164691f 100644 (file)
@@ -38,6 +38,7 @@
 #include "postmaster/interrupt.h"
 #include "postmaster/walsummarizer.h"
 #include "replication/walreceiver.h"
+#include "storage/aio_subsys.h"
 #include "storage/fd.h"
 #include "storage/ipc.h"
 #include "storage/latch.h"
@@ -289,6 +290,7 @@ WalSummarizerMain(const void *startup_data, size_t startup_data_len)
        LWLockReleaseAll();
        ConditionVariableCancelSleep();
        pgstat_report_wait_end();
+       pgaio_error_cleanup();
        ReleaseAuxProcessResources(false);
        AtEOXact_Files(false);
        AtEOXact_HashTables(false);
index 0380601bcbb50fcb3738b17891457d9f1f3dfaa7..fd92c8b7a33e18d47b652d13d4e120e2b2e00041 100644 (file)
@@ -51,6 +51,7 @@
 #include "postmaster/auxprocess.h"
 #include "postmaster/interrupt.h"
 #include "postmaster/walwriter.h"
+#include "storage/aio_subsys.h"
 #include "storage/bufmgr.h"
 #include "storage/condition_variable.h"
 #include "storage/fd.h"
@@ -164,6 +165,7 @@ WalWriterMain(const void *startup_data, size_t startup_data_len)
        LWLockReleaseAll();
        ConditionVariableCancelSleep();
        pgstat_report_wait_end();
+       pgaio_error_cleanup();
        UnlockBuffers();
        ReleaseAuxProcessResources(false);
        AtEOXact_Buffers(false);
index d96121b3aad4225b442c6c2923a6e59d98c2d045..1028919aecb14897c29df5f9d3db209695846fd1 100644 (file)
@@ -79,6 +79,7 @@
 #include "replication/walsender.h"
 #include "replication/walsender_private.h"
 #include "storage/condition_variable.h"
+#include "storage/aio_subsys.h"
 #include "storage/fd.h"
 #include "storage/ipc.h"
 #include "storage/pmsignal.h"
@@ -327,6 +328,7 @@ WalSndErrorCleanup(void)
    LWLockReleaseAll();
    ConditionVariableCancelSleep();
    pgstat_report_wait_end();
+   pgaio_error_cleanup();
 
    if (xlogreader != NULL && xlogreader->seg.ws_file >= 0)
        wal_segment_close(xlogreader);
index 2f29a9ec4d1714b3b46ae0ca6c8b8310854f731a..eaeaeeee8e351da5c2eabab8eea60972cc5d49f8 100644 (file)
@@ -9,6 +9,8 @@ top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 
 OBJS = \
+   aio.o \
+   aio_init.o \
    read_stream.o
 
 include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/storage/aio/aio.c b/src/backend/storage/aio/aio.c
new file mode 100644 (file)
index 0000000..828a94e
--- /dev/null
@@ -0,0 +1,90 @@
+/*-------------------------------------------------------------------------
+ *
+ * aio.c
+ *    AIO - Core Logic
+ *
+ * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *    src/backend/storage/aio/aio.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "lib/ilist.h"
+#include "storage/aio.h"
+#include "storage/aio_subsys.h"
+#include "utils/guc.h"
+#include "utils/guc_hooks.h"
+
+
+/* Options for io_method. */
+const struct config_enum_entry io_method_options[] = {
+   {"sync", IOMETHOD_SYNC, false},
+   {NULL, 0, false}
+};
+
+/* GUCs */
+int            io_method = DEFAULT_IO_METHOD;
+int            io_max_concurrency = -1;
+
+
+
+/*
+ * Release IO handle during resource owner cleanup.
+ */
+void
+pgaio_io_release_resowner(dlist_node *ioh_node, bool on_error)
+{
+}
+
+/*
+ * Perform AIO related cleanup after an error.
+ *
+ * This should be called early in the error recovery paths, as later steps may
+ * need to issue AIO (e.g. to record a transaction abort WAL record).
+ */
+void
+pgaio_error_cleanup(void)
+{
+}
+
+/*
+ * Perform AIO related checks at (sub-)transactional boundaries.
+ *
+ * This should be called late during (sub-)transactional commit/abort, after
+ * all steps that might need to perform AIO, so that we can verify that the
+ * AIO subsystem is in a valid state at the end of a transaction.
+ */
+void
+AtEOXact_Aio(bool is_commit)
+{
+}
+
+void
+assign_io_method(int newval, void *extra)
+{
+}
+
+bool
+check_io_max_concurrency(int *newval, void **extra, GucSource source)
+{
+   if (*newval == -1)
+   {
+       /*
+        * Auto-tuning will be applied later during startup, as auto-tuning
+        * depends on the value of various GUCs.
+        */
+       return true;
+   }
+   else if (*newval == 0)
+   {
+       GUC_check_errdetail("Only -1 or values bigger than 0 are valid.");
+       return false;
+   }
+
+   return true;
+}
diff --git a/src/backend/storage/aio/aio_init.c b/src/backend/storage/aio/aio_init.c
new file mode 100644 (file)
index 0000000..aeacc14
--- /dev/null
@@ -0,0 +1,37 @@
+/*-------------------------------------------------------------------------
+ *
+ * aio_init.c
+ *    AIO - Subsystem Initialization
+ *
+ * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ *    src/backend/storage/aio/aio_init.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "storage/aio_subsys.h"
+
+
+
+Size
+AioShmemSize(void)
+{
+   Size        sz = 0;
+
+   return sz;
+}
+
+void
+AioShmemInit(void)
+{
+}
+
+void
+pgaio_init_backend(void)
+{
+}
index 8abe0eb48639fbd520533ca9d7a7c059a8a60fe4..c822fd4ddf7d596b58159caee58381b816bfe451 100644 (file)
@@ -1,5 +1,7 @@
 # Copyright (c) 2024-2025, PostgreSQL Global Development Group
 
 backend_sources += files(
+  'aio.c',
+  'aio_init.c',
   'read_stream.c',
 )
index 174eed70367c3024bb02d7b453e4febc4a87495c..2fa045e6b0f66ad70a59ba715cb0e09580aee57c 100644 (file)
@@ -37,6 +37,7 @@
 #include "replication/slotsync.h"
 #include "replication/walreceiver.h"
 #include "replication/walsender.h"
+#include "storage/aio_subsys.h"
 #include "storage/bufmgr.h"
 #include "storage/dsm.h"
 #include "storage/dsm_registry.h"
@@ -148,6 +149,7 @@ CalculateShmemSize(int *num_semaphores)
    size = add_size(size, WaitEventCustomShmemSize());
    size = add_size(size, InjectionPointShmemSize());
    size = add_size(size, SlotSyncShmemSize());
+   size = add_size(size, AioShmemSize());
 
    /* include additional requested shmem from preload libraries */
    size = add_size(size, total_addin_request);
@@ -340,6 +342,7 @@ CreateOrAttachShmemStructs(void)
    StatsShmemInit();
    WaitEventCustomShmemInit();
    InjectionPointShmemInit();
+   AioShmemInit();
 }
 
 /*
index 4b2faf1ba9d2dca9626bbd28a3acd3edf4d9115c..7958ea11b7354aa704da6ad3062be4afd96a8bfc 100644 (file)
@@ -43,6 +43,7 @@
 #include "replication/slot.h"
 #include "replication/slotsync.h"
 #include "replication/walsender.h"
+#include "storage/aio_subsys.h"
 #include "storage/bufmgr.h"
 #include "storage/fd.h"
 #include "storage/ipc.h"
@@ -635,6 +636,12 @@ BaseInit(void)
     */
    pgstat_initialize();
 
+   /*
+    * Initialize AIO before infrastructure that might need to actually
+    * execute AIO.
+    */
+   pgaio_init_backend();
+
    /* Do local initialization of storage and buffer managers */
    InitSync();
    smgrinit();
index 9c0b10ad4dc238a20a5057fda8d397901ec833c3..0d3ebf06a9566ab819c0f5279fd18839e258d3bc 100644 (file)
@@ -72,6 +72,7 @@
 #include "replication/slot.h"
 #include "replication/slotsync.h"
 #include "replication/syncrep.h"
+#include "storage/aio.h"
 #include "storage/bufmgr.h"
 #include "storage/bufpage.h"
 #include "storage/large_object.h"
@@ -3254,6 +3255,18 @@ struct config_int ConfigureNamesInt[] =
        NULL, NULL, NULL
    },
 
+   {
+       {"io_max_concurrency",
+           PGC_POSTMASTER,
+           RESOURCES_IO,
+           gettext_noop("Max number of IOs that one process can execute simultaneously."),
+           NULL,
+       },
+       &io_max_concurrency,
+       -1, -1, 1024,
+       check_io_max_concurrency, NULL, NULL
+   },
+
    {
        {"backend_flush_after", PGC_USERSET, RESOURCES_IO,
            gettext_noop("Number of pages after which previously performed writes are flushed to disk."),
@@ -5311,6 +5324,16 @@ struct config_enum ConfigureNamesEnum[] =
        NULL, NULL, NULL
    },
 
+   {
+       {"io_method", PGC_POSTMASTER, RESOURCES_IO,
+           gettext_noop("Selects the method for executing asynchronous I/O."),
+           NULL
+       },
+       &io_method,
+       DEFAULT_IO_METHOD, io_method_options,
+       NULL, assign_io_method, NULL
+   },
+
    /* End-of-list marker */
    {
        {NULL, 0, 0, NULL, NULL}, NULL, 0, NULL, NULL, NULL, NULL
index 8de86e0c945451406a86670e5834c715602ba537..43c2ec2153e96f82d3cfc88137040cd74fef5495 100644 (file)
 #maintenance_io_concurrency = 10   # 1-1000; 0 disables prefetching
 #io_combine_limit = 128kB      # usually 1-32 blocks (depends on OS)
 
+#io_method = sync          # sync (change requires restart)
+#io_max_concurrency = -1       # Max number of IOs that one process
+                   # can execute simultaneously
+                   # -1 sets based on shared_buffers
+                   # (change requires restart)
+
 # - Worker Processes -
 
 #max_worker_processes = 8      # (change requires restart)
index ac5ca4a765efb0c4610c0e0224d2cd30bc51ea32..d39f3e1b655cdfcc18cbbd74a60906216e4aef3b 100644 (file)
@@ -47,6 +47,8 @@
 
 #include "common/hashfn.h"
 #include "common/int.h"
+#include "lib/ilist.h"
+#include "storage/aio.h"
 #include "storage/ipc.h"
 #include "storage/predicate.h"
 #include "storage/proc.h"
@@ -155,6 +157,12 @@ struct ResourceOwnerData
 
    /* The local locks cache. */
    LOCALLOCK  *locks[MAX_RESOWNER_LOCKS];  /* list of owned locks */
+
+   /*
+    * AIO handles need be registered in critical sections and therefore
+    * cannot use the normal ResourceElem mechanism.
+    */
+   dlist_head  aio_handles;
 };
 
 
@@ -425,6 +433,8 @@ ResourceOwnerCreate(ResourceOwner parent, const char *name)
        parent->firstchild = owner;
    }
 
+   dlist_init(&owner->aio_handles);
+
    return owner;
 }
 
@@ -725,6 +735,13 @@ ResourceOwnerReleaseInternal(ResourceOwner owner,
         * so issue warnings.  In the abort case, just clean up quietly.
         */
        ResourceOwnerReleaseAll(owner, phase, isCommit);
+
+       while (!dlist_is_empty(&owner->aio_handles))
+       {
+           dlist_node *node = dlist_head_node(&owner->aio_handles);
+
+           pgaio_io_release_resowner(node, !isCommit);
+       }
    }
    else if (phase == RESOURCE_RELEASE_LOCKS)
    {
@@ -1082,3 +1099,15 @@ ResourceOwnerForgetLock(ResourceOwner owner, LOCALLOCK *locallock)
    elog(ERROR, "lock reference %p is not owned by resource owner %s",
         locallock, owner->name);
 }
+
+void
+ResourceOwnerRememberAioHandle(ResourceOwner owner, struct dlist_node *ioh_node)
+{
+   dlist_push_tail(&owner->aio_handles, ioh_node);
+}
+
+void
+ResourceOwnerForgetAioHandle(ResourceOwner owner, struct dlist_node *ioh_node)
+{
+   dlist_delete_from(&owner->aio_handles, ioh_node);
+}
diff --git a/src/include/storage/aio.h b/src/include/storage/aio.h
new file mode 100644 (file)
index 0000000..e79d534
--- /dev/null
@@ -0,0 +1,38 @@
+/*-------------------------------------------------------------------------
+ *
+ * aio.h
+ *    Main AIO interface
+ *
+ *
+ * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/storage/aio.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef AIO_H
+#define AIO_H
+
+
+
+/* Enum for io_method GUC. */
+typedef enum IoMethod
+{
+   IOMETHOD_SYNC = 0,
+} IoMethod;
+
+/* We'll default to synchronous execution. */
+#define DEFAULT_IO_METHOD IOMETHOD_SYNC
+
+
+struct dlist_node;
+extern void pgaio_io_release_resowner(struct dlist_node *ioh_node, bool on_error);
+
+
+/* GUCs */
+extern PGDLLIMPORT int io_method;
+extern PGDLLIMPORT int io_max_concurrency;
+
+
+#endif                         /* AIO_H */
diff --git a/src/include/storage/aio_subsys.h b/src/include/storage/aio_subsys.h
new file mode 100644 (file)
index 0000000..2a6ca1c
--- /dev/null
@@ -0,0 +1,33 @@
+/*-------------------------------------------------------------------------
+ *
+ * aio_subsys.h
+ *    Interaction with AIO as a subsystem, rather than actually issuing AIO
+ *
+ * This header is for AIO related functionality that's being called by files
+ * that don't perform AIO, but interact with the AIO subsystem in some
+ * form. E.g. postmaster.c and shared memory initialization need to initialize
+ * AIO but don't perform AIO.
+ *
+ * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/storage/aio_subsys.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef AIO_SUBSYS_H
+#define AIO_SUBSYS_H
+
+
+/* aio_init.c */
+extern Size AioShmemSize(void);
+extern void AioShmemInit(void);
+
+extern void pgaio_init_backend(void);
+
+
+/* aio.c */
+extern void pgaio_error_cleanup(void);
+extern void AtEOXact_Aio(bool is_commit);
+
+#endif                         /* AIO_SUBSYS_H */
index 24444cbc365dd6743df036dd5c74567b985a49c4..f619100467df2ceee5dcdc8f9bed46b2e8890a6d 100644 (file)
@@ -318,6 +318,7 @@ extern PGDLLIMPORT bool optimize_bounded_sort;
  */
 extern PGDLLIMPORT const struct config_enum_entry archive_mode_options[];
 extern PGDLLIMPORT const struct config_enum_entry dynamic_shared_memory_options[];
+extern PGDLLIMPORT const struct config_enum_entry io_method_options[];
 extern PGDLLIMPORT const struct config_enum_entry recovery_target_action_options[];
 extern PGDLLIMPORT const struct config_enum_entry wal_level_options[];
 extern PGDLLIMPORT const struct config_enum_entry wal_sync_method_options[];
index 9a0d8ec85c715a4a542380c2115840e7e4c1b037..a3eba8fbe212c46651f6c293f0bd2fd06d8f2027 100644 (file)
@@ -64,6 +64,8 @@ extern bool check_default_with_oids(bool *newval, void **extra,
 extern bool check_effective_io_concurrency(int *newval, void **extra,
                                           GucSource source);
 extern bool check_huge_page_size(int *newval, void **extra, GucSource source);
+extern void assign_io_method(int newval, void *extra);
+extern bool check_io_max_concurrency(int *newval, void **extra, GucSource source);
 extern const char *show_in_hot_standby(void);
 extern bool check_locale_messages(char **newval, void **extra, GucSource source);
 extern void assign_locale_messages(const char *newval, void *extra);
index e8d452ca7eed01163253f4c7bb13213fa30c4470..aede4bfc820a34d5da63e97be8e9e7c37406af26 100644 (file)
@@ -164,4 +164,9 @@ struct LOCALLOCK;
 extern void ResourceOwnerRememberLock(ResourceOwner owner, struct LOCALLOCK *locallock);
 extern void ResourceOwnerForgetLock(ResourceOwner owner, struct LOCALLOCK *locallock);
 
+/* special support for AIO */
+struct dlist_node;
+extern void ResourceOwnerRememberAioHandle(ResourceOwner owner, struct dlist_node *ioh_node);
+extern void ResourceOwnerForgetAioHandle(ResourceOwner owner, struct dlist_node *ioh_node);
+
 #endif                         /* RESOWNER_H */
index 93339ef3c58f78e2d81d2ee2a859784b7d13e110..3c9e823f07e240f4b0af40bf429307e60965abeb 100644 (file)
@@ -1279,6 +1279,7 @@ IntoClause
 InvalMessageArray
 InvalidationInfo
 InvalidationMsgsGroup
+IoMethod
 IpcMemoryId
 IpcMemoryKey
 IpcMemoryState