Skip to content

Commit

Permalink
MDEV-7129 : Galera duplicate error on autoincrement field primary key
Browse files Browse the repository at this point in the history
Merged fix for codership/mysql-wsrep#18.
  • Loading branch information
Nirbhay Choubey committed Jan 7, 2015
1 parent 455f77b commit 54b26b4
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 7 deletions.
3 changes: 2 additions & 1 deletion sql/wsrep_hton.cc
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,8 @@ wsrep_run_wsrep_commit(THD *thd, handlerton *hton, bool all)
case WSREP_BF_ABORT:
DBUG_ASSERT(thd->wsrep_trx_meta.gtid.seqno != WSREP_SEQNO_UNDEFINED);
case WSREP_TRX_FAIL:
WSREP_DEBUG("commit failed for reason: %d", rcode);
WSREP_DEBUG("commit failed for reason: %d %lu %s", rcode, thd->thread_id,
thd->query());
DBUG_PRINT("wsrep", ("replicating commit fail"));

thd->wsrep_query_state= QUERY_EXEC;
Expand Down
28 changes: 24 additions & 4 deletions storage/innobase/handler/ha_innodb.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7623,6 +7623,14 @@ ha_innobase::write_row(
#ifdef WITH_WSREP
/* workaround for LP bug #355000, retrying the insert */
case SQLCOM_INSERT:

WSREP_DEBUG("DUPKEY error for autoinc\n"
"THD %ld, value %llu, off %llu inc %llu",
wsrep_thd_thread_id(current_thd),
auto_inc,
prebuilt->autoinc_offset,
prebuilt->autoinc_increment);

if (wsrep_on(current_thd) &&
auto_inc_inserted &&
wsrep_drupal_282555_workaround &&
Expand All @@ -7638,8 +7646,7 @@ ha_innobase::write_row(
error= DB_SUCCESS;
wsrep_thd_set_conflict_state(
current_thd, MUST_ABORT);
innobase_srv_conc_exit_innodb(
prebuilt->trx);
innobase_srv_conc_exit_innodb(prebuilt->trx);
/* jump straight to func exit over
* later wsrep hooks */
goto func_exit;
Expand Down Expand Up @@ -9700,10 +9707,10 @@ wsrep_append_key(
DBUG_ENTER("wsrep_append_key");
bool const copy = true;
#ifdef WSREP_DEBUG_PRINT
fprintf(stderr, "%s conn %ld, trx %llu, keylen %d, table %s ",
fprintf(stderr, "%s conn %ld, trx %llu, keylen %d, table %s\n Query: %s ",
(shared) ? "Shared" : "Exclusive",
wsrep_thd_thread_id(thd), (long long)trx->id, key_len,
table_share->table_name.str);
table_share->table_name.str, wsrep_thd_query(thd));
for (int i=0; i<key_len; i++) {
fprintf(stderr, "%hhX, ", key[i]);
}
Expand Down Expand Up @@ -14746,7 +14753,20 @@ ha_innobase::get_auto_increment(
next value in the series. */
if (prebuilt->autoinc_increment > increment) {

#ifdef WITH_WSREP
WSREP_DEBUG("autoinc decrease: %llu -> %llu\n"
"THD: %ld, current: %llu, autoinc: %llu",
prebuilt->autoinc_increment,
increment,
wsrep_thd_thread_id(ha_thd()),
current, autoinc);
if (!wsrep_on(ha_thd()))
{
#endif /* WITH_WSREP */
current = autoinc - prebuilt->autoinc_increment;
#ifdef WITH_WSREP
}
#endif /* WITH_WSREP */

current = innobase_next_autoinc(
current, 1, increment, 1, col_max_value);
Expand Down
25 changes: 23 additions & 2 deletions storage/xtradb/handler/ha_innodb.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8207,6 +8207,14 @@ ha_innobase::write_row(
#ifdef WITH_WSREP
/* workaround for LP bug #355000, retrying the insert */
case SQLCOM_INSERT:

WSREP_DEBUG("DUPKEY error for autoinc\n"
"THD %ld, value %llu, off %llu inc %llu",
wsrep_thd_thread_id(current_thd),
auto_inc,
prebuilt->autoinc_offset,
prebuilt->autoinc_increment);

if (wsrep_on(current_thd) &&
auto_inc_inserted &&
wsrep_drupal_282555_workaround &&
Expand Down Expand Up @@ -10331,10 +10339,10 @@ wsrep_append_key(
DBUG_ENTER("wsrep_append_key");
bool const copy = true;
#ifdef WSREP_DEBUG_PRINT
fprintf(stderr, "%s conn %ld, trx %llu, keylen %d, table %s ",
fprintf(stderr, "%s conn %ld, trx %llu, keylen %d, table %s\n Query: %s ",
(shared) ? "Shared" : "Exclusive",
wsrep_thd_thread_id(thd), (long long)trx->id, key_len,
table_share->table_name.str);
table_share->table_name.str, wsrep_thd_query(thd));
for (int i=0; i<key_len; i++) {
fprintf(stderr, "%hhX, ", key[i]);
}
Expand Down Expand Up @@ -15445,7 +15453,20 @@ ha_innobase::get_auto_increment(
next value in the series. */
if (prebuilt->autoinc_increment > increment) {

#ifdef WITH_WSREP
WSREP_DEBUG("autoinc decrease: %llu -> %llu\n"
"THD: %ld, current: %llu, autoinc: %llu",
prebuilt->autoinc_increment,
increment,
wsrep_thd_thread_id(ha_thd()),
current, autoinc);
if (!wsrep_on(ha_thd()))
{
#endif /* WITH_WSREP */
current = autoinc - prebuilt->autoinc_increment;
#ifdef WITH_WSREP
}
#endif /* WITH_WSREP */

current = innobase_next_autoinc(
current, 1, increment, 1, col_max_value);
Expand Down

0 comments on commit 54b26b4

Please sign in to comment.