1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-04-18 10:24:01 +03:00
wsrep-lib/include/wsrep/streaming_context.hpp
Teemu Ollakka 3b3429d8df Work around GCC 12 warning of uninitialized use
Use pointers to pass state objects to service constructors
to work around GCC 12 warning

  error: member ‘wsrep::mock_storage_service::client_state_’
  is used uninitialized
2023-02-27 13:32:55 +02:00

181 lines
4.9 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/>.
*/
#ifndef WSREP_STREAMING_CONTEXT_HPP
#define WSREP_STREAMING_CONTEXT_HPP
#include "compiler.hpp"
#include "logger.hpp"
#include "seqno.hpp"
#include "transaction_id.hpp"
#include <vector>
namespace wsrep
{
/* Helper class to store streaming transaction context. */
class streaming_context
{
public:
enum fragment_unit
{
bytes,
row,
statement
};
streaming_context()
: fragments_certified_()
, fragments_()
, rollback_replicated_for_()
, fragment_unit_()
, fragment_size_()
, unit_counter_()
, log_position_()
{ }
/**
* Set streaming parameters.
*
* Calling this method has a side effect of resetting unit
* counter.
*
* @param fragment_unit Desired fragment unit.
* @param fragment_size Desired fragment size.
*/
void params(enum fragment_unit fragment_unit, size_t fragment_size);
/**
* Enable streaming replication.
*
* @param fragment_unit Desired fragment unit.
* @param fragment_size Desired fragment size.
*/
void enable(enum fragment_unit fragment_unit, size_t fragment_size);
/** Return current fragment unit. */
enum fragment_unit fragment_unit() const { return fragment_unit_; }
/** Return current fragment size. */
size_t fragment_size() const { return fragment_size_; }
/** Disable streaming replication. */
void disable();
/** Increment counter for certified fragments. */
void certified()
{
++fragments_certified_;
}
/** Return number of certified fragments. */
size_t fragments_certified() const
{
return fragments_certified_;
}
/** Mark fragment with seqno as stored in fragment store. */
void stored(wsrep::seqno seqno);
/** Return number of stored fragments. */
size_t fragments_stored() const
{
return fragments_.size();
}
/** Mark fragment with seqno as applied. */
void applied(wsrep::seqno seqno);
/** Mark streaming transaction as rolled back. */
void rolled_back(wsrep::transaction_id id);
/** Return true if streaming transaction has been marked
* as rolled back. */
bool rolled_back() const
{
return (rollback_replicated_for_ !=
wsrep::transaction_id::undefined());
}
/** Return current value of unit counter. */
size_t unit_counter() const
{
return unit_counter_;
}
/** Set value for unit counter. */
void set_unit_counter(size_t count)
{
unit_counter_ = count;
}
/** Increment unit counter by inc. */
void increment_unit_counter(size_t inc)
{
unit_counter_ += inc;
}
/** Reset unit counter to zero. */
void reset_unit_counter()
{
unit_counter_ = 0;
}
/** Return current log position. */
size_t log_position() const
{
return log_position_;
}
/** Set log position. */
void set_log_position(size_t position)
{
log_position_ = position;
}
/** Return vector of stored fragments. */
const std::vector<wsrep::seqno>& fragments() const
{
return fragments_;
}
/** Return true if the fragment size was exceeded. */
bool fragment_size_exceeded() const
{
return unit_counter_ >= fragment_size_;
}
/** Clean up the streaming transaction state. */
void cleanup();
private:
void check_fragment_seqno(wsrep::seqno seqno);
size_t fragments_certified_;
std::vector<wsrep::seqno> fragments_;
wsrep::transaction_id rollback_replicated_for_;
enum fragment_unit fragment_unit_;
size_t fragment_size_;
size_t unit_counter_;
size_t log_position_;
};
}
#endif // WSREP_STREAMING_CONTEXT_HPP