mirror of
https://github.com/MariaDB/server.git
synced 2025-10-12 12:25:37 +03:00
Merge 10.2 into 10.3
This commit is contained in:
@@ -1878,6 +1878,35 @@ static char* xid_to_str(char *buf, XID *xid)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
static my_xid wsrep_order_and_check_continuity(XID *list, int len)
|
||||
{
|
||||
wsrep_sort_xid_array(list, len);
|
||||
wsrep_uuid_t uuid;
|
||||
wsrep_seqno_t seqno;
|
||||
if (wsrep_get_SE_checkpoint(uuid, seqno))
|
||||
{
|
||||
WSREP_ERROR("Could not read wsrep SE checkpoint for recovery");
|
||||
return 0;
|
||||
}
|
||||
long long cur_seqno= seqno;
|
||||
for (int i= 0; i < len; ++i)
|
||||
{
|
||||
if (!wsrep_is_wsrep_xid(list + i) ||
|
||||
wsrep_xid_seqno(*(list + i)) != cur_seqno + 1)
|
||||
{
|
||||
WSREP_WARN("Discovered discontinuity in recovered wsrep "
|
||||
"transaction XIDs. Truncating the recovery list to "
|
||||
"%d entries", i);
|
||||
break;
|
||||
}
|
||||
++cur_seqno;
|
||||
}
|
||||
WSREP_INFO("Last wsrep seqno to be recovered %lld", cur_seqno);
|
||||
return (cur_seqno < 0 ? 0 : cur_seqno);
|
||||
}
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
/**
|
||||
recover() step of xa.
|
||||
|
||||
@@ -1915,6 +1944,19 @@ static my_bool xarecover_handlerton(THD *unused, plugin_ref plugin,
|
||||
{
|
||||
sql_print_information("Found %d prepared transaction(s) in %s",
|
||||
got, hton_name(hton)->str);
|
||||
#ifdef WITH_WSREP
|
||||
/* If wsrep_on=ON, XIDs are first ordered and then the range of
|
||||
recovered XIDs is checked for continuity. All the XIDs which
|
||||
are in continuous range can be safely committed if binlog
|
||||
is off since they have already ordered and certified in the
|
||||
cluster. */
|
||||
my_xid wsrep_limit= 0;
|
||||
if (WSREP_ON)
|
||||
{
|
||||
wsrep_limit= wsrep_order_and_check_continuity(info->list, got);
|
||||
}
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
for (int i=0; i < got; i ++)
|
||||
{
|
||||
my_xid x= IF_WSREP(WSREP_ON && wsrep_is_wsrep_xid(&info->list[i]) ?
|
||||
@@ -1931,15 +1973,21 @@ static my_bool xarecover_handlerton(THD *unused, plugin_ref plugin,
|
||||
info->found_foreign_xids++;
|
||||
continue;
|
||||
}
|
||||
if (info->dry_run)
|
||||
if (IF_WSREP(!(wsrep_emulate_bin_log &&
|
||||
wsrep_is_wsrep_xid(info->list + i) &&
|
||||
x <= wsrep_limit) && info->dry_run,
|
||||
info->dry_run))
|
||||
{
|
||||
info->found_my_xids++;
|
||||
continue;
|
||||
}
|
||||
// recovery mode
|
||||
if (info->commit_list ?
|
||||
my_hash_search(info->commit_list, (uchar *)&x, sizeof(x)) != 0 :
|
||||
tc_heuristic_recover == TC_HEURISTIC_RECOVER_COMMIT)
|
||||
if (IF_WSREP((wsrep_emulate_bin_log &&
|
||||
wsrep_is_wsrep_xid(info->list + i) &&
|
||||
x <= wsrep_limit), false) ||
|
||||
(info->commit_list ?
|
||||
my_hash_search(info->commit_list, (uchar *)&x, sizeof(x)) != 0 :
|
||||
tc_heuristic_recover == TC_HEURISTIC_RECOVER_COMMIT))
|
||||
{
|
||||
#ifndef DBUG_OFF
|
||||
int rc=
|
||||
|
Reference in New Issue
Block a user