1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-07-25 21:41:56 +03:00

* Added size exceeded error code

* Return provider status from selected client_state calls
* Added more methods to provider interface
This commit is contained in:
Teemu Ollakka
2018-06-20 19:44:20 +03:00
parent bf7dad6815
commit ef0fb72b73
9 changed files with 109 additions and 15 deletions

View File

@ -30,6 +30,7 @@ namespace wsrep
e_error_during_commit, e_error_during_commit,
e_deadlock_error, e_deadlock_error,
e_interrupted_error, e_interrupted_error,
e_size_exceeded_error,
e_append_fragment_error e_append_fragment_error
}; };
@ -41,6 +42,7 @@ namespace wsrep
case e_error_during_commit: return "error_during_commit"; case e_error_during_commit: return "error_during_commit";
case e_deadlock_error: return "deadlock_error"; case e_deadlock_error: return "deadlock_error";
case e_interrupted_error: return "interrupted_error"; case e_interrupted_error: return "interrupted_error";
case e_size_exceeded_error: return "size_exceeded";
case e_append_fragment_error: return "append_fragment_error"; case e_append_fragment_error: return "append_fragment_error";
} }
return "unknown"; return "unknown";
@ -393,7 +395,7 @@ namespace wsrep
* in the DBMS cluster, so it may be relatively heavy operation. * in the DBMS cluster, so it may be relatively heavy operation.
* Method wait_for_gtid() should be used whenever possible. * Method wait_for_gtid() should be used whenever possible.
*/ */
int causal_read() const; enum wsrep::provider::status causal_read() const;
/** /**
* Wait until all the write sets up to given GTID have been * Wait until all the write sets up to given GTID have been
@ -401,7 +403,7 @@ namespace wsrep
* *
* @return Zero on success, non-zero on failure. * @return Zero on success, non-zero on failure.
*/ */
int wait_for_gtid(const wsrep::gtid&) const; enum wsrep::provider::status wait_for_gtid(const wsrep::gtid&) const;
// //
// //
@ -413,7 +415,7 @@ namespace wsrep
/** /**
* Enter total order isolation critical section. * Enter total order isolation critical section.
*/ */
int enter_toi(); enum wsrep::provider::status enter_toi();
/** /**
* Leave total order isolation critical section. * Leave total order isolation critical section.
@ -423,7 +425,7 @@ namespace wsrep
/** /**
* Begin non-blocking operation. * Begin non-blocking operation.
*/ */
int begin_nbo(); int begin_nbo(const wsrep::key_array&);
/** /**
* End non-blocking operation * End non-blocking operation

View File

@ -57,6 +57,9 @@ namespace wsrep
wsrep::const_buffer key_parts_[3]; wsrep::const_buffer key_parts_[3];
size_t key_parts_len_; size_t key_parts_len_;
}; };
typedef std::vector<wsrep::key> key_array;
} }
#endif // WSREP_KEY_HPP #endif // WSREP_KEY_HPP

View File

@ -196,7 +196,7 @@ namespace wsrep
/** /**
* Provider capabilities. * Provider capabilities.
*/ */
struct capabilities struct capability
{ {
static const int multi_master = (1 << 0); static const int multi_master = (1 << 0);
static const int certification = (1 << 1); static const int certification = (1 << 1);
@ -228,6 +228,12 @@ namespace wsrep
bool bootstrap) = 0; bool bootstrap) = 0;
virtual int disconnect() = 0; virtual int disconnect() = 0;
virtual int capabilities() const = 0;
virtual int desync() = 0;
virtual int resync() = 0;
virtual int pause() = 0;
virtual int resume() = 0;
// Applier interface // Applier interface
virtual enum status run_applier(void* applier_ctx) = 0; virtual enum status run_applier(void* applier_ctx) = 0;
@ -235,7 +241,8 @@ namespace wsrep
// TODO: Rename to assing_read_view() // TODO: Rename to assing_read_view()
virtual int start_transaction(wsrep::ws_handle&) = 0; virtual int start_transaction(wsrep::ws_handle&) = 0;
virtual int append_key(wsrep::ws_handle&, const wsrep::key&) = 0; virtual int append_key(wsrep::ws_handle&, const wsrep::key&) = 0;
virtual int append_data(wsrep::ws_handle&, const wsrep::const_buffer&) = 0; virtual enum status append_data(
wsrep::ws_handle&, const wsrep::const_buffer&) = 0;
virtual enum status virtual enum status
certify(wsrep::client_id, wsrep::ws_handle&, certify(wsrep::client_id, wsrep::ws_handle&,
int, int,
@ -274,6 +281,10 @@ namespace wsrep
virtual int sst_received(const wsrep::gtid&, int) = 0; virtual int sst_received(const wsrep::gtid&, int) = 0;
virtual std::vector<status_variable> status() const = 0; virtual std::vector<status_variable> status() const = 0;
virtual void reset_status() = 0;
virtual std::string options() const = 0;
virtual void options(const std::string&) = 0;
/** /**
* Return pointer to native provider handle. * Return pointer to native provider handle.

View File

@ -316,6 +316,7 @@ namespace wsrep
const wsrep::ws_meta& ws_meta, const wsrep::ws_meta& ws_meta,
const wsrep::const_buffer& data); const wsrep::const_buffer& data);
enum state state() const { return state_; }
/** /**
* Set server wide wsrep debug logging level. * Set server wide wsrep debug logging level.
* *

View File

@ -155,7 +155,7 @@ namespace wsrep
wsrep::streaming_context streaming_context_; wsrep::streaming_context streaming_context_;
}; };
static inline std::string to_string(enum wsrep::transaction::state state) static inline const char* to_c_string(enum wsrep::transaction::state state)
{ {
switch (state) switch (state)
{ {
@ -174,6 +174,10 @@ namespace wsrep
} }
return "unknown"; return "unknown";
} }
static inline std::string to_string(enum wsrep::transaction::state state)
{
return to_c_string(state);
}
} }

View File

@ -196,7 +196,7 @@ wsrep::client_state::after_statement()
(void)transaction_.after_statement(); (void)transaction_.after_statement();
if (current_error() == wsrep::e_deadlock_error) if (current_error() == wsrep::e_deadlock_error)
{ {
if (client_service_.is_autocommit()) if (mode_ == m_replicating && client_service_.is_autocommit())
{ {
debug_log_state("after_statement: may_retry"); debug_log_state("after_statement: may_retry");
return asr_may_retry; return asr_may_retry;

View File

@ -506,6 +506,30 @@ int wsrep::wsrep_provider_v26::disconnect()
return ret; return ret;
} }
int wsrep::wsrep_provider_v26::capabilities() const
{
return wsrep_->capabilities(wsrep_);
}
int wsrep::wsrep_provider_v26::desync()
{
return (wsrep_->desync(wsrep_) != WSREP_OK);
}
int wsrep::wsrep_provider_v26::resync()
{
return (wsrep_->resync(wsrep_) != WSREP_OK);
}
int wsrep::wsrep_provider_v26::pause()
{
return (wsrep_->pause(wsrep_) != WSREP_OK);
}
int wsrep::wsrep_provider_v26::resume()
{
return (wsrep_->resume(wsrep_) != WSREP_OK);
}
enum wsrep::provider::status enum wsrep::provider::status
wsrep::wsrep_provider_v26::run_applier(void *applier_ctx) wsrep::wsrep_provider_v26::run_applier(void *applier_ctx)
{ {
@ -534,14 +558,15 @@ int wsrep::wsrep_provider_v26::append_key(wsrep::ws_handle& ws_handle,
!= WSREP_OK); != WSREP_OK);
} }
int wsrep::wsrep_provider_v26::append_data(wsrep::ws_handle& ws_handle, enum wsrep::provider::status
wsrep::wsrep_provider_v26::append_data(wsrep::ws_handle& ws_handle,
const wsrep::const_buffer& data) const wsrep::const_buffer& data)
{ {
const wsrep_buf_t wsrep_buf = {data.data(), data.size()}; const wsrep_buf_t wsrep_buf = {data.data(), data.size()};
mutable_ws_handle mwsh(ws_handle); mutable_ws_handle mwsh(ws_handle);
return (wsrep_->append_data(wsrep_, mwsh.native(), &wsrep_buf, return map_return_value(
1, WSREP_DATA_ORDERED, true) wsrep_->append_data(wsrep_, mwsh.native(), &wsrep_buf,
!= WSREP_OK); 1, WSREP_DATA_ORDERED, true));
} }
enum wsrep::provider::status enum wsrep::provider::status
@ -674,6 +699,35 @@ wsrep::wsrep_provider_v26::status() const
return ret; return ret;
} }
void wsrep::wsrep_provider_v26::reset_status()
{
wsrep_->stats_reset(wsrep_);
}
std::string wsrep::wsrep_provider_v26::options() const
{
std::string ret;
char* opts;
if ((opts = wsrep_->options_get(wsrep_)))
{
ret = opts;
free(opts);
}
else
{
throw wsrep::runtime_error("Failed to get provider options");
}
return ret;
}
void wsrep::wsrep_provider_v26::options(const std::string& opts)
{
if (wsrep_->options_set(wsrep_, opts.c_str()) != WSREP_OK)
{
throw wsrep::runtime_error("Failed to set provider options");
}
}
void* wsrep::wsrep_provider_v26::native() const void* wsrep::wsrep_provider_v26::native() const
{ {
return wsrep_; return wsrep_;

View File

@ -21,11 +21,18 @@ namespace wsrep
int connect(const std::string&, const std::string&, const std::string&, int connect(const std::string&, const std::string&, const std::string&,
bool); bool);
int disconnect(); int disconnect();
int capabilities() const;
int desync();
int resync();
int pause();
int resume();
enum wsrep::provider::status run_applier(void*); enum wsrep::provider::status run_applier(void*);
int start_transaction(wsrep::ws_handle&) { return 0; } int start_transaction(wsrep::ws_handle&) { return 0; }
int append_key(wsrep::ws_handle&, const wsrep::key&); int append_key(wsrep::ws_handle&, const wsrep::key&);
int append_data(wsrep::ws_handle&, const wsrep::const_buffer&); enum wsrep::provider::status
append_data(wsrep::ws_handle&, const wsrep::const_buffer&);
enum wsrep::provider::status enum wsrep::provider::status
certify(wsrep::client_id, wsrep::ws_handle&, certify(wsrep::client_id, wsrep::ws_handle&,
int, int,
@ -46,6 +53,9 @@ namespace wsrep
int sst_received(const wsrep::gtid& gtid, int); int sst_received(const wsrep::gtid& gtid, int);
std::vector<status_variable> status() const; std::vector<status_variable> status() const;
void reset_status();
std::string options() const;
void options(const std::string&);
void* native() const; void* native() const;
private: private:
wsrep_provider_v26(const wsrep_provider_v26&); wsrep_provider_v26(const wsrep_provider_v26&);

View File

@ -43,6 +43,11 @@ namespace wsrep
bool) bool)
{ return 0; } { return 0; }
int disconnect() { return 0; } int disconnect() { return 0; }
int capabilities() const { return 0; }
int desync() { return 0; }
int resync() { return 0; }
int pause() { return 0; }
int resume() { return 0; }
enum wsrep::provider::status run_applier(void*) enum wsrep::provider::status run_applier(void*)
{ {
return wsrep::provider::success; return wsrep::provider::success;
@ -121,8 +126,9 @@ namespace wsrep
int append_key(wsrep::ws_handle&, const wsrep::key&) int append_key(wsrep::ws_handle&, const wsrep::key&)
{ return 0; } { return 0; }
int append_data(wsrep::ws_handle&, const wsrep::const_buffer&) enum wsrep::provider::status
{ return 0; } append_data(wsrep::ws_handle&, const wsrep::const_buffer&)
{ return wsrep::provider::success; }
int rollback(const wsrep::transaction_id) int rollback(const wsrep::transaction_id)
{ {
++fragments_; ++fragments_;
@ -199,6 +205,9 @@ namespace wsrep
{ {
return std::vector<status_variable>(); return std::vector<status_variable>();
} }
void reset_status() { }
std::string options() const { return ""; }
void options(const std::string&) { }
void* native() const { return 0; } void* native() const { return 0; }
// //