66#define PGAIO_WORKER_WAKEUP_RATIO_SATURATE 4
92#define PGAIO_WORKERSET_BITS (sizeof(PgAioWorkerSet) * CHAR_BIT)
218#ifdef USE_ASSERT_CHECKING
490 for (
int i = 0;
i < num_staged_ios;
i++)
495 for (
int i = 0;
i < num_staged_ios; ++
i)
506 nsync = (num_staged_ios -
i);
523 nsync = num_staged_ios;
535 return num_staged_ios;
590 elog(
ERROR,
"couldn't find a free worker ID");
628 owner =
ioh->owner_procno;
632 errcontext(
"I/O worker executing I/O on behalf of process %d", owner_pid);
864 "worker %d processing IO",
906 for (
int i = 0;
i < iov_length;
i++)
911#ifdef PGAIO_WORKER_SHOW_PS_INFO
983#ifdef PGAIO_WORKER_SHOW_PS_INFO
984 sprintf(cmd,
"%d: idle, wakeups:ios = %d:%d",
void pgaio_io_process_completion(PgAioHandle *ioh, int result)
int pgaio_io_get_id(PgAioHandle *ioh)
void pgaio_io_prepare_submit(PgAioHandle *ioh)
@ PGAIO_HF_REFERENCES_LOCAL
#define pgaio_debug(elevel, msg,...)
#define pgaio_debug_io(elevel, ioh, msg,...)
#define PGAIO_SUBMIT_BATCH_SIZE
void pgaio_io_perform_synchronously(PgAioHandle *ioh)
const char * pgaio_io_get_op_name(PgAioHandle *ioh)
int pgaio_io_get_iovec_length(PgAioHandle *ioh, struct iovec **iov)
void pgaio_io_reopen(PgAioHandle *ioh)
bool pgaio_io_can_reopen(PgAioHandle *ioh)
char * pgaio_io_get_target_description(PgAioHandle *ioh)
#define pg_memory_barrier()
void AuxiliaryProcessMainCommon(void)
long TimestampDifferenceMilliseconds(TimestampTz start_time, TimestampTz stop_time)
TimestampTz GetCurrentTimestamp(void)
Datum now(PG_FUNCTION_ARGS)
#define Assert(condition)
#define FLEXIBLE_ARRAY_MEMBER
void EmitErrorReport(void)
ErrorContextCallback * error_context_stack
sigjmp_buf * PG_exception_stack
void ProcessConfigFile(GucContext context)
#define INJECTION_POINT(name, arg)
void SignalHandlerForShutdownRequest(SIGNAL_ARGS)
volatile sig_atomic_t ShutdownRequestPending
volatile sig_atomic_t ConfigReloadPending
void SignalHandlerForConfigReload(SIGNAL_ARGS)
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
void SetLatch(Latch *latch)
void ResetLatch(Latch *latch)
int WaitLatch(Latch *latch, int wakeEvents, long timeout, uint32 wait_event_info)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
bool LWLockHeldByMeInMode(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
void LWLockReleaseAll(void)
bool LWLockConditionalAcquire(LWLock *lock, LWLockMode mode)
void pfree(void *pointer)
#define VALGRIND_MAKE_MEM_UNDEFINED(addr, size)
bool pgaio_worker_pm_test_grow_signal_sent(void)
static int pgaio_workerset_get_lowest(PgAioWorkerSet *set)
#define PGAIO_WORKER_WAKEUP_RATIO_SATURATE
#define PGAIO_WORKERSET_BITS
static void pgaio_workerset_remove_lte(PgAioWorkerSet *set, int worker)
static uint32 pgaio_worker_submission_queue_depth(void)
int io_worker_launch_interval
static void pgaio_workerset_all(PgAioWorkerSet *set)
static void pgaio_worker_error_callback(void *arg)
static void pgaio_worker_request_grow(void)
static bool pgaio_worker_needs_synchronous_execution(PgAioHandle *ioh)
static int pgaio_worker_submit(uint16 num_staged_ios, PgAioHandle **staged_ios)
static bool pgaio_worker_can_timeout(void)
bool pgaio_worker_pm_test_grow(void)
static void pgaio_worker_shmem_request(void *arg)
static void pgaio_worker_cancel_grow(void)
static void pgaio_workerset_remove(PgAioWorkerSet *set, int worker)
static int pgaio_worker_choose_idle(int only_workers_above)
static int pgaio_workerset_get_highest(PgAioWorkerSet *set)
static int pgaio_workerset_pop_lowest(PgAioWorkerSet *set)
static int io_worker_queue_size
static void pgaio_worker_wake(int worker)
static void pgaio_worker_register(void)
static bool pgaio_workerset_is_empty(PgAioWorkerSet *set)
static PgAioWorkerControl * io_worker_control
static void pgaio_workerset_wake(PgAioWorkerSet workerset)
int io_worker_idle_timeout
const IoMethodOps pgaio_worker_ops
static void pgaio_worker_die(int code, Datum arg)
static void pgaio_worker_shmem_init(void *arg)
static int pgaio_worker_submission_queue_consume(void)
static bool pgaio_worker_submission_queue_insert(PgAioHandle *ioh)
bool pgaio_workers_enabled(void)
static PgAioWorkerSubmissionQueue * io_worker_submission_queue
static void pgaio_workerset_initialize(PgAioWorkerSet *set)
void IoWorkerMain(const void *startup_data, size_t startup_data_len)
static PgAioWorkerSet pgaio_workerset_singleton(int worker)
static void pgaio_workerset_subtract(PgAioWorkerSet *set1, const PgAioWorkerSet *set2)
void pgaio_worker_pm_clear_grow_signal_sent(void)
static void pgaio_workerset_insert(PgAioWorkerSet *set, int worker)
#define RESUME_INTERRUPTS()
#define START_CRIT_SECTION()
#define CHECK_FOR_INTERRUPTS()
#define HOLD_INTERRUPTS()
#define END_CRIT_SECTION()
BackendType MyBackendType
static int pg_rightmost_one_pos64(uint64 word)
static uint32 pg_nextpower2_32(uint32 num)
static int pg_popcount64(uint64 word)
static int pg_leftmost_one_pos64(uint64 word)
void SendPostmasterSignal(PMSignalReason reason)
@ PMSIGNAL_IO_WORKER_GROW
#define GetPGProcByNumber(n)
#define INVALID_PROC_NUMBER
void procsignal_sigusr1_handler(SIGNAL_ARGS)
static void set_ps_display(const char *activity)
#define ShmemRequestStruct(...)
struct ErrorContextCallback * previous
void(* callback)(void *arg)
ShmemCallbacks shmem_callbacks
PgAioWorkerSet idle_workerset
PgAioWorkerSlot workers[FLEXIBLE_ARRAY_MEMBER]
int sqes[FLEXIBLE_ARRAY_MEMBER]
ShmemRequestCallback request_fn
#define TimestampTzPlusMilliseconds(tz, ms)
#define WL_EXIT_ON_PM_DEATH