1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-04-19 21:02:17 +03:00
wsrep-lib/test/test_utils.cpp
Teemu Ollakka 19eaed587c Fix total order BF abort
Streaming rollback for total order BF abort used regular
BF abort codepath, which was not correct because the streaming
rollback must fully complete before total order operation executes.
Fixed this by adjusting bf_aborted_in_total_order_
before streaming_rollback() gets called.
2023-03-02 08:37:12 +02:00

76 lines
2.7 KiB
C++

/*
* Copyright (C) 2018 Codership Oy <info@codership.com>
*
* This file is part of wsrep-lib.
*
* Wsrep-lib 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 Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* Wsrep-lib is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with wsrep-lib. If not, see <https://www.gnu.org/licenses/>.
*/
#include "test_utils.hpp"
#include "wsrep/client_state.hpp"
#include "mock_server_state.hpp"
// Simple BF abort method to BF abort unordered transasctions
void wsrep_test::bf_abort_unordered(wsrep::client_state& cc)
{
assert(cc.transaction().ordered() == false);
cc.bf_abort(wsrep::seqno(1));
}
void wsrep_test::bf_abort_ordered(wsrep::client_state& cc)
{
assert(cc.transaction().ordered());
cc.bf_abort(wsrep::seqno(0));
}
void wsrep_test::bf_abort_in_total_order(wsrep::client_state& cc)
{
cc.total_order_bf_abort(wsrep::seqno(0));
}
// BF abort method to abort transactions via provider
void wsrep_test::bf_abort_provider(wsrep::mock_server_state& sc,
const wsrep::transaction& tc,
wsrep::seqno bf_seqno)
{
wsrep::seqno victim_seqno;
sc.provider().bf_abort(bf_seqno, tc.id(), victim_seqno);
(void)victim_seqno;
}
void wsrep_test::terminate_streaming_applier(
wsrep::mock_server_state& sc,
const wsrep::id& server_id,
wsrep::transaction_id transaction_id)
{
// Note that all other arguments than server_id and
// transaction_id are chosen arbitrarily and it is hoped
// that the mock implementation does not freak out about it.
wsrep::mock_client mc(sc, wsrep::client_id(10),
wsrep::client_state::m_high_priority);
mc.open(wsrep::client_id(10));
mc.before_command();
wsrep::mock_high_priority_service hps(sc, &mc, false);
wsrep::ws_handle ws_handle(transaction_id, (void*)(1));
wsrep::ws_meta ws_meta(wsrep::gtid(wsrep::id("cluster1"),
wsrep::seqno(100)),
wsrep::stid(server_id,
transaction_id,
wsrep::client_id(1)),
wsrep::seqno(0),
wsrep::provider::flag::rollback);
wsrep::const_buffer data(0, 0);
sc.on_apply(hps, ws_handle, ws_meta, data);
}