mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-07-31 18:24:25 +03:00
The changes:
* Removed WITH_WSREP_SR_SPEEDUP_REPLAY and DEBUG_SR_SPEEDUP_REPLAY * Added "--wsrep_SR_store=undolog" for enabling SR speedup * Modified MTR tests "galera_sr.GCF-572" and "galera_sr.galera_sr_cc_master" * Improved the code that removes unneeded fragments from binlog_fragment_cache. Now all galera_sr tests succeed when SR speedup is disabled and most galera_sr MTR tests succeed when SR speedup up is enabled. The failing tests are listed in "skipped_tests" file. The following MTR test suite run succeeds: (cd mysql-test; ./mysql-test-run.pl --mysqld="--wsrep_SR_store=undolog" --suite=galera_sr --skip-test-list=../skipped_tests --force)
This commit is contained in:
@ -53,15 +53,13 @@ option(WSREP_LIB_MAINTAINER_MODE "Fail compilation on any warnings" OFF)
|
|||||||
#
|
#
|
||||||
# Option for WSREP's Streaming Replication speedup
|
# Option for WSREP's Streaming Replication speedup
|
||||||
#
|
#
|
||||||
option(WITH_WSREP_SR_SPEEDUP "WSREP's Streaming Replication speedup" ON)
|
option(WITH_WSREP_SR_SPEEDUP "WSREP's Streaming Replication speedup" ${WITH_WSREP})
|
||||||
#option(WITH_WSREP_SR_SPEEDUP "WSREP's Streaming Replication speedup" OFF)
|
#option(WITH_WSREP_SR_SPEEDUP "WSREP's Streaming Replication speedup" OFF)
|
||||||
## add_definitions(-DWITH_WSREP_SR_SPEEDUP_CHECK)
|
## add_definitions(-DWITH_WSREP_SR_SPEEDUP_CHECK)
|
||||||
#option(WITH_WSREP_SR_SPEEDUP_TIME "Timing for Streaming Replication speedup" ON)
|
#option(WITH_WSREP_SR_SPEEDUP_TIME "Timing for Streaming Replication speedup" ON)
|
||||||
if (WITH_WSREP_SR_SPEEDUP)
|
if (WITH_WSREP_SR_SPEEDUP)
|
||||||
ADD_DEFINITIONS(-DWITH_WSREP_SR_SPEEDUP)
|
ADD_DEFINITIONS(-DWITH_WSREP_SR_SPEEDUP)
|
||||||
ADD_DEFINITIONS(-DDEBUG_SR_SPEEDUP)
|
ADD_DEFINITIONS(-DDEBUG_SR_SPEEDUP)
|
||||||
# ADD_DEFINITIONS(-DWITH_WSREP_SR_SPEEDUP_REPLAY)
|
|
||||||
# ADD_DEFINITIONS(-DDEBUG_SR_SPEEDUP_REPLAY)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
@ -217,8 +217,8 @@ namespace wsrep
|
|||||||
* been enabled.
|
* been enabled.
|
||||||
*/
|
*/
|
||||||
virtual void debug_crash(const char* crash_point) = 0;
|
virtual void debug_crash(const char* crash_point) = 0;
|
||||||
|
|
||||||
#ifdef WITH_WSREP_SR_SPEEDUP
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the binlog cache for the currently execution
|
* Return the binlog cache for the currently execution
|
||||||
* transaction or a NULL pointer if no such cache exists.
|
* transaction or a NULL pointer if no such cache exists.
|
||||||
|
@ -98,6 +98,9 @@ namespace wsrep
|
|||||||
const wsrep::ws_handle& ws_handle,
|
const wsrep::ws_handle& ws_handle,
|
||||||
const wsrep::ws_meta& ws_meta,
|
const wsrep::ws_meta& ws_meta,
|
||||||
const wsrep::const_buffer& data,
|
const wsrep::const_buffer& data,
|
||||||
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
|
int sr_store,
|
||||||
|
#endif /* WITH_WSREP_SR_SPEEDUP */
|
||||||
const wsrep::xid& xid) = 0;
|
const wsrep::xid& xid) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -65,13 +65,14 @@ namespace wsrep
|
|||||||
wsrep::transaction_id client_id,
|
wsrep::transaction_id client_id,
|
||||||
int flags,
|
int flags,
|
||||||
const wsrep::const_buffer& data,
|
const wsrep::const_buffer& data,
|
||||||
#ifdef WITH_WSREP_SR_SPEEDUP_REPLAY
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
|
int sr_store,
|
||||||
size_t offset,
|
size_t offset,
|
||||||
const wsrep::xid& xid,
|
const wsrep::xid& xid,
|
||||||
void *binlog_cache) = 0;
|
void *binlog_cache) = 0;
|
||||||
#else
|
#else
|
||||||
const wsrep::xid& xid) = 0;
|
const wsrep::xid& xid) = 0;
|
||||||
#endif /* WITH_WSREP_SR_SPEEDUP_REPLAY */
|
#endif /* WITH_WSREP_SR_SPEEDUP */
|
||||||
/**
|
/**
|
||||||
* Update fragment meta data after certification process.
|
* Update fragment meta data after certification process.
|
||||||
*/
|
*/
|
||||||
@ -82,8 +83,8 @@ namespace wsrep
|
|||||||
* adopted a transaction prior this call.
|
* adopted a transaction prior this call.
|
||||||
*/
|
*/
|
||||||
virtual int remove_fragments() = 0;
|
virtual int remove_fragments() = 0;
|
||||||
|
|
||||||
#ifdef WITH_WSREP_SR_SPEEDUP
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
|
|
||||||
int set_fragments_from_table() {return 0;};
|
int set_fragments_from_table() {return 0;};
|
||||||
#endif /* WITH_WSREP_SR_SPEEDUP */
|
#endif /* WITH_WSREP_SR_SPEEDUP */
|
||||||
|
|
||||||
|
@ -189,6 +189,17 @@ namespace wsrep
|
|||||||
unit_counter_ = 0;
|
unit_counter_ = 0;
|
||||||
log_position_ = 0;
|
log_position_ = 0;
|
||||||
}
|
}
|
||||||
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
|
void set_sr_store(int store_type)
|
||||||
|
{
|
||||||
|
sr_store_ = store_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_sr_store() const
|
||||||
|
{
|
||||||
|
return (sr_store_);
|
||||||
|
}
|
||||||
|
#endif /* WITH_WSREP_SR_SPEEDUP */
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void check_fragment_seqno(wsrep::seqno seqno WSREP_UNUSED)
|
void check_fragment_seqno(wsrep::seqno seqno WSREP_UNUSED)
|
||||||
@ -204,6 +215,9 @@ namespace wsrep
|
|||||||
size_t fragment_size_;
|
size_t fragment_size_;
|
||||||
size_t unit_counter_;
|
size_t unit_counter_;
|
||||||
size_t log_position_;
|
size_t log_position_;
|
||||||
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
|
int sr_store_;
|
||||||
|
#endif /* WITH_WSREP_SR_SPEEDUP */
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,6 +92,10 @@ static int apply_fragment(wsrep::server_state& server_state,
|
|||||||
int ret(0);
|
int ret(0);
|
||||||
int apply_err;
|
int apply_err;
|
||||||
wsrep::mutable_buffer err;
|
wsrep::mutable_buffer err;
|
||||||
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
|
int sr_store = streaming_applier->transaction().streaming_context().
|
||||||
|
get_sr_store();
|
||||||
|
#endif /* WITH_WSREP_SR_SPEEDUP */
|
||||||
#ifdef DEBUG_SR_SPEEDUP
|
#ifdef DEBUG_SR_SPEEDUP
|
||||||
wsrep::log_info() << "server_state: apply_fragment, line = " << line;
|
wsrep::log_info() << "server_state: apply_fragment, line = " << line;
|
||||||
#endif /* DEBUG_SR_SPEEDUP */
|
#endif /* DEBUG_SR_SPEEDUP */
|
||||||
@ -101,7 +105,10 @@ static int apply_fragment(wsrep::server_state& server_state,
|
|||||||
apply_err = streaming_applier->apply_write_set(ws_meta, data, err);
|
apply_err = streaming_applier->apply_write_set(ws_meta, data, err);
|
||||||
#ifdef DEBUG_SR_SPEEDUP
|
#ifdef DEBUG_SR_SPEEDUP
|
||||||
wsrep::log_info() << "server_state: apply_fragment, line = "
|
wsrep::log_info() << "server_state: apply_fragment, line = "
|
||||||
<< __LINE__ << ", apply_err = " << apply_err;
|
<< __LINE__ << ", apply_err = " << apply_err
|
||||||
|
<< ", sr_store = "
|
||||||
|
<< streaming_applier->transaction(
|
||||||
|
).streaming_context().get_sr_store();
|
||||||
#endif /* DEBUG_SR_SPEEDUP */
|
#endif /* DEBUG_SR_SPEEDUP */
|
||||||
if (!apply_err)
|
if (!apply_err)
|
||||||
{
|
{
|
||||||
@ -142,7 +149,11 @@ static int apply_fragment(wsrep::server_state& server_state,
|
|||||||
high_priority_service.debug_crash("crash_apply_cb_before_append_frag");
|
high_priority_service.debug_crash("crash_apply_cb_before_append_frag");
|
||||||
const wsrep::xid xid(streaming_applier->transaction().xid());
|
const wsrep::xid xid(streaming_applier->transaction().xid());
|
||||||
ret = high_priority_service.append_fragment_and_commit(
|
ret = high_priority_service.append_fragment_and_commit(
|
||||||
ws_handle, ws_meta, data, xid);
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
|
ws_handle, ws_meta, data, sr_store, xid);
|
||||||
|
#else
|
||||||
|
ws_handle, ws_meta, data, xid);
|
||||||
|
#endif /* WITH_WSREP_SR_SPEEDUP */
|
||||||
high_priority_service.debug_crash("crash_apply_cb_after_append_frag");
|
high_priority_service.debug_crash("crash_apply_cb_after_append_frag");
|
||||||
ret = ret || (high_priority_service.after_apply(), 0);
|
ret = ret || (high_priority_service.after_apply(), 0);
|
||||||
}
|
}
|
||||||
|
@ -29,10 +29,12 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#ifdef WITH_WSREP_SR_SPEEDUP_REPLAY
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
extern void *wsrep_get_current_thd();
|
extern void *wsrep_get_current_thd();
|
||||||
|
extern int fragment_cache_remove_transaction(
|
||||||
|
const wsrep::id&, wsrep::transaction_id);
|
||||||
|
#endif /* WITH_WSREP_SR_SPEEDUP */
|
||||||
|
|
||||||
#endif /* WITH_WSREP_SR_SPEEDUP_REPLAY */
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
class storage_service_deleter
|
class storage_service_deleter
|
||||||
@ -1505,9 +1507,6 @@ int wsrep::transaction::streaming_step(wsrep::unique_lock<wsrep::mutex>& lock,
|
|||||||
int wsrep::transaction::certify_fragment(
|
int wsrep::transaction::certify_fragment(
|
||||||
wsrep::unique_lock<wsrep::mutex>& lock)
|
wsrep::unique_lock<wsrep::mutex>& lock)
|
||||||
{
|
{
|
||||||
#ifdef WITH_WSREP_SR_SPEEDUP_REPLAY
|
|
||||||
void *current_thd = wsrep_get_current_thd();
|
|
||||||
#endif /* WITH_WSREP_SR_SPEEDUP_REPLAY */
|
|
||||||
#ifdef DEBUG_SR_SPEEDUP
|
#ifdef DEBUG_SR_SPEEDUP
|
||||||
wsrep::log_info() << "BEGIN certify_fragment";
|
wsrep::log_info() << "BEGIN certify_fragment";
|
||||||
#endif /* DEBUG_SR_SPEEDUP */
|
#endif /* DEBUG_SR_SPEEDUP */
|
||||||
@ -1538,7 +1537,7 @@ int wsrep::transaction::certify_fragment(
|
|||||||
}
|
}
|
||||||
streaming_context_.set_log_position(log_position);
|
streaming_context_.set_log_position(log_position);
|
||||||
|
|
||||||
#ifdef WITH_WSREP_SR_SPEEDUP_REPLAY
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
#ifdef DEBUG_SR_SPEEDUP
|
#ifdef DEBUG_SR_SPEEDUP
|
||||||
wsrep::log_info() << "certify_fragment, line = " << __LINE__
|
wsrep::log_info() << "certify_fragment, line = " << __LINE__
|
||||||
<< ", log_position = " << log_position
|
<< ", log_position = " << log_position
|
||||||
@ -1546,7 +1545,7 @@ int wsrep::transaction::certify_fragment(
|
|||||||
<< ", wsrep_get_current_thd() = "
|
<< ", wsrep_get_current_thd() = "
|
||||||
<< wsrep_get_current_thd();
|
<< wsrep_get_current_thd();
|
||||||
#endif /* DEBUG_SR_SPEEDUP */
|
#endif /* DEBUG_SR_SPEEDUP */
|
||||||
#endif /* WITH_WSREP_SR_SPEEDUP_REPLAY */
|
#endif /* WITH_WSREP_SR_SPEEDUP */
|
||||||
if (data.size() == 0)
|
if (data.size() == 0)
|
||||||
{
|
{
|
||||||
wsrep::log_warning() << "Attempt to replicate empty data buffer";
|
wsrep::log_warning() << "Attempt to replicate empty data buffer";
|
||||||
@ -1619,17 +1618,17 @@ int wsrep::transaction::certify_fragment(
|
|||||||
id(),
|
id(),
|
||||||
flags(),
|
flags(),
|
||||||
wsrep::const_buffer(data.data(), data.size()),
|
wsrep::const_buffer(data.data(), data.size()),
|
||||||
#ifdef WITH_WSREP_SR_SPEEDUP_REPLAY
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
|
streaming_context_.get_sr_store(),
|
||||||
log_position - data.size(),
|
log_position - data.size(),
|
||||||
xid(), get_binlog_cache()))
|
xid(), get_binlog_cache()))
|
||||||
#else
|
#else
|
||||||
xid()))
|
xid()))
|
||||||
#endif /* WITH_WSREP_SR_SPEEDUP_REPLAY */
|
#endif /* WITH_WSREP_SR_SPEEDUP */
|
||||||
{
|
{
|
||||||
ret = 1;
|
ret = 1;
|
||||||
error = wsrep::e_append_fragment_error;
|
error = wsrep::e_append_fragment_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_SR_SPEEDUP
|
#ifdef DEBUG_SR_SPEEDUP
|
||||||
wsrep::log_info() << "certify_fragment, line = " << __LINE__;
|
wsrep::log_info() << "certify_fragment, line = " << __LINE__;
|
||||||
#endif /* DEBUG_SR_SPEEDUP */
|
#endif /* DEBUG_SR_SPEEDUP */
|
||||||
@ -1668,7 +1667,6 @@ int wsrep::transaction::certify_fragment(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
streaming_context_.stored(sr_ws_meta.seqno());
|
streaming_context_.stored(sr_ws_meta.seqno());
|
||||||
|
|
||||||
}
|
}
|
||||||
client_service_.debug_crash(
|
client_service_.debug_crash(
|
||||||
"crash_replicate_fragment_success");
|
"crash_replicate_fragment_success");
|
||||||
@ -2059,6 +2057,10 @@ int wsrep::transaction::replay(wsrep::unique_lock<wsrep::mutex>& lock)
|
|||||||
}
|
}
|
||||||
if (is_streaming())
|
if (is_streaming())
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_SR_SPEEDUP
|
||||||
|
wsrep::log_info() << "before clear_fragments, line = "
|
||||||
|
<< __LINE__;
|
||||||
|
#endif /* DEBUG_SR_SPEEDUP */
|
||||||
clear_fragments();
|
clear_fragments();
|
||||||
}
|
}
|
||||||
provider().release(ws_handle_);
|
provider().release(ws_handle_);
|
||||||
@ -2069,10 +2071,10 @@ int wsrep::transaction::replay(wsrep::unique_lock<wsrep::mutex>& lock)
|
|||||||
if (is_streaming())
|
if (is_streaming())
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_SR_SPEEDUP
|
#ifdef DEBUG_SR_SPEEDUP
|
||||||
wsrep::log_info() << "before remove_fragments, line = "
|
wsrep::log_info() << "before remove_fragments, line = "
|
||||||
<< __LINE__;
|
<< __LINE__;
|
||||||
#endif /* DEBUG_SR_SPEEDUP */
|
#endif /* DEBUG_SR_SPEEDUP */
|
||||||
client_service_.remove_fragments();
|
client_service_.remove_fragments();
|
||||||
clear_fragments();
|
clear_fragments();
|
||||||
}
|
}
|
||||||
state(lock, s_aborted);
|
state(lock, s_aborted);
|
||||||
@ -2092,9 +2094,13 @@ int wsrep::transaction::replay(wsrep::unique_lock<wsrep::mutex>& lock)
|
|||||||
void wsrep::transaction::clear_fragments()
|
void wsrep::transaction::clear_fragments()
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_SR_SPEEDUP
|
#ifdef DEBUG_SR_SPEEDUP
|
||||||
wsrep::log_info() << "END: wsrep::transaction::clear_fragments";
|
wsrep::log_info() << "END: wsrep::transaction::clear_fragments: id = "
|
||||||
|
<< id_ << ", server = |" << server_id_ << "|";
|
||||||
#endif /* DEBUG_SR_SPEEDUP */
|
#endif /* DEBUG_SR_SPEEDUP */
|
||||||
streaming_context_.cleanup();
|
streaming_context_.cleanup();
|
||||||
|
#ifdef WITH_WSREP_SR_SPEEDUP
|
||||||
|
fragment_cache_remove_transaction(server_id_, id_);
|
||||||
|
#endif /* WITH_WSREP_SR_SPEEDUP */
|
||||||
}
|
}
|
||||||
|
|
||||||
void wsrep::transaction::cleanup()
|
void wsrep::transaction::cleanup()
|
||||||
|
Reference in New Issue
Block a user