Skip to content

Commit

Permalink
Merge 10.6 into 10.8
Browse files Browse the repository at this point in the history
  • Loading branch information
dr-m committed Apr 13, 2023
2 parents 8bd5cf0 + f50abab commit e552747
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 28 deletions.
2 changes: 2 additions & 0 deletions storage/innobase/handler/ha_innodb.cc
Expand Up @@ -547,6 +547,7 @@ mysql_pfs_key_t trx_pool_manager_mutex_key;
mysql_pfs_key_t lock_wait_mutex_key;
mysql_pfs_key_t trx_sys_mutex_key;
mysql_pfs_key_t srv_threads_mutex_key;
mysql_pfs_key_t tpool_cache_mutex_key;

/* all_innodb_mutexes array contains mutexes that are
performance schema instrumented if "UNIV_PFS_MUTEX"
Expand Down Expand Up @@ -580,6 +581,7 @@ static PSI_mutex_info all_innodb_mutexes[] = {
PSI_KEY(rtr_match_mutex),
PSI_KEY(rtr_path_mutex),
PSI_KEY(trx_sys_mutex),
PSI_KEY(tpool_cache_mutex),
};
# endif /* UNIV_PFS_MUTEX */

Expand Down
10 changes: 6 additions & 4 deletions storage/innobase/log/log0recv.cc
Expand Up @@ -1324,8 +1324,9 @@ static void fil_name_process(const char *name, ulint len, uint32_t space_id,
ut_ad(space == NULL);
if (srv_force_recovery == 0) {
sql_print_error("InnoDB: Recovery cannot access"
" file %s (tablespace "
UINT32PF ")", name, space_id);
" file %.*s (tablespace "
UINT32PF ")", int(len), name,
space_id);
sql_print_information("InnoDB: You may set "
"innodb_force_recovery=1"
" to ignore this and"
Expand All @@ -1336,9 +1337,10 @@ static void fil_name_process(const char *name, ulint len, uint32_t space_id,
}

sql_print_warning("InnoDB: Ignoring changes to"
" file %s (tablespace " UINT32PF ")"
" file %.*s (tablespace "
UINT32PF ")"
" due to innodb_force_recovery",
name, space_id);
int(len), name, space_id);
}
}
}
Expand Down
14 changes: 9 additions & 5 deletions storage/innobase/os/os0file.cc
Expand Up @@ -125,7 +125,7 @@ class io_slots
wait();
}

std::mutex& mutex()
mysql_mutex_t& mutex()
{
return m_cache.mutex();
}
Expand Down Expand Up @@ -3648,8 +3648,10 @@ void os_aio_wait_until_no_pending_writes()
/** @return number of pending reads */
size_t os_aio_pending_reads()
{
std::unique_lock<std::mutex> lk(read_slots->mutex());
return read_slots->pending_io_count();
mysql_mutex_lock(&read_slots->mutex());
size_t pending= read_slots->pending_io_count();
mysql_mutex_unlock(&read_slots->mutex());
return pending;
}

/** @return approximate number of pending reads */
Expand All @@ -3661,8 +3663,10 @@ size_t os_aio_pending_reads_approx()
/** @return number of pending writes */
size_t os_aio_pending_writes()
{
std::unique_lock<std::mutex> lk(write_slots->mutex());
return write_slots->pending_io_count();
mysql_mutex_lock(&write_slots->mutex());
size_t pending= write_slots->pending_io_count();
mysql_mutex_unlock(&write_slots->mutex());
return pending;
}

/** Wait until all pending asynchronous reads have completed. */
Expand Down
62 changes: 43 additions & 19 deletions tpool/tpool_structs.h
Expand Up @@ -14,14 +14,13 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 - 1301 USA*/

#pragma once
#include <my_global.h>
#include <my_pthread.h>
#include <vector>
#include <stack>
#include <mutex>
#include <condition_variable>
#include <assert.h>
#include <algorithm>


/* Suppress TSAN warnings, that we believe are not critical. */
#if defined(__has_feature)
#define TPOOL_HAS_FEATURE(...) __has_feature(__VA_ARGS__)
Expand All @@ -37,6 +36,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 - 1301 USA*/
#define TPOOL_SUPPRESS_TSAN
#endif

#ifdef HAVE_PSI_INTERFACE
typedef unsigned int mysql_pfs_key_t;
extern mysql_pfs_key_t tpool_cache_mutex_key;
#endif

namespace tpool
{

Expand All @@ -55,13 +59,13 @@ namespace tpool
template<typename T> class cache
{
/** Protects updates of m_pos and m_cache members */
std::mutex m_mtx;
mysql_mutex_t m_mtx;

/**
Notify waiting threads about "cache full" or "cache not empty" conditions
@see get() and wait()
*/
std::condition_variable m_cv;
pthread_cond_t m_cv;

/** Cached items vector.Does not change after construction */
std::vector<T> m_base;
Expand Down Expand Up @@ -108,46 +112,57 @@ template<typename T> class cache
Constructor
@param size - maximum number of items in cache
*/
cache(size_t size) : m_mtx(), m_cv(), m_base(size), m_cache(size),
cache(size_t size) : m_base(size), m_cache(size),
m_waiters(), m_pos(0)
{
mysql_mutex_init(tpool_cache_mutex_key, &m_mtx, nullptr);
pthread_cond_init(&m_cv, nullptr);

for(size_t i= 0 ; i < size; i++)
m_cache[i]= &m_base[i];
}

~cache()
{
mysql_mutex_destroy(&m_mtx);
pthread_cond_destroy(&m_cv);
}

/**
Retrieve an item from cache. Waits for free item, if cache is
currently empty.
@return borrowed item
*/
T* get()
{
std::unique_lock<std::mutex> lk(m_mtx);
while(is_empty())
m_cv.wait(lk);
mysql_mutex_lock(&m_mtx);
while (is_empty())
my_cond_wait(&m_cv, &m_mtx.m_mutex);
assert(m_pos < capacity());
// return last element
return m_cache[m_pos++];
T *t= m_cache[m_pos++];
mysql_mutex_unlock(&m_mtx);
return t;
}


std::mutex &mutex() { return m_mtx; }
mysql_mutex_t &mutex() { return m_mtx; }

/**
Put back an element to cache.
@param ele element to put back
*/
void put(T *ele)
{
std::unique_lock<std::mutex> lk(m_mtx);
mysql_mutex_lock(&m_mtx);
assert(!is_full());
// put element to the logical end of the array
m_cache[--m_pos] = ele;

/* Notify waiters when the cache becomes
not empty, or when it becomes full */
if (m_pos == 1 || (m_waiters && is_full()))
m_cv.notify_all();
pthread_cond_broadcast(&m_cv);
mysql_mutex_unlock(&m_mtx);
}

/** Check if pointer represents cached element */
Expand All @@ -157,16 +172,25 @@ template<typename T> class cache
return ele >= &m_base[0] && ele <= &m_base[capacity() - 1];
}

/** Wait until cache is full.*/
void wait()
/** Wait until cache is full
@param m cache mutex (locked) */
void wait(mysql_mutex_t &m)
{
std::unique_lock<std::mutex> lk(m_mtx);
mysql_mutex_assert_owner(&m);
m_waiters++;
while(!is_full())
m_cv.wait(lk);
while (!is_full())
my_cond_wait(&m_cv, &m.m_mutex);
m_waiters--;
}

/* Wait until cache is full.*/
void wait()
{
mysql_mutex_lock(&m_mtx);
wait(m_mtx);
mysql_mutex_unlock(&m_mtx);
}

/**
@return approximate number of "borrowed" items.
A "dirty" read, not used in any critical functionality.
Expand Down

0 comments on commit e552747

Please sign in to comment.