MySQL  8.0.19
Source Code Documentation
AIO Class Reference

The asynchronous i/o array structure. More...

Public Member Functions

 AIO (latch_id_t id, ulint n, ulint segments)
 Constructor. More...
 
 ~AIO ()
 Destructor. More...
 
dberr_t init ()
 Initialize the instance. More...
 
Slotreserve_slot (IORequest &type, fil_node_t *m1, void *m2, pfs_os_file_t file, const char *name, void *buf, os_offset_t offset, ulint len)
 Requests for a slot in the aio array. More...
 
ulint pending_io_count () const
 Count the number of free slots. More...
 
const Slotat (ulint i) const
 Returns a pointer to the nth slot in the aio array. More...
 
Slotat (ulint i)
 Non const version. More...
 
void release (Slot *slot)
 Frees a slot in the AIO array, assumes caller owns the mutex. More...
 
void release_with_mutex (Slot *slot)
 Frees a slot in the AIO array, assumes caller doesn't own the mutex. More...
 
void print (FILE *file)
 Prints info about the aio array. More...
 
ulint slots_per_segment () const
 
ulint get_n_segments () const
 
bool is_mutex_owned () const
 
void acquire () const
 Acquire the mutex. More...
 
void release () const
 Release the mutex. More...
 
void to_file (FILE *file) const
 Write out the state to the file/stream. More...
 

Static Public Member Functions

static AIOcreate (latch_id_t id, ulint n, ulint n_segments)
 Create an instance using new(std::nothrow) More...
 
static bool start (ulint n_per_seg, ulint n_readers, ulint n_writers, ulint n_slots_sync)
 Initializes the asynchronous io system. More...
 
static void shutdown ()
 Free the AIO arrays. More...
 
static void print_all (FILE *file)
 Print all the AIO segments. More...
 
static ulint get_array_and_local_segment (AIO **array, ulint segment)
 Calculates local segment number and aio array from global segment number. More...
 
static AIOselect_slot_array (IORequest &type, bool read_only, AIO_mode aio_mode)
 Select the IO slot array. More...
 
static ulint get_segment_no_from_slot (const AIO *array, const Slot *slot)
 Calculates segment number for a slot. More...
 
static void wake_simulated_handler_thread (ulint global_segment)
 Wakes up a simulated AIO I/O-handler thread if it has something to do. More...
 
static bool is_read (const AIO *aio)
 Check if it is a read request. More...
 
static void wait_until_no_pending_writes ()
 Wait on an event until no pending writes. More...
 
static void print_to_file (FILE *file)
 Print to file. More...
 
static ulint total_pending_io_count ()
 Check for pending IO. More...
 

Private Types

typedef std::vector< SlotSlots
 

Private Member Functions

dberr_t init_slots ()
 Initialise the slots. More...
 
void wake_simulated_handler_thread (ulint global_segment, ulint segment)
 Wakes up a simulated AIO I/O-handler thread if it has something to do for a local segment in the AIO array. More...
 
void print_segment_info (FILE *file, const ulint *segments)
 Prints pending IO requests per segment of an aio array. More...
 

Private Attributes

SysMutex m_mutex
 the mutex protecting the aio array More...
 
Slots m_slots
 Pointer to the slots in the array. More...
 
ulint m_n_segments
 Number of segments in the aio array of pending aio requests. More...
 
os_event_t m_not_full
 The event which is set to the signaled state when there is space in the aio outside the ibuf segment. More...
 
os_event_t m_is_empty
 The event which is set to the signaled state when there are no pending i/os in this array. More...
 
ulint m_n_reserved
 Number of reserved slots in the AIO array outside the ibuf segment. More...
 

Static Private Attributes

static AIOs_ibuf
 The aio arrays for non-ibuf i/o and ibuf i/o, as well as sync AIO. More...
 
static AIOs_log
 Redo log. More...
 
static AIOs_reads
 Reads. More...
 
static AIOs_writes
 Writes. More...
 
static AIOs_sync
 Synchronous I/O. More...
 

Detailed Description

The asynchronous i/o array structure.

Member Typedef Documentation

◆ Slots

typedef std::vector<Slot> AIO::Slots
private

Constructor & Destructor Documentation

◆ AIO()

AIO::AIO ( latch_id_t  id,
ulint  n,
ulint  segments 
)

Constructor.

Parameters
[in]idLatch ID
[in]nNumber of slots to configure
[in]segmentsNumber of segments to configure
[in]idThe latch ID
[in]nNumber of AIO slots
[in]segmentsNumber of segments

◆ ~AIO()

AIO::~AIO ( )

Destructor.

AIO destructor.

Member Function Documentation

◆ acquire()

void AIO::acquire ( ) const
inline

Acquire the mutex.

◆ at() [1/2]

Slot* AIO::at ( ulint  i)
inline

Non const version.

◆ at() [2/2]

const Slot* AIO::at ( ulint  i) const
inline

Returns a pointer to the nth slot in the aio array.

Parameters
[in]iIndex of the slot in the array
Returns
pointer to slot

◆ create()

AIO * AIO::create ( latch_id_t  id,
ulint  n,
ulint  n_segments 
)
static

Create an instance using new(std::nothrow)

Creates an aio wait array.

Parameters
[in]idLatch ID
[in]nThe number of AIO request slots
[in]n_segmentsThe number of segments
Returns
a new AIO instance

Note that we return NULL in case of failure. We don't care about freeing memory here because we assume that a failure will result in server refusing to start up.

Parameters
[in]idLatch ID
[in]nmaximum number of pending AIO operations allowed; n must be divisible by m_n_segments
[in]n_segmentsnumber of segments in the AIO array
Returns
own: AIO array, NULL on failure

◆ get_array_and_local_segment()

ulint AIO::get_array_and_local_segment ( AIO **  array,
ulint  segment 
)
static

Calculates local segment number and aio array from global segment number.

Parameters
[out]arrayAIO wait array
[in]segmentglobal segment number
Returns
local segment number within the aio array
Parameters
[out]arrayaio wait array
[in]segmentglobal segment number
Returns
local segment number within the aio array

◆ get_n_segments()

ulint AIO::get_n_segments ( ) const
inline
Returns
accessor for n_segments

◆ get_segment_no_from_slot()

ulint AIO::get_segment_no_from_slot ( const AIO array,
const Slot slot 
)
static

Calculates segment number for a slot.

Parameters
[in]arrayAIO wait array
[in]slotslot in this array
Returns
segment number (which is the number used by, for example, I/O handler threads)
Parameters
[in]arrayAIO wait array
[in]slotslot in this array
Returns
segment number (which is the number used by, for example, I/O-handler threads)

◆ init()

dberr_t AIO::init ( )

Initialize the instance.

Initialise the array.

Returns
DB_SUCCESS or error code

◆ init_slots()

dberr_t AIO::init_slots ( )
private

Initialise the slots.

Returns
DB_SUCCESS or error code

◆ is_mutex_owned()

bool AIO::is_mutex_owned ( ) const
inline
Returns
true if the thread owns the mutex

◆ is_read()

static bool AIO::is_read ( const AIO aio)
inlinestatic

Check if it is a read request.

Parameters
[in]aioThe AIO instance to check
Returns
true if the AIO instance is for reading.

◆ pending_io_count()

ulint AIO::pending_io_count ( ) const

Count the number of free slots.

Returns
number of reserved slots

◆ print()

void AIO::print ( FILE *  file)

Prints info about the aio array.

Parameters
[in,out]fileWhere to print

◆ print_all()

void AIO::print_all ( FILE *  file)
static

Print all the AIO segments.

Parameters
[in,out]fileWhere to print

◆ print_segment_info()

void AIO::print_segment_info ( FILE *  file,
const ulint *  segments 
)
private

Prints pending IO requests per segment of an aio array.

We probably don't need per segment statistics but they can help us during development phase to see if the IO requests are being distributed as expected.

Parameters
[in,out]filefile where to print
[in]segmentspending IO array

We probably don't need per segment statistics but they can help us during development phase to see if the IO requests are being distributed as expected.

Parameters
[in,out]fileFile where to print
[in]segmentsPending IO array

◆ print_to_file()

void AIO::print_to_file ( FILE *  file)
static

Print to file.

Print pending IOs for all arrays.

Parameters
[in]fileFile to write to

◆ release() [1/2]

void AIO::release ( ) const
inline

Release the mutex.

◆ release() [2/2]

void AIO::release ( Slot slot)

Frees a slot in the AIO array, assumes caller owns the mutex.

Frees a slot in the aio array.

Parameters
[in,out]slotSlot to release

Assumes caller owns the mutex.

Parameters
[in,out]slotSlot to release

◆ release_with_mutex()

void AIO::release_with_mutex ( Slot slot)

Frees a slot in the AIO array, assumes caller doesn't own the mutex.

Frees a slot in the AIO array.

Parameters
[in,out]slotSlot to release

Assumes caller doesn't own the mutex.

Parameters
[in,out]slotSlot to release

◆ reserve_slot()

Slot * AIO::reserve_slot ( IORequest type,
fil_node_t m1,
void *  m2,
pfs_os_file_t  file,
const char *  name,
void *  buf,
os_offset_t  offset,
ulint  len 
)

Requests for a slot in the aio array.

If no slot is available, waits until not_full-event becomes signaled.

Parameters
[in,out]typeIO context
[in,out]m1message to be passed along with the AIO operation
[in,out]m2message to be passed along with the AIO operation
[in]filefile handle
[in]namename of the file or path as a null-terminated string
[in,out]bufbuffer where to read or from which to write
[in]offsetfile offset, where to read from or start writing
[in]lenlength of the block to read or write
Returns
pointer to slot

If no slot is available, waits until not_full-event becomes signaled.

Parameters
[in,out]typeIO context
[in,out]m1message to be passed along with the AIO operation
[in,out]m2message to be passed along with the AIO operation
[in]filefile handle
[in]namename of the file or path as a NUL-terminated string
[in,out]bufbuffer where to read or from which to write
[in]offsetfile offset, where to read from or start writing
[in]lenlength of the block to read or write
Returns
pointer to slot

◆ select_slot_array()

AIO * AIO::select_slot_array ( IORequest type,
bool  read_only,
AIO_mode  aio_mode 
)
static

Select the IO slot array.

Parameters
[in,out]typeType of IO, READ or WRITE
[in]read_onlytrue if running in read-only mode
[in]aio_modeIO mode
Returns
slot array or NULL if invalid mode specified

◆ shutdown()

void AIO::shutdown ( )
static

Free the AIO arrays.

◆ slots_per_segment()

ulint AIO::slots_per_segment ( ) const
inline
Returns
the number of slots per segment

◆ start()

bool AIO::start ( ulint  n_per_seg,
ulint  n_readers,
ulint  n_writers,
ulint  n_slots_sync 
)
static

Initializes the asynchronous io system.

Creates one array each for ibuf and log I/O. Also creates one array each for read and write where each array is divided logically into n_readers and n_writers respectively. The caller must create an i/o handler thread for each segment in these arrays. This function also creates the sync array. No I/O handler thread needs to be created for that

Parameters
[in]n_per_segmaximum number of pending aio operations allowed per segment
[in]n_readersnumber of reader threads
[in]n_writersnumber of writer threads
[in]n_slots_syncnumber of slots in the sync aio array
Returns
true if AIO sub-system was started successfully

Creates one array each for ibuf and log i/o. Also creates one array each for read and write where each array is divided logically into n_readers and n_writers respectively. The caller must create an i/o handler thread for each segment in these arrays. This function also creates the sync array. No i/o handler thread needs to be created for that

Parameters
[in]n_per_segmaximum number of pending aio operations allowed per segment
[in]n_readersnumber of reader threads
[in]n_writersnumber of writer threads
[in]n_slots_syncnumber of slots in the sync aio array
Returns
true if the AIO sub-system was started successfully

◆ to_file()

void AIO::to_file ( FILE *  file) const

Write out the state to the file/stream.

Prints all pending IO for the array.

Parameters
[in,out]fileFile to write to
[in]filefile where to print

◆ total_pending_io_count()

ulint AIO::total_pending_io_count ( )
static

Check for pending IO.

Get the total number of pending IOs.

Gets the count and also validates the data structures.

Returns
count of pending IO requests
the total number of pending IOs

◆ wait_until_no_pending_writes()

static void AIO::wait_until_no_pending_writes ( )
inlinestatic

Wait on an event until no pending writes.

◆ wake_simulated_handler_thread() [1/2]

void AIO::wake_simulated_handler_thread ( ulint  global_segment)
static

Wakes up a simulated AIO I/O-handler thread if it has something to do.

Wakes up a simulated aio i/o-handler thread if it has something to do.

Parameters
[in]global_segmentthe number of the segment in the AIO arrays
[in]global_segmentThe number of the segment in the AIO arrays

◆ wake_simulated_handler_thread() [2/2]

void AIO::wake_simulated_handler_thread ( ulint  global_segment,
ulint  segment 
)
private

Wakes up a simulated AIO I/O-handler thread if it has something to do for a local segment in the AIO array.

Parameters
[in]global_segmentthe number of the segment in the AIO arrays
[in]segmentthe local segment in the AIO array
[in]global_segmentThe number of the segment in the AIO arrays
[in]segmentThe local segment in the AIO array

Member Data Documentation

◆ m_is_empty

os_event_t AIO::m_is_empty
private

The event which is set to the signaled state when there are no pending i/os in this array.

◆ m_mutex

SysMutex AIO::m_mutex
mutableprivate

the mutex protecting the aio array

◆ m_n_reserved

ulint AIO::m_n_reserved
private

Number of reserved slots in the AIO array outside the ibuf segment.

◆ m_n_segments

ulint AIO::m_n_segments
private

Number of segments in the aio array of pending aio requests.

A thread can wait separately for any one of the segments.

◆ m_not_full

os_event_t AIO::m_not_full
private

The event which is set to the signaled state when there is space in the aio outside the ibuf segment.

◆ m_slots

Slots AIO::m_slots
private

Pointer to the slots in the array.

Number of elements must be divisible by n_threads.

◆ s_ibuf

AIO * AIO::s_ibuf
staticprivate

The aio arrays for non-ibuf i/o and ibuf i/o, as well as sync AIO.

These are NULL when the module has not yet been initialized. Insert buffer

◆ s_log

AIO * AIO::s_log
staticprivate

Redo log.

◆ s_reads

AIO * AIO::s_reads
staticprivate

Reads.

Static declarations.

◆ s_sync

AIO * AIO::s_sync
staticprivate

Synchronous I/O.

◆ s_writes

AIO * AIO::s_writes
staticprivate

Writes.


The documentation for this class was generated from the following file: