summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
Diffstat (limited to 'storage')
-rw-r--r--storage/connect/filamtxt.cpp2
-rw-r--r--storage/connect/ha_connect.cc7
-rw-r--r--storage/connect/jsonudf.cpp4
-rw-r--r--storage/connect/mycat.cc7
-rw-r--r--storage/connect/tabext.cpp2
-rw-r--r--storage/connect/tabjdbc.cpp2
-rw-r--r--storage/connect/tabjson.cpp14
-rw-r--r--storage/innobase/buf/buf0buf.cc5
-rw-r--r--storage/innobase/dict/dict0dict.cc3
-rw-r--r--storage/innobase/handler/ha_innodb.cc3
-rw-r--r--storage/innobase/handler/handler0alter.cc54
-rw-r--r--storage/innobase/row/row0import.cc7
-rw-r--r--storage/innobase/row/row0log.cc138
-rw-r--r--storage/innobase/row/row0merge.cc3
-rw-r--r--storage/innobase/row/row0mysql.cc8
-rw-r--r--storage/mroonga/vendor/groonga/CMakeLists.txt14
-rw-r--r--storage/mroonga/vendor/groonga/lib/CMakeLists.txt3
-rw-r--r--storage/perfschema/ha_perfschema.cc2
-rw-r--r--storage/tokudb/CMakeLists.txt2
-rw-r--r--storage/tokudb/PerconaFT/.clang-format36
-rw-r--r--storage/tokudb/PerconaFT/CMakeLists.txt6
-rw-r--r--storage/tokudb/PerconaFT/README.md29
-rw-r--r--storage/tokudb/PerconaFT/ft/ft-ops.cc91
-rw-r--r--storage/tokudb/PerconaFT/ft/tests/ft-clock-test.cc4
-rw-r--r--storage/tokudb/PerconaFT/ft/tests/log-test4.cc2
-rw-r--r--storage/tokudb/PerconaFT/portability/tests/test-max-data.cc2
-rw-r--r--storage/tokudb/PerconaFT/portability/toku_instrumentation.h2
-rw-r--r--storage/tokudb/PerconaFT/portability/toku_portability.h2
-rw-r--r--storage/tokudb/PerconaFT/portability/toku_pthread.h6
-rw-r--r--storage/tokudb/PerconaFT/portability/toku_race_tools.h2
-rw-r--r--storage/tokudb/PerconaFT/portability/toku_time.h5
-rw-r--r--storage/tokudb/PerconaFT/src/tests/checkpoint_stress.cc2
-rw-r--r--storage/tokudb/PerconaFT/src/tests/directory_lock.cc2
-rw-r--r--storage/tokudb/PerconaFT/src/tests/loader-cleanup-test.cc18
-rw-r--r--storage/tokudb/PerconaFT/src/tests/recover-del-multiple-abort.cc6
-rw-r--r--storage/tokudb/PerconaFT/src/tests/recover-del-multiple-srcdb-fdelete-all.cc6
-rw-r--r--storage/tokudb/PerconaFT/src/tests/recover-del-multiple.cc6
-rw-r--r--storage/tokudb/PerconaFT/src/tests/recover-put-multiple-abort.cc6
-rw-r--r--storage/tokudb/PerconaFT/src/tests/recovery_fileops_unit.cc4
-rw-r--r--storage/tokudb/PerconaFT/src/tests/test-prepare3.cc1
-rw-r--r--storage/tokudb/hatoku_hton.cc20
41 files changed, 305 insertions, 233 deletions
diff --git a/storage/connect/filamtxt.cpp b/storage/connect/filamtxt.cpp
index 7c222eb3c80..490ca3a5fba 100644
--- a/storage/connect/filamtxt.cpp
+++ b/storage/connect/filamtxt.cpp
@@ -427,7 +427,7 @@ int TXTFAM::DeleteSortedRows(PGLOBAL g)
for (i = 0; i < Posar->GetNval(); i++) {
if ((irc = InitDelete(g, Posar->GetIntValue(ix[i]),
- Sosar->GetIntValue(ix[i])) == RC_FX))
+ Sosar->GetIntValue(ix[i]))) == RC_FX)
goto err;
// Now delete the sorted rows
diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc
index 65e2a38166b..68658e169a6 100644
--- a/storage/connect/ha_connect.cc
+++ b/storage/connect/ha_connect.cc
@@ -108,13 +108,8 @@
#define MYSQL_SERVER 1
#define DONT_DEFINE_VOID
#include <my_global.h>
-#include "sql_class.h"
-#include "create_options.h"
-#include "mysql_com.h"
-#include "field.h"
#include "sql_parse.h"
#include "sql_base.h"
-#include <sys/stat.h>
#include "sql_partition.h"
#undef OFFSET
@@ -5571,7 +5566,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
} // endif p
} else if (ttp != TAB_ODBC || !(fnc & (FNC_TABLE | FNC_COL)))
- tab = (char *) table_s->table_name.str; // Default value
+ tab = (char*)table_s->table_name.str; // Default value
} // endif tab
diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp
index ca51712af0c..3cc541c608f 100644
--- a/storage/connect/jsonudf.cpp
+++ b/storage/connect/jsonudf.cpp
@@ -41,8 +41,6 @@ static PJSON JsonNew(PGLOBAL g, JTYP type);
static PJVAL JvalNew(PGLOBAL g, JTYP type, void *vp = NULL);
static PJSNX JsnxNew(PGLOBAL g, PJSON jsp, int type, int len = 64);
-void json_array_deinit(UDF_INIT* initid);
-
static uint JsonGrpSize = 10;
/*********************************************************************************/
@@ -1622,7 +1620,7 @@ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, uint n,
if (AllocSarea(g, ml)) {
char errmsg[MAX_STR];
- snprintf(errmsg, sizeof(errmsg)-1, MSG(WORK_AREA), g->Message);
+ snprintf(errmsg, sizeof(errmsg) - 1, MSG(WORK_AREA), g->Message);
strcpy(g->Message, errmsg);
return true;
} // endif SareaAlloc
diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc
index dd04d667e58..5aef6d9c660 100644
--- a/storage/connect/mycat.cc
+++ b/storage/connect/mycat.cc
@@ -18,7 +18,7 @@
/* ------------- */
/* Version 1.6 */
/* */
-/* Author: Olivier Bertrand 2012 - 2017 */
+/* Author: Olivier Bertrand 2012 - 2018 */
/* */
/* WHAT THIS PROGRAM DOES: */
/* ----------------------- */
@@ -31,10 +31,7 @@
#define DONT_DEFINE_VOID
#include <my_global.h>
-#if defined(__WIN__)
-//#include <windows.h>
-//#include <sqlext.h>
-#elif defined(UNIX)
+#if defined(UNIX)
#include <unistd.h>
#include <string.h>
#endif
diff --git a/storage/connect/tabext.cpp b/storage/connect/tabext.cpp
index 7be6c0e8328..139e4199ed9 100644
--- a/storage/connect/tabext.cpp
+++ b/storage/connect/tabext.cpp
@@ -286,7 +286,7 @@ bool TDBEXT::MakeSrcdef(PGLOBAL g)
char *catp = strstr(Srcdef, "%s");
if (catp) {
- char *fil1= 0, *fil2;
+ char *fil1 = 0, *fil2;
PCSZ ph = ((EXTDEF*)To_Def)->Phpos;
if (!ph)
diff --git a/storage/connect/tabjdbc.cpp b/storage/connect/tabjdbc.cpp
index adbfb2168ae..275b5edaeae 100644
--- a/storage/connect/tabjdbc.cpp
+++ b/storage/connect/tabjdbc.cpp
@@ -572,7 +572,7 @@ bool TDBJDBC::OpenDB(PGLOBAL g)
if (Memory < 3) {
// Method will depend on cursor type
- if ((Rbuf = Jcp->Rewind(Query->GetStr())) < 0)
+ if ((Rbuf = Query ? Jcp->Rewind(Query->GetStr()) : 0) < 0)
if (Mode != MODE_READX) {
Jcp->Close();
return true;
diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp
index 6151d924a9f..9e4f5ab987d 100644
--- a/storage/connect/tabjson.cpp
+++ b/storage/connect/tabjson.cpp
@@ -195,7 +195,7 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt)
tdp->Fn = GetStringTableOption(g, topt, "Filename", NULL);
if (!(tdp->Database = SetPath(g, db)))
- return 0ULL;
+ return 0;
tdp->Objname = GetStringTableOption(g, topt, "Object", NULL);
tdp->Base = GetIntegerTableOption(g, topt, "Base", 0) ? 1 : 0;
@@ -243,14 +243,14 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt)
tjsp = new(g) TDBJSON(tdp, new(g) MAPFAM(tdp));
if (tjsp->MakeDocument(g))
- return 0ULL;
+ return 0;
jsp = (tjsp->GetDoc()) ? tjsp->GetDoc()->GetValue(0) : NULL;
} else {
if (!(tdp->Lrecl = GetIntegerTableOption(g, topt, "Lrecl", 0)))
if (!mgo) {
sprintf(g->Message, "LRECL must be specified for pretty=%d", tdp->Pretty);
- return 0ULL;
+ return 0;
} else
tdp->Lrecl = 8192; // Should be enough
@@ -269,14 +269,14 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt)
tjnp = new(g) TDBJSN(tdp, new(g) CMGFAM(tdp));
#else
sprintf(g->Message, "Mongo %s Driver not available", "C");
- return 0ULL;
+ return 0;
#endif
} else if (tdp->Driver && toupper(*tdp->Driver) == 'J') {
#if defined(JAVA_SUPPORT)
tjnp = new(g) TDBJSN(tdp, new(g) JMGFAM(tdp));
#else
sprintf(g->Message, "Mongo %s Driver not available", "Java");
- return 0ULL;
+ return 0;
#endif
} else { // Driver not specified
#if defined(CMGO_SUPPORT)
@@ -285,7 +285,7 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt)
tjnp = new(g) TDBJSN(tdp, new(g) JMGFAM(tdp));
#else
sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "MONGO");
- return 0ULL;
+ return 0;
#endif
} // endif Driver
@@ -304,7 +304,7 @@ int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt)
tjnp->SetG(G);
if (tjnp->OpenDB(g))
- return 0ULL;
+ return 0;
switch (tjnp->ReadDB(g)) {
case RC_EF:
diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc
index 29989ccca7f..4d8535abc7b 100644
--- a/storage/innobase/buf/buf0buf.cc
+++ b/storage/innobase/buf/buf0buf.cc
@@ -4390,6 +4390,11 @@ loop:
ibuf_inside(mtr));
retries = 0;
+ } else if (mode == BUF_GET_POSSIBLY_FREED) {
+ if (err) {
+ *err = local_err;
+ }
+ return NULL;
} else if (retries < BUF_PAGE_READ_MAX_RETRIES) {
++retries;
diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc
index 8fa6f6ad4c6..5c800028f98 100644
--- a/storage/innobase/dict/dict0dict.cc
+++ b/storage/innobase/dict/dict0dict.cc
@@ -434,7 +434,8 @@ dict_table_try_drop_aborted(
ut_ad(table->id == table_id);
}
- if (table && table->get_ref_count() == ref_count && table->drop_aborted) {
+ if (table && table->get_ref_count() == ref_count && table->drop_aborted
+ && !UT_LIST_GET_FIRST(table->locks)) {
/* Silence a debug assertion in row_merge_drop_indexes(). */
ut_d(table->acquire());
row_merge_drop_indexes(trx, table, TRUE);
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index ba97579d413..4ca7395f230 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -5072,7 +5072,6 @@ static void innobase_kill_query(handlerton*, THD* thd, enum thd_kill_levels)
{
DBUG_ENTER("innobase_kill_query");
#ifdef WITH_WSREP
- wsrep_thd_LOCK(thd);
if (wsrep_thd_get_conflict_state(thd) != NO_CONFLICT) {
/* if victim has been signaled by BF thread and/or aborting
is already progressing, following query aborting is not necessary
@@ -5080,10 +5079,8 @@ static void innobase_kill_query(handlerton*, THD* thd, enum thd_kill_levels)
Also, BF thread should own trx mutex for the victim, which would
conflict with trx_mutex_enter() below
*/
- wsrep_thd_UNLOCK(thd);
DBUG_VOID_RETURN;
}
- wsrep_thd_UNLOCK(thd);
#endif /* WITH_WSREP */
if (trx_t* trx = thd_to_trx(thd)) {
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index f2128841e1f..65872d82200 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 2005, 2017, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 2005, 2018, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2013, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
@@ -7436,12 +7436,16 @@ rollback_inplace_alter_table(
row_mysql_lock_data_dictionary(ctx->trx);
if (ctx->need_rebuild()) {
- dberr_t err = DB_SUCCESS;
- ulint flags = ctx->new_table->flags;
-
/* DML threads can access ctx->new_table via the
online rebuild log. Free it first. */
innobase_online_rebuild_log_free(prebuilt->table);
+ }
+
+ if (!ctx->new_table) {
+ ut_ad(ctx->need_rebuild());
+ } else if (ctx->need_rebuild()) {
+ dberr_t err= DB_SUCCESS;
+ ulint flags = ctx->new_table->flags;
/* Since the FTS index specific auxiliary tables has
not yet registered with "table->fts" by fts_add_index(),
@@ -8103,7 +8107,7 @@ commit_set_autoinc(
const TABLE* altered_table,
const TABLE* old_table)
{
- DBUG_ENTER("commit_get_autoinc");
+ DBUG_ENTER("commit_set_autoinc");
if (!altered_table->found_next_number_field) {
/* There is no AUTO_INCREMENT column in the table
@@ -9172,20 +9176,6 @@ ha_innobase::commit_inplace_alter_table(
ut_ad(m_prebuilt->table == ctx0->old_table);
ha_alter_info->group_commit_ctx = NULL;
- /* Free the ctx->trx of other partitions, if any. We will only
- use the ctx0->trx here. Others may have been allocated in
- the prepare stage. */
-
- for (inplace_alter_handler_ctx** pctx = &ctx_array[1]; *pctx;
- pctx++) {
- ha_innobase_inplace_ctx* ctx
- = static_cast<ha_innobase_inplace_ctx*>(*pctx);
-
- if (ctx->trx) {
- trx_free(ctx->trx);
- }
- }
-
trx_start_if_not_started_xa(m_prebuilt->trx, true);
for (inplace_alter_handler_ctx** pctx = ctx_array; *pctx; pctx++) {
@@ -9584,10 +9574,6 @@ foreign_fail:
m_share->idx_trans_tbl.index_count = 0;
}
- if (trx == ctx0->trx) {
- ctx0->trx = NULL;
- }
-
/* Tell the InnoDB server that there might be work for
utility threads: */
@@ -9610,10 +9596,30 @@ foreign_fail:
}
row_mysql_unlock_data_dictionary(trx);
- trx_free(trx);
+ if (trx != ctx0->trx) {
+ trx_free(trx);
+ }
DBUG_RETURN(true);
}
+ if (trx == ctx0->trx) {
+ ctx0->trx = NULL;
+ }
+
+ /* Free the ctx->trx of other partitions, if any. We will only
+ use the ctx0->trx here. Others may have been allocated in
+ the prepare stage. */
+
+ for (inplace_alter_handler_ctx** pctx = &ctx_array[1]; *pctx;
+ pctx++) {
+ ha_innobase_inplace_ctx* ctx
+ = static_cast<ha_innobase_inplace_ctx*>(*pctx);
+
+ if (ctx->trx) {
+ trx_free(ctx->trx);
+ }
+ }
+
if (ctx0->num_to_drop_vcol || ctx0->num_to_add_vcol) {
DBUG_ASSERT(ctx0->old_table->get_ref_count() == 1);
diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc
index 6f2cda5b7d9..3ff16aa7f04 100644
--- a/storage/innobase/row/row0import.cc
+++ b/storage/innobase/row/row0import.cc
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 2012, 2016, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 2012, 2018, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
@@ -1704,6 +1704,7 @@ PageConverter::update_records(
while (!m_rec_iter.end()) {
rec_t* rec = m_rec_iter.current();
+
ibool deleted = rec_get_deleted_flag(rec, comp);
/* For the clustered index we have to adjust the BLOB
@@ -1831,6 +1832,10 @@ PageConverter::update_index_page(
return(DB_SUCCESS);
}
+ if (!page_is_leaf(block->frame)) {
+ return (DB_SUCCESS);
+ }
+
return(update_records(block));
}
diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc
index 3cdeaba13dd..be18295abd6 100644
--- a/storage/innobase/row/row0log.cc
+++ b/storage/innobase/row/row0log.cc
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 2011, 2017, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 2011, 2018, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
@@ -504,6 +504,8 @@ err_exit:
*avail = srv_sort_buf_size - log->tail.bytes;
if (size > *avail) {
+ /* Make sure log->tail.buf is large enough */
+ ut_ad(size <= sizeof log->tail.buf);
return(log->tail.buf);
} else {
return(log->tail.block + log->tail.bytes);
@@ -633,12 +635,10 @@ row_log_table_delete(
{
ulint old_pk_extra_size;
ulint old_pk_size;
- ulint ext_size = 0;
ulint mrec_size;
ulint avail_size;
mem_heap_t* heap = NULL;
const dtuple_t* old_pk;
- row_ext_t* ext;
ut_ad(dict_index_is_clust(index));
ut_ad(rec_offs_validate(rec, index, offsets));
@@ -731,72 +731,20 @@ row_log_table_delete(
&old_pk_extra_size);
ut_ad(old_pk_extra_size < 0x100);
- mrec_size = 6 + old_pk_size;
-
- /* Log enough prefix of the BLOB unless both the
- old and new table are in COMPACT or REDUNDANT format,
- which store the prefix in the clustered index record. */
- if (rec_offs_any_extern(offsets)
- && (dict_table_has_atomic_blobs(index->table)
- || dict_table_has_atomic_blobs(new_table))) {
-
- /* Build a cache of those off-page column prefixes
- that are referenced by secondary indexes. It can be
- that none of the off-page columns are needed. */
- row_build(ROW_COPY_DATA, index, rec,
- offsets, NULL, NULL, NULL, &ext, heap);
- if (ext) {
- /* Log the row_ext_t, ext->ext and ext->buf */
- ext_size = ext->n_ext * ext->max_len
- + sizeof(*ext)
- + ext->n_ext * sizeof(ulint)
- + (ext->n_ext - 1) * sizeof ext->len;
- mrec_size += ext_size;
- }
- }
+ /* 2 = 1 (extra_size) + at least 1 byte payload */
+ mrec_size = 2 + old_pk_size;
if (byte* b = row_log_table_open(index->online_log,
mrec_size, &avail_size)) {
*b++ = ROW_T_DELETE;
*b++ = static_cast<byte>(old_pk_extra_size);
- /* Log the size of external prefix we saved */
- mach_write_to_4(b, ext_size);
- b += 4;
-
rec_convert_dtuple_to_temp(
b + old_pk_extra_size, new_index,
old_pk->fields, old_pk->n_fields);
b += old_pk_size;
- if (ext_size) {
- ulint cur_ext_size = sizeof(*ext)
- + (ext->n_ext - 1) * sizeof ext->len;
-
- memcpy(b, ext, cur_ext_size);
- b += cur_ext_size;
-
- /* Check if we need to col_map to adjust the column
- number. If columns were added/removed/reordered,
- adjust the column number. */
- if (const ulint* col_map =
- index->online_log->col_map) {
- for (ulint i = 0; i < ext->n_ext; i++) {
- const_cast<ulint&>(ext->ext[i]) =
- col_map[ext->ext[i]];
- }
- }
-
- memcpy(b, ext->ext, ext->n_ext * sizeof(*ext->ext));
- b += ext->n_ext * sizeof(*ext->ext);
-
- ext_size -= cur_ext_size
- + ext->n_ext * sizeof(*ext->ext);
- memcpy(b, ext->buf, ext_size);
- b += ext_size;
- }
-
row_log_table_close(index, b, mrec_size, avail_size);
}
@@ -1814,15 +1762,13 @@ row_log_table_apply_insert(
/******************************************************//**
Deletes a record from a table that is being rebuilt.
@return DB_SUCCESS or error code */
-static MY_ATTRIBUTE((warn_unused_result))
+static MY_ATTRIBUTE((nonnull, warn_unused_result))
dberr_t
row_log_table_apply_delete_low(
/*===========================*/
btr_pcur_t* pcur, /*!< in/out: B-tree cursor,
will be trashed */
const ulint* offsets, /*!< in: offsets on pcur */
- const row_ext_t* save_ext, /*!< in: saved external field
- info, or NULL */
mem_heap_t* heap, /*!< in/out: memory heap */
mtr_t* mtr) /*!< in/out: mini-transaction,
will be committed */
@@ -1843,12 +1789,7 @@ row_log_table_apply_delete_low(
/* Build a row template for purging secondary index entries. */
row = row_build(
ROW_COPY_DATA, index, btr_pcur_get_rec(pcur),
- offsets, NULL, NULL, NULL,
- save_ext ? NULL : &ext, heap);
-
- if (!save_ext) {
- save_ext = ext;
- }
+ offsets, NULL, NULL, NULL, &ext, heap);
} else {
row = NULL;
}
@@ -1867,7 +1808,7 @@ row_log_table_apply_delete_low(
}
const dtuple_t* entry = row_build_index_entry(
- row, save_ext, index, heap);
+ row, ext, index, heap);
mtr->start();
index->set_modified(*mtr);
btr_pcur_open(index, entry, PAGE_CUR_LE,
@@ -1912,7 +1853,7 @@ flag_ok:
/******************************************************//**
Replays a delete operation on a table that was rebuilt.
@return DB_SUCCESS or error code */
-static MY_ATTRIBUTE((nonnull(2, 3, 4, 5, 6), warn_unused_result))
+static MY_ATTRIBUTE((nonnull, warn_unused_result))
dberr_t
row_log_table_apply_delete(
/*=======================*/
@@ -1924,9 +1865,7 @@ row_log_table_apply_delete(
mem_heap_t* offsets_heap, /*!< in/out: memory heap
that can be emptied */
mem_heap_t* heap, /*!< in/out: memory heap */
- const row_log_t* log, /*!< in: online log */
- const row_ext_t* save_ext) /*!< in: saved external field
- info, or NULL */
+ const row_log_t* log) /*!< in: online log */
{
dict_table_t* new_table = log->table;
dict_index_t* index = dict_table_get_first_index(new_table);
@@ -2030,9 +1969,7 @@ all_done:
}
}
- return(row_log_table_apply_delete_low(&pcur,
- offsets, save_ext,
- heap, &mtr));
+ return row_log_table_apply_delete_low(&pcur, offsets, heap, &mtr);
}
/******************************************************//**
@@ -2243,7 +2180,7 @@ func_exit_committed:
/* Some BLOBs are missing, so we are interpreting
this ROW_T_UPDATE as ROW_T_DELETE (see *1). */
error = row_log_table_apply_delete_low(
- &pcur, cur_offsets, NULL, heap, &mtr);
+ &pcur, cur_offsets, heap, &mtr);
goto func_exit_committed;
}
@@ -2281,7 +2218,7 @@ func_exit_committed:
}
error = row_log_table_apply_delete_low(
- &pcur, cur_offsets, NULL, heap, &mtr);
+ &pcur, cur_offsets, heap, &mtr);
ut_ad(mtr.has_committed());
if (error == DB_SUCCESS) {
@@ -2427,8 +2364,6 @@ row_log_table_apply_op(
ulint extra_size;
const mrec_t* next_mrec;
dtuple_t* old_pk;
- row_ext_t* ext;
- ulint ext_size;
ut_ad(dict_index_is_clust(dup->index));
ut_ad(dup->index->table != log->table);
@@ -2436,7 +2371,7 @@ row_log_table_apply_op(
*error = DB_SUCCESS;
- /* 3 = 1 (op type) + 1 (ext_size) + at least 1 byte payload */
+ /* 3 = 1 (op type) + 1 (extra_size) + at least 1 byte payload */
if (mrec + 3 >= mrec_end) {
return(NULL);
}
@@ -2488,14 +2423,12 @@ row_log_table_apply_op(
break;
case ROW_T_DELETE:
- /* 1 (extra_size) + 4 (ext_size) + at least 1 (payload) */
- if (mrec + 6 >= mrec_end) {
+ /* 1 (extra_size) + at least 1 (payload) */
+ if (mrec + 2 >= mrec_end) {
return(NULL);
}
extra_size = *mrec++;
- ext_size = mach_read_from_4(mrec);
- mrec += 4;
ut_ad(mrec < mrec_end);
/* We assume extra_size < 0x100 for the PRIMARY KEY prefix.
@@ -2508,41 +2441,16 @@ row_log_table_apply_op(
rec_offs_set_n_fields(offsets,
unsigned(new_index->n_uniq) + 2);
rec_init_offsets_temp(mrec, new_index, offsets);
- next_mrec = mrec + rec_offs_data_size(offsets) + ext_size;
-
+ next_mrec = mrec + rec_offs_data_size(offsets);
if (next_mrec > mrec_end) {
return(NULL);
}
log->head.total += ulint(next_mrec - mrec_start);
- /* If there are external fields, retrieve those logged
- prefix info and reconstruct the row_ext_t */
- if (ext_size) {
- /* We use memcpy to avoid unaligned
- access on some non-x86 platforms.*/
- ext = static_cast<row_ext_t*>(
- mem_heap_dup(heap,
- mrec + rec_offs_data_size(offsets),
- ext_size));
-
- byte* ext_start = reinterpret_cast<byte*>(ext);
-
- ulint ext_len = sizeof(*ext)
- + (ext->n_ext - 1) * sizeof ext->len;
-
- ext->ext = reinterpret_cast<ulint*>(ext_start + ext_len);
- ext_len += ext->n_ext * sizeof(*ext->ext);
-
- ext->buf = static_cast<byte*>(ext_start + ext_len);
- } else {
- ext = NULL;
- }
-
*error = row_log_table_apply_delete(
new_trx_id_col,
- mrec, offsets, offsets_heap, heap,
- log, ext);
+ mrec, offsets, offsets_heap, heap, log);
break;
case ROW_T_UPDATE:
@@ -3020,7 +2928,15 @@ all_done:
while (!trx_is_interrupted(trx)) {
mrec = next_mrec;
- ut_ad(mrec < mrec_end);
+ ut_ad(mrec <= mrec_end);
+
+ if (mrec == mrec_end) {
+ /* We are at the end of the log.
+ Mark the replay all_done. */
+ if (has_index_lock) {
+ goto all_done;
+ }
+ }
if (!has_index_lock) {
/* We are applying operations from a different
diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc
index f742c597e34..4ac79fba717 100644
--- a/storage/innobase/row/row0merge.cc
+++ b/storage/innobase/row/row0merge.cc
@@ -3887,7 +3887,8 @@ row_merge_drop_indexes(
A concurrent purge will be prevented by dict_operation_lock. */
- if (!locked && table->get_ref_count() > 1) {
+ if (!locked && (table->get_ref_count() > 1
+ || UT_LIST_GET_FIRST(table->locks))) {
/* We will have to drop the indexes later, when the
table is guaranteed to be no longer in use. Mark the
indexes as incomplete and corrupted, so that other
diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc
index ceab5d00659..987cbd1d11e 100644
--- a/storage/innobase/row/row0mysql.cc
+++ b/storage/innobase/row/row0mysql.cc
@@ -1,6 +1,6 @@
/*****************************************************************************
-Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 2000, 2018, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
@@ -1518,8 +1518,7 @@ error_exit:
doc_ids difference should not exceed
FTS_DOC_ID_MAX_STEP value. */
- if (next_doc_id > 1
- && doc_id - next_doc_id >= FTS_DOC_ID_MAX_STEP) {
+ if (doc_id - next_doc_id >= FTS_DOC_ID_MAX_STEP) {
ib::error() << "Doc ID " << doc_id
<< " is too big. Its difference with"
" largest used Doc ID "
@@ -4578,7 +4577,8 @@ row_rename_table_for_mysql(
}
if (err == DB_SUCCESS
- && dict_table_has_fts_index(table)
+ && (dict_table_has_fts_index(table)
+ || DICT_TF2_FLAG_IS_SET(table, DICT_TF2_FTS_HAS_DOC_ID))
&& !dict_tables_have_same_db(old_name, new_name)) {
err = fts_rename_aux_tables(table, new_name, trx);
if (err != DB_TABLE_NOT_FOUND) {
diff --git a/storage/mroonga/vendor/groonga/CMakeLists.txt b/storage/mroonga/vendor/groonga/CMakeLists.txt
index e27070f9e0c..ee526646c09 100644
--- a/storage/mroonga/vendor/groonga/CMakeLists.txt
+++ b/storage/mroonga/vendor/groonga/CMakeLists.txt
@@ -361,10 +361,18 @@ if(NOT ${GRN_WITH_LZ4} STREQUAL "no")
pkg_check_modules(LIBLZ4 liblz4)
endif()
if(LIBLZ4_FOUND)
+ # According to CMake documentation, this is the recommended way to force
+ # looking in LIBRARY_DIRS first and in regular system paths otherwise.
+ #
+ # pkg_check_modules does not guarantee that LIBLZ4_LIBRARY_DIRS will be
+ # set. If it's not set we won't find the library without looking through
+ # the regular system paths.
find_library(LZ4_LIBS
- NAMES ${LIBLZ4_LIBRARIES}
- PATHS ${LIBLZ4_LIBRARY_DIRS}
- NO_DEFAULT_PATH)
+ NAMES ${LIBLZ4_LIBRARIES}
+ PATHS ${LIBLZ4_LIBRARY_DIRS}
+ NO_DEFAULT_PATH)
+ find_library(LZ4_LIBS
+ NAMES ${LIBLZ4_LIBRARIES})
set(GRN_WITH_LZ4 TRUE)
else()
if(${GRN_WITH_LZ4} STREQUAL "yes")
diff --git a/storage/mroonga/vendor/groonga/lib/CMakeLists.txt b/storage/mroonga/vendor/groonga/lib/CMakeLists.txt
index 2274e95aa24..64fadb8bbdd 100644
--- a/storage/mroonga/vendor/groonga/lib/CMakeLists.txt
+++ b/storage/mroonga/vendor/groonga/lib/CMakeLists.txt
@@ -179,6 +179,7 @@ if(GRN_WITH_MRUBY)
endif()
# Workaround GCC ICE on ARM64
-IF(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
+IF(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" AND
+ CMAKE_C_COMPILER_VERSION VERSION_GREATER "5")
ADD_COMPILE_FLAGS(ts/ts_expr_node.c COMPILE_FLAGS "-fno-tree-loop-vectorize")
ENDIF()
diff --git a/storage/perfschema/ha_perfschema.cc b/storage/perfschema/ha_perfschema.cc
index e8e9581d54b..78bd2d34c32 100644
--- a/storage/perfschema/ha_perfschema.cc
+++ b/storage/perfschema/ha_perfschema.cc
@@ -214,7 +214,7 @@ maria_declare_plugin(perfschema)
0x0001,
pfs_status_vars,
NULL,
- "5.6.36",
+ "5.6.40",
MariaDB_PLUGIN_MATURITY_STABLE
}
maria_declare_plugin_end;
diff --git a/storage/tokudb/CMakeLists.txt b/storage/tokudb/CMakeLists.txt
index 0824ced7079..a0abee09727 100644
--- a/storage/tokudb/CMakeLists.txt
+++ b/storage/tokudb/CMakeLists.txt
@@ -1,4 +1,4 @@
-SET(TOKUDB_VERSION 5.6.38-83.0)
+SET(TOKUDB_VERSION 5.6.39-83.1)
# PerconaFT only supports x86-64 and cmake-2.8.9+
IF(CMAKE_VERSION VERSION_LESS "2.8.9")
MESSAGE(STATUS "CMake 2.8.9 or higher is required by TokuDB")
diff --git a/storage/tokudb/PerconaFT/.clang-format b/storage/tokudb/PerconaFT/.clang-format
new file mode 100644
index 00000000000..0888185848d
--- /dev/null
+++ b/storage/tokudb/PerconaFT/.clang-format
@@ -0,0 +1,36 @@
+Language: Cpp
+BasedOnStyle: Google
+
+# The following parameters are default for Google style,
+# but as they are important for our project they
+# are set explicitly here
+AlignAfterOpenBracket: Align
+BreakBeforeBinaryOperators: None
+ColumnLimit: 80
+PointerAlignment: Left
+SpaceAfterCStyleCast: false
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 2
+SpacesInAngles: false
+SpacesInContainerLiterals: true
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+UseTab: Never
+
+# Non-default parametes
+NamespaceIndentation: All
+IndentWidth: 4
+TabWidth: 4
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+BinPackParameters: false
+BinPackArguments: false
+ExperimentalAutoDetectBinPacking: false
+AllowAllParametersOfDeclarationOnNextLine: false
+#AlignConsecutiveAssignments: yes
+#AlignConsecutiveDeclarations: yes
+BreakStringLiterals: false
+ReflowComments: true
diff --git a/storage/tokudb/PerconaFT/CMakeLists.txt b/storage/tokudb/PerconaFT/CMakeLists.txt
index 5c6d938808e..90ad3f2b1af 100644
--- a/storage/tokudb/PerconaFT/CMakeLists.txt
+++ b/storage/tokudb/PerconaFT/CMakeLists.txt
@@ -9,6 +9,12 @@ project(TokuDB)
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
+# See: https://jira.percona.com/browse/TDB-93
+IF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-address-of-packed-member")
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-address-of-packed-member")
+ENDIF()
+
# detect when we are being built as a subproject
if (DEFINED MYSQL_PROJECT_NAME_DOCSTRING)
add_definitions( -DMYSQL_TOKUDB_ENGINE=1)
diff --git a/storage/tokudb/PerconaFT/README.md b/storage/tokudb/PerconaFT/README.md
index d53caf00190..ffb646b67af 100644
--- a/storage/tokudb/PerconaFT/README.md
+++ b/storage/tokudb/PerconaFT/README.md
@@ -9,20 +9,18 @@ PerconaFT is provided as a shared library with an interface similar to
Berkeley DB.
To build the full MySQL product, see the instructions for
-[Percona/tokudb-engine][tokudb-engine]. To build TokuMX, see the instructions
-for [Percona/percona-server-mongodb][mongo]. This document covers PerconaFT only.
+[Percona/percona-server][percona-server]. This document covers PerconaFT only.
-[tokudb-engine]: https://github.com/Percona/tokudb-engine
-[mongo]: https://github.com/Percona/percona-server-mongodb
+[percona-server]: https://github.com/Percona/percona-server
Building
--------
PerconaFT is built using CMake >= 2.8.9. Out-of-source builds are
-recommended. You need a C++11 compiler, though only GCC >= 4.7 and
-Apple's Clang are tested. You also need zlib development packages
-(`yum install zlib-devel` or `apt-get install zlib1g-dev`).
+recommended. You need a C++11 compiler, though only some versions
+of GCC >= 4.7 and Clang are tested. You also need zlib development
+packages (`yum install zlib-devel` or `apt-get install zlib1g-dev`).
You will also need the source code for jemalloc, checked out in
`third_party/`.
@@ -42,16 +40,16 @@ CC=gcc47 CXX=g++47 cmake \
cmake --build . --target install
```
-This will build `libtokudb.so` and `libtokuportability.so` and install it,
+This will build `libft.so` and `libtokuportability.so` and install it,
some header files, and some examples to `percona-ft/prefix/`. It will also
build jemalloc and install it alongside these libraries, you should link
to that if you are planning to run benchmarks or in production.
### Platforms
-PerconaFT is supported on 64-bit Centos, should work on other 64-bit linux
-distributions, and may work on OSX 10.8 and FreeBSD. PerconaFT is not
-supported on 32-bit systems.
+PerconaFT is supported on 64-bit Centos, Debian, and Ubuntu and should work
+on other 64-bit linux distributions, and may work on OSX 10.8 and FreeBSD.
+PerconaFT is not supported on 32-bit systems.
[Transparent hugepages][transparent-hugepages] is a feature in newer linux
kernel versions that causes problems for the memory usage tracking
@@ -97,16 +95,9 @@ We have two publicly accessible mailing lists for TokuDB:
- tokudb-dev@googlegroups.com is for discussion of the development of
TokuDB.
-and two for TokuMX:
-
- - tokumx-user@googlegroups.com is for general and support related
- questions about the use of TokuMX.
- - tokumx-dev@googlegroups.com is for discussion of the development of
- TokuMX.
-
All source code and test contributions must be provided under a [BSD 2-Clause][bsd-2] license. For any small change set, the license text may be contained within the commit comment and the pull request. For larger contributions, the license must be presented in a COPYING.<feature_name> file in the root of the PerconaFT project. Please see the [BSD 2-Clause license template][bsd-2] for the content of the license text.
-[jira]: https://tokutek.atlassian.net/browse/FT/
+[jira]: https://jira.percona.com/projects/TDB
[bsd-2]: http://opensource.org/licenses/BSD-2-Clause/
diff --git a/storage/tokudb/PerconaFT/ft/ft-ops.cc b/storage/tokudb/PerconaFT/ft/ft-ops.cc
index ef2009db1b1..a98768158dd 100644
--- a/storage/tokudb/PerconaFT/ft/ft-ops.cc
+++ b/storage/tokudb/PerconaFT/ft/ft-ops.cc
@@ -4881,6 +4881,94 @@ static void toku_pfs_keys_init(const char *toku_instr_group_name) {
toku_instr_probe_1 = new toku_instr_probe(*fti_probe_1_key);
}
+static void toku_pfs_keys_destroy(void) {
+ delete kibbutz_mutex_key;
+ delete minicron_p_mutex_key;
+ delete queue_result_mutex_key;
+ delete tpool_lock_mutex_key;
+ delete workset_lock_mutex_key;
+ delete bjm_jobs_lock_mutex_key;
+ delete log_internal_lock_mutex_key;
+ delete cachetable_ev_thread_lock_mutex_key;
+ delete cachetable_disk_nb_mutex_key;
+ delete safe_file_size_lock_mutex_key;
+ delete cachetable_m_mutex_key;
+ delete checkpoint_safe_mutex_key;
+ delete ft_ref_lock_mutex_key;
+ delete ft_open_close_lock_mutex_key;
+ delete loader_error_mutex_key;
+ delete bfs_mutex_key;
+ delete loader_bl_mutex_key;
+ delete loader_fi_lock_mutex_key;
+ delete loader_out_mutex_key;
+ delete result_output_condition_lock_mutex_key;
+ delete block_table_mutex_key;
+ delete rollback_log_node_cache_mutex_key;
+ delete txn_lock_mutex_key;
+ delete txn_state_lock_mutex_key;
+ delete txn_child_manager_mutex_key;
+ delete txn_manager_lock_mutex_key;
+ delete treenode_mutex_key;
+ delete locktree_request_info_mutex_key;
+ delete locktree_request_info_retry_mutex_key;
+ delete manager_mutex_key;
+ delete manager_escalation_mutex_key;
+ delete db_txn_struct_i_txn_mutex_key;
+ delete manager_escalator_mutex_key;
+ delete indexer_i_indexer_lock_mutex_key;
+ delete indexer_i_indexer_estimate_lock_mutex_key;
+
+ delete tokudb_file_data_key;
+ delete tokudb_file_load_key;
+ delete tokudb_file_tmp_key;
+ delete tokudb_file_log_key;
+
+ delete fti_probe_1_key;
+
+ delete extractor_thread_key;
+ delete fractal_thread_key;
+ delete io_thread_key;
+ delete eviction_thread_key;
+ delete kibbutz_thread_key;
+ delete minicron_thread_key;
+ delete tp_internal_thread_key;
+
+ delete result_state_cond_key;
+ delete bjm_jobs_wait_key;
+ delete cachetable_p_refcount_wait_key;
+ delete cachetable_m_flow_control_cond_key;
+ delete cachetable_m_ev_thread_cond_key;
+ delete bfs_cond_key;
+ delete result_output_condition_key;
+ delete manager_m_escalator_done_key;
+ delete lock_request_m_wait_cond_key;
+ delete queue_result_cond_key;
+ delete ws_worker_wait_key;
+ delete rwlock_wait_read_key;
+ delete rwlock_wait_write_key;
+ delete rwlock_cond_key;
+ delete tp_thread_wait_key;
+ delete tp_pool_wait_free_key;
+ delete frwlock_m_wait_read_key;
+ delete kibbutz_k_cond_key;
+ delete minicron_p_condvar_key;
+ delete locktree_request_info_retry_cv_key;
+
+ delete multi_operation_lock_key;
+ delete low_priority_multi_operation_lock_key;
+ delete cachetable_m_list_lock_key;
+ delete cachetable_m_pending_lock_expensive_key;
+ delete cachetable_m_pending_lock_cheap_key;
+ delete cachetable_m_lock_key;
+ delete result_i_open_dbs_rwlock_key;
+ delete checkpoint_safe_rwlock_key;
+ delete cachetable_value_key;
+ delete safe_file_size_lock_rwlock_key;
+
+ delete cachetable_disk_nb_rwlock_key;
+ delete toku_instr_probe_1;
+}
+
int toku_ft_layer_init(void) {
int r = 0;
@@ -4917,8 +5005,7 @@ void toku_ft_layer_destroy(void) {
toku_status_destroy();
partitioned_counters_destroy();
toku_scoped_malloc_destroy();
-
- delete toku_instr_probe_1;
+ toku_pfs_keys_destroy();
// Portability must be cleaned up last
toku_portability_destroy();
diff --git a/storage/tokudb/PerconaFT/ft/tests/ft-clock-test.cc b/storage/tokudb/PerconaFT/ft/tests/ft-clock-test.cc
index 26a3dae673c..00ff8cf204b 100644
--- a/storage/tokudb/PerconaFT/ft/tests/ft-clock-test.cc
+++ b/storage/tokudb/PerconaFT/ft/tests/ft-clock-test.cc
@@ -184,11 +184,11 @@ static void test2(int fd, FT ft_h, FTNODE *dn) {
PAIR_ATTR attr;
memset(&attr, 0, sizeof(attr));
toku_ftnode_pe_callback(*dn, attr, ft_h, def_pe_finalize_impl, nullptr);
- invariant(BP_STATE(*dn, 0) == (is_leaf) ? PT_ON_DISK : PT_COMPRESSED);
+ invariant(BP_STATE(*dn, 0) == ((is_leaf) ? PT_ON_DISK : PT_COMPRESSED));
invariant(BP_STATE(*dn, 1) == PT_AVAIL);
invariant(BP_SHOULD_EVICT(*dn, 1));
toku_ftnode_pe_callback(*dn, attr, ft_h, def_pe_finalize_impl, nullptr);
- invariant(BP_STATE(*dn, 1) == (is_leaf) ? PT_ON_DISK : PT_COMPRESSED);
+ invariant(BP_STATE(*dn, 1) == ((is_leaf) ? PT_ON_DISK : PT_COMPRESSED));
bool req = toku_ftnode_pf_req_callback(*dn, &bfe_subset);
invariant(req);
diff --git a/storage/tokudb/PerconaFT/ft/tests/log-test4.cc b/storage/tokudb/PerconaFT/ft/tests/log-test4.cc
index e0bbedb95bf..019852bb729 100644
--- a/storage/tokudb/PerconaFT/ft/tests/log-test4.cc
+++ b/storage/tokudb/PerconaFT/ft/tests/log-test4.cc
@@ -54,7 +54,7 @@ test_main (int argc __attribute__((__unused__)),
{
ml_lock(&logger->input_lock);
toku_logger_make_space_in_inbuf(logger, 5);
- snprintf(logger->inbuf.buf+logger->inbuf.n_in_buf, 5, "a1234");
+ memcpy(logger->inbuf.buf+logger->inbuf.n_in_buf, "a1234", 5);
logger->inbuf.n_in_buf+=5;
logger->lsn.lsn++;
logger->inbuf.max_lsn_in_buf = logger->lsn;
diff --git a/storage/tokudb/PerconaFT/portability/tests/test-max-data.cc b/storage/tokudb/PerconaFT/portability/tests/test-max-data.cc
index dbbea974a49..fb5fc37111a 100644
--- a/storage/tokudb/PerconaFT/portability/tests/test-max-data.cc
+++ b/storage/tokudb/PerconaFT/portability/tests/test-max-data.cc
@@ -64,7 +64,7 @@ int main(int argc, char *const argv[]) {
if (verbose) printf("maxdata=%" PRIu64 " 0x%" PRIx64 "\n", maxdata, maxdata);
// check the data size
-#if defined(__x86_64__) || defined(__aarch64__)
+#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
assert(maxdata > (1ULL << 32));
#elif __i386__
assert(maxdata < (1ULL << 32));
diff --git a/storage/tokudb/PerconaFT/portability/toku_instrumentation.h b/storage/tokudb/PerconaFT/portability/toku_instrumentation.h
index 8c9390edc0a..c300f9275b8 100644
--- a/storage/tokudb/PerconaFT/portability/toku_instrumentation.h
+++ b/storage/tokudb/PerconaFT/portability/toku_instrumentation.h
@@ -52,6 +52,8 @@ class toku_instr_key {
UU(const char *name)) {}
explicit toku_instr_key(UU(pfs_key_t key_id)) {}
+
+ ~toku_instr_key() {}
};
typedef toku_instr_probe_empty toku_instr_probe;
diff --git a/storage/tokudb/PerconaFT/portability/toku_portability.h b/storage/tokudb/PerconaFT/portability/toku_portability.h
index dc506b129cd..9c5bf891eba 100644
--- a/storage/tokudb/PerconaFT/portability/toku_portability.h
+++ b/storage/tokudb/PerconaFT/portability/toku_portability.h
@@ -159,7 +159,7 @@ extern "C" {
#endif
// Deprecated functions.
-#if !defined(TOKU_ALLOW_DEPRECATED)
+#if !defined(TOKU_ALLOW_DEPRECATED) && !defined(__clang__)
int creat(const char *pathname, mode_t mode) __attribute__((__deprecated__));
int fstat(int fd, struct stat *buf) __attribute__((__deprecated__));
int stat(const char *path, struct stat *buf) __attribute__((__deprecated__));
diff --git a/storage/tokudb/PerconaFT/portability/toku_pthread.h b/storage/tokudb/PerconaFT/portability/toku_pthread.h
index 44de01244d2..e3bd3bce598 100644
--- a/storage/tokudb/PerconaFT/portability/toku_pthread.h
+++ b/storage/tokudb/PerconaFT/portability/toku_pthread.h
@@ -168,11 +168,7 @@ typedef struct toku_mutex_aligned {
}
#else // __linux__, at least
#define ZERO_COND_INITIALIZER \
- { \
- { \
- { 0 } \
- } \
- }
+ {}
#endif
static inline void toku_mutexattr_init(toku_pthread_mutexattr_t *attr) {
diff --git a/storage/tokudb/PerconaFT/portability/toku_race_tools.h b/storage/tokudb/PerconaFT/portability/toku_race_tools.h
index 9ed46ec909d..96712ffffdc 100644
--- a/storage/tokudb/PerconaFT/portability/toku_race_tools.h
+++ b/storage/tokudb/PerconaFT/portability/toku_race_tools.h
@@ -95,8 +95,8 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved.
# define TOKU_ANNOTATE_IGNORE_WRITES_BEGIN() ((void) 0)
# define TOKU_ANNOTATE_IGNORE_WRITES_END() ((void) 0)
# define TOKU_VALGRIND_RESET_MUTEX_ORDERING_INFO(mutex)
+#undef RUNNING_ON_VALGRIND
# define RUNNING_ON_VALGRIND (0U)
-
#endif
// Valgrind 3.10.1 (and previous versions).
diff --git a/storage/tokudb/PerconaFT/portability/toku_time.h b/storage/tokudb/PerconaFT/portability/toku_time.h
index a1278ef0337..c4c45b8e8c7 100644
--- a/storage/tokudb/PerconaFT/portability/toku_time.h
+++ b/storage/tokudb/PerconaFT/portability/toku_time.h
@@ -43,6 +43,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved.
#include <time.h>
#include <sys/time.h>
#include <stdint.h>
+#if defined(__powerpc__)
+# include <sys/platform/ppc.h>
+#endif
static inline float toku_tdiff (struct timeval *a, struct timeval *b) {
return (float)((a->tv_sec - b->tv_sec) + 1e-6 * (a->tv_usec - b->tv_usec));
@@ -106,6 +109,8 @@ static inline tokutime_t toku_time_now(void) {
uint64_t result;
__asm __volatile__ ("mrs %[rt], cntvct_el0" : [rt] "=r" (result));
return result;
+#elif defined(__powerpc__)
+ return __ppc_get_timebase();
#else
#error No timer implementation for this platform
#endif
diff --git a/storage/tokudb/PerconaFT/src/tests/checkpoint_stress.cc b/storage/tokudb/PerconaFT/src/tests/checkpoint_stress.cc
index 135a9843ce4..d3e5ddd5031 100644
--- a/storage/tokudb/PerconaFT/src/tests/checkpoint_stress.cc
+++ b/storage/tokudb/PerconaFT/src/tests/checkpoint_stress.cc
@@ -351,7 +351,7 @@ test_main (int argc, char * const argv[]) {
// arg that suppresses valgrind on this child process
break;
}
- // otherwise, fall through to an error
+ /* fall through */ // otherwise, fall through to an error
case 'h':
case '?':
usage(argv[0]);
diff --git a/storage/tokudb/PerconaFT/src/tests/directory_lock.cc b/storage/tokudb/PerconaFT/src/tests/directory_lock.cc
index f040e680903..b28a71704cf 100644
--- a/storage/tokudb/PerconaFT/src/tests/directory_lock.cc
+++ b/storage/tokudb/PerconaFT/src/tests/directory_lock.cc
@@ -69,7 +69,7 @@ static void verify_shared_ops_fail(DB_ENV* env, DB* db) {
uint32_t flags = 0;
DBT key,val;
DBT in_key,in_val;
- uint32_t in_key_data, in_val_data = 0;
+ uint32_t in_key_data = 0, in_val_data = 0;
memset(&in_key, 0, sizeof(in_key));
memset(&in_val, 0, sizeof(in_val));
in_key.size = sizeof(in_key_data);
diff --git a/storage/tokudb/PerconaFT/src/tests/loader-cleanup-test.cc b/storage/tokudb/PerconaFT/src/tests/loader-cleanup-test.cc
index ea894683c23..a229cb5b565 100644
--- a/storage/tokudb/PerconaFT/src/tests/loader-cleanup-test.cc
+++ b/storage/tokudb/PerconaFT/src/tests/loader-cleanup-test.cc
@@ -172,12 +172,12 @@ err_type_str (enum test_type t) {
case einval_o: return "open";
case enospc_fc: return "fclose";
case abort_via_poll: return "abort_via_poll";
- case commit: assert(0);
- case abort_txn: assert(0);
- case abort_loader: assert(0);
+ case commit: abort();
+ case abort_txn: abort();
+ case abort_loader: abort();
}
// I know that Barry prefers the single-return case, but writing the code this way means that the compiler will complain if I forget something in the enum. -Bradley
- assert(0);
+ abort();
return NULL;
}
@@ -193,12 +193,12 @@ err_msg_type_str (enum test_type t) {
case einval_o: return "EINVAL";
case enospc_fc: return "ENOSPC";
case abort_via_poll: return "non-zero";
- case commit: assert(0);
- case abort_txn: assert(0);
- case abort_loader: assert(0);
+ case commit: abort();
+ case abort_txn: abort();
+ case abort_loader: abort();
}
// I know that Barry prefers the single-return case, but writing the code this way means that the compiler will complain if I forget something in the enum. -Bradley
- assert(0);
+ abort();
return NULL;
}
@@ -873,7 +873,7 @@ static void run_test(enum test_type t, int trigger)
case abort_via_poll:
poll_count_trigger = trigger; break;
default:
- assert(0);
+ abort();
}
diff --git a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-abort.cc b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-abort.cc
index a8455c0f406..425c12e1a90 100644
--- a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-abort.cc
+++ b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-abort.cc
@@ -81,7 +81,7 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals
memcpy(dest_key->data, &pri_data[dbnum], dest_key->size);
break;
default:
- assert(0);
+ abort();
}
if (dest_val) {
@@ -95,9 +95,9 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals
}
break;
case DB_DBT_REALLOC:
- assert(0);
+ abort();
default:
- assert(0);
+ abort();
}
}
diff --git a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-srcdb-fdelete-all.cc b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-srcdb-fdelete-all.cc
index e823a74627d..75479cb69c4 100644
--- a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-srcdb-fdelete-all.cc
+++ b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-srcdb-fdelete-all.cc
@@ -85,7 +85,7 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals
memcpy(dest_key->data, &pri_data[dbnum], dest_key->size);
break;
default:
- assert(0);
+ abort();
}
if (dest_val) {
@@ -99,9 +99,9 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals
}
break;
case DB_DBT_REALLOC:
- assert(0);
+ abort();
default:
- assert(0);
+ abort();
}
}
diff --git a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple.cc b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple.cc
index c2ee80c438f..9f4b1cd9cb8 100644
--- a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple.cc
+++ b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple.cc
@@ -84,7 +84,7 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals
memcpy(dest_key->data, &pri_data[dbnum], dest_key->size);
break;
default:
- assert(0);
+ abort();
}
if (dest_val) {
@@ -98,9 +98,9 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals
}
break;
case DB_DBT_REALLOC:
- assert(0);
+ abort();
default:
- assert(0);
+ abort();
}
}
diff --git a/storage/tokudb/PerconaFT/src/tests/recover-put-multiple-abort.cc b/storage/tokudb/PerconaFT/src/tests/recover-put-multiple-abort.cc
index d045800960c..da40a61f24b 100644
--- a/storage/tokudb/PerconaFT/src/tests/recover-put-multiple-abort.cc
+++ b/storage/tokudb/PerconaFT/src/tests/recover-put-multiple-abort.cc
@@ -81,7 +81,7 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals
memcpy(dest_key->data, &pri_data[dbnum], dest_key->size);
break;
default:
- assert(0);
+ abort();
}
if (dest_val) {
@@ -95,9 +95,9 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals
}
break;
case DB_DBT_REALLOC:
- assert(0);
+ abort();
default:
- assert(0);
+ abort();
}
}
diff --git a/storage/tokudb/PerconaFT/src/tests/recovery_fileops_unit.cc b/storage/tokudb/PerconaFT/src/tests/recovery_fileops_unit.cc
index cc99ab560d8..45f0b465db4 100644
--- a/storage/tokudb/PerconaFT/src/tests/recovery_fileops_unit.cc
+++ b/storage/tokudb/PerconaFT/src/tests/recovery_fileops_unit.cc
@@ -158,7 +158,7 @@ do_args(int argc, char * const argv[]) {
choices[i] = -1;
}
- char c;
+ signed char c;
while ((c = getopt(argc, argv, "vqhcrO:A:B:C:D:E:F:G:H:I:J:X:")) != -1) {
switch (c) {
case 'v':
@@ -217,7 +217,7 @@ do_args(int argc, char * const argv[]) {
// arg that suppresses valgrind on this child process
break;
}
- // otherwise, fall through to an error
+ /* fall through */ // otherwise, fall through to an error
default:
usage();
break;
diff --git a/storage/tokudb/PerconaFT/src/tests/test-prepare3.cc b/storage/tokudb/PerconaFT/src/tests/test-prepare3.cc
index 5cb3796a26b..f57fc963529 100644
--- a/storage/tokudb/PerconaFT/src/tests/test-prepare3.cc
+++ b/storage/tokudb/PerconaFT/src/tests/test-prepare3.cc
@@ -128,6 +128,7 @@ static void check_prepared_list (enum prepared_state ps[NTXNS], long count, DB_P
goto next;
case PREPARED:
count_prepared++;
+ /* fall through */
case MAYBE_COMMITTED:
case MAYBE_ABORTED:
count_maybe_prepared++;
diff --git a/storage/tokudb/hatoku_hton.cc b/storage/tokudb/hatoku_hton.cc
index de8cc576c19..437c71f69dd 100644
--- a/storage/tokudb/hatoku_hton.cc
+++ b/storage/tokudb/hatoku_hton.cc
@@ -978,7 +978,7 @@ static bool tokudb_sync_on_prepare(void) {
}
static int tokudb_xa_prepare(handlerton* hton, THD* thd, bool all) {
- TOKUDB_DBUG_ENTER("");
+ TOKUDB_DBUG_ENTER("%u", all);
TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "enter");
int r = 0;
@@ -1006,6 +1006,22 @@ static int tokudb_xa_prepare(handlerton* hton, THD* thd, bool all) {
r = txn->xa_prepare(txn, &thd_xid, syncflag);
// test hook to induce a crash on a debug build
DBUG_EXECUTE_IF("tokudb_crash_prepare_after", DBUG_SUICIDE(););
+
+ // XA log entries can be interleaved in the binlog since XA prepare on the master
+ // flushes to the binlog. There can be log entries from different clients pushed
+ // into the binlog before XA commit is executed on the master. Therefore, the slave
+ // thread must be able to juggle multiple XA transactions. Tokudb does this by
+ // zapping the client transaction context on the slave when executing the XA prepare
+ // and expecting to process XA commit with commit_by_xid (which supplies the XID so
+ // that the transaction can be looked up and committed).
+ if (r == 0 && all && thd->slave_thread) {
+ TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "zap txn context %u", thd_sql_command(thd));
+ if (thd_sql_command(thd) == SQLCOM_XA_PREPARE) {
+ trx->all = NULL;
+ trx->sub_sp_level = NULL;
+ trx->sp_level = NULL;
+ }
+ }
} else {
TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "nothing to prepare %d", all);
}
@@ -1036,6 +1052,7 @@ static int tokudb_xa_recover(handlerton* hton, XID* xid_list, uint len) {
static int tokudb_commit_by_xid(handlerton* hton, XID* xid) {
TOKUDB_DBUG_ENTER("");
TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "enter");
+ TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "xid %p", xid);
int r = 0;
DB_TXN* txn = NULL;
TOKU_XA_XID* toku_xid = (TOKU_XA_XID*)xid;
@@ -1055,6 +1072,7 @@ cleanup:
static int tokudb_rollback_by_xid(handlerton* hton, XID* xid) {
TOKUDB_DBUG_ENTER("");
TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "enter");
+ TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "xid %p", xid);
int r = 0;
DB_TXN* txn = NULL;
TOKU_XA_XID* toku_xid = (TOKU_XA_XID*)xid;