summaryrefslogtreecommitdiff
path: root/storage/innobase/ut
diff options
context:
space:
mode:
authorJan Lindström <jan.lindstrom@skysql.com>2014-08-06 15:28:58 +0300
committerJan Lindström <jan.lindstrom@skysql.com>2014-08-06 15:28:58 +0300
commit6dad23f04aa5c8a022193cc74b62652a3c1e3057 (patch)
tree85141ad578749597ba997677bb56d3deddd17b4d /storage/innobase/ut
parente974b564389af8251c2ba51060e6129e45431586 (diff)
downloadmariadb-git-6dad23f04aa5c8a022193cc74b62652a3c1e3057.tar.gz
MDEV-5834: Merge Kakao Defragmentation implementation to MariaDB 10.1
Merge https://github.com/kakao/mariadb-10.0 that contains Facebook's implementation for defragmentation facebook/mysql-5.6@a2d3a74 facebook/mysql-5.6@def96c8 facebook/mysql-5.6@9c67c5d facebook/mysql-5.6@921a81b facebook/mysql-5.6@aa519bd facebook/mysql-5.6@fea7d13 facebook/mysql-5.6@09b29d3 facebook/mysql-5.6@9284abb facebook/mysql-5.6@dbd623d facebook/mysql-5.6@aed55dc facebook/mysql-5.6@aad5c82 This version does not add new SQL-syntax and new handler API function. Instead optimize table is mapped to defragment table if innodb_defragment=ON, by default the feature is off. Contains changes authored by Sunguck Lee (Kakao).
Diffstat (limited to 'storage/innobase/ut')
-rw-r--r--storage/innobase/ut/ut0timer.cc92
1 files changed, 92 insertions, 0 deletions
diff --git a/storage/innobase/ut/ut0timer.cc b/storage/innobase/ut/ut0timer.cc
new file mode 100644
index 00000000000..85292cce28c
--- /dev/null
+++ b/storage/innobase/ut/ut0timer.cc
@@ -0,0 +1,92 @@
+/*****************************************************************************
+
+Copyright (c) 2013, 2014, Facebook, Inc. All Rights Reserved.
+Copyright (c) 2014, SkySQL Ab. 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
+Foundation; version 2 of the License.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
+
+*****************************************************************************/
+
+/********************************************************************//**
+@file ut/ut0timer.cc
+Timer rountines
+
+Created 30/07/2014 Jan Lindström jan.lindstrom@skysql.com
+modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11d7269bdfea06f96d6b6
+*************************************************************************/
+
+#include "data0type.h"
+#include <my_rdtsc.h>
+#include <ut0timer.h>
+
+/**************************************************************//**
+Initial timer definition
+@return 0 */
+static
+ulonglong
+ut_timer_none(void)
+/*===============*/
+{
+ return 0;
+}
+
+/**************************************************************//**
+Function pointer to point selected timer function.
+@return timer current value */
+ulonglong (*ut_timer_now)(void) = &ut_timer_none;
+
+struct my_timer_unit_info ut_timer;
+
+/**************************************************************//**
+Sets up the data required for use of my_timer_* functions.
+Selects the best timer by high frequency, and tight resolution.
+Points my_timer_now() to the selected timer function.
+Initializes my_timer struct to contain the info for selected timer.*/
+UNIV_INTERN
+void
+ut_init_timer(void)
+/*===============*/
+{
+ MY_TIMER_INFO all_timer_info;
+ my_timer_init(&all_timer_info);
+
+ if (all_timer_info.cycles.frequency > 1000000 &&
+ all_timer_info.cycles.resolution == 1) {
+ ut_timer = all_timer_info.cycles;
+ ut_timer_now = &my_timer_cycles;
+ } else if (all_timer_info.nanoseconds.frequency > 1000000 &&
+ all_timer_info.nanoseconds.resolution == 1) {
+ ut_timer = all_timer_info.nanoseconds;
+ ut_timer_now = &my_timer_nanoseconds;
+ } else if (all_timer_info.microseconds.frequency >= 1000000 &&
+ all_timer_info.microseconds.resolution == 1) {
+ ut_timer = all_timer_info.microseconds;
+ ut_timer_now = &my_timer_microseconds;
+
+ } else if (all_timer_info.milliseconds.frequency >= 1000 &&
+ all_timer_info.milliseconds.resolution == 1) {
+ ut_timer = all_timer_info.milliseconds;
+ ut_timer_now = &my_timer_milliseconds;
+ } else if (all_timer_info.ticks.frequency >= 1000 &&
+ /* Will probably be false */
+ all_timer_info.ticks.resolution == 1) {
+ ut_timer = all_timer_info.ticks;
+ ut_timer_now = &my_timer_ticks;
+ } else {
+ /* None are acceptable, so leave it as "None", and fill in struct */
+ ut_timer.frequency = 1; /* Avoid div-by-zero */
+ ut_timer.overhead = 0; /* Since it doesn't do anything */
+ ut_timer.resolution = 10; /* Another sign it's bad */
+ ut_timer.routine = 0; /* None */
+ }
+}