PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
aio_target.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * aio_target.c
4 * AIO - Functionality related to executing IO for different targets
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 * IDENTIFICATION
10 * src/backend/storage/aio/aio_target.c
11 *
12 *-------------------------------------------------------------------------
13 */
14
15#include "postgres.h"
16
17#include "storage/aio.h"
19#include "storage/smgr.h"
20
21
22/*
23 * Registry for entities that can be the target of AIO.
24 */
27 .name = "invalid",
28 },
30};
31
32
33
34/* --------------------------------------------------------------------------------
35 * Public target related functions operating on IO Handles
36 * --------------------------------------------------------------------------------
37 */
38
39bool
41{
42 return ioh->target != PGAIO_TID_INVALID;
43}
44
45/*
46 * Return the name for the target associated with the IO. Mostly useful for
47 * debugging/logging.
48 */
49const char *
51{
52 Assert(ioh->target >= 0 && ioh->target < PGAIO_TID_COUNT);
53
54 return pgaio_target_info[ioh->target]->name;
55}
56
57/*
58 * Assign a target to the IO.
59 *
60 * This has to be called exactly once before pgaio_io_start_*() is called.
61 */
62void
64{
67
68 ioh->target = targetid;
69}
70
73{
74 return &ioh->target_data;
75}
76
77/*
78 * Return a stringified description of the IO's target.
79 *
80 * The string is localized and allocated in the current memory context.
81 */
82char *
84{
86}
87
88
89
90/* --------------------------------------------------------------------------------
91 * Internal target related functions operating on IO Handles
92 * --------------------------------------------------------------------------------
93 */
94
95/*
96 * Internal: Check if pgaio_io_reopen() is available for the IO.
97 */
98bool
100{
101 return pgaio_target_info[ioh->target]->reopen != NULL;
102}
103
104/*
105 * Internal: Before executing an IO outside of the context of the process the
106 * IO has been staged in, the file descriptor has to be reopened - any FD
107 * referenced in the IO itself, won't be valid in the separate process.
108 */
109void
111{
112 Assert(ioh->target >= 0 && ioh->target < PGAIO_TID_COUNT);
113 Assert(ioh->op >= 0 && ioh->op < PGAIO_OP_COUNT);
114
115 pgaio_target_info[ioh->target]->reopen(ioh);
116}
#define PGAIO_TID_COUNT
Definition: aio.h:123
#define PGAIO_OP_COUNT
Definition: aio.h:107
PgAioTargetID
Definition: aio.h:117
@ PGAIO_TID_SMGR
Definition: aio.h:120
@ PGAIO_TID_INVALID
Definition: aio.h:119
@ PGAIO_HS_HANDED_OUT
Definition: aio_internal.h:53
PgAioTargetData * pgaio_io_get_target_data(PgAioHandle *ioh)
Definition: aio_target.c:72
static const PgAioTargetInfo * pgaio_target_info[]
Definition: aio_target.c:25
void pgaio_io_reopen(PgAioHandle *ioh)
Definition: aio_target.c:110
bool pgaio_io_can_reopen(PgAioHandle *ioh)
Definition: aio_target.c:99
bool pgaio_io_has_target(PgAioHandle *ioh)
Definition: aio_target.c:40
const char * pgaio_io_get_target_name(PgAioHandle *ioh)
Definition: aio_target.c:50
char * pgaio_io_get_target_description(PgAioHandle *ioh)
Definition: aio_target.c:83
void pgaio_io_set_target(PgAioHandle *ioh, PgAioTargetID targetid)
Definition: aio_target.c:63
struct PgAioTargetInfo PgAioTargetInfo
Definition: aio_types.h:24
Assert(PointerIsAligned(start, uint64))
const PgAioTargetInfo aio_smgr_target_info
Definition: smgr.c:172
PgAioTargetData target_data
Definition: aio_internal.h:181
PgAioOp op
Definition: aio_internal.h:105
PgAioHandleState state
Definition: aio_internal.h:99
PgAioTargetID target
Definition: aio_internal.h:102
void(* reopen)(PgAioHandle *ioh)
Definition: aio.h:164
char *(* describe_identity)(const PgAioTargetData *sd)
Definition: aio.h:167
const char * name
Definition: aio.h:170