mirror of
https://github.com/MariaDB/server.git
synced 2026-05-15 19:37:16 +02:00
5.6.27
This commit is contained in:
parent
56544122c7
commit
86ff4da14d
18 changed files with 393 additions and 118 deletions
|
|
@ -309,6 +309,21 @@ dict_table_autoinc_initialize(
|
|||
dict_table_t* table, /*!< in/out: table */
|
||||
ib_uint64_t value) /*!< in: next value to assign to a row */
|
||||
__attribute__((nonnull));
|
||||
|
||||
/** Store autoinc value when the table is evicted.
|
||||
@param[in] table table evicted */
|
||||
UNIV_INTERN
|
||||
void
|
||||
dict_table_autoinc_store(
|
||||
const dict_table_t* table);
|
||||
|
||||
/** Restore autoinc value when the table is loaded.
|
||||
@param[in] table table loaded */
|
||||
UNIV_INTERN
|
||||
void
|
||||
dict_table_autoinc_restore(
|
||||
dict_table_t* table);
|
||||
|
||||
/********************************************************************//**
|
||||
Reads the next autoinc value (== autoinc counter value), 0 if not yet
|
||||
initialized.
|
||||
|
|
@ -368,6 +383,15 @@ dict_table_remove_from_cache(
|
|||
dict_table_t* table) /*!< in, own: table */
|
||||
__attribute__((nonnull));
|
||||
/**********************************************************************//**
|
||||
Removes a table object from the dictionary cache. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
dict_table_remove_from_cache_low(
|
||||
/*=============================*/
|
||||
dict_table_t* table, /*!< in, own: table */
|
||||
ibool lru_evict); /*!< in: TRUE if table being evicted
|
||||
to make room in the table LRU list */
|
||||
/**********************************************************************//**
|
||||
Renames a table object.
|
||||
@return TRUE if success */
|
||||
UNIV_INTERN
|
||||
|
|
@ -1543,6 +1567,8 @@ extern dict_sys_t* dict_sys;
|
|||
/** the data dictionary rw-latch protecting dict_sys */
|
||||
extern rw_lock_t dict_operation_lock;
|
||||
|
||||
typedef std::map<table_id_t, ib_uint64_t> autoinc_map_t;
|
||||
|
||||
/* Dictionary system struct */
|
||||
struct dict_sys_t{
|
||||
ib_mutex_t mutex; /*!< mutex protecting the data
|
||||
|
|
@ -1577,6 +1603,8 @@ struct dict_sys_t{
|
|||
UT_LIST_BASE_NODE_T(dict_table_t)
|
||||
table_non_LRU; /*!< List of tables that can't be
|
||||
evicted from the cache */
|
||||
autoinc_map_t* autoinc_map; /*!< Map to store table id and autoinc
|
||||
when table is evicted */
|
||||
};
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1997, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 1997, 2015, Oracle and/or its affiliates. All Rights Reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
|
@ -128,7 +128,8 @@ ibuf_should_try(
|
|||
&& ibuf->max_size != 0
|
||||
&& !dict_index_is_clust(index)
|
||||
&& index->table->quiesce == QUIESCE_NONE
|
||||
&& (ignore_sec_unique || !dict_index_is_unique(index)));
|
||||
&& (ignore_sec_unique || !dict_index_is_unique(index))
|
||||
&& srv_force_recovery < SRV_FORCE_NO_IBUF_MERGE);
|
||||
}
|
||||
|
||||
/******************************************************************//**
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2008, Google Inc.
|
||||
|
||||
Portions of this file contain modifications contributed and copyrighted by
|
||||
|
|
@ -38,6 +38,26 @@ Created 9/6/1995 Heikki Tuuri
|
|||
#include "ut0lst.h"
|
||||
#include "sync0types.h"
|
||||
|
||||
#if defined __i386__ || defined __x86_64__ || defined _M_IX86 \
|
||||
|| defined _M_X64 || defined __WIN__
|
||||
|
||||
#define IB_STRONG_MEMORY_MODEL
|
||||
|
||||
#endif /* __i386__ || __x86_64__ || _M_IX86 || _M_X64 || __WIN__ */
|
||||
|
||||
#ifdef HAVE_WINDOWS_ATOMICS
|
||||
typedef LONG lock_word_t; /*!< On Windows, InterlockedExchange operates
|
||||
on LONG variable */
|
||||
#elif defined(HAVE_ATOMIC_BUILTINS) && !defined(HAVE_ATOMIC_BUILTINS_BYTE)
|
||||
typedef ulint lock_word_t;
|
||||
#else
|
||||
|
||||
#define IB_LOCK_WORD_IS_BYTE
|
||||
|
||||
typedef byte lock_word_t;
|
||||
|
||||
#endif /* HAVE_WINDOWS_ATOMICS */
|
||||
|
||||
#ifdef __WIN__
|
||||
/** Native event (slow)*/
|
||||
typedef HANDLE os_native_event_t;
|
||||
|
|
@ -429,14 +449,61 @@ amount to decrement. */
|
|||
# define os_atomic_decrement_uint64(ptr, amount) \
|
||||
os_atomic_decrement(ptr, amount)
|
||||
|
||||
/**********************************************************//**
|
||||
Returns the old value of *ptr, atomically sets *ptr to new_val */
|
||||
# if defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET)
|
||||
|
||||
# define os_atomic_test_and_set_byte(ptr, new_val) \
|
||||
__sync_lock_test_and_set(ptr, (byte) new_val)
|
||||
/** Do an atomic test-and-set.
|
||||
@param[in,out] ptr Memory location to set to non-zero
|
||||
@return the previous value */
|
||||
inline
|
||||
lock_word_t
|
||||
os_atomic_test_and_set(volatile lock_word_t* ptr)
|
||||
{
|
||||
return(__atomic_test_and_set(ptr, __ATOMIC_ACQUIRE));
|
||||
}
|
||||
|
||||
# define os_atomic_test_and_set_ulint(ptr, new_val) \
|
||||
__sync_lock_test_and_set(ptr, new_val)
|
||||
/** Do an atomic clear.
|
||||
@param[in,out] ptr Memory location to set to zero */
|
||||
inline
|
||||
void
|
||||
os_atomic_clear(volatile lock_word_t* ptr)
|
||||
{
|
||||
__atomic_clear(ptr, __ATOMIC_RELEASE);
|
||||
}
|
||||
|
||||
# elif defined(IB_STRONG_MEMORY_MODEL)
|
||||
|
||||
/** Do an atomic test and set.
|
||||
@param[in,out] ptr Memory location to set to non-zero
|
||||
@return the previous value */
|
||||
inline
|
||||
lock_word_t
|
||||
os_atomic_test_and_set(volatile lock_word_t* ptr)
|
||||
{
|
||||
return(__sync_lock_test_and_set(ptr, 1));
|
||||
}
|
||||
|
||||
/** Do an atomic release.
|
||||
|
||||
In theory __sync_lock_release should be used to release the lock.
|
||||
Unfortunately, it does not work properly alone. The workaround is
|
||||
that more conservative __sync_lock_test_and_set is used instead.
|
||||
|
||||
Performance regression was observed at some conditions for Intel
|
||||
architecture. Disable release barrier on Intel architecture for now.
|
||||
@param[in,out] ptr Memory location to write to
|
||||
@return the previous value */
|
||||
inline
|
||||
lock_word_t
|
||||
os_atomic_clear(volatile lock_word_t* ptr)
|
||||
{
|
||||
return(__sync_lock_test_and_set(ptr, 0));
|
||||
}
|
||||
|
||||
# else
|
||||
|
||||
# error "Unsupported platform"
|
||||
|
||||
# endif /* HAVE_IB_GCC_ATOMIC_TEST_AND_SET */
|
||||
|
||||
#elif defined(HAVE_IB_SOLARIS_ATOMICS)
|
||||
|
||||
|
|
@ -511,14 +578,51 @@ amount to decrement. */
|
|||
# define os_atomic_decrement_uint64(ptr, amount) \
|
||||
os_atomic_increment_uint64(ptr, -(amount))
|
||||
|
||||
/**********************************************************//**
|
||||
Returns the old value of *ptr, atomically sets *ptr to new_val */
|
||||
# ifdef IB_LOCK_WORD_IS_BYTE
|
||||
|
||||
# define os_atomic_test_and_set_byte(ptr, new_val) \
|
||||
atomic_swap_uchar(ptr, new_val)
|
||||
/** Do an atomic xchg and set to non-zero.
|
||||
@param[in,out] ptr Memory location to set to non-zero
|
||||
@return the previous value */
|
||||
inline
|
||||
lock_word_t
|
||||
os_atomic_test_and_set(volatile lock_word_t* ptr)
|
||||
{
|
||||
return(atomic_swap_uchar(ptr, 1));
|
||||
}
|
||||
|
||||
# define os_atomic_test_and_set_ulint(ptr, new_val) \
|
||||
atomic_swap_ulong(ptr, new_val)
|
||||
/** Do an atomic xchg and set to zero.
|
||||
@param[in,out] ptr Memory location to set to zero
|
||||
@return the previous value */
|
||||
inline
|
||||
lock_word_t
|
||||
os_atomic_clear(volatile lock_word_t* ptr)
|
||||
{
|
||||
return(atomic_swap_uchar(ptr, 0));
|
||||
}
|
||||
|
||||
# else
|
||||
|
||||
/** Do an atomic xchg and set to non-zero.
|
||||
@param[in,out] ptr Memory location to set to non-zero
|
||||
@return the previous value */
|
||||
inline
|
||||
lock_word_t
|
||||
os_atomic_test_and_set(volatile lock_word_t* ptr)
|
||||
{
|
||||
return(atomic_swap_ulong(ptr, 1));
|
||||
}
|
||||
|
||||
/** Do an atomic xchg and set to zero.
|
||||
@param[in,out] ptr Memory location to set to zero
|
||||
@return the previous value */
|
||||
inline
|
||||
lock_word_t
|
||||
os_atomic_clear(volatile lock_word_t* ptr)
|
||||
{
|
||||
return(atomic_swap_ulong(ptr, 0));
|
||||
}
|
||||
|
||||
# endif /* IB_LOCK_WORD_IS_BYTE */
|
||||
|
||||
#elif defined(HAVE_WINDOWS_ATOMICS)
|
||||
|
||||
|
|
@ -633,16 +737,27 @@ amount to decrement. There is no atomic substract function on Windows */
|
|||
(ib_int64_t*) ptr, \
|
||||
-(ib_int64_t) amount) - amount))
|
||||
|
||||
/**********************************************************//**
|
||||
Returns the old value of *ptr, atomically sets *ptr to new_val.
|
||||
InterlockedExchange() operates on LONG, and the LONG will be
|
||||
clobbered */
|
||||
/** Do an atomic test and set.
|
||||
InterlockedExchange() operates on LONG, and the LONG will be clobbered
|
||||
@param[in,out] ptr Memory location to set to non-zero
|
||||
@return the previous value */
|
||||
inline
|
||||
lock_word_t
|
||||
os_atomic_test_and_set(volatile lock_word_t* ptr)
|
||||
{
|
||||
return(InterlockedExchange(ptr, 1));
|
||||
}
|
||||
|
||||
# define os_atomic_test_and_set_byte(ptr, new_val) \
|
||||
((byte) InterlockedExchange(ptr, new_val))
|
||||
|
||||
# define os_atomic_test_and_set_ulong(ptr, new_val) \
|
||||
InterlockedExchange(ptr, new_val)
|
||||
/** Do an atomic release.
|
||||
InterlockedExchange() operates on LONG, and the LONG will be clobbered
|
||||
@param[in,out] ptr Memory location to set to zero
|
||||
@return the previous value */
|
||||
inline
|
||||
lock_word_t
|
||||
os_atomic_clear(volatile lock_word_t* ptr)
|
||||
{
|
||||
return(InterlockedExchange(ptr, 0));
|
||||
}
|
||||
|
||||
#else
|
||||
# define IB_ATOMICS_STARTUP_MSG \
|
||||
|
|
@ -692,7 +807,7 @@ for synchronization */
|
|||
} while (0);
|
||||
|
||||
/** barrier definitions for memory ordering */
|
||||
#if defined __i386__ || defined __x86_64__ || defined _M_IX86 || defined _M_X64 || defined __WIN__
|
||||
#ifdef IB_STRONG_MEMORY_MODEL
|
||||
/* Performance regression was observed at some conditions for Intel
|
||||
architecture. Disable memory barrier for Intel architecture for now. */
|
||||
# define os_rmb
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2008, 2009, Google Inc.
|
||||
Copyright (c) 2009, Percona Inc.
|
||||
|
||||
|
|
@ -187,6 +187,9 @@ extern char* srv_arch_dir;
|
|||
recovery and open all tables in RO mode instead of RW mode. We don't
|
||||
sync the max trx id to disk either. */
|
||||
extern my_bool srv_read_only_mode;
|
||||
/** Set if InnoDB operates in read-only mode or innodb-force-recovery
|
||||
is greater than SRV_FORCE_NO_TRX_UNDO. */
|
||||
extern my_bool high_level_read_only;
|
||||
/** store to its own file each table created by an user; data
|
||||
dictionary tables are in the system tablespace 0 */
|
||||
extern my_bool srv_file_per_table;
|
||||
|
|
@ -217,6 +220,7 @@ OS (provided we compiled Innobase with it in), otherwise we will
|
|||
use simulated aio we build below with threads.
|
||||
Currently we support native aio on windows and linux */
|
||||
extern my_bool srv_use_native_aio;
|
||||
extern my_bool srv_numa_interleave;
|
||||
#ifdef __WIN__
|
||||
extern ibool srv_use_native_conditions;
|
||||
#endif /* __WIN__ */
|
||||
|
|
@ -875,6 +879,7 @@ struct srv_slot_t{
|
|||
#else /* !UNIV_HOTBACKUP */
|
||||
# define srv_use_adaptive_hash_indexes FALSE
|
||||
# define srv_use_native_aio FALSE
|
||||
# define srv_numa_interleave FALSE
|
||||
# define srv_force_recovery 0UL
|
||||
# define srv_set_io_thread_op_info(t,info) ((void) 0)
|
||||
# define srv_reset_io_thread_op_info() ((void) 0)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2008, Google Inc.
|
||||
Copyright (c) 2012, Facebook Inc.
|
||||
|
||||
|
|
@ -46,15 +46,6 @@ Created 9/5/1995 Heikki Tuuri
|
|||
extern "C" my_bool timed_mutexes;
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
|
||||
#ifdef HAVE_WINDOWS_ATOMICS
|
||||
typedef LONG lock_word_t; /*!< On Windows, InterlockedExchange operates
|
||||
on LONG variable */
|
||||
#elif defined(HAVE_ATOMIC_BUILTINS) && !defined(HAVE_ATOMIC_BUILTINS_BYTE)
|
||||
typedef ulint lock_word_t;
|
||||
#else
|
||||
typedef byte lock_word_t;
|
||||
#endif
|
||||
|
||||
#if defined UNIV_PFS_MUTEX || defined UNIV_PFS_RWLOCK
|
||||
|
||||
/* By default, buffer mutexes and rwlocks will be excluded from
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2009, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2008, Google Inc.
|
||||
|
||||
Portions of this file contain modifications contributed and copyrighted by
|
||||
|
|
@ -74,17 +74,13 @@ Performs an atomic test-and-set instruction to the lock_word field of a
|
|||
mutex.
|
||||
@return the previous value of lock_word: 0 or 1 */
|
||||
UNIV_INLINE
|
||||
byte
|
||||
lock_word_t
|
||||
ib_mutex_test_and_set(
|
||||
/*===============*/
|
||||
/*==================*/
|
||||
ib_mutex_t* mutex) /*!< in: mutex */
|
||||
{
|
||||
#if defined(HAVE_ATOMIC_BUILTINS)
|
||||
# if defined(HAVE_ATOMIC_BUILTINS_BYTE)
|
||||
return(os_atomic_test_and_set_byte(&mutex->lock_word, 1));
|
||||
# else
|
||||
return(os_atomic_test_and_set_ulint(&mutex->lock_word, 1));
|
||||
# endif
|
||||
return(os_atomic_test_and_set(&mutex->lock_word));
|
||||
#else
|
||||
ibool ret;
|
||||
|
||||
|
|
@ -100,7 +96,7 @@ ib_mutex_test_and_set(
|
|||
}
|
||||
|
||||
return((byte) ret);
|
||||
#endif
|
||||
#endif /* HAVE_ATOMIC_BUILTINS */
|
||||
}
|
||||
|
||||
/******************************************************************//**
|
||||
|
|
@ -113,19 +109,12 @@ mutex_reset_lock_word(
|
|||
ib_mutex_t* mutex) /*!< in: mutex */
|
||||
{
|
||||
#if defined(HAVE_ATOMIC_BUILTINS)
|
||||
/* In theory __sync_lock_release should be used to release the lock.
|
||||
Unfortunately, it does not work properly alone. The workaround is
|
||||
that more conservative __sync_lock_test_and_set is used instead. */
|
||||
# if defined(HAVE_ATOMIC_BUILTINS_BYTE)
|
||||
os_atomic_test_and_set_byte(&mutex->lock_word, 0);
|
||||
# else
|
||||
os_atomic_test_and_set_ulint(&mutex->lock_word, 0);
|
||||
# endif
|
||||
os_atomic_clear(&mutex->lock_word);
|
||||
#else
|
||||
mutex->lock_word = 0;
|
||||
|
||||
os_fast_mutex_unlock(&(mutex->os_fast_mutex));
|
||||
#endif
|
||||
#endif /* HAVE_ATOMIC_BUILTINS */
|
||||
}
|
||||
|
||||
/******************************************************************//**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue