Skip to content
Permalink
Browse files

5.5.45-37.4

  • Loading branch information...
vuvova committed Oct 8, 2015
1 parent 1b0c81c commit db79f4cf613c77391216988d2a9273a68e0c3c11
@@ -2667,10 +2667,14 @@ dict_foreign_remove_from_cache(
if (rbt != NULL && foreign->id != NULL) {
const ib_rbt_node_t* node
= rbt_lookup(rbt, foreign->id);
dict_foreign_t* val = *(dict_foreign_t**) node->value;

if (val == foreign) {
rbt_delete(rbt, foreign->id);
if (node != NULL) {
dict_foreign_t* val
= *(dict_foreign_t**) node->value;

if (val == foreign) {
rbt_delete(rbt, foreign->id);
}
}
}
}
@@ -2686,10 +2690,14 @@ dict_foreign_remove_from_cache(
if (rbt != NULL && foreign->id != NULL) {
const ib_rbt_node_t* node
= rbt_lookup(rbt, foreign->id);
dict_foreign_t* val = *(dict_foreign_t**) node->value;

if (val == foreign) {
rbt_delete(rbt, foreign->id);
if (node != NULL) {
dict_foreign_t* val
= *(dict_foreign_t**) node->value;

if (val == foreign) {
rbt_delete(rbt, foreign->id);
}
}
}
}
@@ -1,6 +1,6 @@
/*****************************************************************************
Copyright (c) 1997, 2009, Innobase Oy. 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
@@ -111,6 +111,17 @@ struct purge_node_struct{
purge of a row */
};

#ifdef UNIV_DEBUG
/***********************************************************//**
Validate the persisent cursor in the purge node. The purge node has two
references to the clustered index record - one via the ref member, and the
other via the persistent cursor. These two references must match each
other if the found_clust flag is set.
@return true if the persistent cursor is consistent with the ref member.*/
ibool
row_purge_validate_pcur(purge_node_t* node);
#endif /* UNIV_DEBUG */

#ifndef UNIV_NONINL
#include "row0purge.ic"
#endif
@@ -264,7 +264,6 @@ extern ulint srv_ibuf_active_contract;
extern ulint srv_ibuf_accel_rate;
extern ulint srv_checkpoint_age_target;
extern ulint srv_flush_neighbor_pages;
extern ulint srv_enable_unsafe_group_commit;
extern ulint srv_read_ahead;
extern ulint srv_adaptive_flushing_method;

@@ -64,7 +64,7 @@ component, i.e. we show M.N.P as M.N */
(INNODB_VERSION_MAJOR << 8 | INNODB_VERSION_MINOR)

#ifndef PERCONA_INNODB_VERSION
#define PERCONA_INNODB_VERSION 37.3
#define PERCONA_INNODB_VERSION 37.4
#endif

#define INNODB_VERSION_STR MYSQL_SERVER_VERSION
@@ -1,6 +1,6 @@
/***********************************************************************
Copyright (c) 1995, 2010, Innobase Oy. All Rights Reserved.
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2009, Percona Inc.
Portions of this file contain modifications contributed and copyrighted
@@ -1288,16 +1288,19 @@ os_file_create_simple_no_error_handling_func(
#else /* __WIN__ */
os_file_t file;
int create_flag;
const char* mode_str = NULL;

ut_a(name);

if (create_mode == OS_FILE_OPEN) {
mode_str = "OPEN";
if (access_type == OS_FILE_READ_ONLY) {
create_flag = O_RDONLY;
} else {
create_flag = O_RDWR;
}
} else if (create_mode == OS_FILE_CREATE) {
mode_str = "CREATE";
create_flag = O_RDWR | O_CREAT | O_EXCL;
} else {
create_flag = 0;
@@ -1322,6 +1325,14 @@ os_file_create_simple_no_error_handling_func(
#endif
} else {
*success = TRUE;

/* This function is always called for data files, we should
disable OS caching (O_DIRECT) here as we do in
os_file_create_func(), so we open the same file in the same
mode, see man page of open(2). */
if (srv_unix_file_flush_method == SRV_UNIX_O_DIRECT) {
os_file_set_nocache(file, name, mode_str);
}
}

return(file);
@@ -1,6 +1,6 @@
/*****************************************************************************
Copyright (c) 1997, 2011, 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
@@ -43,6 +43,7 @@ Created 3/14/1997 Heikki Tuuri
#include "row0vers.h"
#include "row0mysql.h"
#include "log0log.h"
#include "rem0cmp.h"

/*************************************************************************
IMPORTANT NOTE: Any operation that generates redo MUST check that there
@@ -80,7 +81,7 @@ row_purge_node_create(

/***********************************************************//**
Repositions the pcur in the purge node on the clustered index record,
if found.
if found. If the record is not found, close pcur.
@return TRUE if the record was found */
static
ibool
@@ -90,23 +91,28 @@ row_purge_reposition_pcur(
purge_node_t* node, /*!< in: row purge node */
mtr_t* mtr) /*!< in: mtr */
{
ibool found;

if (node->found_clust) {
found = btr_pcur_restore_position(mode, &(node->pcur), mtr);
ut_ad(row_purge_validate_pcur(node));

return(found);
}
node->found_clust = btr_pcur_restore_position(
mode, &(node->pcur), mtr);

} else {

node->found_clust = row_search_on_row_ref(
&(node->pcur), mode, node->table, node->ref, mtr);

found = row_search_on_row_ref(&(node->pcur), mode, node->table,
node->ref, mtr);
node->found_clust = found;
if (node->found_clust) {
btr_pcur_store_position(&(node->pcur), mtr);
}
}

if (found) {
btr_pcur_store_position(&(node->pcur), mtr);
/* Close the current cursor if we fail to position it correctly. */
if (!node->found_clust) {
btr_pcur_close(&node->pcur);
}

return(found);
return(node->found_clust);
}

/***********************************************************//**
@@ -143,8 +149,8 @@ row_purge_remove_clust_if_poss_low(

if (!success) {
/* The record is already removed */

btr_pcur_commit_specify_mtr(pcur, &mtr);
/* Persistent cursor is closed if reposition fails. */
mtr_commit(&mtr);

return(TRUE);
}
@@ -258,7 +264,12 @@ row_purge_poss_sec(
btr_pcur_get_rec(&node->pcur),
&mtr, index, entry);

btr_pcur_commit_specify_mtr(&node->pcur, &mtr);
/* Persistent cursor is closed if reposition fails. */
if (node->found_clust) {
btr_pcur_commit_specify_mtr(&node->pcur, &mtr);
} else {
mtr_commit(&mtr);
}

return(can_delete);
}
@@ -806,3 +817,53 @@ row_purge_step(

return(thr);
}

#ifdef UNIV_DEBUG
/***********************************************************//**
Validate the persisent cursor in the purge node. The purge node has two
references to the clustered index record - one via the ref member, and the
other via the persistent cursor. These two references must match each
other if the found_clust flag is set.
@return true if the stored copy of persistent cursor is consistent
with the ref member.*/
ibool
row_purge_validate_pcur(
purge_node_t* node)
{
dict_index_t* clust_index;
ulint* offsets;
int st;

if (!node->found_clust) {
return(TRUE);
}

if (node->index == NULL) {
return(TRUE);
}

if (node->pcur.old_stored != BTR_PCUR_OLD_STORED) {
return(TRUE);
}

clust_index = node->pcur.btr_cur.index;

offsets = rec_get_offsets(node->pcur.old_rec, clust_index, NULL,
node->pcur.old_n_fields, &node->heap);

/* Here we are comparing the purge ref record and the stored initial
part in persistent cursor. Both cases we store n_uniq fields of the
cluster index and so it is fine to do the comparison. We note this
dependency here as pcur and ref belong to different modules. */
st = cmp_dtuple_rec(node->ref, node->pcur.old_rec, offsets);

if (st != 0) {
fprintf(stderr, "Purge node pcur validation failed\n");
dtuple_print(stderr, node->ref);
rec_print(stderr, node->pcur.old_rec, clust_index);
return(FALSE);
}

return(TRUE);
}
#endif /* UNIV_DEBUG */
@@ -427,7 +427,6 @@ UNIV_INTERN ulint srv_ibuf_accel_rate = 100;
UNIV_INTERN ulint srv_checkpoint_age_target = 0;
UNIV_INTERN ulint srv_flush_neighbor_pages = 1; /* 0:disable 1:area 2:contiguous */

UNIV_INTERN ulint srv_enable_unsafe_group_commit = 0; /* 0:disable 1:enable */
UNIV_INTERN ulint srv_read_ahead = 3; /* 1: random 2: linear 3: Both */
UNIV_INTERN ulint srv_adaptive_flushing_method = 0; /* 0: native 1: estimate 2: keep_average */

0 comments on commit db79f4c

Please sign in to comment.
You can’t perform that action at this time.