From 1888d19cfffcab21763aa92183dd0d412fcdc806 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 15 Nov 2024 17:15:30 +0100 Subject: [PATCH 01/53] wip: initial version --- src/api/qpid-proton/reactor/SendingClient.cpp | 8 ++- .../reactor/handler/CommonHandler.h | 8 ++- .../reactor/handler/SenderHandler.cpp | 57 ++++++++++++++++++- .../reactor/handler/SenderHandler.h | 31 ++++++++++ .../options/modern/ModernOptionsParser.cpp | 21 +++++++ 5 files changed, 121 insertions(+), 4 deletions(-) diff --git a/src/api/qpid-proton/reactor/SendingClient.cpp b/src/api/qpid-proton/reactor/SendingClient.cpp index 8be674be..0ef2bd65 100644 --- a/src/api/qpid-proton/reactor/SendingClient.cpp +++ b/src/api/qpid-proton/reactor/SendingClient.cpp @@ -556,13 +556,19 @@ int SendingClient::run(int argc, char **argv) const ); handler.setMessage(msg); - + int count = 1; if (options.is_set("count")) { count = static_cast (options.get("count")); } handler.setCount(count); + int tx_size = 1; + if (options.is_set("tx-size")) { + tx_size = static_cast (options.get("tx-size")); + } + handler.setBatchSize(tx_size); + try { container(handler).run(); diff --git a/src/api/qpid-proton/reactor/handler/CommonHandler.h b/src/api/qpid-proton/reactor/handler/CommonHandler.h index 5919b97d..b1970749 100644 --- a/src/api/qpid-proton/reactor/handler/CommonHandler.h +++ b/src/api/qpid-proton/reactor/handler/CommonHandler.h @@ -19,7 +19,7 @@ #include #include #include - +#include #include @@ -35,6 +35,8 @@ #include "logger/LoggerWrapper.h" using proton::messaging_handler; +using proton::transaction_handler; +using proton::transaction; using proton::container; using proton::void_function0; using proton::duration; @@ -58,7 +60,7 @@ using dtests::common::UriParser; * An abstract proton message handler providing a common interface for other * client handlers */ -class CommonHandler : public messaging_handler { +class CommonHandler : public messaging_handler, transaction_handler { public: /** * Constructor @@ -121,6 +123,8 @@ class CommonHandler : public messaging_handler { virtual void timerEvent() = 0; + transaction_handler th; + protected: diff --git a/src/api/qpid-proton/reactor/handler/SenderHandler.cpp b/src/api/qpid-proton/reactor/handler/SenderHandler.cpp index 7f3b576c..99d479ea 100644 --- a/src/api/qpid-proton/reactor/handler/SenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/SenderHandler.cpp @@ -88,6 +88,11 @@ SenderHandler::SenderHandler( duration_mode(duration_mode), sent(0), confirmedSent(0), + batch_size(1), + current_batch(0), + committed(0), + confirmed(0), + total(0), m(), timer_event(*this), interval(duration::IMMEDIATE) @@ -205,6 +210,11 @@ void SenderHandler::on_container_start(container &c) work_q->schedule(duration::IMMEDIATE, make_work(&SenderHandler::checkIfCanSend, this)); } #endif + // TODO Transactions + tx = NULL; + cont = &c; + // currently causes seqfault + // c.declare_transaction(conn, th); } void SenderHandler::on_sendable(sender &s) @@ -258,6 +268,14 @@ void SenderHandler::on_tracker_reject(tracker &t) void SenderHandler::on_connection_close(connection &c) { logger(debug) << "Closing connection"; + // TODO debug remove + // logger(info) << "Transactions"; + // logger(info) << "Transaction total: " << total; + // logger(info) << "Transaction sent: " << sent; + // logger(info) << "Transaction batch size: " << batch_size; + // logger(info) << "Transaction current batch: " << current_batch; + // logger(info) << "Transaction confirmed: " << confirmed; + // logger(info) << "Transaction committed: " << committed; } void SenderHandler::on_connection_error(connection &c) @@ -269,7 +287,6 @@ void SenderHandler::on_connection_error(connection &c) } } - void SenderHandler::setCount(int count) { this->count = count; @@ -280,6 +297,16 @@ int SenderHandler::getCount() const return count; } +void SenderHandler::setBatchSize(int batchSize) +{ + this->batch_size = batchSize; +} + +int SenderHandler::getBatchSize() const +{ + return batch_size; +} + void SenderHandler::setMessage(message &msg) { this->m = msg; @@ -361,6 +388,34 @@ void SenderHandler::send() ready = false; } +// TODO VIP TRANSACTIONS + +void SenderHandler::on_transaction_declared(transaction &t) { + tx = &t; + send(); +} + +void SenderHandler::on_transaction_committed(transaction &t) { + committed += current_batch; + connection conn = sndr.connection(); + if(committed == total) { + std::cout << "All messages committed"; + conn.close(); + } + else { + current_batch = 0; + cont->declare_transaction(conn, th); + } +} + +void SenderHandler::on_sender_close(sender &s) { + current_batch = 0; +} + +// override +// void SenderHandler::on_sendable(sender &s) override {} +// void SenderHandler::on_tracker_accept(tracker &t) override {} + } /* namespace reactor */ } /* namespace proton */ } /* namespace dtests */ diff --git a/src/api/qpid-proton/reactor/handler/SenderHandler.h b/src/api/qpid-proton/reactor/handler/SenderHandler.h index 0b81439c..010d36ce 100644 --- a/src/api/qpid-proton/reactor/handler/SenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/SenderHandler.h @@ -22,6 +22,7 @@ #include #include #include +#include #include "CommonHandler.h" #include "Timer.h" @@ -36,6 +37,9 @@ using proton::source_options; using proton::transport; using proton::tracker; using proton::connection_options; +using proton::sender; +using proton::transaction; +using proton::transaction_handler; namespace dtests { namespace proton { @@ -124,6 +128,11 @@ class SenderHandler : public CommonHandler { void on_transport_error(transport &t); void on_transport_close(transport &t); + // TODO TX Support + void on_sender_close(sender &s); + void on_transaction_declared(transaction &t); + void on_transaction_committed(transaction &t); + /** * Sets the message count * @param count the message count @@ -136,6 +145,18 @@ class SenderHandler : public CommonHandler { */ int getCount() const; + /** + * Sets the transaction batch size + * @param batch_size the transaction batch size + */ + void setBatchSize(int batchSize); + + /** + * Gets the transaction batch size + * @return the transaction batch size + */ + int getBatchSize() const; + /** * Sets the message to send * @param m the message to send @@ -159,7 +180,17 @@ class SenderHandler : public CommonHandler { string duration_mode; int sent; int confirmedSent; + + // transactions + int batch_size = 0; + int current_batch = 0; + int committed = 0; + int confirmed = 0; + int total = 0; + sender sndr; + transaction *tx; + container *cont; message m; diff --git a/src/common/options/modern/ModernOptionsParser.cpp b/src/common/options/modern/ModernOptionsParser.cpp index 8a95a014..03244de1 100644 --- a/src/common/options/modern/ModernOptionsParser.cpp +++ b/src/common/options/modern/ModernOptionsParser.cpp @@ -126,6 +126,27 @@ ModernOptionsParser::ModernOptionsParser() .help("client reconnect TIMEOUT (default: -1)") .metavar("TIMEOUT"); + // transactions + add_option("--tx-size") + .dest("tx-size") + .help("transactional mode: batch message count size (default: 0)") + .metavar("TX_SIZE"); + + char const* const choices[] = { "commit", "rollback", "none" }; + add_option("--tx-action") + .dest("tx-action") + .help("transactional action at the end of tx batch (default: commit)") + .type("choice") + .choices(std::begin(choices), std::end(choices)) + .metavar("TX_ACTION"); + + add_option("--tx-endloop-action") + .dest("tx-endloop-action") + .help("transactional action after sending all messages in loop") + .type("choice") + .choices(std::begin(choices), std::end(choices)) + .metavar("TX_ENDLOOP_ACTION"); + /*********************** Reactive C++ API client extras ***********************/ add_option("--conn-reconnect-first") .dest("conn-reconnect-first") From 9ae90d6beef003b82680fa8cc53b6a785dbc133c Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 22 Nov 2024 16:42:09 +0100 Subject: [PATCH 02/53] wip: initial version refactoring to new class --- src/api/qpid-proton/CMakeLists.txt | 4 ++ .../qpid-proton/clients/aac3_connector.cpp | 2 - src/api/qpid-proton/clients/aac3_receiver.cpp | 24 ++++++-- src/api/qpid-proton/clients/aac3_sender.cpp | 32 +++++++---- src/api/qpid-proton/reactor/SendingClient.cpp | 34 +++++------ .../reactor/handler/CommonHandler.h | 5 +- .../reactor/handler/SenderHandler.cpp | 57 +------------------ .../reactor/handler/SenderHandler.h | 31 ---------- 8 files changed, 61 insertions(+), 128 deletions(-) diff --git a/src/api/qpid-proton/CMakeLists.txt b/src/api/qpid-proton/CMakeLists.txt index a9d20d75..757b762b 100644 --- a/src/api/qpid-proton/CMakeLists.txt +++ b/src/api/qpid-proton/CMakeLists.txt @@ -61,10 +61,14 @@ add_library( reactor/handler/CommonHandler.cpp reactor/handler/ConnectorHandler.cpp reactor/handler/SenderHandler.cpp + reactor/handler/TxSenderHandler.cpp reactor/handler/ReceiverHandler.cpp + reactor/handler/TxReceiverHandler.cpp reactor/ConnectingClient.cpp reactor/SendingClient.cpp + reactor/TxSendingClient.cpp reactor/ReceivingClient.cpp + reactor/TxReceivingClient.cpp ) target_link_libraries( diff --git a/src/api/qpid-proton/clients/aac3_connector.cpp b/src/api/qpid-proton/clients/aac3_connector.cpp index b954dd0f..33ea1ecd 100644 --- a/src/api/qpid-proton/clients/aac3_connector.cpp +++ b/src/api/qpid-proton/clients/aac3_connector.cpp @@ -4,8 +4,6 @@ * Created on: Apr 14, 2015 * Author: opiske */ -#include - #include using dtests::proton::reactor::ConnectingClient; diff --git a/src/api/qpid-proton/clients/aac3_receiver.cpp b/src/api/qpid-proton/clients/aac3_receiver.cpp index 55a04088..913dbd16 100644 --- a/src/api/qpid-proton/clients/aac3_receiver.cpp +++ b/src/api/qpid-proton/clients/aac3_receiver.cpp @@ -1,17 +1,33 @@ /* - * aac1_sender.cpp + * aac3_sender.cpp * * Created on: Apr 14, 2015 * Author: opiske */ - #include +#include using dtests::proton::reactor::ReceivingClient; +using dtests::proton::reactor::TxReceivingClient; int main(int argc, char** argv) { - ReceivingClient client = ReceivingClient(); + int i = 0; + bool tx_mode = false; + std::string tx_opt = "--tx-"; + while (i < argc) { + if (std::string(argv[i]).rfind("--tx-", 0) == 0) { // pos=0 limits the search to the prefix + tx_mode = true; + break; + } + i++; + } - return client.run(argc, argv); + if (tx_mode) { + ReceivingClient client = ReceivingClient(); + return client.run(argc, argv); + } else { + TxReceivingClient client = TxReceivingClient(); + return client.run(argc, argv); + } } diff --git a/src/api/qpid-proton/clients/aac3_sender.cpp b/src/api/qpid-proton/clients/aac3_sender.cpp index fe9cc9f7..0a2bf611 100644 --- a/src/api/qpid-proton/clients/aac3_sender.cpp +++ b/src/api/qpid-proton/clients/aac3_sender.cpp @@ -1,23 +1,33 @@ /* - * aac1_sender.cpp + * aac3_sender.cpp * * Created on: Apr 14, 2015 * Author: opiske */ -#include - #include +#include using dtests::proton::reactor::SendingClient; +using dtests::proton::reactor::TxSendingClient; int main(int argc, char** argv) { - SendingClient client = SendingClient(); - - return client.run(argc, argv); - + int i = 0; + bool tx_mode = false; + std::string tx_opt = "--tx-"; + while (i < argc) { + if (std::string(argv[i]).rfind("--tx-", 0) == 0) { // pos=0 limits the search to the prefix + tx_mode = true; + break; + } + i++; + } + + if (tx_mode) { + TxSendingClient client = TxSendingClient(); + return client.run(argc, argv); + } else { + SendingClient client = SendingClient(); + return client.run(argc, argv); + } } - - - - diff --git a/src/api/qpid-proton/reactor/SendingClient.cpp b/src/api/qpid-proton/reactor/SendingClient.cpp index 0ef2bd65..743f6f8f 100644 --- a/src/api/qpid-proton/reactor/SendingClient.cpp +++ b/src/api/qpid-proton/reactor/SendingClient.cpp @@ -83,7 +83,7 @@ void SendingClient::setMessageOptions(const OptionsSetter &setter, * #ifdef REACTOR_PROPERTY_MAP_USES_STL message::property_map &properties = msg.properties(); - + setter.setMap("msg-property", properties); #endif // REACTOR_PROPERTY_MAP_USES_STL */ @@ -129,7 +129,7 @@ void SendingClient::setMessageProperty(message *msg, const string &property) con if (nameVal(property, name, val, separator)) { if (separator == "~") { temp.resize(val.size()); - + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); if (temp == "true") { @@ -171,7 +171,7 @@ void SendingClient::setMessageListItem(message *msg, const string &property, std if (nameVal(property, name, val, separator)) { if (separator == "~") { temp.resize(val.size()); - + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); if (temp == "true") { @@ -216,7 +216,7 @@ void SendingClient::setMessageMapItem(message *msg, const string &property, std: if (nameVal(property, name, val, separator)) { if (separator == "~") { temp.resize(val.size()); - + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); if (temp == "true") { @@ -348,14 +348,14 @@ int SendingClient::run(int argc, char **argv) const } else { user = uri_parser.getUser(); } - + string password = ""; if (options.is_set("password")) { password = options["password"]; } else { password = uri_parser.getPassword(); } - + string sasl_mechanisms = ""; if (options.is_set("sasl-mechanisms")) { sasl_mechanisms = options["sasl-mechanisms"]; @@ -364,7 +364,7 @@ int SendingClient::run(int argc, char **argv) const } else { sasl_mechanisms = "ANONYMOUS"; } - + string conn_sasl_enabled = "true"; if (options.is_set("conn-sasl-enabled")) { conn_sasl_enabled = options["conn-sasl-enabled"]; @@ -505,17 +505,17 @@ int SendingClient::run(int argc, char **argv) const setMessageText(options["msg-content"], &msg); } - + /* - * Note 1: this is a left-over from setMessageOptions. Since I don't want to - * change the method signature there, I check again here and set the remaining + * Note 1: this is a left-over from setMessageOptions. Since I don't want to + * change the method signature there, I check again here and set the remaining * option that cannot be done implicitly above. - * - * Note 2: this is a hack for GCC ~4.4.7 on i686. - */ + * + * Note 2: this is a hack for GCC ~4.4.7 on i686. + */ #ifndef ENABLE_IMPLICIT_CONVERSIONS long value = options.get("msg-ttl"); - + msg.ttl(::proton::duration(value)); #endif if (options.is_set("msg-group-seq")) { @@ -562,12 +562,6 @@ int SendingClient::run(int argc, char **argv) const count = static_cast (options.get("count")); } handler.setCount(count); - - int tx_size = 1; - if (options.is_set("tx-size")) { - tx_size = static_cast (options.get("tx-size")); - } - handler.setBatchSize(tx_size); try { container(handler).run(); diff --git a/src/api/qpid-proton/reactor/handler/CommonHandler.h b/src/api/qpid-proton/reactor/handler/CommonHandler.h index b1970749..ffacffb0 100644 --- a/src/api/qpid-proton/reactor/handler/CommonHandler.h +++ b/src/api/qpid-proton/reactor/handler/CommonHandler.h @@ -35,7 +35,6 @@ #include "logger/LoggerWrapper.h" using proton::messaging_handler; -using proton::transaction_handler; using proton::transaction; using proton::container; using proton::void_function0; @@ -60,7 +59,7 @@ using dtests::common::UriParser; * An abstract proton message handler providing a common interface for other * client handlers */ -class CommonHandler : public messaging_handler, transaction_handler { +class CommonHandler : public messaging_handler { public: /** * Constructor @@ -122,8 +121,6 @@ class CommonHandler : public messaging_handler, transaction_handler { virtual ~CommonHandler(); virtual void timerEvent() = 0; - - transaction_handler th; protected: diff --git a/src/api/qpid-proton/reactor/handler/SenderHandler.cpp b/src/api/qpid-proton/reactor/handler/SenderHandler.cpp index 99d479ea..7f3b576c 100644 --- a/src/api/qpid-proton/reactor/handler/SenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/SenderHandler.cpp @@ -88,11 +88,6 @@ SenderHandler::SenderHandler( duration_mode(duration_mode), sent(0), confirmedSent(0), - batch_size(1), - current_batch(0), - committed(0), - confirmed(0), - total(0), m(), timer_event(*this), interval(duration::IMMEDIATE) @@ -210,11 +205,6 @@ void SenderHandler::on_container_start(container &c) work_q->schedule(duration::IMMEDIATE, make_work(&SenderHandler::checkIfCanSend, this)); } #endif - // TODO Transactions - tx = NULL; - cont = &c; - // currently causes seqfault - // c.declare_transaction(conn, th); } void SenderHandler::on_sendable(sender &s) @@ -268,14 +258,6 @@ void SenderHandler::on_tracker_reject(tracker &t) void SenderHandler::on_connection_close(connection &c) { logger(debug) << "Closing connection"; - // TODO debug remove - // logger(info) << "Transactions"; - // logger(info) << "Transaction total: " << total; - // logger(info) << "Transaction sent: " << sent; - // logger(info) << "Transaction batch size: " << batch_size; - // logger(info) << "Transaction current batch: " << current_batch; - // logger(info) << "Transaction confirmed: " << confirmed; - // logger(info) << "Transaction committed: " << committed; } void SenderHandler::on_connection_error(connection &c) @@ -287,6 +269,7 @@ void SenderHandler::on_connection_error(connection &c) } } + void SenderHandler::setCount(int count) { this->count = count; @@ -297,16 +280,6 @@ int SenderHandler::getCount() const return count; } -void SenderHandler::setBatchSize(int batchSize) -{ - this->batch_size = batchSize; -} - -int SenderHandler::getBatchSize() const -{ - return batch_size; -} - void SenderHandler::setMessage(message &msg) { this->m = msg; @@ -388,34 +361,6 @@ void SenderHandler::send() ready = false; } -// TODO VIP TRANSACTIONS - -void SenderHandler::on_transaction_declared(transaction &t) { - tx = &t; - send(); -} - -void SenderHandler::on_transaction_committed(transaction &t) { - committed += current_batch; - connection conn = sndr.connection(); - if(committed == total) { - std::cout << "All messages committed"; - conn.close(); - } - else { - current_batch = 0; - cont->declare_transaction(conn, th); - } -} - -void SenderHandler::on_sender_close(sender &s) { - current_batch = 0; -} - -// override -// void SenderHandler::on_sendable(sender &s) override {} -// void SenderHandler::on_tracker_accept(tracker &t) override {} - } /* namespace reactor */ } /* namespace proton */ } /* namespace dtests */ diff --git a/src/api/qpid-proton/reactor/handler/SenderHandler.h b/src/api/qpid-proton/reactor/handler/SenderHandler.h index 010d36ce..0b81439c 100644 --- a/src/api/qpid-proton/reactor/handler/SenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/SenderHandler.h @@ -22,7 +22,6 @@ #include #include #include -#include #include "CommonHandler.h" #include "Timer.h" @@ -37,9 +36,6 @@ using proton::source_options; using proton::transport; using proton::tracker; using proton::connection_options; -using proton::sender; -using proton::transaction; -using proton::transaction_handler; namespace dtests { namespace proton { @@ -128,11 +124,6 @@ class SenderHandler : public CommonHandler { void on_transport_error(transport &t); void on_transport_close(transport &t); - // TODO TX Support - void on_sender_close(sender &s); - void on_transaction_declared(transaction &t); - void on_transaction_committed(transaction &t); - /** * Sets the message count * @param count the message count @@ -145,18 +136,6 @@ class SenderHandler : public CommonHandler { */ int getCount() const; - /** - * Sets the transaction batch size - * @param batch_size the transaction batch size - */ - void setBatchSize(int batchSize); - - /** - * Gets the transaction batch size - * @return the transaction batch size - */ - int getBatchSize() const; - /** * Sets the message to send * @param m the message to send @@ -180,17 +159,7 @@ class SenderHandler : public CommonHandler { string duration_mode; int sent; int confirmedSent; - - // transactions - int batch_size = 0; - int current_batch = 0; - int committed = 0; - int confirmed = 0; - int total = 0; - sender sndr; - transaction *tx; - container *cont; message m; From 873b526bcdf9bf2bef6fff1d68a167a6b2309ec0 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 22 Nov 2024 18:05:28 +0100 Subject: [PATCH 03/53] wip: initial version refactoring, forgotten classes --- src/api/qpid-proton/reactor/SendingClient.cpp | 32 +- .../qpid-proton/reactor/TxReceivingClient.cpp | 418 +++++++++++++ .../qpid-proton/reactor/TxReceivingClient.h | 64 ++ .../qpid-proton/reactor/TxSendingClient.cpp | 585 ++++++++++++++++++ src/api/qpid-proton/reactor/TxSendingClient.h | 66 ++ .../reactor/handler/TxReceiverHandler.cpp | 540 ++++++++++++++++ .../reactor/handler/TxReceiverHandler.h | 260 ++++++++ .../reactor/handler/TxSenderHandler.cpp | 487 +++++++++++++++ .../reactor/handler/TxSenderHandler.h | 221 +++++++ 9 files changed, 2657 insertions(+), 16 deletions(-) create mode 100644 src/api/qpid-proton/reactor/TxReceivingClient.cpp create mode 100644 src/api/qpid-proton/reactor/TxReceivingClient.h create mode 100644 src/api/qpid-proton/reactor/TxSendingClient.cpp create mode 100644 src/api/qpid-proton/reactor/TxSendingClient.h create mode 100644 src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp create mode 100644 src/api/qpid-proton/reactor/handler/TxReceiverHandler.h create mode 100644 src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp create mode 100644 src/api/qpid-proton/reactor/handler/TxSenderHandler.h diff --git a/src/api/qpid-proton/reactor/SendingClient.cpp b/src/api/qpid-proton/reactor/SendingClient.cpp index 743f6f8f..8be674be 100644 --- a/src/api/qpid-proton/reactor/SendingClient.cpp +++ b/src/api/qpid-proton/reactor/SendingClient.cpp @@ -83,7 +83,7 @@ void SendingClient::setMessageOptions(const OptionsSetter &setter, * #ifdef REACTOR_PROPERTY_MAP_USES_STL message::property_map &properties = msg.properties(); - + setter.setMap("msg-property", properties); #endif // REACTOR_PROPERTY_MAP_USES_STL */ @@ -129,7 +129,7 @@ void SendingClient::setMessageProperty(message *msg, const string &property) con if (nameVal(property, name, val, separator)) { if (separator == "~") { temp.resize(val.size()); - + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); if (temp == "true") { @@ -171,7 +171,7 @@ void SendingClient::setMessageListItem(message *msg, const string &property, std if (nameVal(property, name, val, separator)) { if (separator == "~") { temp.resize(val.size()); - + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); if (temp == "true") { @@ -216,7 +216,7 @@ void SendingClient::setMessageMapItem(message *msg, const string &property, std: if (nameVal(property, name, val, separator)) { if (separator == "~") { temp.resize(val.size()); - + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); if (temp == "true") { @@ -348,14 +348,14 @@ int SendingClient::run(int argc, char **argv) const } else { user = uri_parser.getUser(); } - + string password = ""; if (options.is_set("password")) { password = options["password"]; } else { password = uri_parser.getPassword(); } - + string sasl_mechanisms = ""; if (options.is_set("sasl-mechanisms")) { sasl_mechanisms = options["sasl-mechanisms"]; @@ -364,7 +364,7 @@ int SendingClient::run(int argc, char **argv) const } else { sasl_mechanisms = "ANONYMOUS"; } - + string conn_sasl_enabled = "true"; if (options.is_set("conn-sasl-enabled")) { conn_sasl_enabled = options["conn-sasl-enabled"]; @@ -505,17 +505,17 @@ int SendingClient::run(int argc, char **argv) const setMessageText(options["msg-content"], &msg); } - + /* - * Note 1: this is a left-over from setMessageOptions. Since I don't want to - * change the method signature there, I check again here and set the remaining + * Note 1: this is a left-over from setMessageOptions. Since I don't want to + * change the method signature there, I check again here and set the remaining * option that cannot be done implicitly above. - * - * Note 2: this is a hack for GCC ~4.4.7 on i686. - */ + * + * Note 2: this is a hack for GCC ~4.4.7 on i686. + */ #ifndef ENABLE_IMPLICIT_CONVERSIONS long value = options.get("msg-ttl"); - + msg.ttl(::proton::duration(value)); #endif if (options.is_set("msg-group-seq")) { @@ -556,13 +556,13 @@ int SendingClient::run(int argc, char **argv) const ); handler.setMessage(msg); - + int count = 1; if (options.is_set("count")) { count = static_cast (options.get("count")); } handler.setCount(count); - + try { container(handler).run(); diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.cpp b/src/api/qpid-proton/reactor/TxReceivingClient.cpp new file mode 100644 index 00000000..e323b151 --- /dev/null +++ b/src/api/qpid-proton/reactor/TxReceivingClient.cpp @@ -0,0 +1,418 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: TxReceivingClient.cpp + * Author: pematous + * + * Created on November 20, 2024 + */ + +#include + +#include "TxReceivingClient.h" + +using proton::container; + +namespace dtests { +namespace proton { +namespace reactor { + +using dtests::common::UriParser; + +TxReceivingClient::TxReceivingClient() + : super() +{ +} + +TxReceivingClient::~TxReceivingClient() +{ +} + +void TxReceivingClient::setMessageOptions(const OptionsSetter &setter, message &msg) const +{ + +} + +int TxReceivingClient::run(int argc, char **argv) const +{ + const string usage = "usage: %prog [OPTION]... DIR [FILE]..."; + const string version = "1.0"; + const string desc = "C/C++ AMQ reactive API receiver client for Qpid Proton"; + + ReceiverOptionsParser parser = ReceiverOptionsParser(); + UriParser uri_parser = UriParser(); + + /** + * WARNING: do not reassign the result of chainned calls to usage/version/etc + * because it causes the code to segfault. For example, this crashes: + * + * ControlOptions parser = ControlOptions().usage(usage) + */ + parser.usage(usage).version(version).description(desc); + + optparse::Values options = parser.parse_args(argc, argv); + + parser.validate(options); + + setLogLevel(options); + + // Temporary variable for address, will search for prefix + string tempAddress = options["broker-url"]; + // Variable for final address + string address; + // Variable for recognition of topic + bool is_topic = false; + // Search for prefix + std::size_t prefix_index = tempAddress.find("topic://"); + // If prefix is present + if (prefix_index != std::string::npos) { + // Delete prefix + address = tempAddress.replace(prefix_index, 8, ""); + // Set that it will be topic + is_topic = true; + // If prefix is NOT present + } else { + // Use full address + address = tempAddress; + } + + uri_parser.parse(options["broker-url"]); + + std::vector conn_urls; + if (options.is_set("conn-urls")) { + std::stringstream conn_urls_string(options["conn-urls"]); + std::string segment; + + while(std::getline(conn_urls_string, segment, ',')) { + conn_urls.push_back(segment); + } + } + + string msg_action = "no-action"; + if(options.is_set("msg-action")) { + msg_action = options["msg-action"]; + } + + int msg_action_size = 1; + if(options.is_set("msg-action-size")) { + msg_action_size = atoi(options["msg-action-size"].c_str()); + } + + string user = ""; + if (options.is_set("user")) { + user = options["user"]; + } else { + user = uri_parser.getUser(); + } + + string password = ""; + if (options.is_set("password")) { + password = options["password"]; + } else { + password = uri_parser.getPassword(); + } + + string sasl_mechanisms = ""; + if (options.is_set("sasl-mechanisms")) { + sasl_mechanisms = options["sasl-mechanisms"]; + } else if (user != "" && password != "") { + sasl_mechanisms = "PLAIN"; + } else { + sasl_mechanisms = "ANONYMOUS"; + } + + string conn_sasl_enabled = "true"; + if (options.is_set("conn-sasl-enabled")) { + conn_sasl_enabled = options["conn-sasl-enabled"]; + std::transform(conn_sasl_enabled.begin(), conn_sasl_enabled.end(), conn_sasl_enabled.begin(), ::tolower); + } + + string conn_ssl_certificate = ""; + if (options.is_set("conn-ssl-certificate")) { + conn_ssl_certificate = options["conn-ssl-certificate"]; + } + + string conn_ssl_private_key = ""; + if (options.is_set("conn-ssl-private-key")) { + conn_ssl_private_key = options["conn-ssl-private-key"]; + } + + string conn_ssl_password = ""; + if (options.is_set("conn-ssl-password")) { + conn_ssl_password = options["conn-ssl-password"]; + } + + string conn_ssl_trust_store = ""; + if (options.is_set("conn-ssl-trust-store")) { + conn_ssl_trust_store = options["conn-ssl-trust-store"]; + } + + bool conn_ssl_verify_peer = options.is_set("conn-ssl-verify-peer"); + + bool conn_ssl_verify_peer_name = options.is_set("conn-ssl-verify-peer-name"); + + bool durable_subscriber = false; + if (options.is_set("durable-subscriber")) { + string durable_subscriber_lower = options["durable-subscriber"]; + std::transform(durable_subscriber_lower.begin(), durable_subscriber_lower.end(), durable_subscriber_lower.begin(), ::tolower); + + if (durable_subscriber_lower == "true") { + durable_subscriber = true; + } + } + + bool subscriber_unsubscribe = false; + if (options.is_set("subscriber-unsubscribe")) { + string subscriber_unsubscribe_lower = options["subscriber-unsubscribe"]; + std::transform(subscriber_unsubscribe_lower.begin(), subscriber_unsubscribe_lower.end(), subscriber_unsubscribe_lower.begin(), ::tolower); + + if (subscriber_unsubscribe_lower == "true") { + subscriber_unsubscribe = true; + } + } + + string durable_subscriber_prefix = ""; + if (options.is_set("durable-subscriber-prefix")) { + durable_subscriber_prefix = options["durable-subscriber-prefix"]; + } + + string durable_subscriber_name = ""; + if (options.is_set("durable-subscriber-name")) { + durable_subscriber_name = options["durable-subscriber-name"]; + } + + bool shared_subscriber = false; + if (options.is_set("shared-subscriber")) { + string shared_subscriber_lower = options["shared-subscriber"]; + std::transform(shared_subscriber_lower.begin(), shared_subscriber_lower.end(), shared_subscriber_lower.begin(), ::tolower); + + if (shared_subscriber_lower == "true") { + shared_subscriber = true; + } + } + + string conn_clientid = ""; + if (options.is_set("conn-clientid")) { + conn_clientid = options["conn-clientid"]; + } + + string conn_clientid_prefix = ""; + if (options.is_set("conn-clientid-prefix")) { + conn_clientid_prefix = options["conn-clientid-prefix"]; + } + + bool conn_reconnect_custom = false; + + string conn_reconnect = "true"; + if (options.is_set("conn-reconnect")) { + conn_reconnect = options["conn-reconnect"]; + std::transform(conn_reconnect.begin(), conn_reconnect.end(), conn_reconnect.begin(), ::tolower); + } + + int32_t conn_reconnect_interval = 10; + if (options.is_set("conn-reconnect-interval")) { + conn_reconnect_interval = std::strtol(options["conn-reconnect-interval"].c_str(), NULL, 10); + + conn_reconnect_custom = true; + } + + int32_t conn_reconnect_limit = 0; + if (options.is_set("conn-reconnect-limit")) { + conn_reconnect_limit = std::strtol(options["conn-reconnect-limit"].c_str(), NULL, 10); + + conn_reconnect_custom = true; + } + + int32_t conn_reconnect_timeout = duration::FOREVER.milliseconds(); + if (options.is_set("conn-reconnect-timeout")) { + conn_reconnect_timeout = std::strtol(options["conn-reconnect-timeout"].c_str(), NULL, 10); + + conn_reconnect_custom = true; + } + + uint32_t conn_reconnect_first = 0; + if (options.is_set("conn-reconnect-first")) { + conn_reconnect_first = std::strtoul(options["conn-reconnect-first"].c_str(), NULL, 10); + + conn_reconnect_custom = true; + } + + uint32_t conn_reconnect_increment = 100; + if (options.is_set("conn-reconnect-increment")) { + conn_reconnect_increment = std::strtoul(options["conn-reconnect-increment"].c_str(), NULL, 10); + + conn_reconnect_custom = true; + } + + bool conn_reconnect_doubling = true; + if (options.is_set("conn-reconnect-doubling")) { + if (options["conn-reconnect-doubling"] == "false") { + conn_reconnect_doubling = false; + } + + conn_reconnect_custom = true; + } + + uint32_t conn_heartbeat = 0; + if (options.is_set("conn-heartbeat")) { + conn_heartbeat = std::strtoul(options["conn-heartbeat"].c_str(), NULL, 10); + } + + uint32_t max_frame_size = -1; + if (options.is_set("conn-max-frame-size")) { + max_frame_size = std::strtoul(options["conn-max-frame-size"].c_str(), NULL, 10); + } + + string log_msgs = ""; + if (options.is_set("log-msgs")) { + log_msgs = options["log-msgs"]; + } + + OptionsSetter setter = OptionsSetter(options); + + int timeout = -1; + if (options.is_set("timeout")) { + timeout = static_cast (options.get("timeout")); + } + + bool process_reply_to = false; + if (options.is_set("process-reply-to")) { + process_reply_to = options.get("process-reply-to"); + } + + bool browse = false; + if (options.is_set("recv-browse")) { + browse = options.get("recv-browse"); + } + + int count = 0; + if (options.is_set("count")) { + count = static_cast (options.get("count")); + } + + string selector = ""; + if (options.is_set("recv-selector")) { + selector = options["recv-selector"]; + } + + int duration = 0; + if (options.is_set("duration")) { + duration = static_cast (options.get("duration")); + } + + string duration_mode = "after-receive"; + if (options.is_set("duration-mode")) { + duration_mode = options["duration-mode"]; + } + + int recv_listen_port = 5672; + if(options.is_set("recv-listen-port")) { + recv_listen_port = atoi(options["recv-listen-port"].c_str()); + } + + string recv_listen = "false"; + if (options.is_set("recv-listen")) { + recv_listen = options["recv-listen"]; + std::transform(recv_listen.begin(), recv_listen.end(), recv_listen.begin(), ::tolower); + } + + int recv_credit_window = -1; + if(options.is_set("recv-credit-window")) { + recv_credit_window = atoi(options["recv-credit-window"].c_str()); + } + + bool recv_drain_after_credit_window = options.is_set("recv-drain-after-credit-window"); + + bool conn_use_config_file = options.is_set("conn-use-config-file"); + + bool trace_messages = false; + if (options.is_set("trace-messages")) { + if (options["trace-messages"] == "1" || options["trace-messages"] == "true") { + trace_messages = true; + } + } + if (trace_messages) { + enableTracing("aac3_receiver"); + } + + TxReceiverHandler handler = TxReceiverHandler( + address, + conn_urls, + is_topic, + durable_subscriber, + subscriber_unsubscribe, + durable_subscriber_prefix, + durable_subscriber_name, + shared_subscriber, + msg_action, + msg_action_size, + user, + password, + sasl_mechanisms, + conn_sasl_enabled, + conn_ssl_certificate, + conn_ssl_private_key, + conn_ssl_password, + conn_ssl_trust_store, + conn_ssl_verify_peer, + conn_ssl_verify_peer_name, + timeout, + count, + duration, + duration_mode, + conn_reconnect, + conn_reconnect_interval, + conn_reconnect_limit, + conn_reconnect_timeout, + conn_reconnect_first, + conn_reconnect_increment, + conn_reconnect_doubling, + conn_reconnect_custom, + conn_heartbeat, + max_frame_size, + conn_use_config_file, + log_msgs, + process_reply_to, + browse, + recv_listen, + recv_listen_port, + recv_credit_window, + recv_drain_after_credit_window + ); + + if (selector != "") { + handler.setSelector(selector); + } + + int tx_size = 1; + if (options.is_set("tx-size")) { + tx_size = static_cast (options.get("tx-size")); + } + handler.setBatchSize(tx_size); + + try { + if (conn_clientid != "") { + container(handler, conn_clientid).run(); + } else if (conn_clientid_prefix != "") { + conn_clientid = conn_clientid_prefix + ::proton::uuid::random().str(); + + container(handler, conn_clientid).run(); + } else { + container(handler).run(); + } + + return 0; + } catch (const std::exception& e) { + std::cerr << "error: " << e.what() << std::endl; + } + + return 1; +} + +} /* namespace reactor */ +} /* namespace proton */ +} /* namespace dtests */ diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.h b/src/api/qpid-proton/reactor/TxReceivingClient.h new file mode 100644 index 00000000..cecb0bd7 --- /dev/null +++ b/src/api/qpid-proton/reactor/TxReceivingClient.h @@ -0,0 +1,64 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: TxReceivingClient.h + * Author: pematous + * + * Created on October 19, 2015, 4:25 PM + */ + +#ifndef TXRECEIVINGCLIENT_H +#define TXRECEIVINGCLIENT_H + +#include +#include + +#include +#include +#include + +#include "ModernClient.h" +#include "handler/TxReceiverHandler.h" +#include "options/modern/ReceiverOptionsParser.h" +#include "options/OptionsHelper.h" +#include "TypeUtils.h" +#include "UriParser.h" + +using proton::message; +using proton::uuid; + +namespace dtests { +namespace proton { +namespace reactor { + +using dtests::proton::common::ModernClient; + +using namespace dtests::common; + +/** + * Implements a receiving client using the proton reactive API + */ +class TxReceivingClient : public ModernClient { + public: + TxReceivingClient(); + virtual ~TxReceivingClient(); + + virtual int run(int argc, char **argv) const; + + private: + typedef ModernClient super; + + void setMessageOptions(const OptionsSetter &setter, message &msg) const; + +}; + +} /* namespace reactor */ +} /* namespace proton */ +} /* namespace dtests */ + +#endif /* RECEIVINGCLIENT_H */ + diff --git a/src/api/qpid-proton/reactor/TxSendingClient.cpp b/src/api/qpid-proton/reactor/TxSendingClient.cpp new file mode 100644 index 00000000..0623bfa8 --- /dev/null +++ b/src/api/qpid-proton/reactor/TxSendingClient.cpp @@ -0,0 +1,585 @@ +/* + * TxSendingClient.cpp + * + * Created on: Nov 20, 2024 + * Author: pematous + */ + +#include "TxSendingClient.h" + +using proton::message; +using proton::container; + + +namespace dtests { +namespace proton { +namespace reactor { + +using namespace std; +using dtests::common::UriParser; +using dtests::proton::common::ModernClient; + +TxSendingClient::TxSendingClient() +: super() + +{ + +} + +TxSendingClient::~TxSendingClient() +{ + +} + +void TxSendingClient::setMessageOptions(const OptionsSetter &setter, + message &msg) const +{ + /* + * Why the cast, you might ask? Because reply_to is overloaded, + * and the compiler is not smart enough to pick the correct one. + * Therefore we cast it (but not really) so that the compiler knows + * we are talking about reactor_type member function pointer (which is + * defined in the header file analogous to this one. + */ + setter.set("msg-reply-to", &msg, + static_cast (&message::reply_to)); + + setter.set("msg-to", &msg, + static_cast (&message::to)); + + setter.set("msg-correlation-id", &msg, + static_cast (&message::correlation_id)); + + setter.set("msg-content-type", &msg, + static_cast (&message::content_type)); + + setter.set("msg-subject", &msg, + static_cast (&message::subject)); + + setter.set("msg-id", &msg, static_cast (&message::id)); + +#ifdef ENABLE_IMPLICIT_CONVERSIONS + duration def = duration(0); + setter.setNumber("msg-ttl", &msg, + static_cast (&message::ttl), def); +#endif + + setter.set("msg-user-id", &msg, + static_cast (&message::user)); + + setter.setNumber("msg-priority", &msg, + static_cast (&message::priority)); + + setter.setBoolean("msg-durable", &msg, + static_cast (&message::durable)); + + setter.set("msg-group-id", &msg, + static_cast (&message::group_id)); + + setter.set("reply-to-group-id", &msg, + static_cast (&message::reply_to_group_id)); +/* + * This is replaced by setMessageProperties + * +#ifdef REACTOR_PROPERTY_MAP_USES_STL + message::property_map &properties = msg.properties(); + + setter.setMap("msg-property", properties); +#endif // REACTOR_PROPERTY_MAP_USES_STL + */ +} + +bool TxSendingClient::nameVal(const string &in, string &name, string &value, string &separator) const +{ + std::string::size_type i = in.find("="); + separator = "="; + if (i == std::string::npos) { + std::string::size_type i = in.find("~"); + separator = "~"; + if (i == std::string::npos) { + name = in; + return false; + } else { + name = in.substr(0, i); + if (i+1 < in.size()) { + value = in.substr(i+1); + return true; + } else { + return false; + } + } + } else { + name = in.substr(0, i); + if (i+1 < in.size()) { + value = in.substr(i+1); + return true; + } else { + return false; + } + } +} + +void TxSendingClient::setMessageProperty(message *msg, const string &property) const +{ + string name; + string val; + string separator; + string temp; + + if (nameVal(property, name, val, separator)) { + if (separator == "~") { + temp.resize(val.size()); + + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); + + if (temp == "true") { + // true + msg->properties().put(name, true); + } else if (temp == "false") { + // false + msg->properties().put(name, false); + } else if (val.find(".") != std::string::npos || val.find("e") != std::string::npos || val.find("E") != std::string::npos) { + // maybe double + try { + // double + msg->properties().put(name, atof(val.c_str())); + } catch (exception& e) { + // string + msg->properties().put(name, val); + } + } else { + // long + msg->properties().put(name, atol(val.c_str())); + } + // msg->properties().get(name).setEncoding("utf8"); + } else { + msg->properties().put(name, val); + // msg->properties().get(name).setEncoding("utf8"); + } + } else { + msg->properties().put(name, val); + } +} + +void TxSendingClient::setMessageListItem(message *msg, const string &property, std::list &messageList) const +{ + string name; + string val; + string separator; + string temp; + + if (nameVal(property, name, val, separator)) { + if (separator == "~") { + temp.resize(val.size()); + + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); + + if (temp == "true") { + // true + messageList.push_back(true); + } else if (temp == "false") { + // false + messageList.push_back(false); + } else if (val.find(".") != std::string::npos || val.find("e") != std::string::npos || val.find("E") != std::string::npos) { + // maybe double + try { + // double + messageList.push_back(atof(val.c_str())); + } catch (exception& e) { + // string + messageList.push_back(val); + } + } else if (val.find("~") != std::string::npos) { + // string + messageList.push_back(val); + } else { + // long + messageList.push_back(atol(val.c_str())); + } + // msg->properties().get(name).setEncoding("utf8"); + } else { + messageList.push_back(name); + // msg->properties().get(name).setEncoding("utf8"); + } + } else { + messageList.push_back(name); + } +} + +void TxSendingClient::setMessageMapItem(message *msg, const string &property, std::map &messageMap) const +{ + string name; + string val; + string separator; + string temp; + + if (nameVal(property, name, val, separator)) { + if (separator == "~") { + temp.resize(val.size()); + + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); + + if (temp == "true") { + // true + messageMap[name] = true; + } else if (temp == "false") { + // false + messageMap[name] = false; + } else if (val.find(".") != std::string::npos || val.find("e") != std::string::npos || val.find("E") != std::string::npos) { + // maybe double + try { + // double + messageMap[name] = atof(val.c_str()); + } catch (exception& e) { + // string + messageMap[name] = val; + } + } else { + // long + messageMap[name] = atol(val.c_str()); + } + // msg->properties().get(name).setEncoding("utf8"); + } else { + messageMap[name] = val; + // msg->properties().get(name).setEncoding("utf8"); + } + } else { + messageMap[name] = val; + } +} + +void TxSendingClient::setMessageProperties(StringAppendCallback &callbackProperty, message *msg) const +{ + vector properties = callbackProperty.getStrings(); + + for (vector::iterator it = properties.begin(); it != properties.end(); ++it) { + setMessageProperty(msg, *it); + } +} + +void TxSendingClient::setMessageList(StringAppendCallback &callbackList, message *msg) const +{ + vector list = callbackList.getStrings(); + + std::list messageList; + + for (vector::iterator it = list.begin(); it != list.end(); ++it) { + setMessageListItem(msg, *it, messageList); + } + + msg->body() = messageList; +} + +void TxSendingClient::setMessageMap(StringAppendCallback &callbackMap, message *msg) const +{ + vector map = callbackMap.getStrings(); + + std::map messageMap; + + for (vector::iterator it = map.begin(); it != map.end(); ++it) { + setMessageMapItem(msg, *it, messageMap); + } + + msg->body() = messageMap; +} + +void TxSendingClient::setMessageText(string content, message *msg) const { + msg->body(content); +} + +int TxSendingClient::run(int argc, char **argv) const +{ + const string usage = "usage: %prog [OPTION]... DIR [FILE]..."; + const string version = "1.0"; + const string desc = "C/C++ AMQ reactive API sender client for Qpid Proton"; + + SenderOptionsParser parser = SenderOptionsParser(); + UriParser uri_parser = UriParser(); + + /** + * WARNING: do not reassign the result of chainned calls to usage/version/etc + * because it causes the code to segfault. For example, this crashes: + * + * ControlOptions parser = ControlOptions().usage(usage) + */ + parser.usage(usage).version(version).description(desc); + + optparse::Values options = parser.parse_args(argc, argv); + + parser.validate(options); + + setLogLevel(options); + + // Temporary variable for address, will search for prefix + string tempAddress = options["broker-url"]; + // Variable for final address + string address; + // Variable for recognition of topic + bool is_topic = false; + // Search for prefix + std::size_t prefix_index = tempAddress.find("topic://"); + // If prefix is present + if (prefix_index != std::string::npos) { + // Delete prefix + address = tempAddress.replace(prefix_index, 8, ""); + // Set that it will be topic + is_topic = true; + // If prefix is NOT present + } else { + // Use full address + address = tempAddress; + } + + uri_parser.parse(options["broker-url"]); + + std::vector conn_urls; + if (options.is_set("conn-urls")) { + std::stringstream conn_urls_string(options["conn-urls"]); + std::string segment; + + while(std::getline(conn_urls_string, segment, ',')) { + conn_urls.push_back(segment); + } + } + + string user = ""; + if (options.is_set("user")) { + user = options["user"]; + } else { + user = uri_parser.getUser(); + } + + string password = ""; + if (options.is_set("password")) { + password = options["password"]; + } else { + password = uri_parser.getPassword(); + } + + string sasl_mechanisms = ""; + if (options.is_set("sasl-mechanisms")) { + sasl_mechanisms = options["sasl-mechanisms"]; + } else if (user != "" && password != "") { + sasl_mechanisms = "PLAIN"; + } else { + sasl_mechanisms = "ANONYMOUS"; + } + + string conn_sasl_enabled = "true"; + if (options.is_set("conn-sasl-enabled")) { + conn_sasl_enabled = options["conn-sasl-enabled"]; + std::transform(conn_sasl_enabled.begin(), conn_sasl_enabled.end(), conn_sasl_enabled.begin(), ::tolower); + } + + string conn_ssl_certificate = ""; + if (options.is_set("conn-ssl-certificate")) { + conn_ssl_certificate = options["conn-ssl-certificate"]; + } + + string conn_ssl_private_key = ""; + if (options.is_set("conn-ssl-private-key")) { + conn_ssl_private_key = options["conn-ssl-private-key"]; + } + + string conn_ssl_password = ""; + if (options.is_set("conn-ssl-password")) { + conn_ssl_password = options["conn-ssl-password"]; + } + + string conn_ssl_trust_store = ""; + if (options.is_set("conn-ssl-trust-store")) { + conn_ssl_trust_store = options["conn-ssl-trust-store"]; + } + + bool conn_ssl_verify_peer = options.is_set("conn-ssl-verify-peer"); + + bool conn_ssl_verify_peer_name = options.is_set("conn-ssl-verify-peer-name"); + + bool conn_reconnect_custom = false; + + string conn_reconnect = "true"; + if (options.is_set("conn-reconnect")) { + conn_reconnect = options["conn-reconnect"]; + std::transform(conn_reconnect.begin(), conn_reconnect.end(), conn_reconnect.begin(), ::tolower); + } + + int32_t conn_reconnect_interval = 10; + if (options.is_set("conn-reconnect-interval")) { + conn_reconnect_interval = std::strtol(options["conn-reconnect-interval"].c_str(), NULL, 10); + + conn_reconnect_custom = true; + } + + int32_t conn_reconnect_limit = 0; + if (options.is_set("conn-reconnect-limit")) { + conn_reconnect_limit = std::strtol(options["conn-reconnect-limit"].c_str(), NULL, 10); + + conn_reconnect_custom = true; + } + + int32_t conn_reconnect_timeout = duration::FOREVER.milliseconds(); + if (options.is_set("conn-reconnect-timeout")) { + conn_reconnect_timeout = std::strtol(options["conn-reconnect-timeout"].c_str(), NULL, 10); + + conn_reconnect_custom = true; + } + + uint32_t conn_reconnect_first = 0; + if (options.is_set("conn-reconnect-first")) { + conn_reconnect_first = std::strtoul(options["conn-reconnect-first"].c_str(), NULL, 10); + + conn_reconnect_custom = true; + } + + uint32_t conn_reconnect_increment = 100; + if (options.is_set("conn-reconnect-increment")) { + conn_reconnect_increment = std::strtoul(options["conn-reconnect-increment"].c_str(), NULL, 10); + + conn_reconnect_custom = true; + } + + bool conn_reconnect_doubling = true; + if (options.is_set("conn-reconnect-doubling")) { + if (options["conn-reconnect-doubling"] == "false") { + conn_reconnect_doubling = false; + } + + conn_reconnect_custom = true; + } + + uint32_t conn_heartbeat = 0; + if (options.is_set("conn-heartbeat")) { + conn_heartbeat = std::strtoul(options["conn-heartbeat"].c_str(), NULL, 10); + } + + uint32_t max_frame_size = -1; + if (options.is_set("conn-max-frame-size")) { + max_frame_size = std::strtoul(options["conn-max-frame-size"].c_str(), NULL, 10); + } + + OptionsSetter setter = OptionsSetter(options); + + int timeout = 1; + if (options.is_set("timeout")) { + timeout = static_cast (options.get("timeout")); + } + + string log_msgs = ""; + if (options.is_set("log-msgs")) { + log_msgs = options["log-msgs"]; + } + + int duration = 0; + if (options.is_set("duration")) { + duration = static_cast (options.get("duration")); + } + + string duration_mode = "after-send"; + if (options.is_set("duration-mode")) { + duration_mode = options["duration-mode"]; + } + + bool trace_messages = false; + if (options.is_set("trace-messages")) { + if (options["trace-messages"] == "1" || options["trace-messages"] == "true") { + trace_messages = true; + } + } + if (trace_messages) { + enableTracing("aac3_sender"); + } + + message msg; + + setMessageOptions(setter, msg); + setMessageProperties(parser.callbackProperty, &msg); + + if (parser.callbackList.str.length() > 0) { + // List + setMessageList(parser.callbackList, &msg); + } else if (parser.callbackMap.str.length() > 0) { + // Map + setMessageMap(parser.callbackMap, &msg); + } else { + // Text + setMessageText(options["msg-content"], &msg); + } + + +/* + * Note 1: this is a left-over from setMessageOptions. Since I don't want to + * change the method signature there, I check again here and set the remaining + * option that cannot be done implicitly above. + * + * Note 2: this is a hack for GCC ~4.4.7 on i686. + */ +#ifndef ENABLE_IMPLICIT_CONVERSIONS + long value = options.get("msg-ttl"); + + msg.ttl(::proton::duration(value)); +#endif + if (options.is_set("msg-group-seq")) { + msg.group_sequence(std::strtol(options["msg-group-seq"].c_str(), NULL, 10)); + } + + bool conn_use_config_file = options.is_set("conn-use-config-file"); + + TxSenderHandler handler = TxSenderHandler( + address, + conn_urls, + is_topic, + user, + password, + sasl_mechanisms, + conn_sasl_enabled, + conn_ssl_certificate, + conn_ssl_private_key, + conn_ssl_password, + conn_ssl_trust_store, + conn_ssl_verify_peer, + conn_ssl_verify_peer_name, + timeout, + duration, + duration_mode, + conn_reconnect, + conn_reconnect_interval, + conn_reconnect_limit, + conn_reconnect_timeout, + conn_reconnect_first, + conn_reconnect_increment, + conn_reconnect_doubling, + conn_reconnect_custom, + conn_heartbeat, + max_frame_size, + conn_use_config_file, + log_msgs + ); + + handler.setMessage(msg); + + int count = 1; + if (options.is_set("count")) { + count = static_cast (options.get("count")); + } + handler.setCount(count); + + int tx_size = 1; + if (options.is_set("tx-size")) { + tx_size = static_cast (options.get("tx-size")); + } + handler.setBatchSize(tx_size); + + try { + container(handler).run(); + + return 0; + } catch (const std::exception& e) { + std::cerr << "error: " << e.what() << std::endl; + } + + return 1; +} + +} /* namespace reactor */ +} /* namespace proton */ +} /* namespace dtests */ diff --git a/src/api/qpid-proton/reactor/TxSendingClient.h b/src/api/qpid-proton/reactor/TxSendingClient.h new file mode 100644 index 00000000..71ef79d9 --- /dev/null +++ b/src/api/qpid-proton/reactor/TxSendingClient.h @@ -0,0 +1,66 @@ +/* + * TxSendingClient.h + * + * Created on: Nov 20, 2024 + * Author: pematous + */ + +#ifndef DTESTS_NODE_DATA_CLIENTS_LANG_CPP_APIS_PROTON_REACTOR_TXSENDINGCLIENT_H_ +#define DTESTS_NODE_DATA_CLIENTS_LANG_CPP_APIS_PROTON_REACTOR_TXSENDINGCLIENT_H_ + +#include +#include + +#include +#include +#include +#include + +#include "ModernClient.h" +#include "handler/TxSenderHandler.h" +#include "options/modern/SenderOptionsParser.h" +#include "options/OptionsHelper.h" +#include "ContentType.h" +#include "TypeUtils.h" +#include "UriParser.h" + +using proton::message; + +namespace dtests { +namespace proton { +namespace reactor { + +using dtests::proton::common::ModernClient; + +using namespace dtests::common; + +/** + * Implements a connecting client using the proton reactive API + */ +class TxSendingClient : public ModernClient { + public: + TxSendingClient(); + virtual ~TxSendingClient(); + + virtual int run(int argc, char **argv) const; + + private: + typedef ModernClient super; + + void setMessageOptions(const OptionsSetter &setter, message &msg) const; + bool nameVal(const string& in, string& name, string& value, string& separator) const; + void setMessageProperty(message *msg, const string &property) const; + void setMessageListItem(message *msg, const string &property, std::list &messageList) const; + void setMessageMapItem(message *msg, const string &property, std::map &messageMap) const; + void setMessageProperties(StringAppendCallback &callbackProperty, message *msg) const; + void setMessageList(StringAppendCallback &callbackList, message *msg) const; + void setMessageMap(StringAppendCallback &callbackMap, message *msg) const; + void setMessageText(string content, message *msg) const; +}; + +} /* namespace reactor */ +} /* namespace proton */ +} /* namespace dtests */ + + +#endif /* DTESTS_NODE_DATA_CLIENTS_LANG_CPP_APIS_PROTON_REACTOR_SENDINGCLIENT_H_ */ diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp new file mode 100644 index 00000000..c83e78f4 --- /dev/null +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -0,0 +1,540 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: TxReceiverHandler.cpp + * Author: pematous + * + * Created on October 20, 2024 + */ + +#include + +#include + +#include "TxReceiverHandler.h" + +using namespace dtests::common; +using namespace dtests::common::log; +using namespace dtests::proton::reactor; + +TxReceiverHandler::TxReceiverHandler( + const string &url, + vector conn_urls, + bool is_topic, + bool durable_subscriber, + bool subscriber_unsubscribe, + string durable_subscriber_prefix, + string durable_subscriber_name, + bool shared_subscriber, + string msg_action, + int msg_action_size, + string user, + string password, + string sasl_mechanisms, + string conn_sasl_enabled, + string conn_ssl_certificate, + string conn_ssl_private_key, + string conn_ssl_password, + string conn_ssl_trust_store, + bool conn_ssl_verify_peer, + bool conn_ssl_verify_peer_name, + int timeout, + int count, + int duration_time, + string duration_mode, + string conn_reconnect, + int32_t conn_reconnect_interval, + int32_t conn_reconnect_limit, + int32_t conn_reconnect_timeout, + uint32_t conn_reconnect_first, + uint32_t conn_reconnect_increment, + bool conn_reconnect_doubling, + bool conn_reconnect_custom, + uint32_t conn_heartbeat, + uint32_t max_frame_size, + bool conn_use_config_file, + string log_msgs, + bool process_reply_to, + bool browse, + string recv_listen, + int recv_listen_port, + int recv_credit_window, + bool recv_drain_after_credit_window +) + : super( + url, + conn_urls, + is_topic, + user, + password, + sasl_mechanisms, + conn_sasl_enabled, + conn_ssl_certificate, + conn_ssl_private_key, + conn_ssl_password, + conn_ssl_trust_store, + conn_ssl_verify_peer, + conn_ssl_verify_peer_name, + timeout, + conn_reconnect, + conn_reconnect_interval, + conn_reconnect_limit, + conn_reconnect_timeout, + conn_reconnect_first, + conn_reconnect_increment, + conn_reconnect_doubling, + conn_reconnect_custom, + conn_heartbeat, + max_frame_size, + conn_use_config_file, + log_msgs + ), + durable_subscriber(durable_subscriber), + subscriber_unsubscribe(subscriber_unsubscribe), + durable_subscriber_prefix(durable_subscriber_prefix), + durable_subscriber_name(durable_subscriber_name), + shared_subscriber(shared_subscriber), + interval(timeout * duration::SECOND), + timer_event(*this), + msg_action(msg_action), + msg_action_size(msg_action_size), + msg_received_cnt(0), + process_reply_to(process_reply_to), + browse(browse), + count(count), + duration_time(duration_time), + duration_mode(duration_mode), + recv_listen(recv_listen), + recv_listen_port(recv_listen_port), + recv_credit_window(recv_credit_window), + recv_drain_after_credit_window(recv_drain_after_credit_window) +{ +} + +TxReceiverHandler::~TxReceiverHandler() +{ +} + +void TxReceiverHandler::timerEvent() { +#if defined(__REACTOR_HAS_TIMER) + if (timer.isExpired()) { + logger(info) << "Timed out"; + + if (recv_listen != "true") { + exit(EXIT_SUCCESS); + } else { + exit(0); + } + } else { + timer--; + logger(debug) << "Waiting ..."; + + if (recv_listen != "true") { + work_q->schedule(duration::SECOND, make_work(&TxReceiverHandler::timerEvent, this)); + } else { + cont->schedule(duration::SECOND, make_work(&TxReceiverHandler::timerEvent, this)); + } + } +#endif +} + +void TxReceiverHandler::do_message_action(delivery &d) +{ + logger(debug) << "Message action: " << msg_action; + logger(debug) << "Message action size: " << msg_action_size; + + if(msg_action == "ack") { + d.accept(); + + logger(debug) << "Message acknowledged"; + } else if(msg_action == "reject") { + d.reject(); + + logger(debug) << "Message rejected"; + } else if(msg_action == "release") { + d.release(); + + logger(debug) << "Message released"; + } +} + +void TxReceiverHandler::do_process_reply_to(message &m) +{ + logger(debug) << "Processing reply-to"; + + map::iterator it = senders.find(m.reply_to()); + + if (it != senders.end()) { + logger(debug) << "Sender for " << m.reply_to() << " found"; + } else { + logger(debug) << "Sender for " << m.reply_to() << " not found"; + logger(debug) << "Creating sender for " << m.reply_to(); + + senders[m.reply_to()] = recv.connection().open_sender(m.reply_to()); + + logger(debug) << "Sender for " << m.reply_to() << " created"; + } + + message replyToMessage = message(m); + replyToMessage.to(m.reply_to()); + + logger(debug) << "Sending reply to " << replyToMessage.to(); + + senders[m.reply_to()].send(replyToMessage); +} + + +void TxReceiverHandler::drain() { + logger(debug) << "Draining..."; + recv.drain(); +} + +void TxReceiverHandler::setSelector(string selector) +{ + source::filter_map map; + symbol filter_key("selector"); + value filter_value; + encoder enc(filter_value); + + enc << start::described() + << symbol("apache.org:selector-filter:string") + << selector + << finish(); + + fm.put(filter_key, filter_value); +} + +void TxReceiverHandler::createSubscriptionName(string customPrefix) +{ + if (durable_subscriber_name == "") { + uuid client_uuid = ::proton::uuid::random(); + + if (customPrefix == "") { + durable_subscriber_name = "qpid-proton-cpp-" + client_uuid.str(); + } else { + durable_subscriber_name = customPrefix + client_uuid.str(); + } + } + + logger(debug) << "Durable subscription name: " << durable_subscriber_name; +} + +void TxReceiverHandler::setBatchSize(int batchSize) +{ + this->batch_size = batchSize; +} + +int TxReceiverHandler::getBatchSize() const +{ + return batch_size; +} + +// reactor methods + + +void TxReceiverHandler::on_container_start(container &c) +{ + logger(debug) << "Starting messaging handler"; + + if (recv_listen == "true") { + cont = &c; + } + + logger(debug) << "User: " << user; + logger(debug) << "Password: " << password; + logger(debug) << "SASL mechanisms: " << sasl_mechanisms; + logger(debug) << "SASL enabled: " << conn_sasl_enabled; + + logger(debug) << "Maximum frame size: " << max_frame_size; + + logger(debug) << "Topic: " << is_topic; + + connection_options conn_opts; + std::vector< ::proton::symbol > caps; + + if (is_topic) { + caps.push_back("topic"); + + if (durable_subscriber || subscriber_unsubscribe) { + createSubscriptionName(durable_subscriber_prefix); + } + + if (shared_subscriber) { + caps.push_back("shared"); + caps.push_back("global"); + } + } + + logger(debug) << "Source capabilities: "; + for (std::vector< ::proton::symbol >::const_iterator i = caps.begin(); i != caps.end(); ++i) { + logger(debug) << *i; + } + + if (!user.empty()) conn_opts.user(user); + if (!password.empty()) conn_opts.password(password); + + if (conn_sasl_enabled == "false") { + conn_opts.sasl_enabled(false); + } else { + conn_opts.sasl_enabled(true); + } + + conn_opts.sasl_allow_insecure_mechs(true); + conn_opts.sasl_allowed_mechs(sasl_mechanisms); + // conn_opts.max_frame_size(max_frame_size); + conn_opts.failover_urls(conn_urls); + + logger(debug) << "Setting a reconnect timer: " << conn_reconnect; + logger(debug) << "Custom reconnect: " << conn_reconnect_custom; + + configure_reconnect(conn_opts); + configure_ssl(c); + + if (conn_heartbeat != 0) { + logger(debug) << "Heartbeat: " << conn_heartbeat; + + duration heartbeat_seconds = conn_heartbeat * duration::SECOND; + + conn_opts.idle_timeout(heartbeat_seconds); + } + + logger(debug) << "Browsing: " << browse; + + if (browse) { + logger(debug) << "Creating a receiver and connecting to the server"; + + source_options s_opts = source_options() + .distribution_mode(source::COPY) + .filters(this->fm) + .capabilities(caps); + + if (durable_subscriber || subscriber_unsubscribe) { + s_opts.durability_mode( ::proton::source::UNSETTLED_STATE ); + s_opts.expiry_policy( ::proton::source::NEVER ); + } + + receiver_options r_opts = c.receiver_options() + .source( + s_opts + ); + + if (duration_time > 0 && recv_credit_window == -1) { + r_opts.credit_window(1); + } else if (recv_credit_window != -1) { + r_opts.credit_window(recv_credit_window); + } + + if (durable_subscriber || subscriber_unsubscribe) { + r_opts.name(durable_subscriber_name); + } + + connection conn; + if (conn_use_config_file) { + conn = c.connect(); + } else { + conn = c.connect(broker_url.getUri(), conn_opts); + } + + recv = conn.open_receiver( + broker_url.getPath(), + r_opts + ); + + work_q = &recv.work_queue(); + } else { + logger(debug) << "Peer-to-peer: " << recv_listen; + logger(debug) << "Peer-to-peer port: " << recv_listen_port; + + if (recv_listen == "true") { + logger(debug) << "Creating a listener"; + // P2P + stringstream ss; + ss << "0.0.0.0:"; + ss << recv_listen_port; + lsnr = c.listen(ss.str(), conn_opts); + } else { + logger(debug) << "Creating a receiver and connecting to the server"; + + source_options s_opts = source_options().filters(this->fm).capabilities(caps); + + if (durable_subscriber || subscriber_unsubscribe) { + s_opts.durability_mode( ::proton::source::UNSETTLED_STATE ); + s_opts.expiry_policy( ::proton::source::NEVER ); + } + + receiver_options r_opts = c.receiver_options() + .source( + s_opts + ); + + if (durable_subscriber || subscriber_unsubscribe) { + r_opts.name(durable_subscriber_name); + } + + if (duration_time > 0 && recv_credit_window == -1) { + r_opts.credit_window(1); + } else if (recv_credit_window != -1) { + r_opts.credit_window(recv_credit_window); + } + + connection conn; + if (conn_use_config_file) { + conn = c.connect(); + } else { + conn = c.connect(broker_url.getUri(), conn_opts); + } + + recv = conn.open_receiver( + broker_url.getPath(), + r_opts + ); + + work_q = &recv.work_queue(); + } + } + logger(debug) << "Connected to the broker/p2p and waiting for messages"; + + if (subscriber_unsubscribe && durable_subscriber_name != "") { + recv.close(); + recv.connection().close(); + } else { + ts = get_time(); +#if defined(__REACTOR_HAS_TIMER) + if (recv_listen != "true") { + work_q->schedule(duration::IMMEDIATE, make_work(&TxReceiverHandler::timerEvent, this)); + } else { + cont->schedule(duration::IMMEDIATE, make_work(&TxReceiverHandler::timerEvent, this)); + } +#endif + } + +} + +void TxReceiverHandler::on_message(delivery &d, message &m) +{ + msg_received_cnt += 1; + + logger(debug) << "Processing received message"; + + if (log_msgs == "dict") { + logger(trace) << "Decoding message"; + ReactorDecoder decoder = ReactorDecoder(m); + + std::ostringstream stream; + DictWriter writer = DictWriter(&stream); + + DictFormatter formatter = DictFormatter(); + formatter.printMessage(&decoder, &writer); + + writer.endLine(); + std::cout << writer.toString(); + } else if (log_msgs == "interop") { + DictFormatter formatter = DictFormatter(); + + formatter.printMessageInterop(m); + } + + if (duration_time > 0 && duration_mode == "after-receive") { + logger(debug) << "Waiting..."; + sleep4next(ts, count, duration_time, msg_received_cnt); + } + + if((msg_received_cnt % msg_action_size) == 0) { + do_message_action(d); + } + + if (duration_time > 0 && duration_mode == "after-receive-action") { + sleep4next(ts, count, duration_time, msg_received_cnt); + } + + if (duration_time > 0 && duration_mode == "after-receive-action-tx-action") { + // TODO: Transactions are not supported yet + } + + logger(debug) << "Process-reply-to: " << process_reply_to; + + if (process_reply_to) { + if (m.reply_to() != "") { + logger(debug) << "Reply-to address: " << m.reply_to(); + + do_process_reply_to(m); + } else { + logger(debug) << "Reply-to address is not set"; + } + } + + if (recv_drain_after_credit_window && msg_received_cnt == recv_credit_window) { + logger(debug) << "Scheduling drain"; + d.receiver().work_queue().add(make_work(&TxReceiverHandler::drain, this)); + } + + if (!process_reply_to && msg_received_cnt == count) { + if (durable_subscriber) { + d.receiver().detach(); + } else { + d.receiver().close(); + } + d.connection().close(); + } else { +#if defined(__REACTOR_HAS_TIMER) + super::timer.reset(); +#endif + } +} + +void TxReceiverHandler::on_receiver_drain_finish(receiver &r) { + logger(debug) << "Receiver drain finished"; +} + +void TxReceiverHandler::on_tracker_accept(tracker &t) +{ + logger(debug) << "Delivery accepted"; +} + + +void TxReceiverHandler::on_tracker_reject(tracker &t) +{ + logger(debug) << "Delivery rejected"; +} + +void TxReceiverHandler::on_transport_close(transport &t) { + logger(debug) << "Closing the transport"; + + if (conn_reconnect == "false") { + exit(1); + } else if (msg_received_cnt == count) { + exit(0); + } +} + +void TxReceiverHandler::on_transport_error(transport &t) { + logger(error) << "The connection with " << broker_url.getHost() << ":" << broker_url.getPort() << " was interrupted: " << t.error().what(); + + if (t.error().what().find("unauthorized") != string::npos) { + exit(1); + } +} + +void TxReceiverHandler::on_connection_close(connection &conn) +{ + logger(debug) << "Disconnecting ..."; +} + +void TxReceiverHandler::on_connection_error(connection &c) +{ + logger(error) << "Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); + + if (c.error().what().find("Unable to validate user") != string::npos) { + exit(1); + } +} + +void TxReceiverHandler::do_disconnect() +{ + +} + diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h new file mode 100644 index 00000000..5ee73b84 --- /dev/null +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -0,0 +1,260 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: TxReceiverHandler.h + * Author: pematous + * + * Created on November 20, 2024 + */ + +#ifndef TXRECEIVERHANDLER_H +#define TXRECEIVERHANDLER_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "CommonHandler.h" + +#include "reactor/formatter/ReactorDecoder.h" +#include "formatter/DictFormatter.h" +#include "formatter/DictWriter.h" + +#include "formatter/UpstreamFormatter.h" +#include "formatter/UpstreamWriter.h" +#include "Utils.h" + +using proton::message; +using proton::container; +using proton::connection; +using proton::sender; +using proton::receiver; +using proton::listener; +using proton::delivery; +using proton::tracker; +using proton::void_function0; +using proton::endpoint; +using proton::source; +using proton::source_options; +using proton::transport; +using proton::connection_options; +using proton::receiver_options; +using proton::symbol; +using proton::codec::start; +using proton::codec::finish; +using proton::codec::encoder; +using proton::binary; +using proton::uuid; +using proton::transaction; +using proton::transaction_handler; + +#ifdef PN_CPP_HAS_STD_FUNCTION +#undef PN_CPP_HAS_STD_FUNCTION +#endif + +namespace dtests { +namespace proton { +namespace reactor { + +/** + * A proton message handler that handles message receive events + */ +class TxReceiverHandler : public CommonHandler, transaction_handler { + public: + /** + * Constructor + * @param url broker URL + * @param conn_urls connection URLs + * @param is_topic if target is topic + * @param durable_subscriber durable subscription to topic + * @param subscriber_unsubscribe unsubscribe durable subscriptor + * @param durable_subscriber_prefix prefix to use to identify subscriber + * @param durable_subscriber_name name of the durable subscriber to be unsubscribe + * @param shared_subscriber shared subscription to topic + * @param msg_action message action + * @param msg_action_size apply action in the batch of given size + * @param user username + * @param password password + * @param sasl_mechanisms SASL mechanisms + * @param conn_sasl_enabled enable connection SASL + * @param conn_ssl_certificate path to client certificate + * @param conn_ssl_private_key path to client private key + * @param conn_ssl_password client's certificate database password + * @param conn_ssl_trust_store path to client trust store + * @param conn_ssl_verify_peer verifies server certificate + * @param conn_ssl_verify_peer_name verifies connection url against server hostname + * @param timeout timeout + * @param count count of messages to receive + * @param duration_time message actions total duration + * @param duration_mode specifies where to wait to achieve expected duration + * @param conn_reconnect type of reconnection + * @param conn_reconnect_interval reconnect interval + * @param conn_reconnect_limit reconnect limit + * @param conn_reconnect_timeout reconnect timeout + * @param conn_reconnect_first reconnect first + * @param conn_reconnect_increment reconnect increment + * @param conn_reconnect_doubling reconnect doubling + * @param conn_reconnect_custom custom reconnect values + * @param conn_heartbeat connection heartbeat in seconds + * @param max_frame_size maximum frame size + * @param conn_use_config_file use configuration file for connection + * @param log_msgs message log format + * @param process_reply_to send message to reply-to address if enabled and message got reply-to address + * @param browse enable browsing receiver + * @param recv_listen enable p2p listener + * @param recv_listen_port p2p listener port + */ + TxReceiverHandler( + const string &url, + vector conn_urls, + bool is_topic, + bool durable_subscriber, + bool subscriber_unsubscribe, + string durable_subscriber_prefix, + string durable_subscriber_name, + bool shared_subscriber, + string msg_action, + int msg_action_size, + string user, + string password, + string sasl_mechanisms, + string conn_sasl_enabled = "true", + string conn_ssl_certificate = "", + string conn_ssl_private_key = "", + string conn_ssl_password = "", + string conn_ssl_trust_store = "", + bool conn_ssl_verify_peer = false, + bool conn_ssl_verify_peer_name = false, + int timeout = 10, + int count = 0, + int duration_time = 0, + string duration_mode = "after-receive", + string conn_reconnect = "true", + int32_t conn_reconnect_interval = -1, + int32_t conn_reconnect_limit = -1, + int32_t conn_reconnect_timeout = -1, + uint32_t conn_reconnect_first = 0, + uint32_t conn_reconnect_increment = 100, + bool conn_reconnect_doubling = true, + bool conn_reconnect_custom = false, + uint32_t conn_heartbeat = 0, + uint32_t max_frame_size = -1, + bool conn_use_config_file = false, + string log_msgs = "", + bool process_reply_to = false, + bool browse = false, + string recv_listen = "false", + int recv_listen_port = 5672, + int recv_credit_window = -1, + bool recv_drain_after_credit_window = false + ); + + virtual ~TxReceiverHandler(); + + void timerEvent(); + + void do_message_action(delivery &d); + void do_process_reply_to(message &m); + void drain(); + void setSelector(string selector); + void createSubscriptionName(string customPrefix); + + // TODO transaction reactor methods on_transaction_ + + /** + * Sets the transaction batch size + * @param batch_size the transaction batch size + */ + void setBatchSize(int batchSize); + + /** + * Gets the transaction batch size + * @return the transaction batch size + */ + int getBatchSize() const; + + transaction_handler th; + + // reactor methods + void on_container_start(container &c); + void on_message(delivery &d, message &m); + void on_receiver_drain_finish(receiver &r); + void on_tracker_accept(tracker &t); + void on_tracker_reject(tracker &t); + void on_transport_close(transport &t); + void on_transport_error(transport &t); + void on_connection_close(connection &conn); + void on_connection_error(connection &conn); + + private: + typedef CommonHandler super; + receiver recv; + listener lsnr; + container *cont; + double ts; + + struct timer_event_t : public void_function0 { + TxReceiverHandler &parent; + timer_event_t(TxReceiverHandler &handler): parent(handler) { } + void operator()() { + parent.timerEvent(); + } + }; + + source::filter_map fm; + + bool durable_subscriber; + bool subscriber_unsubscribe; + string durable_subscriber_prefix; + string durable_subscriber_name; + bool shared_subscriber; + + duration interval; + timer_event_t timer_event; + + string msg_action; + int msg_action_size; + int msg_received_cnt; + bool process_reply_to; + bool browse; + int count; + int duration_time; + string duration_mode; + std::map senders; + string recv_listen; + int recv_listen_port; + int recv_credit_window; + bool recv_drain_after_credit_window; + + void do_disconnect(); + + // transact + int batch_size = 0; + int current_batch = 0; + int committed = 0; + int confirmed = 0; + int total = 0; + + transaction *tx; +}; + +} /* namespace reactor */ +} /* namespace proton */ +} /* namespace dtests */ + +#endif /* RECEIVERHANDLER_H */ + diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp new file mode 100644 index 00000000..9272f93c --- /dev/null +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -0,0 +1,487 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: TxSenderHandler.cpp + * Author: pematous + * + * Created on November 20, 2024 + */ + +#include "TxSenderHandler.h" + +#include "reactor/formatter/ReactorDecoder.h" +#include "formatter/DictFormatter.h" +#include "formatter/DictWriter.h" + +namespace dtests { +namespace proton { +namespace reactor { + +using namespace dtests::common; +using namespace dtests::common::log; + +TxSenderHandler::TxSenderHandler( + const string &url, + vector conn_url, + bool is_topic, + string user, + string password, + string sasl_mechanisms, + string conn_sasl_enabled, + string conn_ssl_certificate, + string conn_ssl_private_key, + string conn_ssl_password, + string conn_ssl_trust_store, + bool conn_ssl_verify_peer, + bool conn_ssl_verify_peer_name, + int timeout, + int duration_time, + string duration_mode, + string conn_reconnect, + int32_t conn_reconnect_interval, + int32_t conn_reconnect_limit, + int32_t conn_reconnect_timeout, + uint32_t conn_reconnect_first, + uint32_t conn_reconnect_increment, + bool conn_reconnect_doubling, + bool conn_reconnect_custom, + uint32_t conn_heartbeat, + uint32_t max_frame_size, + bool conn_use_config_file, + string log_msgs +) + : super( + url, + conn_url, + is_topic, + user, + password, + sasl_mechanisms, + conn_sasl_enabled, + conn_ssl_certificate, + conn_ssl_private_key, + conn_ssl_password, + conn_ssl_trust_store, + conn_ssl_verify_peer, + conn_ssl_verify_peer_name, + timeout, + conn_reconnect, + conn_reconnect_interval, + conn_reconnect_limit, + conn_reconnect_timeout, + conn_reconnect_first, + conn_reconnect_increment, + conn_reconnect_doubling, + conn_reconnect_custom, + conn_heartbeat, + max_frame_size, + conn_use_config_file, + log_msgs + ), + ready(false), + count(1), + duration_time(duration_time), + duration_mode(duration_mode), + sent(0), + confirmedSent(0), + batch_size(1), + current_batch(0), + committed(0), + confirmed(0), + total(0), + // TODO whats this ? + m(), + timer_event(*this), + interval(duration::IMMEDIATE) +{ + +} + +TxSenderHandler::~TxSenderHandler() +{ + logger(debug) << "Destroying the sender handler"; +} + +void TxSenderHandler::timerEvent() { +#if defined(__REACTOR_HAS_TIMER) + if (timer.isExpired()) { + logger(info) << "Timed out"; + + exit(EXIT_SUCCESS); + } else { + timer--; + logger(debug) << "Waiting ..."; + + work_q->schedule(duration::SECOND, make_work(&TxSenderHandler::timerEvent, this)); + } +#endif +} + +void TxSenderHandler::setCount(int count) +{ + this->count = count; +} + +int TxSenderHandler::getCount() const +{ + return count; +} + +void TxSenderHandler::setBatchSize(int batchSize) +{ + this->batch_size = batchSize; +} + +int TxSenderHandler::getBatchSize() const +{ + return batch_size; +} + +void TxSenderHandler::setMessage(message &msg) +{ + this->m = msg; +} + +message TxSenderHandler::getMessage() const +{ + return m; +} + +void TxSenderHandler::checkIfCanSend() { + if (sent < count) { + work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); + + if (sndr.credit() > 0) { + send(); + } else { + ready = true; + } + } +} + +// TODO VIP TRANSACTIONS + +void TxSenderHandler::send() +{ + logger(debug) << "Preparing to send message"; + int credit = sndr.credit(); + + if (credit == 0) { + logger(warning) << "There not enough credit to send messages"; + } + + logger(debug) << "The handler has enough credit to send " << credit + << " message" << (credit > 1 ? "s" : "" ); + logger(debug) << "The handler has sent " << sent << " messages" + << (sent > 1 ? "s" : "" ); + + logger(trace) << "Sending messages through the link"; + + message message_to_send = message(m); + + try { + if (get(message_to_send.body()).find("%d") != string::npos) { + size_t percent_position = get(message_to_send.body()).find("%d"); + stringstream ss; + ss << sent; + string replaced_number = get(message_to_send.body()).replace(percent_position, 2, ss.str()); + message_to_send.body(replaced_number); + } + } catch (conversion_error &) { + } + + while (tx && sndr.credit() && (committed + current_batch) < total) + { + sndr.send(message_to_send); + + if (log_msgs == "dict") { + ReactorDecoder decoder = ReactorDecoder(message_to_send); + + std::ostringstream stream; + DictWriter writer = DictWriter(&stream); + + DictFormatter formatter = DictFormatter(); + formatter.printMessage(&decoder, &writer); + + writer.endLine(); + std::cout << writer.toString(); + } else if (log_msgs == "interop") { + DictFormatter formatter = DictFormatter(); + + formatter.printMessageInterop(message_to_send); + } + + if (duration_time > 0 && duration_mode == "after-send-tx-action") { + // TODO: Transactions are not supported yet + } + + // TODO both ?? + sent++; + confirmed++; + + // TX + current_batch += 1; + if(current_batch == batch_size) + { + tx->commit(); + tx = NULL; + // reject + // tx->rollback(); + // tx = NULL; + // TODO none + // if (confirmed + current_batch == total) { + // std::cout << "All messages committed"; + // conn.close(); + // } else { + // current_batch = 0; + // confirmed += current_batch; + // cont->declare_transaction(conn, th); + // } + } else if (confirmed + current_batch == total) { + // DO ENDLOOP ACTION + tx->commit(); + // reject + // tx->rollback(); + // TODO none + // conn.close() + } + } + +#if defined(__REACTOR_HAS_TIMER) + timer.reset(); +#endif + ready = false; +} + +// reactor methods +void TxSenderHandler::on_sendable(sender &s) +{ + if (ready) { + send(); + } +} + + +void TxSenderHandler::on_tracker_accept(tracker &t) +{ + logger(trace) << "Message accepted. Now obtaining the connection reference object"; + connection conn = t.connection(); + + logger(trace) << "Confirmed message delivery"; + confirmed += 1; +// confirmedSent++; +// +// if (confirmedSent == count) { +// logger(trace) << "Closing the sender after sending " << confirmedSent +// << " message" << (confirmedSent > 1 ? "s" : "" ); +// conn.close(); +// } +} + +void TxSenderHandler::on_tracker_reject(tracker &t) +{ + std::cerr << "[error] Delivery rejected" << std::endl; + + exit(1); +} + +void TxSenderHandler::on_transport_error(transport &t) { + logger(error) << "The connection with " << broker_url.getHost() << ":" << broker_url.getPort() << " was interrupted: " << t.error().what(); + + if (t.error().what().find("unauthorized") != string::npos) { + exit(1); + } +} + +void TxSenderHandler::on_transport_close(transport &t) { + logger(debug) << "Closing the transport"; + + if (conn_reconnect == "false") { + exit(1); + } +} + +void TxSenderHandler::on_connection_close(connection &c) +{ + logger(debug) << "Closing connection"; + logger(info) << "Transactions"; + logger(info) << "Transaction total: " << total; + logger(info) << "Transaction sent: " << sent; + logger(info) << "Transaction batch size: " << batch_size; + logger(info) << "Transaction current batch: " << current_batch; + logger(info) << "Transaction confirmed: " << confirmed; + logger(info) << "Transaction committed: " << committed; + current_batch = 0; +} + +void TxSenderHandler::on_connection_error(connection &c) +{ + logger(error) << "Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); + + if (c.error().what().find("Unable to validate user") != string::npos) { + exit(1); + } +} + +void TxSenderHandler::on_transaction_declared(transaction &t) { + tx = &t; + send(); +} + +void TxSenderHandler::on_transaction_committed(transaction &t) { + committed += current_batch; + connection conn = sndr.connection(); + if(committed == total) { + std::cout << "All messages committed"; + conn.close(); + } + else { + current_batch = 0; + cont->declare_transaction(conn, th); + } +} + +// TODO jak je to s temi override ? +// ?? python to tak ma ?? stejne jak commited +// void TxSenderHandler::on_transaction_aborted(transaction t) override { +void TxSenderHandler::on_transaction_aborted(transaction &t) { + committed += current_batch; + connection conn = sndr.connection(); + if(committed == total) { + std::cout << "All messages committed"; + conn.close(); + } + else { + current_batch = 0; + cont->declare_transaction(conn, th); + } +} + +void TxSenderHandler::on_sender_close(sender &s) { + logger(info) << "Transactions"; + logger(info) << "Transaction total: " << total; + logger(info) << "Transaction sent: " << sent; + logger(info) << "Transaction batch size: " << batch_size; + logger(info) << "Transaction current batch: " << current_batch; + logger(info) << "Transaction confirmed: " << confirmed; + logger(info) << "Transaction committed: " << committed; + current_batch = 0; +} + +void TxSenderHandler::on_container_start(container &c) +{ + logger(debug) << "Starting messaging handler"; + + logger(debug) << "User: " << user; + logger(debug) << "Password: " << password; + logger(debug) << "SASL mechanisms: " << sasl_mechanisms; + logger(debug) << "SASL enabled: " << conn_sasl_enabled; + + logger(debug) << "Maximum frame size: " << max_frame_size; + + logger(info) << "Transactions"; + logger(info) << "Transaction total: " << total; + logger(info) << "Transaction sent: " << sent; + logger(info) << "Transaction batch size: " << batch_size; + logger(info) << "Transaction current batch: " << current_batch; + logger(info) << "Transaction confirmed: " << confirmed; + logger(info) << "Transaction committed: " << committed; + + logger(debug) << "Topic: " << is_topic; + + std::vector< ::proton::symbol > caps; + + if (is_topic) { + caps.push_back("topic"); + } + + logger(debug) << "Source capabilities: "; + for (std::vector< ::proton::symbol >::const_iterator i = caps.begin(); i != caps.end(); ++i) { + logger(debug) << *i; + } +// connection_options conn_opts; +// +// if (!user.empty()) conn_opts.user(user); +// if (!password.empty()) conn_opts.password(password); +// +// if (conn_sasl_enabled == "false") { +// conn_opts.sasl_enabled(false); +// } else { +// conn_opts.sasl_enabled(true); +// } +// +// conn_opts.sasl_allow_insecure_mechs(true); +// conn_opts.sasl_allowed_mechs(sasl_mechanisms); +// // conn_opts.max_frame_size(max_frame_size); +// conn_opts.failover_urls(conn_urls); +// +// logger(debug) << "Setting a reconnect timer: " << conn_reconnect; +// logger(debug) << "Custom reconnect: " << conn_reconnect_custom; +// +// configure_reconnect(conn_opts); +// configure_ssl(c); +// +// if (conn_heartbeat != 0) { +// logger(debug) << "Heartbeat: " << conn_heartbeat; +// +// duration heartbeat_seconds = conn_heartbeat * duration::SECOND; +// +// conn_opts.idle_timeout(heartbeat_seconds); +// } +// +// logger(debug) << "Creating a sender"; +// +// connection conn; +// if (conn_use_config_file) { +// conn = c.connect(); +// } else { +// conn = c.connect(broker_url.getUri(), conn_opts); +// } + + connection conn = c.connect(broker_url.getUri()); + sndr = conn.open_sender( + broker_url.getPath(), + c.sender_options() + .source( + source_options().capabilities(caps) + ) + ); + +// work_q = &sndr.work_queue(); +// +// logger(trace) << "Setting up timer"; +// +// if (duration_time > 0 && count > 0) { +// interval = duration((duration_time * duration::SECOND) / count); +// +// logger(trace) << "Interval for duration: " << interval.milliseconds() << " ms"; +// } +//#if defined(__REACTOR_HAS_TIMER) +// work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::timerEvent, this)); +// +// if (duration_time > 0 && duration_mode == "after-send") { +// work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); +// } else if (duration_time > 0 && duration_mode == "before-send") { +// work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); +// } else { +// work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); +// } +//#endif + + tx = NULL; + // currently causes seqfault + c.declare_transaction(conn, th); + cont = &c; +} + +// void TxSenderHandler::on_transaction_aborted(transaction) {} +// void TxSenderHandler::on_transaction_declare_failed(transaction) {} +// void TxSenderHandler::on_transaction_commit_failed(transaction) {} + +} /* namespace reactor */ +} /* namespace proton */ +} /* namespace dtests */ diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h new file mode 100644 index 00000000..c342b904 --- /dev/null +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -0,0 +1,221 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: TxSenderHandler.h + * Author: pematous + * + * Created on November 20, 2024 + */ + +#ifndef TXSENDERHANDLER_H +#define TXSENDERHANDLER_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "CommonHandler.h" +#include "Timer.h" +#include "Utils.h" + +using proton::message; +using proton::message_id; +using proton::connection; +using proton::sender; +using proton::delivery; +using proton::source_options; +using proton::transport; +using proton::tracker; +using proton::connection_options; +using proton::sender; +using proton::transaction; +using proton::transaction_handler; + +namespace dtests { +namespace proton { +namespace reactor { + +using dtests::common::Timer; + +/** + * A proton message handler that handles message send events + */ +class TxSenderHandler : public CommonHandler, transaction_handler { + public: + /** + * Constructor + * @param url broker URL + * @param conn_urls connection URLs + * @param is_topic if target is topic + * @param user username + * @param password password + * @param sasl_mechanisms SASL mechanisms + * @param conn_sasl_enabled enable connection SASL + * @param conn_ssl_certificate path to client certificate + * @param conn_ssl_private_key path to client private key + * @param conn_ssl_password client's certificate database password + * @param conn_ssl_trust_store path to client trust store + * @param conn_ssl_verify_peer verifies server certificate + * @param conn_ssl_verify_peer_name verifies connection url against server hostname + * @param timeout timeout + * @param duration message actions total duration + * @param duration_mode specifies where to wait to achieve expected duration + * @param conn_reconnect type or reconnection + * @param conn_reconnect_interval reconnect interval + * @param conn_reconnect_limit reconnect limit + * @param conn_reconnect_timeout reconnect timeout + * @param conn_reconnect_first reconnect first + * @param conn_reconnect_increment reconnect increment + * @param conn_reconnect_doubling reconnect doubling + * @param conn_reconnect_custom custom reconnect values + * @param conn_heartbeat connection heartbeat in seconds + * @param max_frame_size maximum frame size + * @param conn_use_config_file use configuration file for connection + * @param log_msgs message log format + */ + TxSenderHandler( + const string &url, + vector conn_urls, + bool is_topic, + string user, + string password, + string sasl_mechanisms, + string conn_sasl_enabled = "true", + string conn_ssl_certificate = "", + string conn_ssl_private_key = "", + string conn_ssl_password = "", + string conn_ssl_trust_store = "", + bool conn_ssl_verify_peer = false, + bool conn_ssl_verify_peer_name = false, + int timeout = 10, + int duration_time = 0, + string duration_mode = "after-send", + string conn_reconnect = "true", + int32_t conn_reconnect_interval = -1, + int32_t conn_reconnect_limit = -1, + int32_t conn_reconnect_timeout = -1, + uint32_t conn_reconnect_first = 0, + uint32_t conn_reconnect_increment = 100, + bool conn_reconnect_doubling = true, + bool conn_reconnect_custom = false, + uint32_t conn_heartbeat = 0, + uint32_t max_frame_size = -1, + bool conn_use_config_file = false, + string log_msgs = "" + ); + + void timerEvent(); + + virtual ~TxSenderHandler(); + + /** + * Sets the message count + * @param count the message count + */ + void setCount(int count); + + /** + * Gets the message count + * @return the message count + */ + int getCount() const; + + /** + * Sets the transaction batch size + * @param batch_size the transaction batch size + */ + void setBatchSize(int batchSize); + + /** + * Gets the transaction batch size + * @return the transaction batch size + */ + int getBatchSize() const; + + /** + * Sets the message to send + * @param m the message to send + */ + void setMessage(message &m); + + void checkIfCanSend(); + void send(); + + /** + * Gets the message to send + * @return the message to send + */ + message getMessage() const; + + transaction_handler th; + + // reactor methods + void on_container_start(container &c); + void on_sendable(sender &s); + void on_tracker_accept(tracker &t); + void on_tracker_reject(tracker &t); + void on_transport_error(transport &t); + void on_transport_close(transport &t); + void on_connection_error(connection &c); + void on_connection_close(connection &c); + + // TODO TX Support + void on_sender_close(sender &s); + void on_transaction_declared(transaction &t); + void on_transaction_committed(transaction &t); + void on_transaction_aborted(transaction &t); +// void on_transaction_declare_failed(transaction &t); +// void on_transaction_commit_failed(transaction &t); + + private: + typedef CommonHandler super; + bool ready; + int count; + int duration_time; + string duration_mode; + int sent; + int confirmedSent; + + // transact + int batch_size = 0; + int current_batch = 0; + int committed = 0; + int confirmed = 0; + int total = 0; + + sender sndr; + transaction *tx; + container *cont; + + message m; + + struct timer_event_t : public void_function0 { + TxSenderHandler &parent; + timer_event_t(TxSenderHandler &handler) : parent(handler) {} + void operator()() { + parent.timerEvent(); + } + }; + + timer_event_t timer_event; + + duration interval; + +}; + +} /* namespace reactor */ +} /* namespace proton */ +} /* namespace dtests */ + +#endif /* SENDERHANDLER_H */ + From 0868f92922dabb271dad80c3f745338166b14f0e Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 29 Nov 2024 14:58:51 +0100 Subject: [PATCH 04/53] wip: initial version refactoring #2 --- .../qpid-proton/reactor/TxReceivingClient.cpp | 10 + .../qpid-proton/reactor/TxSendingClient.cpp | 14 +- .../reactor/handler/TxReceiverHandler.cpp | 14 +- .../reactor/handler/TxReceiverHandler.h | 13 +- .../reactor/handler/TxSenderHandler.cpp | 186 ++++++++---------- .../reactor/handler/TxSenderHandler.h | 44 ++--- 6 files changed, 142 insertions(+), 139 deletions(-) diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.cpp b/src/api/qpid-proton/reactor/TxReceivingClient.cpp index e323b151..2d5528fe 100644 --- a/src/api/qpid-proton/reactor/TxReceivingClient.cpp +++ b/src/api/qpid-proton/reactor/TxReceivingClient.cpp @@ -339,6 +339,16 @@ int TxReceivingClient::run(int argc, char **argv) const enableTracing("aac3_receiver"); } + string tx_action = "commit"; + if (options.is_set("tx-action")) { + tx_action = options["tx-action"]; + } + + string tx_endloop_action = "commit"; + if (options.is_set("tx-endloop-action")) { + tx_endloop_action = options["tx-endloop-action"]; + } + TxReceiverHandler handler = TxReceiverHandler( address, conn_urls, diff --git a/src/api/qpid-proton/reactor/TxSendingClient.cpp b/src/api/qpid-proton/reactor/TxSendingClient.cpp index 0623bfa8..c3fb377b 100644 --- a/src/api/qpid-proton/reactor/TxSendingClient.cpp +++ b/src/api/qpid-proton/reactor/TxSendingClient.cpp @@ -489,6 +489,16 @@ int TxSendingClient::run(int argc, char **argv) const enableTracing("aac3_sender"); } + string tx_action = "commit"; + if (options.is_set("tx-action")) { + tx_action = options["tx-action"]; + } + + string tx_endloop_action = "commit"; + if (options.is_set("tx-endloop-action")) { + tx_endloop_action = options["tx-endloop-action"]; + } + message msg; setMessageOptions(setter, msg); @@ -552,7 +562,9 @@ int TxSendingClient::run(int argc, char **argv) const conn_heartbeat, max_frame_size, conn_use_config_file, - log_msgs + log_msgs, + tx_action, + tx_endloop_action ); handler.setMessage(msg); diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index c83e78f4..c8810151 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -4,10 +4,10 @@ * and open the template in the editor. */ -/* +/* * File: TxReceiverHandler.cpp * Author: pematous - * + * * Created on October 20, 2024 */ @@ -132,7 +132,7 @@ void TxReceiverHandler::timerEvent() { } else { timer--; logger(debug) << "Waiting ..."; - + if (recv_listen != "true") { work_q->schedule(duration::SECOND, make_work(&TxReceiverHandler::timerEvent, this)); } else { @@ -204,7 +204,7 @@ void TxReceiverHandler::setSelector(string selector) << symbol("apache.org:selector-filter:string") << selector << finish(); - + fm.put(filter_key, filter_value); } @@ -248,7 +248,7 @@ void TxReceiverHandler::on_container_start(container &c) logger(debug) << "Password: " << password; logger(debug) << "SASL mechanisms: " << sasl_mechanisms; logger(debug) << "SASL enabled: " << conn_sasl_enabled; - + logger(debug) << "Maximum frame size: " << max_frame_size; logger(debug) << "Topic: " << is_topic; @@ -290,7 +290,7 @@ void TxReceiverHandler::on_container_start(container &c) logger(debug) << "Setting a reconnect timer: " << conn_reconnect; logger(debug) << "Custom reconnect: " << conn_reconnect_custom; - + configure_reconnect(conn_opts); configure_ssl(c); @@ -513,7 +513,7 @@ void TxReceiverHandler::on_transport_close(transport &t) { void TxReceiverHandler::on_transport_error(transport &t) { logger(error) << "The connection with " << broker_url.getHost() << ":" << broker_url.getPort() << " was interrupted: " << t.error().what(); - + if (t.error().what().find("unauthorized") != string::npos) { exit(1); } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 5ee73b84..6ebf645f 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -4,7 +4,7 @@ * and open the template in the editor. */ -/* +/* * File: TxReceiverHandler.h * Author: pematous * @@ -64,7 +64,7 @@ using proton::transaction_handler; #ifdef PN_CPP_HAS_STD_FUNCTION #undef PN_CPP_HAS_STD_FUNCTION -#endif +#endif namespace dtests { namespace proton { @@ -162,7 +162,7 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { int recv_credit_window = -1, bool recv_drain_after_credit_window = false ); - + virtual ~TxReceiverHandler(); void timerEvent(); @@ -185,7 +185,7 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { * Gets the transaction batch size * @return the transaction batch size */ - int getBatchSize() const; + int getBatchSize() const; transaction_handler th; @@ -206,11 +206,11 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { listener lsnr; container *cont; double ts; - + struct timer_event_t : public void_function0 { TxReceiverHandler &parent; timer_event_t(TxReceiverHandler &handler): parent(handler) { } - void operator()() { + void operator()() { parent.timerEvent(); } }; @@ -247,7 +247,6 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { int current_batch = 0; int committed = 0; int confirmed = 0; - int total = 0; transaction *tx; }; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 9272f93c..e705596c 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -4,10 +4,10 @@ * and open the template in the editor. */ -/* +/* * File: TxSenderHandler.cpp * Author: pematous - * + * * Created on November 20, 2024 */ @@ -52,7 +52,9 @@ TxSenderHandler::TxSenderHandler( uint32_t conn_heartbeat, uint32_t max_frame_size, bool conn_use_config_file, - string log_msgs + string log_msgs, + string tx_action, + string tx_endloop_action ) : super( url, @@ -86,13 +88,12 @@ TxSenderHandler::TxSenderHandler( count(1), duration_time(duration_time), duration_mode(duration_mode), - sent(0), - confirmedSent(0), batch_size(1), current_batch(0), committed(0), - confirmed(0), - total(0), + confirmedSent(0), + tx_action(tx_action), + tx_endloop_action(tx_endloop_action), // TODO whats this ? m(), timer_event(*this), @@ -152,7 +153,7 @@ message TxSenderHandler::getMessage() const } void TxSenderHandler::checkIfCanSend() { - if (sent < count) { + if (confirmedSent < count) { work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); if (sndr.credit() > 0) { @@ -163,8 +164,6 @@ void TxSenderHandler::checkIfCanSend() { } } -// TODO VIP TRANSACTIONS - void TxSenderHandler::send() { logger(debug) << "Preparing to send message"; @@ -176,8 +175,6 @@ void TxSenderHandler::send() logger(debug) << "The handler has enough credit to send " << credit << " message" << (credit > 1 ? "s" : "" ); - logger(debug) << "The handler has sent " << sent << " messages" - << (sent > 1 ? "s" : "" ); logger(trace) << "Sending messages through the link"; @@ -187,16 +184,23 @@ void TxSenderHandler::send() if (get(message_to_send.body()).find("%d") != string::npos) { size_t percent_position = get(message_to_send.body()).find("%d"); stringstream ss; - ss << sent; + ss << confirmedSent; string replaced_number = get(message_to_send.body()).replace(percent_position, 2, ss.str()); message_to_send.body(replaced_number); } } catch (conversion_error &) { } - while (tx && sndr.credit() && (committed + current_batch) < total) + logger(trace) << "Transaction variables"; + logger(trace) << "confirmed: " << confirmedSent; + logger(trace) << "commited: " << committed; + logger(trace) << "count: " << count; + logger(trace) << "is_empty: " << tx.is_empty(); + logger(trace) << "current_batch: " << current_batch; + + while (!tx.is_empty() && sndr.credit() && (committed + current_batch) < count) { - sndr.send(message_to_send); + tx.send(sndr, message_to_send); if (log_msgs == "dict") { ReactorDecoder decoder = ReactorDecoder(message_to_send); @@ -218,37 +222,35 @@ void TxSenderHandler::send() if (duration_time > 0 && duration_mode == "after-send-tx-action") { // TODO: Transactions are not supported yet } - - // TODO both ?? - sent++; - confirmed++; - // TX + confirmedSent++; + current_batch += 1; - if(current_batch == batch_size) - { - tx->commit(); - tx = NULL; - // reject - // tx->rollback(); - // tx = NULL; - // TODO none - // if (confirmed + current_batch == total) { - // std::cout << "All messages committed"; - // conn.close(); - // } else { - // current_batch = 0; - // confirmed += current_batch; - // cont->declare_transaction(conn, th); - // } - } else if (confirmed + current_batch == total) { - // DO ENDLOOP ACTION - tx->commit(); - // reject - // tx->rollback(); - // TODO none - // conn.close() - } + + logger(trace) << "Transaction variables"; + logger(trace) << "confirmed: " << confirmedSent; + logger(trace) << "commited: " << committed; + logger(trace) << "count: " << count; + logger(trace) << "is_empty: " << tx.is_empty(); + logger(trace) << "current_batch: " << current_batch; + + if (confirmedSent + current_batch == count) { + logger(debug) << "[send] Transaction attempt (endloop): " << tx_endloop_action; + if (tx_endloop_action == "commit") { + tx.commit(); + } else if (tx_endloop_action == "rollback") { + tx.abort(); + } + sndr.connection().close(); + } else if(current_batch == batch_size) { + logger(debug) << "[send] Transaction attempt: " << tx_action; + if (tx_endloop_action == "commit") { + tx.commit(); + } else if (tx_endloop_action == "rollback") { + tx.abort(); + } + tx = transaction(); + } } #if defined(__REACTOR_HAS_TIMER) @@ -257,9 +259,10 @@ void TxSenderHandler::send() ready = false; } -// reactor methods +// reactor methods void TxSenderHandler::on_sendable(sender &s) { + logger(trace) << "[on_sendable] transaction: " << &tx; if (ready) { send(); } @@ -268,24 +271,16 @@ void TxSenderHandler::on_sendable(sender &s) void TxSenderHandler::on_tracker_accept(tracker &t) { - logger(trace) << "Message accepted. Now obtaining the connection reference object"; + logger(trace) << "[on_tracker_accept] Message accepted. Now obtaining the connection reference object"; connection conn = t.connection(); - - logger(trace) << "Confirmed message delivery"; - confirmed += 1; -// confirmedSent++; -// -// if (confirmedSent == count) { -// logger(trace) << "Closing the sender after sending " << confirmedSent -// << " message" << (confirmedSent > 1 ? "s" : "" ); -// conn.close(); -// } + + confirmedSent += 1; + logger(trace) << "[on_tracker_accept] Confirmed message delivery " << confirmedSent; } void TxSenderHandler::on_tracker_reject(tracker &t) { std::cerr << "[error] Delivery rejected" << std::endl; - exit(1); } @@ -308,12 +303,10 @@ void TxSenderHandler::on_transport_close(transport &t) { void TxSenderHandler::on_connection_close(connection &c) { logger(debug) << "Closing connection"; - logger(info) << "Transactions"; - logger(info) << "Transaction total: " << total; - logger(info) << "Transaction sent: " << sent; + logger(info) << "Transactions status"; logger(info) << "Transaction batch size: " << batch_size; logger(info) << "Transaction current batch: " << current_batch; - logger(info) << "Transaction confirmed: " << confirmed; + logger(info) << "Transaction confirmed: " << confirmedSent; logger(info) << "Transaction committed: " << committed; current_batch = 0; } @@ -327,48 +320,38 @@ void TxSenderHandler::on_connection_error(connection &c) } } -void TxSenderHandler::on_transaction_declared(transaction &t) { - tx = &t; +void TxSenderHandler::on_transaction_declared(transaction t) { + logger(trace) << "[on_transaction_declared] txn called " << (&t); + tx = t; send(); + logger(trace) << "[on_transaction_declared] txn is_empty " << (t.is_empty()) + << "\t" << tx.is_empty(); } -void TxSenderHandler::on_transaction_committed(transaction &t) { +void TxSenderHandler::on_transaction_committed(transaction t) { + logger(trace) << "[on_transaction_commited] Messages committed"; committed += current_batch; + current_batch = 0; connection conn = sndr.connection(); - if(committed == total) { - std::cout << "All messages committed"; + if(committed == count) { + logger(trace) << "[on_transaction_commited] All messages committed"; conn.close(); } else { - current_batch = 0; - cont->declare_transaction(conn, th); + cont->declare_transaction(conn, *this); } } // TODO jak je to s temi override ? // ?? python to tak ma ?? stejne jak commited // void TxSenderHandler::on_transaction_aborted(transaction t) override { -void TxSenderHandler::on_transaction_aborted(transaction &t) { - committed += current_batch; - connection conn = sndr.connection(); - if(committed == total) { - std::cout << "All messages committed"; - conn.close(); - } - else { - current_batch = 0; - cont->declare_transaction(conn, th); - } +void TxSenderHandler::on_transaction_aborted(transaction t) { + logger(debug) << "[on_transaction_aborted] Mesages Aborted"; + current_batch = 0; + cont->declare_transaction(sndr.connection(), *this); } void TxSenderHandler::on_sender_close(sender &s) { - logger(info) << "Transactions"; - logger(info) << "Transaction total: " << total; - logger(info) << "Transaction sent: " << sent; - logger(info) << "Transaction batch size: " << batch_size; - logger(info) << "Transaction current batch: " << current_batch; - logger(info) << "Transaction confirmed: " << confirmed; - logger(info) << "Transaction committed: " << committed; current_batch = 0; } @@ -383,13 +366,7 @@ void TxSenderHandler::on_container_start(container &c) logger(debug) << "Maximum frame size: " << max_frame_size; - logger(info) << "Transactions"; - logger(info) << "Transaction total: " << total; - logger(info) << "Transaction sent: " << sent; - logger(info) << "Transaction batch size: " << batch_size; - logger(info) << "Transaction current batch: " << current_batch; - logger(info) << "Transaction confirmed: " << confirmed; - logger(info) << "Transaction committed: " << committed; + logger(info) << "Transaction batch size" << batch_size; logger(debug) << "Topic: " << is_topic; @@ -421,7 +398,7 @@ void TxSenderHandler::on_container_start(container &c) // // logger(debug) << "Setting a reconnect timer: " << conn_reconnect; // logger(debug) << "Custom reconnect: " << conn_reconnect_custom; -// +// // configure_reconnect(conn_opts); // configure_ssl(c); // @@ -452,7 +429,7 @@ void TxSenderHandler::on_container_start(container &c) ); // work_q = &sndr.work_queue(); -// +// // logger(trace) << "Setting up timer"; // // if (duration_time > 0 && count > 0) { @@ -467,20 +444,25 @@ void TxSenderHandler::on_container_start(container &c) // work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); // } else if (duration_time > 0 && duration_mode == "before-send") { // work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); -// } else { +// } else { // work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); // } //#endif - tx = NULL; - // currently causes seqfault - c.declare_transaction(conn, th); + tx = transaction(); + logger(debug) << "[on_container_start] declare_txn started..."; + c.declare_transaction(conn, *this); cont = &c; + logger(debug) << "[on_container_start] completed (container:" << &c << ", transaction: " << &tx << ")"; } -// void TxSenderHandler::on_transaction_aborted(transaction) {} -// void TxSenderHandler::on_transaction_declare_failed(transaction) {} -// void TxSenderHandler::on_transaction_commit_failed(transaction) {} +void TxSenderHandler::on_transaction_declare_failed(transaction) {} + +void TxSenderHandler::on_transaction_commit_failed(transaction) { + logger(error) << "[on_transaction_commit_failed] Transaction Commit Failed"; + sndr.connection().close(); + exit(1); +} } /* namespace reactor */ } /* namespace proton */ diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index c342b904..a3639726 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -4,7 +4,7 @@ * and open the template in the editor. */ -/* +/* * File: TxSenderHandler.h * Author: pematous * @@ -111,9 +111,11 @@ class TxSenderHandler : public CommonHandler, transaction_handler { uint32_t conn_heartbeat = 0, uint32_t max_frame_size = -1, bool conn_use_config_file = false, - string log_msgs = "" + string log_msgs = "", + string tx_action = "commit", + string tx_endloop_action = "commit" ); - + void timerEvent(); virtual ~TxSenderHandler(); @@ -123,13 +125,13 @@ class TxSenderHandler : public CommonHandler, transaction_handler { * @param count the message count */ void setCount(int count); - + /** * Gets the message count * @return the message count */ int getCount() const; - + /** * Sets the transaction batch size * @param batch_size the transaction batch size @@ -150,7 +152,7 @@ class TxSenderHandler : public CommonHandler, transaction_handler { void checkIfCanSend(); void send(); - + /** * Gets the message to send * @return the message to send @@ -159,7 +161,7 @@ class TxSenderHandler : public CommonHandler, transaction_handler { transaction_handler th; - // reactor methods + // common reactor methods void on_container_start(container &c); void on_sendable(sender &s); void on_tracker_accept(tracker &t); @@ -168,14 +170,13 @@ class TxSenderHandler : public CommonHandler, transaction_handler { void on_transport_close(transport &t); void on_connection_error(connection &c); void on_connection_close(connection &c); - - // TODO TX Support void on_sender_close(sender &s); - void on_transaction_declared(transaction &t); - void on_transaction_committed(transaction &t); - void on_transaction_aborted(transaction &t); -// void on_transaction_declare_failed(transaction &t); -// void on_transaction_commit_failed(transaction &t); + // reactor transaction methods + void on_transaction_declared(transaction t); + void on_transaction_committed(transaction t); + void on_transaction_aborted(transaction t); + void on_transaction_declare_failed(transaction t); + void on_transaction_commit_failed(transaction t); private: typedef CommonHandler super; @@ -183,22 +184,21 @@ class TxSenderHandler : public CommonHandler, transaction_handler { int count; int duration_time; string duration_mode; - int sent; - int confirmedSent; - // transact + // transactions related variables int batch_size = 0; int current_batch = 0; int committed = 0; - int confirmed = 0; - int total = 0; + int confirmedSent = 0; + string tx_action = "commit"; + string tx_endloop_action = "commit"; sender sndr; - transaction *tx; + transaction tx; container *cont; message m; - + struct timer_event_t : public void_function0 { TxSenderHandler &parent; timer_event_t(TxSenderHandler &handler) : parent(handler) {} @@ -206,7 +206,7 @@ class TxSenderHandler : public CommonHandler, transaction_handler { parent.timerEvent(); } }; - + timer_event_t timer_event; duration interval; From f158e6fbfa92897d80a391672c875976ea557d02 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 2 Dec 2024 16:40:04 +0100 Subject: [PATCH 05/53] wip: initial version refactoring #3 --- src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp | 8 ++++++-- src/api/qpid-proton/reactor/handler/TxReceiverHandler.h | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index c8810151..fc4ed3d0 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -63,7 +63,9 @@ TxReceiverHandler::TxReceiverHandler( string recv_listen, int recv_listen_port, int recv_credit_window, - bool recv_drain_after_credit_window + bool recv_drain_after_credit_window, + string tx_action, + string tx_endloop_action ) : super( url, @@ -111,7 +113,9 @@ TxReceiverHandler::TxReceiverHandler( recv_listen(recv_listen), recv_listen_port(recv_listen_port), recv_credit_window(recv_credit_window), - recv_drain_after_credit_window(recv_drain_after_credit_window) + recv_drain_after_credit_window(recv_drain_after_credit_window), + tx_action(tx_action), + tx_endloop_action(tx_endloop_action) { } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 6ebf645f..f25d0a0e 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -160,7 +160,9 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { string recv_listen = "false", int recv_listen_port = 5672, int recv_credit_window = -1, - bool recv_drain_after_credit_window = false + bool recv_drain_after_credit_window = false, + string tx_action = "commit", + string tx_endloop_action = "commit" ); virtual ~TxReceiverHandler(); @@ -242,11 +244,13 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { void do_disconnect(); - // transact + // transaction variables int batch_size = 0; int current_batch = 0; int committed = 0; int confirmed = 0; + string tx_action = "commit"; + string tx_endloop_action = "commit"; transaction *tx; }; From e8de055234bea76d78a301efcf4499ab25f6527d Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 2 Dec 2024 16:49:51 +0100 Subject: [PATCH 06/53] wip: initial version refactoring #4 --- .../qpid-proton/reactor/TxReceivingClient.cpp | 10 ++++---- .../qpid-proton/reactor/TxReceivingClient.h | 2 +- .../qpid-proton/reactor/TxSendingClient.cpp | 24 +++++++++---------- .../reactor/handler/TxReceiverHandler.h | 2 +- .../reactor/handler/TxSenderHandler.cpp | 2 +- .../reactor/handler/TxSenderHandler.h | 2 +- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.cpp b/src/api/qpid-proton/reactor/TxReceivingClient.cpp index 2d5528fe..88ee27c5 100644 --- a/src/api/qpid-proton/reactor/TxReceivingClient.cpp +++ b/src/api/qpid-proton/reactor/TxReceivingClient.cpp @@ -4,10 +4,10 @@ * and open the template in the editor. */ -/* +/* * File: TxReceivingClient.cpp * Author: pematous - * + * * Created on November 20, 2024 */ @@ -108,14 +108,14 @@ int TxReceivingClient::run(int argc, char **argv) const } else { user = uri_parser.getUser(); } - + string password = ""; if (options.is_set("password")) { password = options["password"]; } else { password = uri_parser.getPassword(); } - + string sasl_mechanisms = ""; if (options.is_set("sasl-mechanisms")) { sasl_mechanisms = options["sasl-mechanisms"]; @@ -273,7 +273,7 @@ int TxReceivingClient::run(int argc, char **argv) const } OptionsSetter setter = OptionsSetter(options); - + int timeout = -1; if (options.is_set("timeout")) { timeout = static_cast (options.get("timeout")); diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.h b/src/api/qpid-proton/reactor/TxReceivingClient.h index cecb0bd7..94cb7095 100644 --- a/src/api/qpid-proton/reactor/TxReceivingClient.h +++ b/src/api/qpid-proton/reactor/TxReceivingClient.h @@ -4,7 +4,7 @@ * and open the template in the editor. */ -/* +/* * File: TxReceivingClient.h * Author: pematous * diff --git a/src/api/qpid-proton/reactor/TxSendingClient.cpp b/src/api/qpid-proton/reactor/TxSendingClient.cpp index c3fb377b..e6bf7a57 100644 --- a/src/api/qpid-proton/reactor/TxSendingClient.cpp +++ b/src/api/qpid-proton/reactor/TxSendingClient.cpp @@ -83,7 +83,7 @@ void TxSendingClient::setMessageOptions(const OptionsSetter &setter, * #ifdef REACTOR_PROPERTY_MAP_USES_STL message::property_map &properties = msg.properties(); - + setter.setMap("msg-property", properties); #endif // REACTOR_PROPERTY_MAP_USES_STL */ @@ -129,7 +129,7 @@ void TxSendingClient::setMessageProperty(message *msg, const string &property) c if (nameVal(property, name, val, separator)) { if (separator == "~") { temp.resize(val.size()); - + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); if (temp == "true") { @@ -171,7 +171,7 @@ void TxSendingClient::setMessageListItem(message *msg, const string &property, s if (nameVal(property, name, val, separator)) { if (separator == "~") { temp.resize(val.size()); - + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); if (temp == "true") { @@ -216,7 +216,7 @@ void TxSendingClient::setMessageMapItem(message *msg, const string &property, st if (nameVal(property, name, val, separator)) { if (separator == "~") { temp.resize(val.size()); - + std::transform(val.begin(), val.end(), temp.begin(), ::tolower); if (temp == "true") { @@ -348,14 +348,14 @@ int TxSendingClient::run(int argc, char **argv) const } else { user = uri_parser.getUser(); } - + string password = ""; if (options.is_set("password")) { password = options["password"]; } else { password = uri_parser.getPassword(); } - + string sasl_mechanisms = ""; if (options.is_set("sasl-mechanisms")) { sasl_mechanisms = options["sasl-mechanisms"]; @@ -364,7 +364,7 @@ int TxSendingClient::run(int argc, char **argv) const } else { sasl_mechanisms = "ANONYMOUS"; } - + string conn_sasl_enabled = "true"; if (options.is_set("conn-sasl-enabled")) { conn_sasl_enabled = options["conn-sasl-enabled"]; @@ -515,17 +515,17 @@ int TxSendingClient::run(int argc, char **argv) const setMessageText(options["msg-content"], &msg); } - + /* * Note 1: this is a left-over from setMessageOptions. Since I don't want to * change the method signature there, I check again here and set the remaining * option that cannot be done implicitly above. - * + * * Note 2: this is a hack for GCC ~4.4.7 on i686. - */ + */ #ifndef ENABLE_IMPLICIT_CONVERSIONS long value = options.get("msg-ttl"); - + msg.ttl(::proton::duration(value)); #endif if (options.is_set("msg-group-seq")) { @@ -574,7 +574,7 @@ int TxSendingClient::run(int argc, char **argv) const count = static_cast (options.get("count")); } handler.setCount(count); - + int tx_size = 1; if (options.is_set("tx-size")) { tx_size = static_cast (options.get("tx-size")); diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index f25d0a0e..0fdb2f16 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -259,5 +259,5 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { } /* namespace proton */ } /* namespace dtests */ -#endif /* RECEIVERHANDLER_H */ +#endif /* TXRECEIVERHANDLER_H */ diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index e705596c..4b12b9ff 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -355,7 +355,7 @@ void TxSenderHandler::on_sender_close(sender &s) { current_batch = 0; } -void TxSenderHandler::on_container_start(container &c) +void TxSenderHandler::on_container_start(container &c) { logger(debug) << "Starting messaging handler"; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index a3639726..8aa335f1 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -217,5 +217,5 @@ class TxSenderHandler : public CommonHandler, transaction_handler { } /* namespace proton */ } /* namespace dtests */ -#endif /* SENDERHANDLER_H */ +#endif /* TXSENDERHANDLER_H */ From f942c965eb290ca000d8a45c862c2e4227d04712 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 2 Dec 2024 16:53:33 +0100 Subject: [PATCH 07/53] wip: initial version refactoring #5 --- src/api/qpid-proton/reactor/TxReceivingClient.h | 2 +- src/api/qpid-proton/reactor/TxSendingClient.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.h b/src/api/qpid-proton/reactor/TxReceivingClient.h index 94cb7095..4c6c8673 100644 --- a/src/api/qpid-proton/reactor/TxReceivingClient.h +++ b/src/api/qpid-proton/reactor/TxReceivingClient.h @@ -60,5 +60,5 @@ class TxReceivingClient : public ModernClient { } /* namespace proton */ } /* namespace dtests */ -#endif /* RECEIVINGCLIENT_H */ +#endif /* TXRECEIVINGCLIENT_H */ diff --git a/src/api/qpid-proton/reactor/TxSendingClient.h b/src/api/qpid-proton/reactor/TxSendingClient.h index 71ef79d9..a3f36e4e 100644 --- a/src/api/qpid-proton/reactor/TxSendingClient.h +++ b/src/api/qpid-proton/reactor/TxSendingClient.h @@ -63,4 +63,4 @@ class TxSendingClient : public ModernClient { } /* namespace dtests */ -#endif /* DTESTS_NODE_DATA_CLIENTS_LANG_CPP_APIS_PROTON_REACTOR_SENDINGCLIENT_H_ */ +#endif /* DTESTS_NODE_DATA_CLIENTS_LANG_CPP_APIS_PROTON_REACTOR_TXSENDINGCLIENT_H_ */ From 7233c5c90408f98fe5e4ebd22ed39513f474258f Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 2 Dec 2024 17:11:40 +0100 Subject: [PATCH 08/53] wip: initial version refactoring #6 --- src/api/qpid-proton/clients/aac3_connector.cpp | 2 ++ src/api/qpid-proton/reactor/handler/CommonHandler.h | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/api/qpid-proton/clients/aac3_connector.cpp b/src/api/qpid-proton/clients/aac3_connector.cpp index 33ea1ecd..b954dd0f 100644 --- a/src/api/qpid-proton/clients/aac3_connector.cpp +++ b/src/api/qpid-proton/clients/aac3_connector.cpp @@ -4,6 +4,8 @@ * Created on: Apr 14, 2015 * Author: opiske */ +#include + #include using dtests::proton::reactor::ConnectingClient; diff --git a/src/api/qpid-proton/reactor/handler/CommonHandler.h b/src/api/qpid-proton/reactor/handler/CommonHandler.h index ffacffb0..5919b97d 100644 --- a/src/api/qpid-proton/reactor/handler/CommonHandler.h +++ b/src/api/qpid-proton/reactor/handler/CommonHandler.h @@ -19,7 +19,7 @@ #include #include #include -#include + #include @@ -35,7 +35,6 @@ #include "logger/LoggerWrapper.h" using proton::messaging_handler; -using proton::transaction; using proton::container; using proton::void_function0; using proton::duration; @@ -121,7 +120,7 @@ class CommonHandler : public messaging_handler { virtual ~CommonHandler(); virtual void timerEvent() = 0; - + protected: From e0651a0c1ed711af20b0159a90fbc073be7eda93 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 2 Dec 2024 17:31:51 +0100 Subject: [PATCH 09/53] wip: initial version refactoring #7 --- .../reactor/handler/TxSenderHandler.cpp | 119 +++++++++--------- 1 file changed, 59 insertions(+), 60 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 4b12b9ff..1adabd81 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -380,46 +380,45 @@ void TxSenderHandler::on_container_start(container &c) for (std::vector< ::proton::symbol >::const_iterator i = caps.begin(); i != caps.end(); ++i) { logger(debug) << *i; } -// connection_options conn_opts; -// -// if (!user.empty()) conn_opts.user(user); -// if (!password.empty()) conn_opts.password(password); -// -// if (conn_sasl_enabled == "false") { -// conn_opts.sasl_enabled(false); -// } else { -// conn_opts.sasl_enabled(true); -// } -// -// conn_opts.sasl_allow_insecure_mechs(true); -// conn_opts.sasl_allowed_mechs(sasl_mechanisms); -// // conn_opts.max_frame_size(max_frame_size); -// conn_opts.failover_urls(conn_urls); -// -// logger(debug) << "Setting a reconnect timer: " << conn_reconnect; -// logger(debug) << "Custom reconnect: " << conn_reconnect_custom; -// -// configure_reconnect(conn_opts); -// configure_ssl(c); -// -// if (conn_heartbeat != 0) { -// logger(debug) << "Heartbeat: " << conn_heartbeat; -// -// duration heartbeat_seconds = conn_heartbeat * duration::SECOND; -// -// conn_opts.idle_timeout(heartbeat_seconds); -// } -// -// logger(debug) << "Creating a sender"; -// -// connection conn; -// if (conn_use_config_file) { -// conn = c.connect(); -// } else { -// conn = c.connect(broker_url.getUri(), conn_opts); -// } - - connection conn = c.connect(broker_url.getUri()); + connection_options conn_opts; + + if (!user.empty()) conn_opts.user(user); + if (!password.empty()) conn_opts.password(password); + + if (conn_sasl_enabled == "false") { + conn_opts.sasl_enabled(false); + } else { + conn_opts.sasl_enabled(true); + } + + conn_opts.sasl_allow_insecure_mechs(true); + conn_opts.sasl_allowed_mechs(sasl_mechanisms); + // conn_opts.max_frame_size(max_frame_size); + conn_opts.failover_urls(conn_urls); + + logger(debug) << "Setting a reconnect timer: " << conn_reconnect; + logger(debug) << "Custom reconnect: " << conn_reconnect_custom; + + configure_reconnect(conn_opts); + configure_ssl(c); + + if (conn_heartbeat != 0) { + logger(debug) << "Heartbeat: " << conn_heartbeat; + + duration heartbeat_seconds = conn_heartbeat * duration::SECOND; + + conn_opts.idle_timeout(heartbeat_seconds); + } + + logger(debug) << "Creating a sender"; + + connection conn; + if (conn_use_config_file) { + conn = c.connect(); + } else { + conn = c.connect(broker_url.getUri(), conn_opts); + } + sndr = conn.open_sender( broker_url.getPath(), c.sender_options() @@ -428,26 +427,26 @@ void TxSenderHandler::on_container_start(container &c) ) ); -// work_q = &sndr.work_queue(); -// -// logger(trace) << "Setting up timer"; -// -// if (duration_time > 0 && count > 0) { -// interval = duration((duration_time * duration::SECOND) / count); -// -// logger(trace) << "Interval for duration: " << interval.milliseconds() << " ms"; -// } -//#if defined(__REACTOR_HAS_TIMER) -// work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::timerEvent, this)); -// -// if (duration_time > 0 && duration_mode == "after-send") { -// work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); -// } else if (duration_time > 0 && duration_mode == "before-send") { -// work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); -// } else { -// work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); -// } -//#endif + work_q = &sndr.work_queue(); + + logger(trace) << "Setting up timer"; + + if (duration_time > 0 && count > 0) { + interval = duration((duration_time * duration::SECOND) / count); + + logger(trace) << "Interval for duration: " << interval.milliseconds() << " ms"; + } +#if defined(__REACTOR_HAS_TIMER) + work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::timerEvent, this)); + + if (duration_time > 0 && duration_mode == "after-send") { + work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); + } else if (duration_time > 0 && duration_mode == "before-send") { + work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); + } else { + work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); + } +#endif tx = transaction(); logger(debug) << "[on_container_start] declare_txn started..."; From ad9eae926144092130a277d70e8d4b9d7fe88258 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 2 Dec 2024 21:39:56 +0100 Subject: [PATCH 10/53] wip: initial version refactoring n8 --- .../reactor/handler/TxReceiverHandler.h | 2 +- .../reactor/handler/TxSenderHandler.cpp | 37 +++++++++++-------- .../reactor/handler/TxSenderHandler.h | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 0fdb2f16..c17d0e4a 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -247,7 +247,7 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { // transaction variables int batch_size = 0; int current_batch = 0; - int committed = 0; + int processed = 0; int confirmed = 0; string tx_action = "commit"; string tx_endloop_action = "commit"; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 1adabd81..62e2ef39 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -90,7 +90,7 @@ TxSenderHandler::TxSenderHandler( duration_mode(duration_mode), batch_size(1), current_batch(0), - committed(0), + processed(0), confirmedSent(0), tx_action(tx_action), tx_endloop_action(tx_endloop_action), @@ -193,12 +193,12 @@ void TxSenderHandler::send() logger(trace) << "Transaction variables"; logger(trace) << "confirmed: " << confirmedSent; - logger(trace) << "commited: " << committed; + logger(trace) << "processed: " << processed; logger(trace) << "count: " << count; logger(trace) << "is_empty: " << tx.is_empty(); logger(trace) << "current_batch: " << current_batch; - while (!tx.is_empty() && sndr.credit() && (committed + current_batch) < count) + while (!tx.is_empty() && sndr.credit() && (processed + current_batch) < count) { tx.send(sndr, message_to_send); @@ -229,7 +229,7 @@ void TxSenderHandler::send() logger(trace) << "Transaction variables"; logger(trace) << "confirmed: " << confirmedSent; - logger(trace) << "commited: " << committed; + logger(trace) << "processed: " << processed; logger(trace) << "count: " << count; logger(trace) << "is_empty: " << tx.is_empty(); logger(trace) << "current_batch: " << current_batch; @@ -307,7 +307,7 @@ void TxSenderHandler::on_connection_close(connection &c) logger(info) << "Transaction batch size: " << batch_size; logger(info) << "Transaction current batch: " << current_batch; logger(info) << "Transaction confirmed: " << confirmedSent; - logger(info) << "Transaction committed: " << committed; + logger(info) << "Transaction processed: " << processed; current_batch = 0; } @@ -329,26 +329,31 @@ void TxSenderHandler::on_transaction_declared(transaction t) { } void TxSenderHandler::on_transaction_committed(transaction t) { - logger(trace) << "[on_transaction_commited] Messages committed"; - committed += current_batch; - current_batch = 0; + logger(trace) << "[on_transaction_committed] Messages committed"; + processed += current_batch; connection conn = sndr.connection(); - if(committed == count) { - logger(trace) << "[on_transaction_commited] All messages committed"; + if (processed == count) { + logger(trace) << "[on_transaction_committed] All messages processed"; conn.close(); - } - else { + } else { + current_batch = 0; cont->declare_transaction(conn, *this); } } // TODO jak je to s temi override ? -// ?? python to tak ma ?? stejne jak commited // void TxSenderHandler::on_transaction_aborted(transaction t) override { void TxSenderHandler::on_transaction_aborted(transaction t) { - logger(debug) << "[on_transaction_aborted] Mesages Aborted"; - current_batch = 0; - cont->declare_transaction(sndr.connection(), *this); + logger(trace) << "[on_transaction_aborted] Messages aborted"; + processed += current_batch; + connection conn = sndr.connection(); + if (processed == count) { + logger(trace) << "[on_transaction_aborted] All messages processed"; + conn.close(); + } else { + current_batch = 0; + cont->declare_transaction(conn, *this); + } } void TxSenderHandler::on_sender_close(sender &s) { diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index 8aa335f1..14712b26 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -188,7 +188,7 @@ class TxSenderHandler : public CommonHandler, transaction_handler { // transactions related variables int batch_size = 0; int current_batch = 0; - int committed = 0; + int processed = 0; int confirmedSent = 0; string tx_action = "commit"; string tx_endloop_action = "commit"; From 6e58ecbfbe186853c5a7dab7696a8cb2f2a3e3dc Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 2 Dec 2024 21:59:45 +0100 Subject: [PATCH 11/53] wip: initial version refactoring n9 --- src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp | 2 +- src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index fc4ed3d0..97248d2f 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -456,7 +456,7 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } if (duration_time > 0 && duration_mode == "after-receive-action-tx-action") { - // TODO: Transactions are not supported yet + // TODO: not implemented yet } logger(debug) << "Process-reply-to: " << process_reply_to; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 62e2ef39..27364df8 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -94,7 +94,6 @@ TxSenderHandler::TxSenderHandler( confirmedSent(0), tx_action(tx_action), tx_endloop_action(tx_endloop_action), - // TODO whats this ? m(), timer_event(*this), interval(duration::IMMEDIATE) @@ -220,7 +219,7 @@ void TxSenderHandler::send() } if (duration_time > 0 && duration_mode == "after-send-tx-action") { - // TODO: Transactions are not supported yet + // TODO: Not implemented yet } confirmedSent++; @@ -341,8 +340,6 @@ void TxSenderHandler::on_transaction_committed(transaction t) { } } -// TODO jak je to s temi override ? -// void TxSenderHandler::on_transaction_aborted(transaction t) override { void TxSenderHandler::on_transaction_aborted(transaction t) { logger(trace) << "[on_transaction_aborted] Messages aborted"; processed += current_batch; From bdc9c290e95230ce265a135052ca3ce8ea1b70d3 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 6 Dec 2024 14:54:42 +0100 Subject: [PATCH 12/53] missing kpvdr repos --- Dockerfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Dockerfile b/Dockerfile index 1f14c307..d67b853a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,11 @@ RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/opentelemetry-cpp-rhel RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/protobuf/repo/epel-9/kpvdr-protobuf-epel-9.repo > /etc/yum.repos.d/kpvdr-protobuf-epel-9.repo RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/json/repo/epel-9/kpvdr-json-epel-9.repo > /etc/yum.repos.d/kpvdr-json-epel-9.repo +RUN dnf install -y 'dnf-command(copr)' \ +&& dnf copr enable -y kpvdr/json \ +&& dnf copr enable -y kpvdr/protobuf \ +&& dnf copr enable -y kpvdr/opentelemetry-cpp-rhel + #CMake Error at /usr/lib64/cmake/protobuf/protobuf-targets.cmake:106 (message): # The imported target "protobuf::libprotobuf-lite" references the file # From c8c00596fd92804fab3a488f90c593bb8d6b5d47 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 6 Dec 2024 14:58:20 +0100 Subject: [PATCH 13/53] missing kpvdr repos --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index d67b853a..c157a9f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,9 +22,7 @@ RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/protobuf/repo/epel-9/k RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/json/repo/epel-9/kpvdr-json-epel-9.repo > /etc/yum.repos.d/kpvdr-json-epel-9.repo RUN dnf install -y 'dnf-command(copr)' \ -&& dnf copr enable -y kpvdr/json \ -&& dnf copr enable -y kpvdr/protobuf \ -&& dnf copr enable -y kpvdr/opentelemetry-cpp-rhel +&& dnf copr enable -y kpvdr/opentelemetry-cpp #CMake Error at /usr/lib64/cmake/protobuf/protobuf-targets.cmake:106 (message): # The imported target "protobuf::libprotobuf-lite" references the file From 6f6a6c02bf19c947d3a616f14abc3960de66dcc2 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 6 Dec 2024 15:02:30 +0100 Subject: [PATCH 14/53] missing kpvdr repos --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index c157a9f2..eb57ed66 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,8 +21,8 @@ RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/opentelemetry-cpp-rhel RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/protobuf/repo/epel-9/kpvdr-protobuf-epel-9.repo > /etc/yum.repos.d/kpvdr-protobuf-epel-9.repo RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/json/repo/epel-9/kpvdr-json-epel-9.repo > /etc/yum.repos.d/kpvdr-json-epel-9.repo -RUN dnf install -y 'dnf-command(copr)' \ -&& dnf copr enable -y kpvdr/opentelemetry-cpp +RUN dnf install -y 'dnf-command(copr)' +RUN dnf copr enable -y kpvdr/opentelemetry-cpp #CMake Error at /usr/lib64/cmake/protobuf/protobuf-targets.cmake:106 (message): # The imported target "protobuf::libprotobuf-lite" references the file From b4b8e8b6c5081a18340db33d1b3798fd330d2421 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 6 Dec 2024 15:22:33 +0100 Subject: [PATCH 15/53] missing kpvdr repos rollback --- Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index eb57ed66..1f14c307 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,9 +21,6 @@ RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/opentelemetry-cpp-rhel RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/protobuf/repo/epel-9/kpvdr-protobuf-epel-9.repo > /etc/yum.repos.d/kpvdr-protobuf-epel-9.repo RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/json/repo/epel-9/kpvdr-json-epel-9.repo > /etc/yum.repos.d/kpvdr-json-epel-9.repo -RUN dnf install -y 'dnf-command(copr)' -RUN dnf copr enable -y kpvdr/opentelemetry-cpp - #CMake Error at /usr/lib64/cmake/protobuf/protobuf-targets.cmake:106 (message): # The imported target "protobuf::libprotobuf-lite" references the file # From 42a5d8788287fd9959eecc7dc60635515d46cdaf Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 13 Dec 2024 14:30:23 +0100 Subject: [PATCH 16/53] copr repositories fix --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1f14c307..f7670020 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,9 +17,9 @@ RUN rpm -ivh epel-release-latest-9.noarch.rpm RUN dnf install -y 'dnf-command(config-manager)' RUN /usr/bin/crb enable -RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/opentelemetry-cpp-rhel/repo/epel-9/kpvdr-opentelemetry-cpp-rhel-epel-9.repo > /etc/yum.repos.d/kpvdr-opentelemetry-cpp-rhel-epel-9.repo -RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/protobuf/repo/epel-9/kpvdr-protobuf-epel-9.repo > /etc/yum.repos.d/kpvdr-protobuf-epel-9.repo -RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/json/repo/epel-9/kpvdr-json-epel-9.repo > /etc/yum.repos.d/kpvdr-json-epel-9.repo +RUN curl -L https://copr.devel.redhat.com/coprs/kvanderr/rh-opentelemetry-cpp/repo/epel-9/kvanderr-rh-opentelemetry-cpp-epel-9.repo > /etc/yum.repos.d/kpvdr-opentelemetry-cpp-rhel-epel-9.repo +RUN curl -L https://copr.devel.redhat.com/coprs/kvanderr/rh-protobuf/repo/epel-9/kvanderr-rh-protobuf-epel-9.repo > /etc/yum.repos.d/kpvdr-protobuf-epel-9.repo +RUN curl -L https://copr.devel.redhat.com/coprs/kvanderr/rh-json/repo/epel-9/kvanderr-rh-json-epel-9.repo > /etc/yum.repos.d/kpvdr-json-epel-9.repo #CMake Error at /usr/lib64/cmake/protobuf/protobuf-targets.cmake:106 (message): # The imported target "protobuf::libprotobuf-lite" references the file From 647d862d823be6c6c483213a8574eadb903d15f5 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 9 Jan 2025 19:32:48 +0100 Subject: [PATCH 17/53] transactions now declared within session, connection is accessible from transaction --- .../reactor/handler/TxSenderHandler.cpp | 30 +++++++++---------- .../reactor/handler/TxSenderHandler.h | 5 ++-- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 27364df8..a667e5dc 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -270,11 +270,8 @@ void TxSenderHandler::on_sendable(sender &s) void TxSenderHandler::on_tracker_accept(tracker &t) { - logger(trace) << "[on_tracker_accept] Message accepted. Now obtaining the connection reference object"; - connection conn = t.connection(); - confirmedSent += 1; - logger(trace) << "[on_tracker_accept] Confirmed message delivery " << confirmedSent; + logger(trace) << "[on_tracker_accept] Message accepted, confirmed message delivery: " << confirmedSent; } void TxSenderHandler::on_tracker_reject(tracker &t) @@ -330,26 +327,24 @@ void TxSenderHandler::on_transaction_declared(transaction t) { void TxSenderHandler::on_transaction_committed(transaction t) { logger(trace) << "[on_transaction_committed] Messages committed"; processed += current_batch; - connection conn = sndr.connection(); if (processed == count) { logger(trace) << "[on_transaction_committed] All messages processed"; - conn.close(); + t.connection().close(); } else { current_batch = 0; - cont->declare_transaction(conn, *this); + sess.declare_transaction(*this); } } void TxSenderHandler::on_transaction_aborted(transaction t) { logger(trace) << "[on_transaction_aborted] Messages aborted"; processed += current_batch; - connection conn = sndr.connection(); if (processed == count) { logger(trace) << "[on_transaction_aborted] All messages processed"; - conn.close(); + t.connection().close(); } else { current_batch = 0; - cont->declare_transaction(conn, *this); + sess.declare_transaction(*this); } } @@ -357,6 +352,13 @@ void TxSenderHandler::on_sender_close(sender &s) { current_batch = 0; } +void TxSenderHandler::on_session_open(session &s) { + sess = s; + std::cout << " [on_session_open] declare_txn started..." << std::endl; + s.declare_transaction(*this); + std::cout << " [on_session_open] declare_txn ended..." << std::endl; + } + void TxSenderHandler::on_container_start(container &c) { logger(debug) << "Starting messaging handler"; @@ -451,17 +453,13 @@ void TxSenderHandler::on_container_start(container &c) #endif tx = transaction(); - logger(debug) << "[on_container_start] declare_txn started..."; - c.declare_transaction(conn, *this); - cont = &c; - logger(debug) << "[on_container_start] completed (container:" << &c << ", transaction: " << &tx << ")"; } void TxSenderHandler::on_transaction_declare_failed(transaction) {} -void TxSenderHandler::on_transaction_commit_failed(transaction) { +void TxSenderHandler::on_transaction_commit_failed(transaction t) { logger(error) << "[on_transaction_commit_failed] Transaction Commit Failed"; - sndr.connection().close(); + t.connection().close(); exit(1); } diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index 14712b26..cbec1835 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -39,6 +39,7 @@ using proton::tracker; using proton::connection_options; using proton::sender; using proton::transaction; +using proton::session; using proton::transaction_handler; namespace dtests { @@ -159,10 +160,11 @@ class TxSenderHandler : public CommonHandler, transaction_handler { */ message getMessage() const; - transaction_handler th; + session sess; // common reactor methods void on_container_start(container &c); + void on_session_open(session &s); void on_sendable(sender &s); void on_tracker_accept(tracker &t); void on_tracker_reject(tracker &t); @@ -195,7 +197,6 @@ class TxSenderHandler : public CommonHandler, transaction_handler { sender sndr; transaction tx; - container *cont; message m; From 8d4974e1488fb51f23f3bf57247e30193e150d20 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 9 Jan 2025 19:33:19 +0100 Subject: [PATCH 18/53] transactional receiver first version --- .../reactor/handler/TxReceiverHandler.cpp | 217 +++++++++++------- .../reactor/handler/TxReceiverHandler.h | 8 + 2 files changed, 139 insertions(+), 86 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 97248d2f..7ff5d947 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -239,6 +239,51 @@ int TxReceiverHandler::getBatchSize() const // reactor methods + void TxReceiverHandler::on_session_open(session &s) override { + sess = s; + std::cout << " [on_session_open] declare_txn started..." << std::endl; + s.declare_transaction(*this); + std::cout << " [on_session_open] declare_txn ended..." << std::endl; + } + + void on_transaction_declare_failed(transaction) {} + + void on_transaction_commit_failed(proton::transaction t) { + std::cout << "Transaction Commit Failed" << std::endl; + t.connection().close(); + exit(-1); + } + + void TxReceiverHandler::on_transaction_declared(transaction t) override { + std::cout << "[on_transaction_declared] txn called " << (&t) + << std::endl; + std::cout << "[on_transaction_declared] txn is_empty " << (t.is_empty()) + << "\t" << transaction.is_empty() << std::endl; + recv.add_credit(batch_size); + transaction = t; + } + + void TxReceiverHandler::on_message(delivery &d, message &msg) override { + std::cout<<"# MESSAGE: " << msg.id() <<": " << msg.body() << std::endl; + transaction.accept(d); + current_batch += 1; + if(current_batch == batch_size) { + transaction = proton::transaction(); // null + } + } + + void TxReceiverHandler::on_transaction_committed(transaction t) override { + committed += current_batch; + current_batch = 0; + std::cout<<" [OnTxnCommitted] Committed:"<< committed<< std::endl; + if(committed == expected) { + std::cout << "All messages committed" << std::endl; + t.connection().close(); + } + else { + sess.declare_transaction(*this); + } + } void TxReceiverHandler::on_container_start(container &c) { @@ -418,92 +463,92 @@ void TxReceiverHandler::on_container_start(container &c) } -void TxReceiverHandler::on_message(delivery &d, message &m) -{ - msg_received_cnt += 1; - - logger(debug) << "Processing received message"; - - if (log_msgs == "dict") { - logger(trace) << "Decoding message"; - ReactorDecoder decoder = ReactorDecoder(m); - - std::ostringstream stream; - DictWriter writer = DictWriter(&stream); - - DictFormatter formatter = DictFormatter(); - formatter.printMessage(&decoder, &writer); - - writer.endLine(); - std::cout << writer.toString(); - } else if (log_msgs == "interop") { - DictFormatter formatter = DictFormatter(); - - formatter.printMessageInterop(m); - } - - if (duration_time > 0 && duration_mode == "after-receive") { - logger(debug) << "Waiting..."; - sleep4next(ts, count, duration_time, msg_received_cnt); - } - - if((msg_received_cnt % msg_action_size) == 0) { - do_message_action(d); - } - - if (duration_time > 0 && duration_mode == "after-receive-action") { - sleep4next(ts, count, duration_time, msg_received_cnt); - } - - if (duration_time > 0 && duration_mode == "after-receive-action-tx-action") { - // TODO: not implemented yet - } - - logger(debug) << "Process-reply-to: " << process_reply_to; - - if (process_reply_to) { - if (m.reply_to() != "") { - logger(debug) << "Reply-to address: " << m.reply_to(); - - do_process_reply_to(m); - } else { - logger(debug) << "Reply-to address is not set"; - } - } - - if (recv_drain_after_credit_window && msg_received_cnt == recv_credit_window) { - logger(debug) << "Scheduling drain"; - d.receiver().work_queue().add(make_work(&TxReceiverHandler::drain, this)); - } - - if (!process_reply_to && msg_received_cnt == count) { - if (durable_subscriber) { - d.receiver().detach(); - } else { - d.receiver().close(); - } - d.connection().close(); - } else { -#if defined(__REACTOR_HAS_TIMER) - super::timer.reset(); -#endif - } -} - -void TxReceiverHandler::on_receiver_drain_finish(receiver &r) { - logger(debug) << "Receiver drain finished"; -} - -void TxReceiverHandler::on_tracker_accept(tracker &t) -{ - logger(debug) << "Delivery accepted"; -} - - -void TxReceiverHandler::on_tracker_reject(tracker &t) -{ - logger(debug) << "Delivery rejected"; -} +//void TxReceiverHandler::on_message(delivery &d, message &m) +//{ +// msg_received_cnt += 1; +// +// logger(debug) << "Processing received message"; +// +// if (log_msgs == "dict") { +// logger(trace) << "Decoding message"; +// ReactorDecoder decoder = ReactorDecoder(m); +// +// std::ostringstream stream; +// DictWriter writer = DictWriter(&stream); +// +// DictFormatter formatter = DictFormatter(); +// formatter.printMessage(&decoder, &writer); +// +// writer.endLine(); +// std::cout << writer.toString(); +// } else if (log_msgs == "interop") { +// DictFormatter formatter = DictFormatter(); +// +// formatter.printMessageInterop(m); +// } +// +// if (duration_time > 0 && duration_mode == "after-receive") { +// logger(debug) << "Waiting..."; +// sleep4next(ts, count, duration_time, msg_received_cnt); +// } +// +// if((msg_received_cnt % msg_action_size) == 0) { +// do_message_action(d); +// } +// +// if (duration_time > 0 && duration_mode == "after-receive-action") { +// sleep4next(ts, count, duration_time, msg_received_cnt); +// } +// +// if (duration_time > 0 && duration_mode == "after-receive-action-tx-action") { +// // TODO: not implemented yet +// } +// +// logger(debug) << "Process-reply-to: " << process_reply_to; +// +// if (process_reply_to) { +// if (m.reply_to() != "") { +// logger(debug) << "Reply-to address: " << m.reply_to(); +// +// do_process_reply_to(m); +// } else { +// logger(debug) << "Reply-to address is not set"; +// } +// } +// +// if (recv_drain_after_credit_window && msg_received_cnt == recv_credit_window) { +// logger(debug) << "Scheduling drain"; +// d.receiver().work_queue().add(make_work(&TxReceiverHandler::drain, this)); +// } +// +// if (!process_reply_to && msg_received_cnt == count) { +// if (durable_subscriber) { +// d.receiver().detach(); +// } else { +// d.receiver().close(); +// } +// d.connection().close(); +// } else { +//#if defined(__REACTOR_HAS_TIMER) +// super::timer.reset(); +//#endif +// } +//} +// +//void TxReceiverHandler::on_receiver_drain_finish(receiver &r) { +// logger(debug) << "Receiver drain finished"; +//} +// +//void TxReceiverHandler::on_tracker_accept(tracker &t) +//{ +// logger(debug) << "Delivery accepted"; +//} +// +// +//void TxReceiverHandler::on_tracker_reject(tracker &t) +//{ +// logger(debug) << "Delivery rejected"; +//} void TxReceiverHandler::on_transport_close(transport &t) { logger(debug) << "Closing the transport"; diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index c17d0e4a..110c8be8 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -202,6 +202,13 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { void on_connection_close(connection &conn); void on_connection_error(connection &conn); + // TX + void on_session_open(session &s); + void on_transaction_declare_failed(transaction); + void on_transaction_commit_failed(transaction t); + void on_transaction_declared(transaction t); + void on_transaction_committed(transaction t); + private: typedef CommonHandler super; receiver recv; @@ -253,6 +260,7 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { string tx_endloop_action = "commit"; transaction *tx; + session sess; }; } /* namespace reactor */ From 260d099f8ff376e0ccaf321d14f4fadad0fc4656 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 9 Jan 2025 19:55:30 +0100 Subject: [PATCH 19/53] transactional receiver first version fixup --- .../reactor/handler/TxReceiverHandler.cpp | 26 +++++++++---------- .../reactor/handler/TxReceiverHandler.h | 9 ++++--- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 7ff5d947..1486a283 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -239,44 +239,44 @@ int TxReceiverHandler::getBatchSize() const // reactor methods - void TxReceiverHandler::on_session_open(session &s) override { + void TxReceiverHandler::on_session_open(session &s) { sess = s; std::cout << " [on_session_open] declare_txn started..." << std::endl; s.declare_transaction(*this); std::cout << " [on_session_open] declare_txn ended..." << std::endl; } - void on_transaction_declare_failed(transaction) {} + void TxReceiverHandler::on_transaction_declare_failed(transaction) {} - void on_transaction_commit_failed(proton::transaction t) { + void TxReceiverHandler::on_transaction_commit_failed(transaction t) { std::cout << "Transaction Commit Failed" << std::endl; t.connection().close(); exit(-1); } - void TxReceiverHandler::on_transaction_declared(transaction t) override { + void TxReceiverHandler::on_transaction_declared(transaction t) { std::cout << "[on_transaction_declared] txn called " << (&t) << std::endl; std::cout << "[on_transaction_declared] txn is_empty " << (t.is_empty()) - << "\t" << transaction.is_empty() << std::endl; + << "\t" << tx.is_empty() << std::endl; recv.add_credit(batch_size); - transaction = t; + tx = t; } - void TxReceiverHandler::on_message(delivery &d, message &msg) override { + void TxReceiverHandler::on_message(delivery &d, message &msg) { std::cout<<"# MESSAGE: " << msg.id() <<": " << msg.body() << std::endl; - transaction.accept(d); + tx.accept(d); current_batch += 1; if(current_batch == batch_size) { - transaction = proton::transaction(); // null + tx = transaction(); // null } } - void TxReceiverHandler::on_transaction_committed(transaction t) override { - committed += current_batch; + void TxReceiverHandler::on_transaction_committed(transaction t) { + processed += current_batch; current_batch = 0; - std::cout<<" [OnTxnCommitted] Committed:"<< committed<< std::endl; - if(committed == expected) { + std::cout<<" [OnTxnCommitted] Processed:"<< processed << std::endl; + if(processed == count) { std::cout << "All messages committed" << std::endl; t.connection().close(); } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 110c8be8..baf42f37 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -60,6 +60,7 @@ using proton::codec::encoder; using proton::binary; using proton::uuid; using proton::transaction; +using proton::session; using proton::transaction_handler; #ifdef PN_CPP_HAS_STD_FUNCTION @@ -194,9 +195,9 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { // reactor methods void on_container_start(container &c); void on_message(delivery &d, message &m); - void on_receiver_drain_finish(receiver &r); - void on_tracker_accept(tracker &t); - void on_tracker_reject(tracker &t); +// void on_receiver_drain_finish(receiver &r); +// void on_tracker_accept(tracker &t); +// void on_tracker_reject(tracker &t); void on_transport_close(transport &t); void on_transport_error(transport &t); void on_connection_close(connection &conn); @@ -259,7 +260,7 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { string tx_action = "commit"; string tx_endloop_action = "commit"; - transaction *tx; + transaction tx; session sess; }; From a8159274718c20a45dc17f0c087d385712bd7637 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 10 Jan 2025 14:35:43 +0100 Subject: [PATCH 20/53] tx mode recognition fix --- src/api/qpid-proton/clients/aac3_receiver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/qpid-proton/clients/aac3_receiver.cpp b/src/api/qpid-proton/clients/aac3_receiver.cpp index 913dbd16..10a11dc5 100644 --- a/src/api/qpid-proton/clients/aac3_receiver.cpp +++ b/src/api/qpid-proton/clients/aac3_receiver.cpp @@ -24,10 +24,10 @@ int main(int argc, char** argv) } if (tx_mode) { - ReceivingClient client = ReceivingClient(); + TxReceivingClient client = TxReceivingClient(); return client.run(argc, argv); } else { - TxReceivingClient client = TxReceivingClient(); + ReceivingClient client = ReceivingClient(); return client.run(argc, argv); } } From ab42ae33c8b76365311f2052322dbf2c627eff6d Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 10 Jan 2025 16:47:51 +0100 Subject: [PATCH 21/53] sender tx fixup --- src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index a667e5dc..260484ac 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -318,10 +318,10 @@ void TxSenderHandler::on_connection_error(connection &c) void TxSenderHandler::on_transaction_declared(transaction t) { logger(trace) << "[on_transaction_declared] txn called " << (&t); - tx = t; - send(); logger(trace) << "[on_transaction_declared] txn is_empty " << (t.is_empty()) << "\t" << tx.is_empty(); + tx = t; + send(); } void TxSenderHandler::on_transaction_committed(transaction t) { From 6a14ed2f7c5cbba2ff6d5f02a11a4a26b28f4f39 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Sun, 12 Jan 2025 20:25:17 +0100 Subject: [PATCH 22/53] recv tx --- .../reactor/handler/TxReceiverHandler.cpp | 260 +++++++++--------- .../reactor/handler/TxReceiverHandler.h | 7 +- 2 files changed, 139 insertions(+), 128 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 1486a283..8cd3ff77 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -239,51 +239,49 @@ int TxReceiverHandler::getBatchSize() const // reactor methods - void TxReceiverHandler::on_session_open(session &s) { - sess = s; - std::cout << " [on_session_open] declare_txn started..." << std::endl; - s.declare_transaction(*this); - std::cout << " [on_session_open] declare_txn ended..." << std::endl; - } +void TxReceiverHandler::on_session_open(session &s) { + sess = s; + std::cout << " [on_session_open] declare_txn started..." << std::endl; + s.declare_transaction(*this); + std::cout << " [on_session_open] declare_txn ended..." << std::endl; +} - void TxReceiverHandler::on_transaction_declare_failed(transaction) {} +void TxReceiverHandler::on_transaction_declare_failed(transaction) {} - void TxReceiverHandler::on_transaction_commit_failed(transaction t) { - std::cout << "Transaction Commit Failed" << std::endl; - t.connection().close(); - exit(-1); - } +void TxReceiverHandler::on_transaction_commit_failed(transaction t) { + std::cout << "Transaction Commit Failed" << std::endl; + t.connection().close(); + exit(-1); +} - void TxReceiverHandler::on_transaction_declared(transaction t) { - std::cout << "[on_transaction_declared] txn called " << (&t) - << std::endl; - std::cout << "[on_transaction_declared] txn is_empty " << (t.is_empty()) - << "\t" << tx.is_empty() << std::endl; - recv.add_credit(batch_size); - tx = t; - } +void TxReceiverHandler::on_transaction_declared(transaction t) { + std::cout << "[on_transaction_declared] txn called " << (&t) + << std::endl; + std::cout << "[on_transaction_declared] txn is_empty " << (t.is_empty()) + << "\t" << tx.is_empty() << std::endl; + // TODO needed? + // recv.add_credit(batch_size); + tx = t; +} - void TxReceiverHandler::on_message(delivery &d, message &msg) { - std::cout<<"# MESSAGE: " << msg.id() <<": " << msg.body() << std::endl; - tx.accept(d); - current_batch += 1; - if(current_batch == batch_size) { - tx = transaction(); // null - } - } +void TxReceiverHandler::on_transaction_aborted(transaction t) { + confirmed += current_batch; + std::cout << "messages aborted" << std::endl; +} - void TxReceiverHandler::on_transaction_committed(transaction t) { - processed += current_batch; - current_batch = 0; - std::cout<<" [OnTxnCommitted] Processed:"<< processed << std::endl; - if(processed == count) { - std::cout << "All messages committed" << std::endl; - t.connection().close(); - } - else { - sess.declare_transaction(*this); - } +void TxReceiverHandler::on_transaction_committed(transaction t) { + confirmed += current_batch; + current_batch = 0; + std::cout<<" [OnTxnCommitted] Processed:"<< processed << std::endl; + std::cout<<" [OnTxnCommitted] Committed:"<< confirmed << std::endl; + if(confirmed == count) { + std::cout << "All messages committed" << std::endl; + t.connection().close(); + } + else { + sess.declare_transaction(*this); } +} void TxReceiverHandler::on_container_start(container &c) { @@ -463,92 +461,104 @@ void TxReceiverHandler::on_container_start(container &c) } -//void TxReceiverHandler::on_message(delivery &d, message &m) -//{ -// msg_received_cnt += 1; -// -// logger(debug) << "Processing received message"; -// -// if (log_msgs == "dict") { -// logger(trace) << "Decoding message"; -// ReactorDecoder decoder = ReactorDecoder(m); -// -// std::ostringstream stream; -// DictWriter writer = DictWriter(&stream); -// -// DictFormatter formatter = DictFormatter(); -// formatter.printMessage(&decoder, &writer); -// -// writer.endLine(); -// std::cout << writer.toString(); -// } else if (log_msgs == "interop") { -// DictFormatter formatter = DictFormatter(); -// -// formatter.printMessageInterop(m); -// } -// -// if (duration_time > 0 && duration_mode == "after-receive") { -// logger(debug) << "Waiting..."; -// sleep4next(ts, count, duration_time, msg_received_cnt); -// } -// -// if((msg_received_cnt % msg_action_size) == 0) { -// do_message_action(d); -// } -// -// if (duration_time > 0 && duration_mode == "after-receive-action") { -// sleep4next(ts, count, duration_time, msg_received_cnt); -// } -// -// if (duration_time > 0 && duration_mode == "after-receive-action-tx-action") { -// // TODO: not implemented yet -// } -// -// logger(debug) << "Process-reply-to: " << process_reply_to; -// -// if (process_reply_to) { -// if (m.reply_to() != "") { -// logger(debug) << "Reply-to address: " << m.reply_to(); -// -// do_process_reply_to(m); -// } else { -// logger(debug) << "Reply-to address is not set"; -// } -// } -// -// if (recv_drain_after_credit_window && msg_received_cnt == recv_credit_window) { -// logger(debug) << "Scheduling drain"; -// d.receiver().work_queue().add(make_work(&TxReceiverHandler::drain, this)); -// } -// -// if (!process_reply_to && msg_received_cnt == count) { -// if (durable_subscriber) { -// d.receiver().detach(); -// } else { -// d.receiver().close(); -// } -// d.connection().close(); -// } else { -//#if defined(__REACTOR_HAS_TIMER) -// super::timer.reset(); -//#endif -// } -//} -// -//void TxReceiverHandler::on_receiver_drain_finish(receiver &r) { -// logger(debug) << "Receiver drain finished"; -//} -// -//void TxReceiverHandler::on_tracker_accept(tracker &t) -//{ -// logger(debug) << "Delivery accepted"; -//} -// -// -//void TxReceiverHandler::on_tracker_reject(tracker &t) -//{ -// logger(debug) << "Delivery rejected"; -//} +void TxReceiverHandler::on_message(delivery &d, message &m) +{ + msg_received_cnt += 1; + + logger(debug) << "Processing received message"; + + if (log_msgs == "dict") { + logger(trace) << "Decoding message"; + ReactorDecoder decoder = ReactorDecoder(m); + + std::ostringstream stream; + DictWriter writer = DictWriter(&stream); + + DictFormatter formatter = DictFormatter(); + formatter.printMessage(&decoder, &writer); + + writer.endLine(); + std::cout << writer.toString(); + } else if (log_msgs == "interop") { + DictFormatter formatter = DictFormatter(); + + formatter.printMessageInterop(m); + } + + if (duration_time > 0 && duration_mode == "after-receive") { + logger(debug) << "Waiting..."; + sleep4next(ts, count, duration_time, msg_received_cnt); + } + + if((msg_received_cnt % msg_action_size) == 0) { + do_message_action(d); + } + + if (duration_time > 0 && duration_mode == "after-receive-action") { + sleep4next(ts, count, duration_time, msg_received_cnt); + } + + if (duration_time > 0 && duration_mode == "after-receive-action-tx-action") { + // TODO: not implemented yet + } + + logger(debug) << "Process-reply-to: " << process_reply_to; + + if (process_reply_to) { + if (m.reply_to() != "") { + logger(debug) << "Reply-to address: " << m.reply_to(); + + do_process_reply_to(m); + } else { + logger(debug) << "Reply-to address is not set"; + } + } + + if (recv_drain_after_credit_window && msg_received_cnt == recv_credit_window) { + logger(debug) << "Scheduling drain"; + d.receiver().work_queue().add(make_work(&TxReceiverHandler::drain, this)); + } + + if (!process_reply_to && msg_received_cnt == count) { + if (durable_subscriber) { + d.receiver().detach(); + } else { + d.receiver().close(); + } + d.connection().close(); + } else { +#if defined(__REACTOR_HAS_TIMER) + super::timer.reset(); +#endif + } + + // TODO + tx.accept(d); + current_batch += 1; + std::cout<<"# CURRENT VS SIZE: " << current_batch <<": " << batch_size << std::endl; + if(current_batch == batch_size) { + //tx = transaction(); // null + // TODO: I think we should do a commit here ! rakhi is not doing + std::cout<<"# COMMIT: " << current_batch <<": " << batch_size << std::endl; + tx.commit(); + //sess.declare_transaction(*this); + } +} + +void TxReceiverHandler::on_receiver_drain_finish(receiver &r) { + logger(debug) << "Receiver drain finished"; +} + +void TxReceiverHandler::on_tracker_accept(tracker &t) +{ + logger(debug) << "Delivery accepted"; +} + + +void TxReceiverHandler::on_tracker_reject(tracker &t) +{ + logger(debug) << "Delivery rejected"; +} void TxReceiverHandler::on_transport_close(transport &t) { logger(debug) << "Closing the transport"; diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index baf42f37..6b8657a5 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -195,9 +195,9 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { // reactor methods void on_container_start(container &c); void on_message(delivery &d, message &m); -// void on_receiver_drain_finish(receiver &r); -// void on_tracker_accept(tracker &t); -// void on_tracker_reject(tracker &t); + void on_receiver_drain_finish(receiver &r); + void on_tracker_accept(tracker &t); + void on_tracker_reject(tracker &t); void on_transport_close(transport &t); void on_transport_error(transport &t); void on_connection_close(connection &conn); @@ -209,6 +209,7 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { void on_transaction_commit_failed(transaction t); void on_transaction_declared(transaction t); void on_transaction_committed(transaction t); + void on_transaction_aborted(transaction t); private: typedef CommonHandler super; From f47e0bff1ed3022642c429842af665be9466d15e Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Sun, 12 Jan 2025 20:27:01 +0100 Subject: [PATCH 23/53] recv tx --- src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp | 1 - src/api/qpid-proton/reactor/handler/TxReceiverHandler.h | 1 - 2 files changed, 2 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 8cd3ff77..86694ba4 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -272,7 +272,6 @@ void TxReceiverHandler::on_transaction_aborted(transaction t) { void TxReceiverHandler::on_transaction_committed(transaction t) { confirmed += current_batch; current_batch = 0; - std::cout<<" [OnTxnCommitted] Processed:"<< processed << std::endl; std::cout<<" [OnTxnCommitted] Committed:"<< confirmed << std::endl; if(confirmed == count) { std::cout << "All messages committed" << std::endl; diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 6b8657a5..78c573ff 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -256,7 +256,6 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { // transaction variables int batch_size = 0; int current_batch = 0; - int processed = 0; int confirmed = 0; string tx_action = "commit"; string tx_endloop_action = "commit"; From 94636b7047df04ae572c6db9127ee9b0f1ad50c4 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Sun, 12 Jan 2025 20:40:13 +0100 Subject: [PATCH 24/53] logging --- .../reactor/handler/TxReceiverHandler.cpp | 23 +++++++++---------- .../reactor/handler/TxSenderHandler.cpp | 4 ++-- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 86694ba4..635a3cba 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -241,24 +241,23 @@ int TxReceiverHandler::getBatchSize() const void TxReceiverHandler::on_session_open(session &s) { sess = s; - std::cout << " [on_session_open] declare_txn started..." << std::endl; + logger(trace) << "[on_session_open] declare_txn started..."; s.declare_transaction(*this); - std::cout << " [on_session_open] declare_txn ended..." << std::endl; + logger(trace) << "[on_session_open] declare_txn ended..."; + logger(debug) << "[on_session_open] transaction batch size: " << batch_size; } void TxReceiverHandler::on_transaction_declare_failed(transaction) {} void TxReceiverHandler::on_transaction_commit_failed(transaction t) { - std::cout << "Transaction Commit Failed" << std::endl; + logger(debug) << "[on_transaction_commit_failed] Transaction Commit Failed"; t.connection().close(); exit(-1); } void TxReceiverHandler::on_transaction_declared(transaction t) { - std::cout << "[on_transaction_declared] txn called " << (&t) - << std::endl; - std::cout << "[on_transaction_declared] txn is_empty " << (t.is_empty()) - << "\t" << tx.is_empty() << std::endl; + logger(trace) << "[on_transaction_declared] txn called " << (&t); + logger(debug) << "[on_transaction_declared] txn is_empty " << (t.is_empty()); // TODO needed? // recv.add_credit(batch_size); tx = t; @@ -266,15 +265,15 @@ void TxReceiverHandler::on_transaction_declared(transaction t) { void TxReceiverHandler::on_transaction_aborted(transaction t) { confirmed += current_batch; - std::cout << "messages aborted" << std::endl; + logger(debug) << "[on_transaction_aborted] messages aborted"; } void TxReceiverHandler::on_transaction_committed(transaction t) { confirmed += current_batch; current_batch = 0; - std::cout<<" [OnTxnCommitted] Committed:"<< confirmed << std::endl; + logger(trace) << "[on_transaction_committed] Committed:"<< confirmed; if(confirmed == count) { - std::cout << "All messages committed" << std::endl; + logger(info) << "[on_transaction_committed] All messages committed"; t.connection().close(); } else { @@ -534,11 +533,11 @@ void TxReceiverHandler::on_message(delivery &d, message &m) // TODO tx.accept(d); current_batch += 1; - std::cout<<"# CURRENT VS SIZE: " << current_batch <<": " << batch_size << std::endl; + logger(debug) << "[on_message] current batch: " << current_batch; if(current_batch == batch_size) { //tx = transaction(); // null // TODO: I think we should do a commit here ! rakhi is not doing - std::cout<<"# COMMIT: " << current_batch <<": " << batch_size << std::endl; + logger(debug) << "[on_message] messages commited: " << current_batch; tx.commit(); //sess.declare_transaction(*this); } diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 260484ac..e4da818b 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -354,9 +354,9 @@ void TxSenderHandler::on_sender_close(sender &s) { void TxSenderHandler::on_session_open(session &s) { sess = s; - std::cout << " [on_session_open] declare_txn started..." << std::endl; + logger(trace) << "[on_session_open] declare_txn started..."; s.declare_transaction(*this); - std::cout << " [on_session_open] declare_txn ended..." << std::endl; + logger(trace) << "[on_session_open] declare_txn ended..."; } void TxSenderHandler::on_container_start(container &c) From 31e1fe0295dd74711a3d56ec38eb2fbd8b2ef794 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 16 Jan 2025 18:08:11 +0100 Subject: [PATCH 25/53] fixups and loging --- .../qpid-proton/reactor/TxReceivingClient.cpp | 4 +- .../qpid-proton/reactor/TxSendingClient.cpp | 4 +- .../reactor/handler/TxReceiverHandler.cpp | 26 +++- .../reactor/handler/TxSenderHandler.cpp | 138 +++++++++--------- .../reactor/handler/TxSenderHandler.h | 3 +- 5 files changed, 97 insertions(+), 78 deletions(-) diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.cpp b/src/api/qpid-proton/reactor/TxReceivingClient.cpp index 88ee27c5..12dea9c7 100644 --- a/src/api/qpid-proton/reactor/TxReceivingClient.cpp +++ b/src/api/qpid-proton/reactor/TxReceivingClient.cpp @@ -344,7 +344,7 @@ int TxReceivingClient::run(int argc, char **argv) const tx_action = options["tx-action"]; } - string tx_endloop_action = "commit"; + string tx_endloop_action = "none"; if (options.is_set("tx-endloop-action")) { tx_endloop_action = options["tx-endloop-action"]; } @@ -398,7 +398,7 @@ int TxReceivingClient::run(int argc, char **argv) const handler.setSelector(selector); } - int tx_size = 1; + int tx_size = 0; if (options.is_set("tx-size")) { tx_size = static_cast (options.get("tx-size")); } diff --git a/src/api/qpid-proton/reactor/TxSendingClient.cpp b/src/api/qpid-proton/reactor/TxSendingClient.cpp index e6bf7a57..3be4350a 100644 --- a/src/api/qpid-proton/reactor/TxSendingClient.cpp +++ b/src/api/qpid-proton/reactor/TxSendingClient.cpp @@ -494,7 +494,7 @@ int TxSendingClient::run(int argc, char **argv) const tx_action = options["tx-action"]; } - string tx_endloop_action = "commit"; + string tx_endloop_action = "none"; if (options.is_set("tx-endloop-action")) { tx_endloop_action = options["tx-endloop-action"]; } @@ -575,7 +575,7 @@ int TxSendingClient::run(int argc, char **argv) const } handler.setCount(count); - int tx_size = 1; + int tx_size = 0; if (options.is_set("tx-size")) { tx_size = static_cast (options.get("tx-size")); } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 635a3cba..5475b125 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -266,6 +266,13 @@ void TxReceiverHandler::on_transaction_declared(transaction t) { void TxReceiverHandler::on_transaction_aborted(transaction t) { confirmed += current_batch; logger(debug) << "[on_transaction_aborted] messages aborted"; + if(confirmed == count) { + logger(info) << "[on_transaction_committed] All messages proccessed"; + t.connection().close(); + } + else { + sess.declare_transaction(*this); + } } void TxReceiverHandler::on_transaction_committed(transaction t) { @@ -273,7 +280,7 @@ void TxReceiverHandler::on_transaction_committed(transaction t) { current_batch = 0; logger(trace) << "[on_transaction_committed] Committed:"<< confirmed; if(confirmed == count) { - logger(info) << "[on_transaction_committed] All messages committed"; + logger(info) << "[on_transaction_committed] All messages proccessed"; t.connection().close(); } else { @@ -461,6 +468,7 @@ void TxReceiverHandler::on_container_start(container &c) void TxReceiverHandler::on_message(delivery &d, message &m) { + // TODO useless now ?? usew confirmed ? msg_received_cnt += 1; logger(debug) << "Processing received message"; @@ -534,11 +542,23 @@ void TxReceiverHandler::on_message(delivery &d, message &m) tx.accept(d); current_batch += 1; logger(debug) << "[on_message] current batch: " << current_batch; - if(current_batch == batch_size) { + if (confirmed + current_batch == count) { + logger(debug) << "[on_message] Transaction attempt (endloop): " << tx_endloop_action; + if (tx_endloop_action == "commit") { + tx.commit(); + } else if (tx_endloop_action == "rollback") { + tx.abort(); + } + } else if(current_batch == batch_size) { //tx = transaction(); // null // TODO: I think we should do a commit here ! rakhi is not doing logger(debug) << "[on_message] messages commited: " << current_batch; - tx.commit(); + if (tx_endloop_action == "commit") { + tx.commit(); + } else if (tx_endloop_action == "rollback") { + tx.abort(); + } + // Rakhi ? //sess.declare_transaction(*this); } } diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index e4da818b..2fda473a 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -88,10 +88,9 @@ TxSenderHandler::TxSenderHandler( count(1), duration_time(duration_time), duration_mode(duration_mode), - batch_size(1), + batch_size(0), current_batch(0), processed(0), - confirmedSent(0), tx_action(tx_action), tx_endloop_action(tx_endloop_action), m(), @@ -152,7 +151,7 @@ message TxSenderHandler::getMessage() const } void TxSenderHandler::checkIfCanSend() { - if (confirmedSent < count) { + if (processed < count) { work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); if (sndr.credit() > 0) { @@ -165,17 +164,17 @@ void TxSenderHandler::checkIfCanSend() { void TxSenderHandler::send() { - logger(debug) << "Preparing to send message"; + logger(debug) << "[send] Preparing to send message"; int credit = sndr.credit(); if (credit == 0) { - logger(warning) << "There not enough credit to send messages"; + logger(warning) << "[send] There not enough credit to send messages"; } - logger(debug) << "The handler has enough credit to send " << credit + logger(debug) << "[send] The handler has enough credit to send " << credit << " message" << (credit > 1 ? "s" : "" ); - logger(trace) << "Sending messages through the link"; + logger(trace) << "[send] Sending messages through the link"; message message_to_send = message(m); @@ -183,23 +182,22 @@ void TxSenderHandler::send() if (get(message_to_send.body()).find("%d") != string::npos) { size_t percent_position = get(message_to_send.body()).find("%d"); stringstream ss; - ss << confirmedSent; + ss << processed; string replaced_number = get(message_to_send.body()).replace(percent_position, 2, ss.str()); message_to_send.body(replaced_number); } } catch (conversion_error &) { } - logger(trace) << "Transaction variables"; - logger(trace) << "confirmed: " << confirmedSent; - logger(trace) << "processed: " << processed; - logger(trace) << "count: " << count; - logger(trace) << "is_empty: " << tx.is_empty(); - logger(trace) << "current_batch: " << current_batch; + logger(trace) << "[send] Transaction is empty: " << tx.is_empty(); + logger(trace) << "[send] Current_batch: " << sndr.credit(); + logger(debug) << "[send] Messages processed: " << processed; + logger(trace) << "[send] Current batch: " << current_batch; while (!tx.is_empty() && sndr.credit() && (processed + current_batch) < count) { tx.send(sndr, message_to_send); + current_batch += 1; if (log_msgs == "dict") { ReactorDecoder decoder = ReactorDecoder(message_to_send); @@ -222,34 +220,36 @@ void TxSenderHandler::send() // TODO: Not implemented yet } - confirmedSent++; - - current_batch += 1; - - logger(trace) << "Transaction variables"; - logger(trace) << "confirmed: " << confirmedSent; - logger(trace) << "processed: " << processed; - logger(trace) << "count: " << count; - logger(trace) << "is_empty: " << tx.is_empty(); - logger(trace) << "current_batch: " << current_batch; + logger(debug) << "[send] Messages processed: " << processed; + logger(debug) << "[send] Current batch: " << current_batch; - if (confirmedSent + current_batch == count) { - logger(debug) << "[send] Transaction attempt (endloop): " << tx_endloop_action; - if (tx_endloop_action == "commit") { + if(current_batch == batch_size) { + logger(debug) << "[send] Transaction attempt: " << tx_action; + if (tx_action == "commit") { tx.commit(); - } else if (tx_endloop_action == "rollback") { + } else if (tx_action == "rollback") { tx.abort(); } - sndr.connection().close(); - } else if(current_batch == batch_size) { - logger(debug) << "[send] Transaction attempt: " << tx_action; + tx = transaction(); // null ? + + if (tx_action == "none") { + if (processed + current_batch == count) { + sndr.connection().close(); + } else { + processed += current_batch; + current_batch = 0; + sess.declare_transaction(*this); + } + } + } else if (processed + current_batch == count) { + logger(debug) << "[send] Transaction attempt (endloop): " << tx_endloop_action; if (tx_endloop_action == "commit") { tx.commit(); } else if (tx_endloop_action == "rollback") { tx.abort(); } - tx = transaction(); - } + sndr.connection().close(); + } } #if defined(__REACTOR_HAS_TIMER) @@ -259,19 +259,20 @@ void TxSenderHandler::send() } // reactor methods -void TxSenderHandler::on_sendable(sender &s) -{ - logger(trace) << "[on_sendable] transaction: " << &tx; - if (ready) { - send(); - } -} + +// TODO I guess not needed +// void TxSenderHandler::on_sendable(sender &s) +// { +// logger(trace) << "[on_sendable] transaction: " << &tx; +// if (ready) { +// send(); +// } +// } void TxSenderHandler::on_tracker_accept(tracker &t) { - confirmedSent += 1; - logger(trace) << "[on_tracker_accept] Message accepted, confirmed message delivery: " << confirmedSent; + logger(trace) << "[on_tracker_accept] Message accepted, confirmed message delivery: " << processed; } void TxSenderHandler::on_tracker_reject(tracker &t) @@ -281,7 +282,7 @@ void TxSenderHandler::on_tracker_reject(tracker &t) } void TxSenderHandler::on_transport_error(transport &t) { - logger(error) << "The connection with " << broker_url.getHost() << ":" << broker_url.getPort() << " was interrupted: " << t.error().what(); + logger(error) << "[on_transport_error] The connection with " << broker_url.getHost() << ":" << broker_url.getPort() << " was interrupted: " << t.error().what(); if (t.error().what().find("unauthorized") != string::npos) { exit(1); @@ -289,7 +290,7 @@ void TxSenderHandler::on_transport_error(transport &t) { } void TxSenderHandler::on_transport_close(transport &t) { - logger(debug) << "Closing the transport"; + logger(debug) << "[on_transport_close] Closing the transport"; if (conn_reconnect == "false") { exit(1); @@ -298,13 +299,8 @@ void TxSenderHandler::on_transport_close(transport &t) { void TxSenderHandler::on_connection_close(connection &c) { - logger(debug) << "Closing connection"; - logger(info) << "Transactions status"; - logger(info) << "Transaction batch size: " << batch_size; - logger(info) << "Transaction current batch: " << current_batch; - logger(info) << "Transaction confirmed: " << confirmedSent; - logger(info) << "Transaction processed: " << processed; current_batch = 0; + logger(debug) << "[on_connection_close] Closing connection"; } void TxSenderHandler::on_connection_error(connection &c) @@ -327,10 +323,12 @@ void TxSenderHandler::on_transaction_declared(transaction t) { void TxSenderHandler::on_transaction_committed(transaction t) { logger(trace) << "[on_transaction_committed] Messages committed"; processed += current_batch; + logger(debug) << "[on_transaction_committed] Messages processed" << processed; if (processed == count) { logger(trace) << "[on_transaction_committed] All messages processed"; t.connection().close(); } else { + logger(trace) << "[on_transaction_committed] Declaring new transaction"; current_batch = 0; sess.declare_transaction(*this); } @@ -339,10 +337,12 @@ void TxSenderHandler::on_transaction_committed(transaction t) { void TxSenderHandler::on_transaction_aborted(transaction t) { logger(trace) << "[on_transaction_aborted] Messages aborted"; processed += current_batch; + logger(debug) << "[on_transaction_committed] Messages processed" << processed; if (processed == count) { logger(trace) << "[on_transaction_aborted] All messages processed"; t.connection().close(); } else { + logger(trace) << "[on_transaction_committed] Declaring new transaction"; current_batch = 0; sess.declare_transaction(*this); } @@ -361,18 +361,18 @@ void TxSenderHandler::on_session_open(session &s) { void TxSenderHandler::on_container_start(container &c) { - logger(debug) << "Starting messaging handler"; - - logger(debug) << "User: " << user; - logger(debug) << "Password: " << password; - logger(debug) << "SASL mechanisms: " << sasl_mechanisms; - logger(debug) << "SASL enabled: " << conn_sasl_enabled; - - logger(debug) << "Maximum frame size: " << max_frame_size; - - logger(info) << "Transaction batch size" << batch_size; - - logger(debug) << "Topic: " << is_topic; + logger(debug) << "[on_container_start] Starting messaging transaction handler"; + logger(debug) << "[on_container_start] User: " << user; + logger(debug) << "[on_container_start] Password: " << password; + logger(debug) << "[on_container_start] SASL mechanisms: " << sasl_mechanisms; + logger(debug) << "[on_container_start] SASL enabled: " << conn_sasl_enabled; + logger(debug) << "[on_container_start] Maximum frame size: " << max_frame_size; + logger(debug) << "[on_container_start] Topic: " << is_topic; + logger(debug) << "[on_container_start] Transaction batch size: " << batch_size; + logger(debug) << "[on_container_start] Transaction action: " << tx_action; + logger(debug) << "[on_container_start] Transaction endloop action: " << tx_endloop_action; + logger(trace) << "[on_container_start] Messages count: " << count; + logger(debug) << "[on_container_start] Messages Processed: " << processed; std::vector< ::proton::symbol > caps; @@ -380,7 +380,7 @@ void TxSenderHandler::on_container_start(container &c) caps.push_back("topic"); } - logger(debug) << "Source capabilities: "; + logger(debug) << "[on_container_start] Source capabilities: "; for (std::vector< ::proton::symbol >::const_iterator i = caps.begin(); i != caps.end(); ++i) { logger(debug) << *i; } @@ -400,21 +400,21 @@ void TxSenderHandler::on_container_start(container &c) // conn_opts.max_frame_size(max_frame_size); conn_opts.failover_urls(conn_urls); - logger(debug) << "Setting a reconnect timer: " << conn_reconnect; - logger(debug) << "Custom reconnect: " << conn_reconnect_custom; + logger(debug) << "[on_container_start] Setting a reconnect timer: " << conn_reconnect; + logger(debug) << "[on_container_start] Custom reconnect: " << conn_reconnect_custom; configure_reconnect(conn_opts); configure_ssl(c); if (conn_heartbeat != 0) { - logger(debug) << "Heartbeat: " << conn_heartbeat; + logger(debug) << "[on_container_start] Heartbeat: " << conn_heartbeat; duration heartbeat_seconds = conn_heartbeat * duration::SECOND; conn_opts.idle_timeout(heartbeat_seconds); } - logger(debug) << "Creating a sender"; + logger(debug) << "[on_container_start] Creating a sender"; connection conn; if (conn_use_config_file) { @@ -433,12 +433,12 @@ void TxSenderHandler::on_container_start(container &c) work_q = &sndr.work_queue(); - logger(trace) << "Setting up timer"; + logger(trace) << "[on_container_start] Setting up timer"; if (duration_time > 0 && count > 0) { interval = duration((duration_time * duration::SECOND) / count); - logger(trace) << "Interval for duration: " << interval.milliseconds() << " ms"; + logger(trace) << "[on_container_start] Interval for duration: " << interval.milliseconds() << " ms"; } #if defined(__REACTOR_HAS_TIMER) work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::timerEvent, this)); diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index cbec1835..15db7725 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -165,7 +165,7 @@ class TxSenderHandler : public CommonHandler, transaction_handler { // common reactor methods void on_container_start(container &c); void on_session_open(session &s); - void on_sendable(sender &s); +// void on_sendable(sender &s); void on_tracker_accept(tracker &t); void on_tracker_reject(tracker &t); void on_transport_error(transport &t); @@ -191,7 +191,6 @@ class TxSenderHandler : public CommonHandler, transaction_handler { int batch_size = 0; int current_batch = 0; int processed = 0; - int confirmedSent = 0; string tx_action = "commit"; string tx_endloop_action = "commit"; From 9b5a9670b5e569f2ab9e9c478c09ae1a82ecb57e Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 17 Jan 2025 15:15:45 +0100 Subject: [PATCH 26/53] logging update --- Dockerfile | 6 +- .../reactor/handler/TxReceiverHandler.cpp | 84 +++++++++---------- .../reactor/handler/TxSenderHandler.cpp | 6 +- 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/Dockerfile b/Dockerfile index f7670020..1f14c307 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,9 +17,9 @@ RUN rpm -ivh epel-release-latest-9.noarch.rpm RUN dnf install -y 'dnf-command(config-manager)' RUN /usr/bin/crb enable -RUN curl -L https://copr.devel.redhat.com/coprs/kvanderr/rh-opentelemetry-cpp/repo/epel-9/kvanderr-rh-opentelemetry-cpp-epel-9.repo > /etc/yum.repos.d/kpvdr-opentelemetry-cpp-rhel-epel-9.repo -RUN curl -L https://copr.devel.redhat.com/coprs/kvanderr/rh-protobuf/repo/epel-9/kvanderr-rh-protobuf-epel-9.repo > /etc/yum.repos.d/kpvdr-protobuf-epel-9.repo -RUN curl -L https://copr.devel.redhat.com/coprs/kvanderr/rh-json/repo/epel-9/kvanderr-rh-json-epel-9.repo > /etc/yum.repos.d/kpvdr-json-epel-9.repo +RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/opentelemetry-cpp-rhel/repo/epel-9/kpvdr-opentelemetry-cpp-rhel-epel-9.repo > /etc/yum.repos.d/kpvdr-opentelemetry-cpp-rhel-epel-9.repo +RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/protobuf/repo/epel-9/kpvdr-protobuf-epel-9.repo > /etc/yum.repos.d/kpvdr-protobuf-epel-9.repo +RUN curl -L https://copr.fedorainfracloud.org/coprs/kpvdr/json/repo/epel-9/kpvdr-json-epel-9.repo > /etc/yum.repos.d/kpvdr-json-epel-9.repo #CMake Error at /usr/lib64/cmake/protobuf/protobuf-targets.cmake:106 (message): # The imported target "protobuf::libprotobuf-lite" references the file diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 5475b125..d0c1d402 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -265,7 +265,7 @@ void TxReceiverHandler::on_transaction_declared(transaction t) { void TxReceiverHandler::on_transaction_aborted(transaction t) { confirmed += current_batch; - logger(debug) << "[on_transaction_aborted] messages aborted"; + logger(debug) << "[on_transaction_aborted] messages aborted, confirmed: " << confirmed; if(confirmed == count) { logger(info) << "[on_transaction_committed] All messages proccessed"; t.connection().close(); @@ -278,7 +278,7 @@ void TxReceiverHandler::on_transaction_aborted(transaction t) { void TxReceiverHandler::on_transaction_committed(transaction t) { confirmed += current_batch; current_batch = 0; - logger(trace) << "[on_transaction_committed] Committed:"<< confirmed; + logger(debug) << "[on_transaction_aborted] messages committed, confirmed: " << confirmed; if(confirmed == count) { logger(info) << "[on_transaction_committed] All messages proccessed"; t.connection().close(); @@ -290,21 +290,24 @@ void TxReceiverHandler::on_transaction_committed(transaction t) { void TxReceiverHandler::on_container_start(container &c) { - logger(debug) << "Starting messaging handler"; + logger(debug) << "[on_container_start] Starting messaging transaction handler"; + logger(debug) << "[on_container_start] User: " << user; + logger(debug) << "[on_container_start] Password: " << password; + logger(debug) << "[on_container_start] SASL mechanisms: " << sasl_mechanisms; + logger(debug) << "[on_container_start] SASL enabled: " << conn_sasl_enabled; + logger(debug) << "[on_container_start] Maximum frame size: " << max_frame_size; + logger(debug) << "[on_container_start] Topic: " << is_topic; + logger(debug) << "[on_container_start] Transaction batch size: " << batch_size; + logger(debug) << "[on_container_start] Transaction action: " << tx_action; + logger(debug) << "[on_container_start] Transaction endloop action: " << tx_endloop_action; + logger(trace) << "[on_container_start] Messages count: " << count; + logger(debug) << "[on_container_start] Messages confirmed: " << confirmed; + logger(debug) << "[on_container_start] Peer to Peer: " << recv_listen; if (recv_listen == "true") { cont = &c; } - logger(debug) << "User: " << user; - logger(debug) << "Password: " << password; - logger(debug) << "SASL mechanisms: " << sasl_mechanisms; - logger(debug) << "SASL enabled: " << conn_sasl_enabled; - - logger(debug) << "Maximum frame size: " << max_frame_size; - - logger(debug) << "Topic: " << is_topic; - connection_options conn_opts; std::vector< ::proton::symbol > caps; @@ -321,7 +324,7 @@ void TxReceiverHandler::on_container_start(container &c) } } - logger(debug) << "Source capabilities: "; + logger(debug) << "[on_container_start] Source capabilities: "; for (std::vector< ::proton::symbol >::const_iterator i = caps.begin(); i != caps.end(); ++i) { logger(debug) << *i; } @@ -340,24 +343,24 @@ void TxReceiverHandler::on_container_start(container &c) // conn_opts.max_frame_size(max_frame_size); conn_opts.failover_urls(conn_urls); - logger(debug) << "Setting a reconnect timer: " << conn_reconnect; - logger(debug) << "Custom reconnect: " << conn_reconnect_custom; + logger(debug) << "[on_container_start] Setting a reconnect timer: " << conn_reconnect; + logger(debug) << "[on_container_start] Custom reconnect: " << conn_reconnect_custom; configure_reconnect(conn_opts); configure_ssl(c); if (conn_heartbeat != 0) { - logger(debug) << "Heartbeat: " << conn_heartbeat; + logger(debug) << "[on_container_start] Heartbeat: " << conn_heartbeat; duration heartbeat_seconds = conn_heartbeat * duration::SECOND; conn_opts.idle_timeout(heartbeat_seconds); } - logger(debug) << "Browsing: " << browse; + logger(debug) << "[on_container_start] Browsing: " << browse; if (browse) { - logger(debug) << "Creating a receiver and connecting to the server"; + logger(debug) << "[on_container_start] Creating a receiver and connecting to the server"; source_options s_opts = source_options() .distribution_mode(source::COPY) @@ -398,18 +401,18 @@ void TxReceiverHandler::on_container_start(container &c) work_q = &recv.work_queue(); } else { - logger(debug) << "Peer-to-peer: " << recv_listen; - logger(debug) << "Peer-to-peer port: " << recv_listen_port; + logger(debug) << "[on_container_start] Peer-to-peer: " << recv_listen; + logger(debug) << "[on_container_start] Peer-to-peer port: " << recv_listen_port; if (recv_listen == "true") { - logger(debug) << "Creating a listener"; + logger(debug) << "[on_container_start] Creating a listener"; // P2P stringstream ss; ss << "0.0.0.0:"; ss << recv_listen_port; lsnr = c.listen(ss.str(), conn_opts); } else { - logger(debug) << "Creating a receiver and connecting to the server"; + logger(debug) << "[on_container_start] Creating a receiver and connecting to the server"; source_options s_opts = source_options().filters(this->fm).capabilities(caps); @@ -448,7 +451,7 @@ void TxReceiverHandler::on_container_start(container &c) work_q = &recv.work_queue(); } } - logger(debug) << "Connected to the broker/p2p and waiting for messages"; + logger(debug) << "[on_container_start] Connected to the broker/p2p and waiting for messages"; if (subscriber_unsubscribe && durable_subscriber_name != "") { recv.close(); @@ -471,10 +474,10 @@ void TxReceiverHandler::on_message(delivery &d, message &m) // TODO useless now ?? usew confirmed ? msg_received_cnt += 1; - logger(debug) << "Processing received message"; + logger(debug) << "[on_message] Processing received message"; if (log_msgs == "dict") { - logger(trace) << "Decoding message"; + logger(trace) << "[on_message] Decoding message"; ReactorDecoder decoder = ReactorDecoder(m); std::ostringstream stream; @@ -492,7 +495,7 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } if (duration_time > 0 && duration_mode == "after-receive") { - logger(debug) << "Waiting..."; + logger(debug) << "[on_message] Waiting..."; sleep4next(ts, count, duration_time, msg_received_cnt); } @@ -508,20 +511,20 @@ void TxReceiverHandler::on_message(delivery &d, message &m) // TODO: not implemented yet } - logger(debug) << "Process-reply-to: " << process_reply_to; + logger(debug) << "[on_message] Process-reply-to: " << process_reply_to; if (process_reply_to) { if (m.reply_to() != "") { - logger(debug) << "Reply-to address: " << m.reply_to(); + logger(debug) << "[on_message] Reply-to address: " << m.reply_to(); do_process_reply_to(m); } else { - logger(debug) << "Reply-to address is not set"; + logger(debug) << "[on_message] Reply-to address is not set"; } } if (recv_drain_after_credit_window && msg_received_cnt == recv_credit_window) { - logger(debug) << "Scheduling drain"; + logger(debug) << "[on_message] Scheduling drain"; d.receiver().work_queue().add(make_work(&TxReceiverHandler::drain, this)); } @@ -564,22 +567,22 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } void TxReceiverHandler::on_receiver_drain_finish(receiver &r) { - logger(debug) << "Receiver drain finished"; + logger(debug) << "[on_receiver_drain_finish] Receiver drain finished"; } void TxReceiverHandler::on_tracker_accept(tracker &t) { - logger(debug) << "Delivery accepted"; + logger(debug) << "[on_tracker_accept] Delivery accepted"; } void TxReceiverHandler::on_tracker_reject(tracker &t) { - logger(debug) << "Delivery rejected"; + logger(debug) << "[on_tracker_reject] Delivery rejected"; } void TxReceiverHandler::on_transport_close(transport &t) { - logger(debug) << "Closing the transport"; + logger(debug) << "[on_transport_close] Closing the transport"; if (conn_reconnect == "false") { exit(1); @@ -589,7 +592,8 @@ void TxReceiverHandler::on_transport_close(transport &t) { } void TxReceiverHandler::on_transport_error(transport &t) { - logger(error) << "The connection with " << broker_url.getHost() << ":" << broker_url.getPort() << " was interrupted: " << t.error().what(); + logger(error) << "[on_transport_error] The connection with " << broker_url.getHost() << ":" + << broker_url.getPort() << " was interrupted: " << t.error().what(); if (t.error().what().find("unauthorized") != string::npos) { exit(1); @@ -598,20 +602,16 @@ void TxReceiverHandler::on_transport_error(transport &t) { void TxReceiverHandler::on_connection_close(connection &conn) { - logger(debug) << "Disconnecting ..."; + logger(debug) << "[on_connection_close] Disconnecting ..."; } void TxReceiverHandler::on_connection_error(connection &c) { - logger(error) << "Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); + logger(error) << "[on_connection_error] Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); if (c.error().what().find("Unable to validate user") != string::npos) { exit(1); } } -void TxReceiverHandler::do_disconnect() -{ - -} - +void TxReceiverHandler::do_disconnect() {} diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 2fda473a..c5fc40c2 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -277,7 +277,7 @@ void TxSenderHandler::on_tracker_accept(tracker &t) void TxSenderHandler::on_tracker_reject(tracker &t) { - std::cerr << "[error] Delivery rejected" << std::endl; + std::cerr << "[on_tracker_reject] Delivery rejected" << std::endl; exit(1); } @@ -305,7 +305,7 @@ void TxSenderHandler::on_connection_close(connection &c) void TxSenderHandler::on_connection_error(connection &c) { - logger(error) << "Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); + logger(error) << "[on_connection_error] Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); if (c.error().what().find("Unable to validate user") != string::npos) { exit(1); @@ -372,7 +372,7 @@ void TxSenderHandler::on_container_start(container &c) logger(debug) << "[on_container_start] Transaction action: " << tx_action; logger(debug) << "[on_container_start] Transaction endloop action: " << tx_endloop_action; logger(trace) << "[on_container_start] Messages count: " << count; - logger(debug) << "[on_container_start] Messages Processed: " << processed; + logger(debug) << "[on_container_start] Messages processed: " << processed; std::vector< ::proton::symbol > caps; From 5b6f2b4ff673e07aca38e736e57baca5871dcd35 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 17 Jan 2025 16:31:04 +0100 Subject: [PATCH 27/53] fixup --- .../reactor/handler/TxSenderHandler.cpp | 17 ++++++++--------- .../reactor/handler/TxSenderHandler.h | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index c5fc40c2..9ef37d58 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -260,14 +260,13 @@ void TxSenderHandler::send() // reactor methods -// TODO I guess not needed -// void TxSenderHandler::on_sendable(sender &s) -// { -// logger(trace) << "[on_sendable] transaction: " << &tx; -// if (ready) { -// send(); -// } -// } +void TxSenderHandler::on_sendable(sender &s) +{ + logger(trace) << "[on_sendable] transaction: " << &tx; + if (ready) { + send(); + } +} void TxSenderHandler::on_tracker_accept(tracker &t) @@ -277,7 +276,7 @@ void TxSenderHandler::on_tracker_accept(tracker &t) void TxSenderHandler::on_tracker_reject(tracker &t) { - std::cerr << "[on_tracker_reject] Delivery rejected" << std::endl; + logger(trace) << "[on_tracker_reject] Delivery rejected"; exit(1); } diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index 15db7725..cf15b113 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -165,7 +165,7 @@ class TxSenderHandler : public CommonHandler, transaction_handler { // common reactor methods void on_container_start(container &c); void on_session_open(session &s); -// void on_sendable(sender &s); + void on_sendable(sender &s); void on_tracker_accept(tracker &t); void on_tracker_reject(tracker &t); void on_transport_error(transport &t); From fdac9a52c4cf9fa51ad1342a2ce2a45543d42c7d Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Tue, 21 Jan 2025 18:33:36 +0100 Subject: [PATCH 28/53] fixup --- .../reactor/handler/TxReceiverHandler.cpp | 23 +++++------------- .../reactor/handler/TxReceiverHandler.h | 5 +--- .../reactor/handler/TxSenderHandler.cpp | 24 +++++++++---------- 3 files changed, 19 insertions(+), 33 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index d0c1d402..4cdc2be2 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -104,7 +104,6 @@ TxReceiverHandler::TxReceiverHandler( timer_event(*this), msg_action(msg_action), msg_action_size(msg_action_size), - msg_received_cnt(0), process_reply_to(process_reply_to), browse(browse), count(count), @@ -258,8 +257,6 @@ void TxReceiverHandler::on_transaction_commit_failed(transaction t) { void TxReceiverHandler::on_transaction_declared(transaction t) { logger(trace) << "[on_transaction_declared] txn called " << (&t); logger(debug) << "[on_transaction_declared] txn is_empty " << (t.is_empty()); - // TODO needed? - // recv.add_credit(batch_size); tx = t; } @@ -471,9 +468,6 @@ void TxReceiverHandler::on_container_start(container &c) void TxReceiverHandler::on_message(delivery &d, message &m) { - // TODO useless now ?? usew confirmed ? - msg_received_cnt += 1; - logger(debug) << "[on_message] Processing received message"; if (log_msgs == "dict") { @@ -496,15 +490,15 @@ void TxReceiverHandler::on_message(delivery &d, message &m) if (duration_time > 0 && duration_mode == "after-receive") { logger(debug) << "[on_message] Waiting..."; - sleep4next(ts, count, duration_time, msg_received_cnt); + sleep4next(ts, count, duration_time, confirmed); } - if((msg_received_cnt % msg_action_size) == 0) { + if((confirmed % sg_action_size) == 0) { do_message_action(d); } if (duration_time > 0 && duration_mode == "after-receive-action") { - sleep4next(ts, count, duration_time, msg_received_cnt); + sleep4next(ts, count, duration_time, confirmed); } if (duration_time > 0 && duration_mode == "after-receive-action-tx-action") { @@ -523,12 +517,12 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } } - if (recv_drain_after_credit_window && msg_received_cnt == recv_credit_window) { + if (recv_drain_after_credit_window && confirmed== recv_credit_window) { logger(debug) << "[on_message] Scheduling drain"; d.receiver().work_queue().add(make_work(&TxReceiverHandler::drain, this)); } - if (!process_reply_to && msg_received_cnt == count) { + if (!process_reply_to && confirmed == count) { if (durable_subscriber) { d.receiver().detach(); } else { @@ -541,7 +535,6 @@ void TxReceiverHandler::on_message(delivery &d, message &m) #endif } - // TODO tx.accept(d); current_batch += 1; logger(debug) << "[on_message] current batch: " << current_batch; @@ -553,16 +546,12 @@ void TxReceiverHandler::on_message(delivery &d, message &m) tx.abort(); } } else if(current_batch == batch_size) { - //tx = transaction(); // null - // TODO: I think we should do a commit here ! rakhi is not doing logger(debug) << "[on_message] messages commited: " << current_batch; if (tx_endloop_action == "commit") { tx.commit(); } else if (tx_endloop_action == "rollback") { tx.abort(); } - // Rakhi ? - //sess.declare_transaction(*this); } } @@ -586,7 +575,7 @@ void TxReceiverHandler::on_transport_close(transport &t) { if (conn_reconnect == "false") { exit(1); - } else if (msg_received_cnt == count) { + } else if (confirmed == count) { exit(0); } } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 78c573ff..80485459 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -176,8 +176,6 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { void setSelector(string selector); void createSubscriptionName(string customPrefix); - // TODO transaction reactor methods on_transaction_ - /** * Sets the transaction batch size * @param batch_size the transaction batch size @@ -203,7 +201,7 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { void on_connection_close(connection &conn); void on_connection_error(connection &conn); - // TX + // reactor transaction methods void on_session_open(session &s); void on_transaction_declare_failed(transaction); void on_transaction_commit_failed(transaction t); @@ -239,7 +237,6 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { string msg_action; int msg_action_size; - int msg_received_cnt; bool process_reply_to; bool browse; int count; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 9ef37d58..eaa716c6 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -230,18 +230,18 @@ void TxSenderHandler::send() } else if (tx_action == "rollback") { tx.abort(); } - tx = transaction(); // null ? - - if (tx_action == "none") { - if (processed + current_batch == count) { - sndr.connection().close(); - } else { - processed += current_batch; - current_batch = 0; - sess.declare_transaction(*this); - } - } - } else if (processed + current_batch == count) { + tx = transaction(); + + if (tx_action == "none") { + if (processed + current_batch == count) { + sndr.connection().close(); + } else { + processed += current_batch; + current_batch = 0; + sess.declare_transaction(*this); + } + } + } else if (processed + current_batch == count) { logger(debug) << "[send] Transaction attempt (endloop): " << tx_endloop_action; if (tx_endloop_action == "commit") { tx.commit(); From 1118010cc1f600fa9392bc14bae37c28622305cd Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Tue, 21 Jan 2025 19:03:48 +0100 Subject: [PATCH 29/53] fixup --- src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 4cdc2be2..56d14808 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -493,7 +493,7 @@ void TxReceiverHandler::on_message(delivery &d, message &m) sleep4next(ts, count, duration_time, confirmed); } - if((confirmed % sg_action_size) == 0) { + if((confirmed % msg_action_size) == 0) { do_message_action(d); } From 4ba513f1b8ed60e8450a6bfda58afb981149a2bc Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 24 Jan 2025 16:59:15 +0100 Subject: [PATCH 30/53] refactoring --- src/api/qpid-proton/reactor/ReceivingClient.h | 1 + src/api/qpid-proton/reactor/SendingClient.h | 1 + .../qpid-proton/reactor/TxReceivingClient.cpp | 5 - .../qpid-proton/reactor/TxReceivingClient.h | 11 +- .../qpid-proton/reactor/TxSendingClient.cpp | 257 ------------------ src/api/qpid-proton/reactor/TxSendingClient.h | 18 +- 6 files changed, 8 insertions(+), 285 deletions(-) diff --git a/src/api/qpid-proton/reactor/ReceivingClient.h b/src/api/qpid-proton/reactor/ReceivingClient.h index 5e5f5afd..9a4fe1f6 100644 --- a/src/api/qpid-proton/reactor/ReceivingClient.h +++ b/src/api/qpid-proton/reactor/ReceivingClient.h @@ -52,6 +52,7 @@ class ReceivingClient : public ModernClient { private: typedef ModernClient super; + protected: void setMessageOptions(const OptionsSetter &setter, message &msg) const; }; diff --git a/src/api/qpid-proton/reactor/SendingClient.h b/src/api/qpid-proton/reactor/SendingClient.h index 559babc3..59bc5aca 100644 --- a/src/api/qpid-proton/reactor/SendingClient.h +++ b/src/api/qpid-proton/reactor/SendingClient.h @@ -47,6 +47,7 @@ class SendingClient : public ModernClient { private: typedef ModernClient super; + protected: void setMessageOptions(const OptionsSetter &setter, message &msg) const; bool nameVal(const string& in, string& name, string& value, string& separator) const; void setMessageProperty(message *msg, const string &property) const; diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.cpp b/src/api/qpid-proton/reactor/TxReceivingClient.cpp index 12dea9c7..ba358872 100644 --- a/src/api/qpid-proton/reactor/TxReceivingClient.cpp +++ b/src/api/qpid-proton/reactor/TxReceivingClient.cpp @@ -32,11 +32,6 @@ TxReceivingClient::~TxReceivingClient() { } -void TxReceivingClient::setMessageOptions(const OptionsSetter &setter, message &msg) const -{ - -} - int TxReceivingClient::run(int argc, char **argv) const { const string usage = "usage: %prog [OPTION]... DIR [FILE]..."; diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.h b/src/api/qpid-proton/reactor/TxReceivingClient.h index 4c6c8673..1c628b04 100644 --- a/src/api/qpid-proton/reactor/TxReceivingClient.h +++ b/src/api/qpid-proton/reactor/TxReceivingClient.h @@ -21,7 +21,7 @@ #include #include -#include "ModernClient.h" +#include "ReceivingClient.h" #include "handler/TxReceiverHandler.h" #include "options/modern/ReceiverOptionsParser.h" #include "options/OptionsHelper.h" @@ -35,14 +35,12 @@ namespace dtests { namespace proton { namespace reactor { -using dtests::proton::common::ModernClient; - using namespace dtests::common; /** * Implements a receiving client using the proton reactive API */ -class TxReceivingClient : public ModernClient { +class TxReceivingClient : public ReceivingClient { public: TxReceivingClient(); virtual ~TxReceivingClient(); @@ -50,10 +48,7 @@ class TxReceivingClient : public ModernClient { virtual int run(int argc, char **argv) const; private: - typedef ModernClient super; - - void setMessageOptions(const OptionsSetter &setter, message &msg) const; - + typedef ReceivingClient super; }; } /* namespace reactor */ diff --git a/src/api/qpid-proton/reactor/TxSendingClient.cpp b/src/api/qpid-proton/reactor/TxSendingClient.cpp index 3be4350a..81488850 100644 --- a/src/api/qpid-proton/reactor/TxSendingClient.cpp +++ b/src/api/qpid-proton/reactor/TxSendingClient.cpp @@ -17,7 +17,6 @@ namespace reactor { using namespace std; using dtests::common::UriParser; -using dtests::proton::common::ModernClient; TxSendingClient::TxSendingClient() : super() @@ -31,262 +30,6 @@ TxSendingClient::~TxSendingClient() } -void TxSendingClient::setMessageOptions(const OptionsSetter &setter, - message &msg) const -{ - /* - * Why the cast, you might ask? Because reply_to is overloaded, - * and the compiler is not smart enough to pick the correct one. - * Therefore we cast it (but not really) so that the compiler knows - * we are talking about reactor_type member function pointer (which is - * defined in the header file analogous to this one. - */ - setter.set("msg-reply-to", &msg, - static_cast (&message::reply_to)); - - setter.set("msg-to", &msg, - static_cast (&message::to)); - - setter.set("msg-correlation-id", &msg, - static_cast (&message::correlation_id)); - - setter.set("msg-content-type", &msg, - static_cast (&message::content_type)); - - setter.set("msg-subject", &msg, - static_cast (&message::subject)); - - setter.set("msg-id", &msg, static_cast (&message::id)); - -#ifdef ENABLE_IMPLICIT_CONVERSIONS - duration def = duration(0); - setter.setNumber("msg-ttl", &msg, - static_cast (&message::ttl), def); -#endif - - setter.set("msg-user-id", &msg, - static_cast (&message::user)); - - setter.setNumber("msg-priority", &msg, - static_cast (&message::priority)); - - setter.setBoolean("msg-durable", &msg, - static_cast (&message::durable)); - - setter.set("msg-group-id", &msg, - static_cast (&message::group_id)); - - setter.set("reply-to-group-id", &msg, - static_cast (&message::reply_to_group_id)); -/* - * This is replaced by setMessageProperties - * -#ifdef REACTOR_PROPERTY_MAP_USES_STL - message::property_map &properties = msg.properties(); - - setter.setMap("msg-property", properties); -#endif // REACTOR_PROPERTY_MAP_USES_STL - */ -} - -bool TxSendingClient::nameVal(const string &in, string &name, string &value, string &separator) const -{ - std::string::size_type i = in.find("="); - separator = "="; - if (i == std::string::npos) { - std::string::size_type i = in.find("~"); - separator = "~"; - if (i == std::string::npos) { - name = in; - return false; - } else { - name = in.substr(0, i); - if (i+1 < in.size()) { - value = in.substr(i+1); - return true; - } else { - return false; - } - } - } else { - name = in.substr(0, i); - if (i+1 < in.size()) { - value = in.substr(i+1); - return true; - } else { - return false; - } - } -} - -void TxSendingClient::setMessageProperty(message *msg, const string &property) const -{ - string name; - string val; - string separator; - string temp; - - if (nameVal(property, name, val, separator)) { - if (separator == "~") { - temp.resize(val.size()); - - std::transform(val.begin(), val.end(), temp.begin(), ::tolower); - - if (temp == "true") { - // true - msg->properties().put(name, true); - } else if (temp == "false") { - // false - msg->properties().put(name, false); - } else if (val.find(".") != std::string::npos || val.find("e") != std::string::npos || val.find("E") != std::string::npos) { - // maybe double - try { - // double - msg->properties().put(name, atof(val.c_str())); - } catch (exception& e) { - // string - msg->properties().put(name, val); - } - } else { - // long - msg->properties().put(name, atol(val.c_str())); - } - // msg->properties().get(name).setEncoding("utf8"); - } else { - msg->properties().put(name, val); - // msg->properties().get(name).setEncoding("utf8"); - } - } else { - msg->properties().put(name, val); - } -} - -void TxSendingClient::setMessageListItem(message *msg, const string &property, std::list &messageList) const -{ - string name; - string val; - string separator; - string temp; - - if (nameVal(property, name, val, separator)) { - if (separator == "~") { - temp.resize(val.size()); - - std::transform(val.begin(), val.end(), temp.begin(), ::tolower); - - if (temp == "true") { - // true - messageList.push_back(true); - } else if (temp == "false") { - // false - messageList.push_back(false); - } else if (val.find(".") != std::string::npos || val.find("e") != std::string::npos || val.find("E") != std::string::npos) { - // maybe double - try { - // double - messageList.push_back(atof(val.c_str())); - } catch (exception& e) { - // string - messageList.push_back(val); - } - } else if (val.find("~") != std::string::npos) { - // string - messageList.push_back(val); - } else { - // long - messageList.push_back(atol(val.c_str())); - } - // msg->properties().get(name).setEncoding("utf8"); - } else { - messageList.push_back(name); - // msg->properties().get(name).setEncoding("utf8"); - } - } else { - messageList.push_back(name); - } -} - -void TxSendingClient::setMessageMapItem(message *msg, const string &property, std::map &messageMap) const -{ - string name; - string val; - string separator; - string temp; - - if (nameVal(property, name, val, separator)) { - if (separator == "~") { - temp.resize(val.size()); - - std::transform(val.begin(), val.end(), temp.begin(), ::tolower); - - if (temp == "true") { - // true - messageMap[name] = true; - } else if (temp == "false") { - // false - messageMap[name] = false; - } else if (val.find(".") != std::string::npos || val.find("e") != std::string::npos || val.find("E") != std::string::npos) { - // maybe double - try { - // double - messageMap[name] = atof(val.c_str()); - } catch (exception& e) { - // string - messageMap[name] = val; - } - } else { - // long - messageMap[name] = atol(val.c_str()); - } - // msg->properties().get(name).setEncoding("utf8"); - } else { - messageMap[name] = val; - // msg->properties().get(name).setEncoding("utf8"); - } - } else { - messageMap[name] = val; - } -} - -void TxSendingClient::setMessageProperties(StringAppendCallback &callbackProperty, message *msg) const -{ - vector properties = callbackProperty.getStrings(); - - for (vector::iterator it = properties.begin(); it != properties.end(); ++it) { - setMessageProperty(msg, *it); - } -} - -void TxSendingClient::setMessageList(StringAppendCallback &callbackList, message *msg) const -{ - vector list = callbackList.getStrings(); - - std::list messageList; - - for (vector::iterator it = list.begin(); it != list.end(); ++it) { - setMessageListItem(msg, *it, messageList); - } - - msg->body() = messageList; -} - -void TxSendingClient::setMessageMap(StringAppendCallback &callbackMap, message *msg) const -{ - vector map = callbackMap.getStrings(); - - std::map messageMap; - - for (vector::iterator it = map.begin(); it != map.end(); ++it) { - setMessageMapItem(msg, *it, messageMap); - } - - msg->body() = messageMap; -} - -void TxSendingClient::setMessageText(string content, message *msg) const { - msg->body(content); -} - int TxSendingClient::run(int argc, char **argv) const { const string usage = "usage: %prog [OPTION]... DIR [FILE]..."; diff --git a/src/api/qpid-proton/reactor/TxSendingClient.h b/src/api/qpid-proton/reactor/TxSendingClient.h index a3f36e4e..bc3a7779 100644 --- a/src/api/qpid-proton/reactor/TxSendingClient.h +++ b/src/api/qpid-proton/reactor/TxSendingClient.h @@ -16,7 +16,7 @@ #include #include -#include "ModernClient.h" +#include "SendingClient.h" #include "handler/TxSenderHandler.h" #include "options/modern/SenderOptionsParser.h" #include "options/OptionsHelper.h" @@ -30,14 +30,12 @@ namespace dtests { namespace proton { namespace reactor { -using dtests::proton::common::ModernClient; - using namespace dtests::common; /** * Implements a connecting client using the proton reactive API */ -class TxSendingClient : public ModernClient { +class TxSendingClient : public SendingClient { public: TxSendingClient(); virtual ~TxSendingClient(); @@ -45,17 +43,7 @@ class TxSendingClient : public ModernClient { virtual int run(int argc, char **argv) const; private: - typedef ModernClient super; - - void setMessageOptions(const OptionsSetter &setter, message &msg) const; - bool nameVal(const string& in, string& name, string& value, string& separator) const; - void setMessageProperty(message *msg, const string &property) const; - void setMessageListItem(message *msg, const string &property, std::list &messageList) const; - void setMessageMapItem(message *msg, const string &property, std::map &messageMap) const; - void setMessageProperties(StringAppendCallback &callbackProperty, message *msg) const; - void setMessageList(StringAppendCallback &callbackList, message *msg) const; - void setMessageMap(StringAppendCallback &callbackMap, message *msg) const; - void setMessageText(string content, message *msg) const; + typedef SendingClient super; }; } /* namespace reactor */ From 2d887f6351ddc401bda6413edd8c4d905ae72b09 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 24 Jan 2025 17:40:40 +0100 Subject: [PATCH 31/53] fixup --- src/api/qpid-proton/reactor/handler/TxReceiverHandler.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 80485459..c0342538 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -188,8 +188,6 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { */ int getBatchSize() const; - transaction_handler th; - // reactor methods void on_container_start(container &c); void on_message(delivery &d, message &m); From 9c5bb5bbc7c12bacdf7c92bac5e9534837b78f00 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 27 Jan 2025 13:37:42 +0100 Subject: [PATCH 32/53] refactoring --- .../reactor/handler/ReceiverHandler.h | 4 +- .../reactor/handler/SenderHandler.h | 2 +- .../reactor/handler/TxReceiverHandler.cpp | 344 +++++++++--------- .../reactor/handler/TxReceiverHandler.h | 109 +++--- .../reactor/handler/TxSenderHandler.cpp | 164 ++++----- .../reactor/handler/TxSenderHandler.h | 102 +++--- 6 files changed, 363 insertions(+), 362 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/ReceiverHandler.h b/src/api/qpid-proton/reactor/handler/ReceiverHandler.h index 0ff9ff05..b23101c4 100644 --- a/src/api/qpid-proton/reactor/handler/ReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/ReceiverHandler.h @@ -181,13 +181,13 @@ class ReceiverHandler : public CommonHandler { void setSelector(string selector); void createSubscriptionName(string customPrefix); - private: + protected: typedef CommonHandler super; receiver recv; listener lsnr; container *cont; double ts; - + struct timer_event_t : public void_function0 { ReceiverHandler &parent; timer_event_t(ReceiverHandler &handler): parent(handler) { } diff --git a/src/api/qpid-proton/reactor/handler/SenderHandler.h b/src/api/qpid-proton/reactor/handler/SenderHandler.h index 0b81439c..27b88977 100644 --- a/src/api/qpid-proton/reactor/handler/SenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/SenderHandler.h @@ -151,7 +151,7 @@ class SenderHandler : public CommonHandler { */ message getMessage() const; - private: + protected: typedef CommonHandler super; bool ready; int count; diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 56d14808..3d4c7597 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -71,6 +71,13 @@ TxReceiverHandler::TxReceiverHandler( url, conn_urls, is_topic, +durable_subscriber, +subscriber_unsubscribe, +durable_subscriber_prefix, +durable_subscriber_name, +shared_subscriber, +msg_action, +msg_action_size, user, password, sasl_mechanisms, @@ -82,6 +89,9 @@ TxReceiverHandler::TxReceiverHandler( conn_ssl_verify_peer, conn_ssl_verify_peer_name, timeout, +count, +duration_time, +duration_mode, conn_reconnect, conn_reconnect_interval, conn_reconnect_limit, @@ -93,26 +103,16 @@ TxReceiverHandler::TxReceiverHandler( conn_heartbeat, max_frame_size, conn_use_config_file, - log_msgs - ), - durable_subscriber(durable_subscriber), - subscriber_unsubscribe(subscriber_unsubscribe), - durable_subscriber_prefix(durable_subscriber_prefix), - durable_subscriber_name(durable_subscriber_name), - shared_subscriber(shared_subscriber), - interval(timeout * duration::SECOND), - timer_event(*this), - msg_action(msg_action), - msg_action_size(msg_action_size), - process_reply_to(process_reply_to), - browse(browse), - count(count), - duration_time(duration_time), - duration_mode(duration_mode), - recv_listen(recv_listen), - recv_listen_port(recv_listen_port), - recv_credit_window(recv_credit_window), - recv_drain_after_credit_window(recv_drain_after_credit_window), + log_msgs, +//interval(timeout * duration::SECOND), +//timer_event(*this), +process_reply_to, +browse, +recv_listen, +recv_listen_port, +recv_credit_window, +recv_drain_after_credit_window + ), tx_action(tx_action), tx_endloop_action(tx_endloop_action) { @@ -122,109 +122,109 @@ TxReceiverHandler::~TxReceiverHandler() { } -void TxReceiverHandler::timerEvent() { -#if defined(__REACTOR_HAS_TIMER) - if (timer.isExpired()) { - logger(info) << "Timed out"; - - if (recv_listen != "true") { - exit(EXIT_SUCCESS); - } else { - exit(0); - } - } else { - timer--; - logger(debug) << "Waiting ..."; - - if (recv_listen != "true") { - work_q->schedule(duration::SECOND, make_work(&TxReceiverHandler::timerEvent, this)); - } else { - cont->schedule(duration::SECOND, make_work(&TxReceiverHandler::timerEvent, this)); - } - } -#endif -} - -void TxReceiverHandler::do_message_action(delivery &d) -{ - logger(debug) << "Message action: " << msg_action; - logger(debug) << "Message action size: " << msg_action_size; - - if(msg_action == "ack") { - d.accept(); - - logger(debug) << "Message acknowledged"; - } else if(msg_action == "reject") { - d.reject(); - - logger(debug) << "Message rejected"; - } else if(msg_action == "release") { - d.release(); - - logger(debug) << "Message released"; - } -} - -void TxReceiverHandler::do_process_reply_to(message &m) -{ - logger(debug) << "Processing reply-to"; - - map::iterator it = senders.find(m.reply_to()); - - if (it != senders.end()) { - logger(debug) << "Sender for " << m.reply_to() << " found"; - } else { - logger(debug) << "Sender for " << m.reply_to() << " not found"; - logger(debug) << "Creating sender for " << m.reply_to(); - - senders[m.reply_to()] = recv.connection().open_sender(m.reply_to()); - - logger(debug) << "Sender for " << m.reply_to() << " created"; - } - - message replyToMessage = message(m); - replyToMessage.to(m.reply_to()); - - logger(debug) << "Sending reply to " << replyToMessage.to(); - - senders[m.reply_to()].send(replyToMessage); -} - - -void TxReceiverHandler::drain() { - logger(debug) << "Draining..."; - recv.drain(); -} - -void TxReceiverHandler::setSelector(string selector) -{ - source::filter_map map; - symbol filter_key("selector"); - value filter_value; - encoder enc(filter_value); - - enc << start::described() - << symbol("apache.org:selector-filter:string") - << selector - << finish(); - - fm.put(filter_key, filter_value); -} - -void TxReceiverHandler::createSubscriptionName(string customPrefix) -{ - if (durable_subscriber_name == "") { - uuid client_uuid = ::proton::uuid::random(); - - if (customPrefix == "") { - durable_subscriber_name = "qpid-proton-cpp-" + client_uuid.str(); - } else { - durable_subscriber_name = customPrefix + client_uuid.str(); - } - } - - logger(debug) << "Durable subscription name: " << durable_subscriber_name; -} +//void TxReceiverHandler::timerEvent() { +//#if defined(__REACTOR_HAS_TIMER) +// if (timer.isExpired()) { +// logger(info) << "Timed out"; +// +// if (recv_listen != "true") { +// exit(EXIT_SUCCESS); +// } else { +// exit(0); +// } +// } else { +// timer--; +// logger(debug) << "Waiting ..."; +// +// if (recv_listen != "true") { +// work_q->schedule(duration::SECOND, make_work(&TxReceiverHandler::timerEvent, this)); +// } else { +// cont->schedule(duration::SECOND, make_work(&TxReceiverHandler::timerEvent, this)); +// } +// } +//#endif +//} +// +// void TxReceiverHandler::do_message_action(delivery &d) +// { +// logger(debug) << "Message action: " << msg_action; +// logger(debug) << "Message action size: " << msg_action_size; +// +// if(msg_action == "ack") { +// d.accept(); +// +// logger(debug) << "Message acknowledged"; +// } else if(msg_action == "reject") { +// d.reject(); +// +// logger(debug) << "Message rejected"; +// } else if(msg_action == "release") { +// d.release(); +// +// logger(debug) << "Message released"; +// } +// } +// +// void TxReceiverHandler::do_process_reply_to(message &m) +// { +// logger(debug) << "Processing reply-to"; +// +// map::iterator it = senders.find(m.reply_to()); +// +// if (it != senders.end()) { +// logger(debug) << "Sender for " << m.reply_to() << " found"; +// } else { +// logger(debug) << "Sender for " << m.reply_to() << " not found"; +// logger(debug) << "Creating sender for " << m.reply_to(); +// +// senders[m.reply_to()] = recv.connection().open_sender(m.reply_to()); +// +// logger(debug) << "Sender for " << m.reply_to() << " created"; +// } +// +// message replyToMessage = message(m); +// replyToMessage.to(m.reply_to()); +// +// logger(debug) << "Sending reply to " << replyToMessage.to(); +// +// senders[m.reply_to()].send(replyToMessage); +// } +// +// +// void TxReceiverHandler::drain() { +// logger(debug) << "Draining..."; +// recv.drain(); +// } +// +// void TxReceiverHandler::setSelector(string selector) +// { +// source::filter_map map; +// symbol filter_key("selector"); +// value filter_value; +// encoder enc(filter_value); +// +// enc << start::described() +// << symbol("apache.org:selector-filter:string") +// << selector +// << finish(); +// +// fm.put(filter_key, filter_value); +// } +// +//void TxReceiverHandler::createSubscriptionName(string customPrefix) +//{ +// if (durable_subscriber_name == "") { +// uuid client_uuid = ::proton::uuid::random(); +// +// if (customPrefix == "") { +// durable_subscriber_name = "qpid-proton-cpp-" + client_uuid.str(); +// } else { +// durable_subscriber_name = customPrefix + client_uuid.str(); +// } +// } +// +// logger(debug) << "Durable subscription name: " << durable_subscriber_name; +//} void TxReceiverHandler::setBatchSize(int batchSize) { @@ -555,52 +555,52 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } } -void TxReceiverHandler::on_receiver_drain_finish(receiver &r) { - logger(debug) << "[on_receiver_drain_finish] Receiver drain finished"; -} - -void TxReceiverHandler::on_tracker_accept(tracker &t) -{ - logger(debug) << "[on_tracker_accept] Delivery accepted"; -} - - -void TxReceiverHandler::on_tracker_reject(tracker &t) -{ - logger(debug) << "[on_tracker_reject] Delivery rejected"; -} - -void TxReceiverHandler::on_transport_close(transport &t) { - logger(debug) << "[on_transport_close] Closing the transport"; - - if (conn_reconnect == "false") { - exit(1); - } else if (confirmed == count) { - exit(0); - } -} - -void TxReceiverHandler::on_transport_error(transport &t) { - logger(error) << "[on_transport_error] The connection with " << broker_url.getHost() << ":" - << broker_url.getPort() << " was interrupted: " << t.error().what(); - - if (t.error().what().find("unauthorized") != string::npos) { - exit(1); - } -} - -void TxReceiverHandler::on_connection_close(connection &conn) -{ - logger(debug) << "[on_connection_close] Disconnecting ..."; -} - -void TxReceiverHandler::on_connection_error(connection &c) -{ - logger(error) << "[on_connection_error] Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); - - if (c.error().what().find("Unable to validate user") != string::npos) { - exit(1); - } -} - -void TxReceiverHandler::do_disconnect() {} +// void TxReceiverHandler::on_receiver_drain_finish(receiver &r) { +// logger(debug) << "[on_receiver_drain_finish] Receiver drain finished"; +// } +// +// void TxReceiverHandler::on_tracker_accept(tracker &t) +// { +// logger(debug) << "[on_tracker_accept] Delivery accepted"; +// } +// +// +// void TxReceiverHandler::on_tracker_reject(tracker &t) +// { +// logger(debug) << "[on_tracker_reject] Delivery rejected"; +// } +// +// void TxReceiverHandler::on_transport_close(transport &t) { +// logger(debug) << "[on_transport_close] Closing the transport"; +// +// if (conn_reconnect == "false") { +// exit(1); +// } else if (confirmed == count) { +// exit(0); +// } +// } +// +// void TxReceiverHandler::on_transport_error(transport &t) { +// logger(error) << "[on_transport_error] The connection with " << broker_url.getHost() << ":" +// << broker_url.getPort() << " was interrupted: " << t.error().what(); +// +// if (t.error().what().find("unauthorized") != string::npos) { +// exit(1); +// } +// } +// +// void TxReceiverHandler::on_connection_close(connection &conn) +// { +// logger(debug) << "[on_connection_close] Disconnecting ..."; +// } +// +// void TxReceiverHandler::on_connection_error(connection &c) +// { +// logger(error) << "[on_connection_error] Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); +// +// if (c.error().what().find("Unable to validate user") != string::npos) { +// exit(1); +// } +// } + +// void TxReceiverHandler::do_disconnect() {} diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index c0342538..8a2706c5 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -28,7 +28,7 @@ #include #include -#include "CommonHandler.h" +#include "ReceiverHandler.h" #include "reactor/formatter/ReactorDecoder.h" #include "formatter/DictFormatter.h" @@ -74,7 +74,7 @@ namespace reactor { /** * A proton message handler that handles message receive events */ -class TxReceiverHandler : public CommonHandler, transaction_handler { +class TxReceiverHandler : public ReceiverHandler, transaction_handler { public: /** * Constructor @@ -168,13 +168,13 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { virtual ~TxReceiverHandler(); - void timerEvent(); - - void do_message_action(delivery &d); - void do_process_reply_to(message &m); - void drain(); - void setSelector(string selector); - void createSubscriptionName(string customPrefix); +// void timerEvent(); +// +// void do_message_action(delivery &d); +// void do_process_reply_to(message &m); +// void drain(); +// void setSelector(string selector); +// void createSubscriptionName(string customPrefix); /** * Sets the transaction batch size @@ -191,13 +191,14 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { // reactor methods void on_container_start(container &c); void on_message(delivery &d, message &m); - void on_receiver_drain_finish(receiver &r); - void on_tracker_accept(tracker &t); - void on_tracker_reject(tracker &t); - void on_transport_close(transport &t); - void on_transport_error(transport &t); - void on_connection_close(connection &conn); - void on_connection_error(connection &conn); +// TODO define so they do nothing ? or leave and check they are unchanged (same func as receiverHandler) +// void on_receiver_drain_finish(receiver &r); +// void on_tracker_accept(tracker &t); +// void on_tracker_reject(tracker &t); +// void on_transport_close(transport &t); +// void on_transport_error(transport &t); +// void on_connection_close(connection &conn); +// void on_connection_error(connection &conn); // reactor transaction methods void on_session_open(session &s); @@ -208,45 +209,45 @@ class TxReceiverHandler : public CommonHandler, transaction_handler { void on_transaction_aborted(transaction t); private: - typedef CommonHandler super; - receiver recv; - listener lsnr; - container *cont; - double ts; - - struct timer_event_t : public void_function0 { - TxReceiverHandler &parent; - timer_event_t(TxReceiverHandler &handler): parent(handler) { } - void operator()() { - parent.timerEvent(); - } - }; - - source::filter_map fm; - - bool durable_subscriber; - bool subscriber_unsubscribe; - string durable_subscriber_prefix; - string durable_subscriber_name; - bool shared_subscriber; - - duration interval; - timer_event_t timer_event; - - string msg_action; - int msg_action_size; - bool process_reply_to; - bool browse; - int count; - int duration_time; - string duration_mode; - std::map senders; - string recv_listen; - int recv_listen_port; - int recv_credit_window; - bool recv_drain_after_credit_window; + typedef ReceiverHandler super; +// receiver recv; +// listener lsnr; +// container *cont; +// double ts; - void do_disconnect(); +//struct timer_event_t : public void_function0 { +// TxReceiverHandler &parent; +// timer_event_t(TxReceiverHandler &handler): parent(handler) { } +// void operator()() { +// parent.timerEvent(); +// } +//}; +// +// source::filter_map fm; +// +// bool durable_subscriber; +// bool subscriber_unsubscribe; +// string durable_subscriber_prefix; +// string durable_subscriber_name; +// bool shared_subscriber; +// +// duration interval; +// timer_event_t timer_event; +// +// string msg_action; +// int msg_action_size; +// bool process_reply_to; +// bool browse; +// int count; +// int duration_time; +// string duration_mode; +// std::map senders; +// string recv_listen; +// int recv_listen_port; +// int recv_credit_window; +// bool recv_drain_after_credit_window; +// +// void do_disconnect(); // transaction variables int batch_size = 0; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index eaa716c6..86b21238 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -71,6 +71,8 @@ TxSenderHandler::TxSenderHandler( conn_ssl_verify_peer, conn_ssl_verify_peer_name, timeout, + duration_time, + duration_mode, conn_reconnect, conn_reconnect_interval, conn_reconnect_limit, @@ -84,18 +86,16 @@ TxSenderHandler::TxSenderHandler( conn_use_config_file, log_msgs ), - ready(false), - count(1), - duration_time(duration_time), - duration_mode(duration_mode), +// ready(false), +// count(1) batch_size(0), current_batch(0), processed(0), tx_action(tx_action), - tx_endloop_action(tx_endloop_action), - m(), - timer_event(*this), - interval(duration::IMMEDIATE) + tx_endloop_action(tx_endloop_action) +// m(), +// timer_event(*this), +// interval(duration::IMMEDIATE) { } @@ -105,30 +105,30 @@ TxSenderHandler::~TxSenderHandler() logger(debug) << "Destroying the sender handler"; } -void TxSenderHandler::timerEvent() { -#if defined(__REACTOR_HAS_TIMER) - if (timer.isExpired()) { - logger(info) << "Timed out"; - - exit(EXIT_SUCCESS); - } else { - timer--; - logger(debug) << "Waiting ..."; - - work_q->schedule(duration::SECOND, make_work(&TxSenderHandler::timerEvent, this)); - } -#endif -} - -void TxSenderHandler::setCount(int count) -{ - this->count = count; -} - -int TxSenderHandler::getCount() const -{ - return count; -} +//void TxSenderHandler::timerEvent() { +//#if defined(__REACTOR_HAS_TIMER) +// if (timer.isExpired()) { +// logger(info) << "Timed out"; +// +// exit(EXIT_SUCCESS); +// } else { +// timer--; +// logger(debug) << "Waiting ..."; +// +// work_q->schedule(duration::SECOND, make_work(&TxSenderHandler::timerEvent, this)); +// } +//#endif +//} +// +//void TxSenderHandler::setCount(int count) +//{ +// this->count = count; +//} +// +//int TxSenderHandler::getCount() const +//{ +// return count; +//} void TxSenderHandler::setBatchSize(int batchSize) { @@ -140,15 +140,15 @@ int TxSenderHandler::getBatchSize() const return batch_size; } -void TxSenderHandler::setMessage(message &msg) -{ - this->m = msg; -} - -message TxSenderHandler::getMessage() const -{ - return m; -} +// void TxSenderHandler::setMessage(message &msg) +// { +// this->m = msg; +// } +// +// message TxSenderHandler::getMessage() const +// { +// return m; +// } void TxSenderHandler::checkIfCanSend() { if (processed < count) { @@ -269,47 +269,47 @@ void TxSenderHandler::on_sendable(sender &s) } -void TxSenderHandler::on_tracker_accept(tracker &t) -{ - logger(trace) << "[on_tracker_accept] Message accepted, confirmed message delivery: " << processed; -} - -void TxSenderHandler::on_tracker_reject(tracker &t) -{ - logger(trace) << "[on_tracker_reject] Delivery rejected"; - exit(1); -} - -void TxSenderHandler::on_transport_error(transport &t) { - logger(error) << "[on_transport_error] The connection with " << broker_url.getHost() << ":" << broker_url.getPort() << " was interrupted: " << t.error().what(); - - if (t.error().what().find("unauthorized") != string::npos) { - exit(1); - } -} - -void TxSenderHandler::on_transport_close(transport &t) { - logger(debug) << "[on_transport_close] Closing the transport"; - - if (conn_reconnect == "false") { - exit(1); - } -} - -void TxSenderHandler::on_connection_close(connection &c) -{ - current_batch = 0; - logger(debug) << "[on_connection_close] Closing connection"; -} - -void TxSenderHandler::on_connection_error(connection &c) -{ - logger(error) << "[on_connection_error] Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); - - if (c.error().what().find("Unable to validate user") != string::npos) { - exit(1); - } -} +// void TxSenderHandler::on_tracker_accept(tracker &t) +// { +// logger(trace) << "[on_tracker_accept] Message accepted, confirmed message delivery: " << processed; +// } +// +// void TxSenderHandler::on_tracker_reject(tracker &t) +// { +// logger(trace) << "[on_tracker_reject] Delivery rejected"; +// exit(1); +// } +// +// void TxSenderHandler::on_transport_error(transport &t) { +// logger(error) << "[on_transport_error] The connection with " << broker_url.getHost() << ":" << broker_url.getPort() << " was interrupted: " << t.error().what(); +// +// if (t.error().what().find("unauthorized") != string::npos) { +// exit(1); +// } +// } +// +// void TxSenderHandler::on_transport_close(transport &t) { +// logger(debug) << "[on_transport_close] Closing the transport"; +// +// if (conn_reconnect == "false") { +// exit(1); +// } +// } +// +// void TxSenderHandler::on_connection_close(connection &c) +// { +// current_batch = 0; +// logger(debug) << "[on_connection_close] Closing connection"; +// } +// +// void TxSenderHandler::on_connection_error(connection &c) +// { +// logger(error) << "[on_connection_error] Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); +// +// if (c.error().what().find("Unable to validate user") != string::npos) { +// exit(1); +// } +// } void TxSenderHandler::on_transaction_declared(transaction t) { logger(trace) << "[on_transaction_declared] txn called " << (&t); diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index cf15b113..9cbe8ff4 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -24,7 +24,7 @@ #include #include -#include "CommonHandler.h" +#include "SenderHandler.h" #include "Timer.h" #include "Utils.h" @@ -51,7 +51,7 @@ using dtests::common::Timer; /** * A proton message handler that handles message send events */ -class TxSenderHandler : public CommonHandler, transaction_handler { +class TxSenderHandler : public SenderHandler, transaction_handler { public: /** * Constructor @@ -117,21 +117,21 @@ class TxSenderHandler : public CommonHandler, transaction_handler { string tx_endloop_action = "commit" ); - void timerEvent(); - virtual ~TxSenderHandler(); - /** - * Sets the message count - * @param count the message count - */ - void setCount(int count); - - /** - * Gets the message count - * @return the message count - */ - int getCount() const; +// void timerEvent(); +// +// /** +// * Sets the message count +// * @param count the message count +// */ +// void setCount(int count); +// +// /** +// * Gets the message count +// * @return the message count +// */ +// int getCount() const; /** * Sets the transaction batch size @@ -145,20 +145,20 @@ class TxSenderHandler : public CommonHandler, transaction_handler { */ int getBatchSize() const; - /** - * Sets the message to send - * @param m the message to send - */ - void setMessage(message &m); +// /** +// * Sets the message to send +// * @param m the message to send +// */ +// void setMessage(message &m); void checkIfCanSend(); void send(); - /** - * Gets the message to send - * @return the message to send - */ - message getMessage() const; +// /** +// * Gets the message to send +// * @return the message to send +// */ +// message getMessage() const; session sess; @@ -166,12 +166,12 @@ class TxSenderHandler : public CommonHandler, transaction_handler { void on_container_start(container &c); void on_session_open(session &s); void on_sendable(sender &s); - void on_tracker_accept(tracker &t); - void on_tracker_reject(tracker &t); - void on_transport_error(transport &t); - void on_transport_close(transport &t); - void on_connection_error(connection &c); - void on_connection_close(connection &c); +// void on_tracker_accept(tracker &t); +// void on_tracker_reject(tracker &t); +// void on_transport_error(transport &t); +// void on_transport_close(transport &t); +// void on_connection_error(connection &c); +// void on_connection_close(connection &c); void on_sender_close(sender &s); // reactor transaction methods void on_transaction_declared(transaction t); @@ -181,12 +181,12 @@ class TxSenderHandler : public CommonHandler, transaction_handler { void on_transaction_commit_failed(transaction t); private: - typedef CommonHandler super; - bool ready; - int count; - int duration_time; - string duration_mode; - + typedef SenderHandler super; +// bool ready; +// int count; +// int duration_time; +// string duration_mode; +// // transactions related variables int batch_size = 0; int current_batch = 0; @@ -196,20 +196,20 @@ class TxSenderHandler : public CommonHandler, transaction_handler { sender sndr; transaction tx; - - message m; - - struct timer_event_t : public void_function0 { - TxSenderHandler &parent; - timer_event_t(TxSenderHandler &handler) : parent(handler) {} - void operator()() { - parent.timerEvent(); - } - }; - - timer_event_t timer_event; - - duration interval; +// +// message m; +// +// struct timer_event_t : public void_function0 { +// TxSenderHandler &parent; +// timer_event_t(TxSenderHandler &handler) : parent(handler) {} +// void operator()() { +// parent.timerEvent(); +// } +// }; +// +// timer_event_t timer_event; +// +// duration interval; }; From a7795bfd633c423c083ae9cdf278e3e9cf735f6e Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 27 Jan 2025 17:21:52 +0100 Subject: [PATCH 33/53] refactoring --- .../reactor/handler/TxReceiverHandler.cpp | 162 +----------------- .../reactor/handler/TxReceiverHandler.h | 66 +------ .../reactor/handler/TxSenderHandler.cpp | 99 ++--------- .../reactor/handler/TxSenderHandler.h | 72 ++------ 4 files changed, 39 insertions(+), 360 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 3d4c7597..5e1b98ce 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -122,110 +122,6 @@ TxReceiverHandler::~TxReceiverHandler() { } -//void TxReceiverHandler::timerEvent() { -//#if defined(__REACTOR_HAS_TIMER) -// if (timer.isExpired()) { -// logger(info) << "Timed out"; -// -// if (recv_listen != "true") { -// exit(EXIT_SUCCESS); -// } else { -// exit(0); -// } -// } else { -// timer--; -// logger(debug) << "Waiting ..."; -// -// if (recv_listen != "true") { -// work_q->schedule(duration::SECOND, make_work(&TxReceiverHandler::timerEvent, this)); -// } else { -// cont->schedule(duration::SECOND, make_work(&TxReceiverHandler::timerEvent, this)); -// } -// } -//#endif -//} -// -// void TxReceiverHandler::do_message_action(delivery &d) -// { -// logger(debug) << "Message action: " << msg_action; -// logger(debug) << "Message action size: " << msg_action_size; -// -// if(msg_action == "ack") { -// d.accept(); -// -// logger(debug) << "Message acknowledged"; -// } else if(msg_action == "reject") { -// d.reject(); -// -// logger(debug) << "Message rejected"; -// } else if(msg_action == "release") { -// d.release(); -// -// logger(debug) << "Message released"; -// } -// } -// -// void TxReceiverHandler::do_process_reply_to(message &m) -// { -// logger(debug) << "Processing reply-to"; -// -// map::iterator it = senders.find(m.reply_to()); -// -// if (it != senders.end()) { -// logger(debug) << "Sender for " << m.reply_to() << " found"; -// } else { -// logger(debug) << "Sender for " << m.reply_to() << " not found"; -// logger(debug) << "Creating sender for " << m.reply_to(); -// -// senders[m.reply_to()] = recv.connection().open_sender(m.reply_to()); -// -// logger(debug) << "Sender for " << m.reply_to() << " created"; -// } -// -// message replyToMessage = message(m); -// replyToMessage.to(m.reply_to()); -// -// logger(debug) << "Sending reply to " << replyToMessage.to(); -// -// senders[m.reply_to()].send(replyToMessage); -// } -// -// -// void TxReceiverHandler::drain() { -// logger(debug) << "Draining..."; -// recv.drain(); -// } -// -// void TxReceiverHandler::setSelector(string selector) -// { -// source::filter_map map; -// symbol filter_key("selector"); -// value filter_value; -// encoder enc(filter_value); -// -// enc << start::described() -// << symbol("apache.org:selector-filter:string") -// << selector -// << finish(); -// -// fm.put(filter_key, filter_value); -// } -// -//void TxReceiverHandler::createSubscriptionName(string customPrefix) -//{ -// if (durable_subscriber_name == "") { -// uuid client_uuid = ::proton::uuid::random(); -// -// if (customPrefix == "") { -// durable_subscriber_name = "qpid-proton-cpp-" + client_uuid.str(); -// } else { -// durable_subscriber_name = customPrefix + client_uuid.str(); -// } -// } -// -// logger(debug) << "Durable subscription name: " << durable_subscriber_name; -//} - void TxReceiverHandler::setBatchSize(int batchSize) { this->batch_size = batchSize; @@ -555,52 +451,12 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } } -// void TxReceiverHandler::on_receiver_drain_finish(receiver &r) { -// logger(debug) << "[on_receiver_drain_finish] Receiver drain finished"; -// } -// -// void TxReceiverHandler::on_tracker_accept(tracker &t) -// { -// logger(debug) << "[on_tracker_accept] Delivery accepted"; -// } -// -// -// void TxReceiverHandler::on_tracker_reject(tracker &t) -// { -// logger(debug) << "[on_tracker_reject] Delivery rejected"; -// } -// -// void TxReceiverHandler::on_transport_close(transport &t) { -// logger(debug) << "[on_transport_close] Closing the transport"; -// -// if (conn_reconnect == "false") { -// exit(1); -// } else if (confirmed == count) { -// exit(0); -// } -// } -// -// void TxReceiverHandler::on_transport_error(transport &t) { -// logger(error) << "[on_transport_error] The connection with " << broker_url.getHost() << ":" -// << broker_url.getPort() << " was interrupted: " << t.error().what(); -// -// if (t.error().what().find("unauthorized") != string::npos) { -// exit(1); -// } -// } -// -// void TxReceiverHandler::on_connection_close(connection &conn) -// { -// logger(debug) << "[on_connection_close] Disconnecting ..."; -// } -// -// void TxReceiverHandler::on_connection_error(connection &c) -// { -// logger(error) << "[on_connection_error] Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); -// -// if (c.error().what().find("Unable to validate user") != string::npos) { -// exit(1); -// } -// } - -// void TxReceiverHandler::do_disconnect() {} +void TxReceiverHandler::on_transport_close(transport &t) { + logger(debug) << "[on_transport_close] Closing the transport"; + + if (conn_reconnect == "false") { + exit(1); + } else if (confirmed == count) { + exit(0); + } +} diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 8a2706c5..851e168f 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -168,14 +168,6 @@ class TxReceiverHandler : public ReceiverHandler, transaction_handler { virtual ~TxReceiverHandler(); -// void timerEvent(); -// -// void do_message_action(delivery &d); -// void do_process_reply_to(message &m); -// void drain(); -// void setSelector(string selector); -// void createSubscriptionName(string customPrefix); - /** * Sets the transaction batch size * @param batch_size the transaction batch size @@ -188,19 +180,7 @@ class TxReceiverHandler : public ReceiverHandler, transaction_handler { */ int getBatchSize() const; - // reactor methods - void on_container_start(container &c); - void on_message(delivery &d, message &m); -// TODO define so they do nothing ? or leave and check they are unchanged (same func as receiverHandler) -// void on_receiver_drain_finish(receiver &r); -// void on_tracker_accept(tracker &t); -// void on_tracker_reject(tracker &t); -// void on_transport_close(transport &t); -// void on_transport_error(transport &t); -// void on_connection_close(connection &conn); -// void on_connection_error(connection &conn); - - // reactor transaction methods + // reactor method void on_session_open(session &s); void on_transaction_declare_failed(transaction); void on_transaction_commit_failed(transaction t); @@ -208,46 +188,13 @@ class TxReceiverHandler : public ReceiverHandler, transaction_handler { void on_transaction_committed(transaction t); void on_transaction_aborted(transaction t); + // overrides + void on_container_start(container &c); + void on_message(delivery &d, message &m); + void on_transport_close(transport &t); + private: typedef ReceiverHandler super; -// receiver recv; -// listener lsnr; -// container *cont; -// double ts; - -//struct timer_event_t : public void_function0 { -// TxReceiverHandler &parent; -// timer_event_t(TxReceiverHandler &handler): parent(handler) { } -// void operator()() { -// parent.timerEvent(); -// } -//}; -// -// source::filter_map fm; -// -// bool durable_subscriber; -// bool subscriber_unsubscribe; -// string durable_subscriber_prefix; -// string durable_subscriber_name; -// bool shared_subscriber; -// -// duration interval; -// timer_event_t timer_event; -// -// string msg_action; -// int msg_action_size; -// bool process_reply_to; -// bool browse; -// int count; -// int duration_time; -// string duration_mode; -// std::map senders; -// string recv_listen; -// int recv_listen_port; -// int recv_credit_window; -// bool recv_drain_after_credit_window; -// -// void do_disconnect(); // transaction variables int batch_size = 0; @@ -255,7 +202,6 @@ class TxReceiverHandler : public ReceiverHandler, transaction_handler { int confirmed = 0; string tx_action = "commit"; string tx_endloop_action = "commit"; - transaction tx; session sess; }; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 86b21238..74d45934 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -71,8 +71,8 @@ TxSenderHandler::TxSenderHandler( conn_ssl_verify_peer, conn_ssl_verify_peer_name, timeout, - duration_time, - duration_mode, + duration_time, + duration_mode, conn_reconnect, conn_reconnect_interval, conn_reconnect_limit, @@ -86,16 +86,11 @@ TxSenderHandler::TxSenderHandler( conn_use_config_file, log_msgs ), -// ready(false), -// count(1) batch_size(0), current_batch(0), processed(0), tx_action(tx_action), tx_endloop_action(tx_endloop_action) -// m(), -// timer_event(*this), -// interval(duration::IMMEDIATE) { } @@ -105,31 +100,6 @@ TxSenderHandler::~TxSenderHandler() logger(debug) << "Destroying the sender handler"; } -//void TxSenderHandler::timerEvent() { -//#if defined(__REACTOR_HAS_TIMER) -// if (timer.isExpired()) { -// logger(info) << "Timed out"; -// -// exit(EXIT_SUCCESS); -// } else { -// timer--; -// logger(debug) << "Waiting ..."; -// -// work_q->schedule(duration::SECOND, make_work(&TxSenderHandler::timerEvent, this)); -// } -//#endif -//} -// -//void TxSenderHandler::setCount(int count) -//{ -// this->count = count; -//} -// -//int TxSenderHandler::getCount() const -//{ -// return count; -//} - void TxSenderHandler::setBatchSize(int batchSize) { this->batch_size = batchSize; @@ -140,22 +110,13 @@ int TxSenderHandler::getBatchSize() const return batch_size; } -// void TxSenderHandler::setMessage(message &msg) -// { -// this->m = msg; -// } -// -// message TxSenderHandler::getMessage() const -// { -// return m; -// } - +// TODO parametrize and remove void TxSenderHandler::checkIfCanSend() { if (processed < count) { work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); if (sndr.credit() > 0) { - send(); + send(); } else { ready = true; } @@ -268,48 +229,16 @@ void TxSenderHandler::on_sendable(sender &s) } } +void TxSenderHandler::on_tracker_accept(tracker &t) +{ + logger(trace) << "[on_tracker_accept] Message accepted, confirmed message delivery: " << processed; +} -// void TxSenderHandler::on_tracker_accept(tracker &t) -// { -// logger(trace) << "[on_tracker_accept] Message accepted, confirmed message delivery: " << processed; -// } -// -// void TxSenderHandler::on_tracker_reject(tracker &t) -// { -// logger(trace) << "[on_tracker_reject] Delivery rejected"; -// exit(1); -// } -// -// void TxSenderHandler::on_transport_error(transport &t) { -// logger(error) << "[on_transport_error] The connection with " << broker_url.getHost() << ":" << broker_url.getPort() << " was interrupted: " << t.error().what(); -// -// if (t.error().what().find("unauthorized") != string::npos) { -// exit(1); -// } -// } -// -// void TxSenderHandler::on_transport_close(transport &t) { -// logger(debug) << "[on_transport_close] Closing the transport"; -// -// if (conn_reconnect == "false") { -// exit(1); -// } -// } -// -// void TxSenderHandler::on_connection_close(connection &c) -// { -// current_batch = 0; -// logger(debug) << "[on_connection_close] Closing connection"; -// } -// -// void TxSenderHandler::on_connection_error(connection &c) -// { -// logger(error) << "[on_connection_error] Failed to connect to " << broker_url.getHost() << ":" << broker_url.getPort(); -// -// if (c.error().what().find("Unable to validate user") != string::npos) { -// exit(1); -// } -// } +void TxSenderHandler::on_connection_close(connection &c) +{ + current_batch = 0; + logger(debug) << "[on_connection_close] Closing connection"; +} void TxSenderHandler::on_transaction_declared(transaction t) { logger(trace) << "[on_transaction_declared] txn called " << (&t); @@ -356,7 +285,7 @@ void TxSenderHandler::on_session_open(session &s) { logger(trace) << "[on_session_open] declare_txn started..."; s.declare_transaction(*this); logger(trace) << "[on_session_open] declare_txn ended..."; - } +} void TxSenderHandler::on_container_start(container &c) { diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index 9cbe8ff4..5c63da45 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -119,20 +119,6 @@ class TxSenderHandler : public SenderHandler, transaction_handler { virtual ~TxSenderHandler(); -// void timerEvent(); -// -// /** -// * Sets the message count -// * @param count the message count -// */ -// void setCount(int count); -// -// /** -// * Gets the message count -// * @return the message count -// */ -// int getCount() const; - /** * Sets the transaction batch size * @param batch_size the transaction batch size @@ -145,72 +131,34 @@ class TxSenderHandler : public SenderHandler, transaction_handler { */ int getBatchSize() const; -// /** -// * Sets the message to send -// * @param m the message to send -// */ -// void setMessage(message &m); - + // overrides void checkIfCanSend(); void send(); -// /** -// * Gets the message to send -// * @return the message to send -// */ -// message getMessage() const; - - session sess; - - // common reactor methods - void on_container_start(container &c); - void on_session_open(session &s); - void on_sendable(sender &s); -// void on_tracker_accept(tracker &t); -// void on_tracker_reject(tracker &t); -// void on_transport_error(transport &t); -// void on_transport_close(transport &t); -// void on_connection_error(connection &c); -// void on_connection_close(connection &c); + // reactor methods void on_sender_close(sender &s); - // reactor transaction methods void on_transaction_declared(transaction t); void on_transaction_committed(transaction t); void on_transaction_aborted(transaction t); void on_transaction_declare_failed(transaction t); void on_transaction_commit_failed(transaction t); + // overrides + void on_container_start(container &c); + void on_session_open(session &s); + void on_sendable(sender &s); + void on_tracker_accept(tracker &t); + void on_connection_close(connection &c); + private: typedef SenderHandler super; -// bool ready; -// int count; -// int duration_time; -// string duration_mode; -// - // transactions related variables int batch_size = 0; int current_batch = 0; int processed = 0; string tx_action = "commit"; string tx_endloop_action = "commit"; - - sender sndr; transaction tx; -// -// message m; -// -// struct timer_event_t : public void_function0 { -// TxSenderHandler &parent; -// timer_event_t(TxSenderHandler &handler) : parent(handler) {} -// void operator()() { -// parent.timerEvent(); -// } -// }; -// -// timer_event_t timer_event; -// -// duration interval; - + session sess; }; } /* namespace reactor */ From 010d1437a556962fdb10534b2beeec6c3932cfb0 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 27 Jan 2025 18:39:32 +0100 Subject: [PATCH 34/53] refactoring --- .../reactor/handler/TxReceiverHandler.h | 43 +------------------ .../reactor/handler/TxSenderHandler.cpp | 3 +- .../reactor/handler/TxSenderHandler.h | 24 +---------- 3 files changed, 4 insertions(+), 66 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 851e168f..6b178d7d 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -14,51 +14,10 @@ #ifndef TXRECEIVERHANDLER_H #define TXRECEIVERHANDLER_H -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include #include "ReceiverHandler.h" -#include "reactor/formatter/ReactorDecoder.h" -#include "formatter/DictFormatter.h" -#include "formatter/DictWriter.h" - -#include "formatter/UpstreamFormatter.h" -#include "formatter/UpstreamWriter.h" -#include "Utils.h" - -using proton::message; -using proton::container; -using proton::connection; -using proton::sender; -using proton::receiver; -using proton::listener; -using proton::delivery; -using proton::tracker; -using proton::void_function0; -using proton::endpoint; -using proton::source; -using proton::source_options; -using proton::transport; -using proton::connection_options; -using proton::receiver_options; -using proton::symbol; -using proton::codec::start; -using proton::codec::finish; -using proton::codec::encoder; -using proton::binary; -using proton::uuid; using proton::transaction; using proton::session; using proton::transaction_handler; @@ -72,7 +31,7 @@ namespace proton { namespace reactor { /** - * A proton message handler that handles message receive events + * A proton transaction message handler that handles message receive events */ class TxReceiverHandler : public ReceiverHandler, transaction_handler { public: diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 74d45934..a58551d8 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -110,13 +110,12 @@ int TxSenderHandler::getBatchSize() const return batch_size; } -// TODO parametrize and remove void TxSenderHandler::checkIfCanSend() { if (processed < count) { work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); if (sndr.credit() > 0) { - send(); + send(); } else { ready = true; } diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index 5c63da45..fdc4bc98 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -14,30 +14,10 @@ #ifndef TXSENDERHANDLER_H #define TXSENDERHANDLER_H -#include -#include -#include -#include -#include -#include -#include -#include #include #include "SenderHandler.h" -#include "Timer.h" -#include "Utils.h" - -using proton::message; -using proton::message_id; -using proton::connection; -using proton::sender; -using proton::delivery; -using proton::source_options; -using proton::transport; -using proton::tracker; -using proton::connection_options; -using proton::sender; + using proton::transaction; using proton::session; using proton::transaction_handler; @@ -49,7 +29,7 @@ namespace reactor { using dtests::common::Timer; /** - * A proton message handler that handles message send events + * A proton transaction message handler that handles message send events */ class TxSenderHandler : public SenderHandler, transaction_handler { public: From 3c34c00f32d602a00f57bbd7f6a63fee96098a0c Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 27 Jan 2025 18:48:48 +0100 Subject: [PATCH 35/53] refactoring --- .../reactor/handler/TxReceiverHandler.cpp | 34 +++++++++---------- .../reactor/handler/TxSenderHandler.cpp | 2 +- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 5e1b98ce..c08049a4 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -71,13 +71,13 @@ TxReceiverHandler::TxReceiverHandler( url, conn_urls, is_topic, -durable_subscriber, -subscriber_unsubscribe, -durable_subscriber_prefix, -durable_subscriber_name, -shared_subscriber, -msg_action, -msg_action_size, + durable_subscriber, + subscriber_unsubscribe, + durable_subscriber_prefix, + durable_subscriber_name, + shared_subscriber, + msg_action, + msg_action_size, user, password, sasl_mechanisms, @@ -89,9 +89,9 @@ msg_action_size, conn_ssl_verify_peer, conn_ssl_verify_peer_name, timeout, -count, -duration_time, -duration_mode, + count, + duration_time, + duration_mode, conn_reconnect, conn_reconnect_interval, conn_reconnect_limit, @@ -104,14 +104,12 @@ duration_mode, max_frame_size, conn_use_config_file, log_msgs, -//interval(timeout * duration::SECOND), -//timer_event(*this), -process_reply_to, -browse, -recv_listen, -recv_listen_port, -recv_credit_window, -recv_drain_after_credit_window + process_reply_to, + browse, + recv_listen, + recv_listen_port, + recv_credit_window, + recv_drain_after_credit_window ), tx_action(tx_action), tx_endloop_action(tx_endloop_action) diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index a58551d8..d16af8dd 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -201,7 +201,7 @@ void TxSenderHandler::send() sess.declare_transaction(*this); } } - } else if (processed + current_batch == count) { + } else if (processed + current_batch == count) { logger(debug) << "[send] Transaction attempt (endloop): " << tx_endloop_action; if (tx_endloop_action == "commit") { tx.commit(); From 233a3ff9313d8fd30b9847663c081f253bb2b469 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 27 Jan 2025 19:01:12 +0100 Subject: [PATCH 36/53] refactoring --- src/api/qpid-proton/reactor/TxReceivingClient.h | 11 ----------- src/api/qpid-proton/reactor/TxSendingClient.h | 13 ------------- 2 files changed, 24 deletions(-) diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.h b/src/api/qpid-proton/reactor/TxReceivingClient.h index 1c628b04..ac5a2e08 100644 --- a/src/api/qpid-proton/reactor/TxReceivingClient.h +++ b/src/api/qpid-proton/reactor/TxReceivingClient.h @@ -14,19 +14,8 @@ #ifndef TXRECEIVINGCLIENT_H #define TXRECEIVINGCLIENT_H -#include -#include - -#include -#include -#include - #include "ReceivingClient.h" #include "handler/TxReceiverHandler.h" -#include "options/modern/ReceiverOptionsParser.h" -#include "options/OptionsHelper.h" -#include "TypeUtils.h" -#include "UriParser.h" using proton::message; using proton::uuid; diff --git a/src/api/qpid-proton/reactor/TxSendingClient.h b/src/api/qpid-proton/reactor/TxSendingClient.h index bc3a7779..55bc01c4 100644 --- a/src/api/qpid-proton/reactor/TxSendingClient.h +++ b/src/api/qpid-proton/reactor/TxSendingClient.h @@ -8,21 +8,8 @@ #ifndef DTESTS_NODE_DATA_CLIENTS_LANG_CPP_APIS_PROTON_REACTOR_TXSENDINGCLIENT_H_ #define DTESTS_NODE_DATA_CLIENTS_LANG_CPP_APIS_PROTON_REACTOR_TXSENDINGCLIENT_H_ -#include -#include - -#include -#include -#include -#include - #include "SendingClient.h" #include "handler/TxSenderHandler.h" -#include "options/modern/SenderOptionsParser.h" -#include "options/OptionsHelper.h" -#include "ContentType.h" -#include "TypeUtils.h" -#include "UriParser.h" using proton::message; From ce7f96a21a63b38259cb145fd01048ca9b280a93 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Mon, 27 Jan 2025 19:17:59 +0100 Subject: [PATCH 37/53] refactoring --- src/api/qpid-proton/reactor/handler/TxReceiverHandler.h | 5 ++++- src/api/qpid-proton/reactor/handler/TxSenderHandler.h | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 6b178d7d..63cc8d89 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -77,6 +77,10 @@ class TxReceiverHandler : public ReceiverHandler, transaction_handler { * @param browse enable browsing receiver * @param recv_listen enable p2p listener * @param recv_listen_port p2p listener port + * @param recv_credit_window receiver credit window + * @param recv_drain_after_credit_window drain aqfter credit window + * @param tx_action transaction action on batch + * @param tx_endloop_action transaction action on last batch */ TxReceiverHandler( const string &url, @@ -155,7 +159,6 @@ class TxReceiverHandler : public ReceiverHandler, transaction_handler { private: typedef ReceiverHandler super; - // transaction variables int batch_size = 0; int current_batch = 0; int confirmed = 0; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index fdc4bc98..3f250074 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -63,6 +63,8 @@ class TxSenderHandler : public SenderHandler, transaction_handler { * @param max_frame_size maximum frame size * @param conn_use_config_file use configuration file for connection * @param log_msgs message log format + * @param tx_action transaction action on batch + * @param tx_endloop_action transaction action on last batch */ TxSenderHandler( const string &url, @@ -132,6 +134,7 @@ class TxSenderHandler : public SenderHandler, transaction_handler { private: typedef SenderHandler super; + int batch_size = 0; int current_batch = 0; int processed = 0; From d80ee5c11c0cc3b329275252dd70ccbc9fcf5af9 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Tue, 4 Feb 2025 14:54:50 +0100 Subject: [PATCH 38/53] align with python --- .../qpid-proton/reactor/TxReceivingClient.cpp | 2 + .../reactor/handler/TxReceiverHandler.cpp | 93 ++++++++++++------- .../reactor/handler/TxReceiverHandler.h | 2 +- .../reactor/handler/TxSenderHandler.cpp | 1 - 4 files changed, 60 insertions(+), 38 deletions(-) diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.cpp b/src/api/qpid-proton/reactor/TxReceivingClient.cpp index ba358872..647bb832 100644 --- a/src/api/qpid-proton/reactor/TxReceivingClient.cpp +++ b/src/api/qpid-proton/reactor/TxReceivingClient.cpp @@ -393,6 +393,8 @@ int TxReceivingClient::run(int argc, char **argv) const handler.setSelector(selector); } + // TODO python defaults to 10 + // int tx_size = 10; int tx_size = 0; if (options.is_set("tx-size")) { tx_size = static_cast (options.get("tx-size")); diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index c08049a4..8fab737d 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -110,7 +110,7 @@ TxReceiverHandler::TxReceiverHandler( recv_listen_port, recv_credit_window, recv_drain_after_credit_window - ), + ), tx_action(tx_action), tx_endloop_action(tx_endloop_action) { @@ -149,33 +149,39 @@ void TxReceiverHandler::on_transaction_commit_failed(transaction t) { } void TxReceiverHandler::on_transaction_declared(transaction t) { + // TODO python some weird magic around count 0, doesn't make much sense to me yet + // when fixes take care about all count checks ofr zero + if (count != 0 && processed + batch_size > count) { + batch_size = count % batch_size; + } else if (count != 0) { + batch_size = count; + } logger(trace) << "[on_transaction_declared] txn called " << (&t); logger(debug) << "[on_transaction_declared] txn is_empty " << (t.is_empty()); tx = t; } void TxReceiverHandler::on_transaction_aborted(transaction t) { - confirmed += current_batch; - logger(debug) << "[on_transaction_aborted] messages aborted, confirmed: " << confirmed; - if(confirmed == count) { - logger(info) << "[on_transaction_committed] All messages proccessed"; - t.connection().close(); - } - else { + processed += current_batch; + current_batch = 0; + logger(debug) << "[on_transaction_aborted] messages aborted, processed: " << processed; + if (count == 0 || processed < count) { sess.declare_transaction(*this); + } else { + logger(info) << "[on_transaction_committed] All messages processed"; + t.connection().close(); } } void TxReceiverHandler::on_transaction_committed(transaction t) { - confirmed += current_batch; + processed += current_batch; current_batch = 0; - logger(debug) << "[on_transaction_aborted] messages committed, confirmed: " << confirmed; - if(confirmed == count) { - logger(info) << "[on_transaction_committed] All messages proccessed"; - t.connection().close(); - } - else { + logger(debug) << "[on_transaction_aborted] messages committed, processed: " << processed; + if (count == 0 || processed < count) { sess.declare_transaction(*this); + } else { + logger(info) << "[on_transaction_committed] All messages processed"; + t.connection().close(); } } @@ -192,7 +198,7 @@ void TxReceiverHandler::on_container_start(container &c) logger(debug) << "[on_container_start] Transaction action: " << tx_action; logger(debug) << "[on_container_start] Transaction endloop action: " << tx_endloop_action; logger(trace) << "[on_container_start] Messages count: " << count; - logger(debug) << "[on_container_start] Messages confirmed: " << confirmed; + logger(debug) << "[on_container_start] Messages processed: " << processed; logger(debug) << "[on_container_start] Peer to Peer: " << recv_listen; if (recv_listen == "true") { @@ -364,6 +370,11 @@ void TxReceiverHandler::on_message(delivery &d, message &m) { logger(debug) << "[on_message] Processing received message"; + tx.accept(d); + current_batch += 1; + + logger(debug) << "[on_message] current batch: " << current_batch; + if (log_msgs == "dict") { logger(trace) << "[on_message] Decoding message"; ReactorDecoder decoder = ReactorDecoder(m); @@ -384,19 +395,15 @@ void TxReceiverHandler::on_message(delivery &d, message &m) if (duration_time > 0 && duration_mode == "after-receive") { logger(debug) << "[on_message] Waiting..."; - sleep4next(ts, count, duration_time, confirmed); + sleep4next(ts, count, duration_time, processed + current_batch); } - if((confirmed % msg_action_size) == 0) { + if(((processed + current_batch) % msg_action_size) == 0) { do_message_action(d); } if (duration_time > 0 && duration_mode == "after-receive-action") { - sleep4next(ts, count, duration_time, confirmed); - } - - if (duration_time > 0 && duration_mode == "after-receive-action-tx-action") { - // TODO: not implemented yet + sleep4next(ts, count, duration_time, processed + current_batch); } logger(debug) << "[on_message] Process-reply-to: " << process_reply_to; @@ -411,12 +418,12 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } } - if (recv_drain_after_credit_window && confirmed== recv_credit_window) { + if (recv_drain_after_credit_window && processed + current_batch == recv_credit_window) { logger(debug) << "[on_message] Scheduling drain"; d.receiver().work_queue().add(make_work(&TxReceiverHandler::drain, this)); } - if (!process_reply_to && confirmed == count) { + if (!process_reply_to && processed + current_batch == count) { if (durable_subscriber) { d.receiver().detach(); } else { @@ -429,32 +436,46 @@ void TxReceiverHandler::on_message(delivery &d, message &m) #endif } - tx.accept(d); - current_batch += 1; - logger(debug) << "[on_message] current batch: " << current_batch; - if (confirmed + current_batch == count) { - logger(debug) << "[on_message] Transaction attempt (endloop): " << tx_endloop_action; - if (tx_endloop_action == "commit") { + if(current_batch == batch_size) { + logger(debug) << "[send] Transaction attempt: " << tx_action; + if (tx_action == "commit") { tx.commit(); - } else if (tx_endloop_action == "rollback") { + } else if (tx_action == "rollback") { tx.abort(); } - } else if(current_batch == batch_size) { - logger(debug) << "[on_message] messages commited: " << current_batch; + + if (tx_action == "none") { + if (processed + current_batch == count) { + recv.connection().close(); + } else { + processed += current_batch; + current_batch = 0; + sess.declare_transaction(*this); + } + } + + if (duration_time > 0 && duration_mode == "after-receive-action-tx-action") { + // TODO: not implemented yet + } + + } else if (count != 0 && processed + current_batch == count) { + logger(debug) << "[send] Transaction attempt (endloop): " << tx_endloop_action; if (tx_endloop_action == "commit") { tx.commit(); } else if (tx_endloop_action == "rollback") { tx.abort(); + } else { + recv.connection().close(); } } } void TxReceiverHandler::on_transport_close(transport &t) { logger(debug) << "[on_transport_close] Closing the transport"; - + current_batch = 0; if (conn_reconnect == "false") { exit(1); - } else if (confirmed == count) { + } else if (processed == count) { exit(0); } } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 63cc8d89..7042f0c2 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -161,7 +161,7 @@ class TxReceiverHandler : public ReceiverHandler, transaction_handler { int batch_size = 0; int current_batch = 0; - int confirmed = 0; + int processed = 0; string tx_action = "commit"; string tx_endloop_action = "commit"; transaction tx; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index d16af8dd..f737fb61 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -151,7 +151,6 @@ void TxSenderHandler::send() logger(trace) << "[send] Transaction is empty: " << tx.is_empty(); - logger(trace) << "[send] Current_batch: " << sndr.credit(); logger(debug) << "[send] Messages processed: " << processed; logger(trace) << "[send] Current batch: " << current_batch; while (!tx.is_empty() && sndr.credit() && (processed + current_batch) < count) From a49f1db6e08af9b7bc9eaf06ed7bccc56aac772a Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Tue, 18 Mar 2025 19:50:36 +0100 Subject: [PATCH 39/53] use session insted of transaction argument in event calls --- .../reactor/handler/TxReceiverHandler.cpp | 41 +++---- .../reactor/handler/TxReceiverHandler.h | 12 +- .../reactor/handler/TxSenderHandler.cpp | 113 +++++++++--------- .../reactor/handler/TxSenderHandler.h | 14 +-- 4 files changed, 90 insertions(+), 90 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 8fab737d..12b71271 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -133,22 +133,21 @@ int TxReceiverHandler::getBatchSize() const // reactor methods void TxReceiverHandler::on_session_open(session &s) { - sess = s; logger(trace) << "[on_session_open] declare_txn started..."; s.declare_transaction(*this); logger(trace) << "[on_session_open] declare_txn ended..."; logger(debug) << "[on_session_open] transaction batch size: " << batch_size; } -void TxReceiverHandler::on_transaction_declare_failed(transaction) {} +void TxReceiverHandler::on_transaction_declare_failed(session) {} -void TxReceiverHandler::on_transaction_commit_failed(transaction t) { +void TxReceiverHandler::on_transaction_commit_failed(session s) { logger(debug) << "[on_transaction_commit_failed] Transaction Commit Failed"; - t.connection().close(); + s.connection().close(); exit(-1); } -void TxReceiverHandler::on_transaction_declared(transaction t) { +void TxReceiverHandler::on_transaction_declared(session s) { // TODO python some weird magic around count 0, doesn't make much sense to me yet // when fixes take care about all count checks ofr zero if (count != 0 && processed + batch_size > count) { @@ -156,32 +155,33 @@ void TxReceiverHandler::on_transaction_declared(transaction t) { } else if (count != 0) { batch_size = count; } - logger(trace) << "[on_transaction_declared] txn called " << (&t); - logger(debug) << "[on_transaction_declared] txn is_empty " << (t.is_empty()); - tx = t; + logger(trace) << "[on_transaction_declared] txn called " << (&s); + logger(debug) << "[on_transaction_declared] txn is_empty " << (s.txn_is_empty()); + // TODO + // tx = t; } -void TxReceiverHandler::on_transaction_aborted(transaction t) { +void TxReceiverHandler::on_transaction_aborted(session s) { processed += current_batch; current_batch = 0; logger(debug) << "[on_transaction_aborted] messages aborted, processed: " << processed; if (count == 0 || processed < count) { - sess.declare_transaction(*this); + s.declare_transaction(*this); } else { logger(info) << "[on_transaction_committed] All messages processed"; - t.connection().close(); + s.connection().close(); } } -void TxReceiverHandler::on_transaction_committed(transaction t) { +void TxReceiverHandler::on_transaction_committed(session s) { processed += current_batch; current_batch = 0; logger(debug) << "[on_transaction_aborted] messages committed, processed: " << processed; if (count == 0 || processed < count) { - sess.declare_transaction(*this); + s.declare_transaction(*this); } else { logger(info) << "[on_transaction_committed] All messages processed"; - t.connection().close(); + s.connection().close(); } } @@ -370,7 +370,8 @@ void TxReceiverHandler::on_message(delivery &d, message &m) { logger(debug) << "[on_message] Processing received message"; - tx.accept(d); + session s = d.session(); + s.txn_accept(d); current_batch += 1; logger(debug) << "[on_message] current batch: " << current_batch; @@ -439,9 +440,9 @@ void TxReceiverHandler::on_message(delivery &d, message &m) if(current_batch == batch_size) { logger(debug) << "[send] Transaction attempt: " << tx_action; if (tx_action == "commit") { - tx.commit(); + s.txn_commit(); } else if (tx_action == "rollback") { - tx.abort(); + s.txn_abort(); } if (tx_action == "none") { @@ -450,7 +451,7 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } else { processed += current_batch; current_batch = 0; - sess.declare_transaction(*this); + s.declare_transaction(*this); } } @@ -461,9 +462,9 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } else if (count != 0 && processed + current_batch == count) { logger(debug) << "[send] Transaction attempt (endloop): " << tx_endloop_action; if (tx_endloop_action == "commit") { - tx.commit(); + s.txn_commit(); } else if (tx_endloop_action == "rollback") { - tx.abort(); + s.txn_abort(); } else { recv.connection().close(); } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 7042f0c2..ac642e14 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -145,11 +145,11 @@ class TxReceiverHandler : public ReceiverHandler, transaction_handler { // reactor method void on_session_open(session &s); - void on_transaction_declare_failed(transaction); - void on_transaction_commit_failed(transaction t); - void on_transaction_declared(transaction t); - void on_transaction_committed(transaction t); - void on_transaction_aborted(transaction t); + void on_transaction_declare_failed(session); + void on_transaction_commit_failed(session s); + void on_transaction_declared(session s); + void on_transaction_committed(session s); + void on_transaction_aborted(session s); // overrides void on_container_start(container &c); @@ -164,8 +164,6 @@ class TxReceiverHandler : public ReceiverHandler, transaction_handler { int processed = 0; string tx_action = "commit"; string tx_endloop_action = "commit"; - transaction tx; - session sess; }; } /* namespace reactor */ diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index f737fb61..b3f58903 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -110,19 +110,20 @@ int TxSenderHandler::getBatchSize() const return batch_size; } -void TxSenderHandler::checkIfCanSend() { - if (processed < count) { - work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); - - if (sndr.credit() > 0) { - send(); - } else { - ready = true; - } - } -} - -void TxSenderHandler::send() +// void TxSenderHandler::checkIfCanSend() { +// if (processed < count) { +// work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); +// +// if (sndr.credit() > 0) { +// logger(debug) << "[checkIfCanSend] Preparing to send message"; +// send(); +// } else { +// ready = true; +// } +// } +// } + +void TxSenderHandler::send(session s) { logger(debug) << "[send] Preparing to send message"; int credit = sndr.credit(); @@ -150,12 +151,14 @@ void TxSenderHandler::send() } - logger(trace) << "[send] Transaction is empty: " << tx.is_empty(); + logger(trace) << "[send] Transaction is empty: " << s.txn_is_empty(); logger(debug) << "[send] Messages processed: " << processed; logger(trace) << "[send] Current batch: " << current_batch; - while (!tx.is_empty() && sndr.credit() && (processed + current_batch) < count) + while (s.txn_is_declared() && sndr.credit() && (processed + current_batch) < count) { - tx.send(sndr, message_to_send); + logger(trace) << "[send] Sending messages through the link NAZDAR"; + s.txn_send(sndr, message_to_send); + logger(trace) << "[send] Sending messages through the link BAZAR"; current_batch += 1; if (log_msgs == "dict") { @@ -185,11 +188,10 @@ void TxSenderHandler::send() if(current_batch == batch_size) { logger(debug) << "[send] Transaction attempt: " << tx_action; if (tx_action == "commit") { - tx.commit(); + s.txn_commit(); } else if (tx_action == "rollback") { - tx.abort(); + s.txn_abort(); } - tx = transaction(); if (tx_action == "none") { if (processed + current_batch == count) { @@ -197,15 +199,15 @@ void TxSenderHandler::send() } else { processed += current_batch; current_batch = 0; - sess.declare_transaction(*this); + s.declare_transaction(*this); } } } else if (processed + current_batch == count) { logger(debug) << "[send] Transaction attempt (endloop): " << tx_endloop_action; if (tx_endloop_action == "commit") { - tx.commit(); + s.txn_commit(); } else if (tx_endloop_action == "rollback") { - tx.abort(); + s.txn_abort(); } sndr.connection().close(); } @@ -221,9 +223,10 @@ void TxSenderHandler::send() void TxSenderHandler::on_sendable(sender &s) { - logger(trace) << "[on_sendable] transaction: " << &tx; + logger(trace) << "[on_sendable] IS THIS METHOD EVER CALLED IN TX MODE???"; + logger(trace) << "[on_sendable] transaction: " << &s; if (ready) { - send(); + send(s.session()); } } @@ -238,39 +241,39 @@ void TxSenderHandler::on_connection_close(connection &c) logger(debug) << "[on_connection_close] Closing connection"; } -void TxSenderHandler::on_transaction_declared(transaction t) { - logger(trace) << "[on_transaction_declared] txn called " << (&t); - logger(trace) << "[on_transaction_declared] txn is_empty " << (t.is_empty()) - << "\t" << tx.is_empty(); - tx = t; - send(); +void TxSenderHandler::on_transaction_declared(session s) { + logger(trace) << "[on_transaction_declared] txn called " << (&s); + logger(trace) << "[on_transaction_declared] txn is_empty " << (s.txn_is_empty()) + << "\t" << s.txn_is_empty(); + // tx = t; + send(s); } -void TxSenderHandler::on_transaction_committed(transaction t) { +void TxSenderHandler::on_transaction_committed(session s) { logger(trace) << "[on_transaction_committed] Messages committed"; processed += current_batch; logger(debug) << "[on_transaction_committed] Messages processed" << processed; if (processed == count) { logger(trace) << "[on_transaction_committed] All messages processed"; - t.connection().close(); + s.connection().close(); } else { logger(trace) << "[on_transaction_committed] Declaring new transaction"; current_batch = 0; - sess.declare_transaction(*this); + s.declare_transaction(*this); } } -void TxSenderHandler::on_transaction_aborted(transaction t) { +void TxSenderHandler::on_transaction_aborted(session s) { logger(trace) << "[on_transaction_aborted] Messages aborted"; processed += current_batch; - logger(debug) << "[on_transaction_committed] Messages processed" << processed; + logger(debug) << "[on_transaction_aborted] Messages processed" << processed; if (processed == count) { logger(trace) << "[on_transaction_aborted] All messages processed"; - t.connection().close(); + s.connection().close(); } else { - logger(trace) << "[on_transaction_committed] Declaring new transaction"; + logger(trace) << "[on_transaction_aborted] Declaring new transaction"; current_batch = 0; - sess.declare_transaction(*this); + s.declare_transaction(*this); } } @@ -279,7 +282,6 @@ void TxSenderHandler::on_sender_close(sender &s) { } void TxSenderHandler::on_session_open(session &s) { - sess = s; logger(trace) << "[on_session_open] declare_txn started..."; s.declare_transaction(*this); logger(trace) << "[on_session_open] declare_txn ended..."; @@ -366,26 +368,27 @@ void TxSenderHandler::on_container_start(container &c) logger(trace) << "[on_container_start] Interval for duration: " << interval.milliseconds() << " ms"; } -#if defined(__REACTOR_HAS_TIMER) - work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::timerEvent, this)); - - if (duration_time > 0 && duration_mode == "after-send") { - work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); - } else if (duration_time > 0 && duration_mode == "before-send") { - work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); - } else { - work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); - } -#endif - - tx = transaction(); +// TODO +// #if defined(__REACTOR_HAS_TIMER) +// work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::timerEvent, this)); +// +// if (duration_time > 0 && duration_mode == "after-send") { +// work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); +// } else if (duration_time > 0 && duration_mode == "before-send") { +// work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); +// } else { +// work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); +// } +// #endif + +// tx = transaction(); } -void TxSenderHandler::on_transaction_declare_failed(transaction) {} +void TxSenderHandler::on_transaction_declare_failed(session) {} -void TxSenderHandler::on_transaction_commit_failed(transaction t) { +void TxSenderHandler::on_transaction_commit_failed(session s) { logger(error) << "[on_transaction_commit_failed] Transaction Commit Failed"; - t.connection().close(); + s.connection().close(); exit(1); } diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index 3f250074..3fcbbfb6 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -115,15 +115,15 @@ class TxSenderHandler : public SenderHandler, transaction_handler { // overrides void checkIfCanSend(); - void send(); + void send(session sess); // reactor methods void on_sender_close(sender &s); - void on_transaction_declared(transaction t); - void on_transaction_committed(transaction t); - void on_transaction_aborted(transaction t); - void on_transaction_declare_failed(transaction t); - void on_transaction_commit_failed(transaction t); + void on_transaction_declared(session s); + void on_transaction_committed(session s); + void on_transaction_aborted(session s); + void on_transaction_declare_failed(session s); + void on_transaction_commit_failed(session s); // overrides void on_container_start(container &c); @@ -140,8 +140,6 @@ class TxSenderHandler : public SenderHandler, transaction_handler { int processed = 0; string tx_action = "commit"; string tx_endloop_action = "commit"; - transaction tx; - session sess; }; } /* namespace reactor */ From 72df011109d316ceb667aa8339d9935c0719b3be Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Tue, 18 Mar 2025 20:05:40 +0100 Subject: [PATCH 40/53] refactoring --- .../reactor/handler/TxReceiverHandler.cpp | 8 ++--- .../reactor/handler/TxSenderHandler.cpp | 34 +++++++++---------- .../reactor/handler/TxSenderHandler.h | 2 +- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 12b71271..316c4958 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -157,8 +157,6 @@ void TxReceiverHandler::on_transaction_declared(session s) { } logger(trace) << "[on_transaction_declared] txn called " << (&s); logger(debug) << "[on_transaction_declared] txn is_empty " << (s.txn_is_empty()); - // TODO - // tx = t; } void TxReceiverHandler::on_transaction_aborted(session s) { @@ -168,7 +166,7 @@ void TxReceiverHandler::on_transaction_aborted(session s) { if (count == 0 || processed < count) { s.declare_transaction(*this); } else { - logger(info) << "[on_transaction_committed] All messages processed"; + logger(info) << "[on_transaction_aborted] All messages processed"; s.connection().close(); } } @@ -176,7 +174,7 @@ void TxReceiverHandler::on_transaction_aborted(session s) { void TxReceiverHandler::on_transaction_committed(session s) { processed += current_batch; current_batch = 0; - logger(debug) << "[on_transaction_aborted] messages committed, processed: " << processed; + logger(debug) << "[on_transaction_committed] messages committed, processed: " << processed; if (count == 0 || processed < count) { s.declare_transaction(*this); } else { @@ -370,7 +368,9 @@ void TxReceiverHandler::on_message(delivery &d, message &m) { logger(debug) << "[on_message] Processing received message"; + // TODO legit? session s = d.session(); + s.txn_accept(d); current_batch += 1; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index b3f58903..cb4e486d 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -110,18 +110,19 @@ int TxSenderHandler::getBatchSize() const return batch_size; } -// void TxSenderHandler::checkIfCanSend() { -// if (processed < count) { -// work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); -// -// if (sndr.credit() > 0) { -// logger(debug) << "[checkIfCanSend] Preparing to send message"; -// send(); -// } else { -// ready = true; -// } -// } -// } +void TxSenderHandler::checkIfCanSend() { + if (processed < count) { + work_q->schedule(interval, make_work(&TxSenderHandler::checkIfCanSend, this)); + + if (sndr.credit() > 0) { + logger(debug) << "[checkIfCanSend] Preparing to send message"; + // TODO test w/ session defined + send(); + } else { + ready = true; + } + } +} void TxSenderHandler::send(session s) { @@ -156,9 +157,7 @@ void TxSenderHandler::send(session s) logger(trace) << "[send] Current batch: " << current_batch; while (s.txn_is_declared() && sndr.credit() && (processed + current_batch) < count) { - logger(trace) << "[send] Sending messages through the link NAZDAR"; s.txn_send(sndr, message_to_send); - logger(trace) << "[send] Sending messages through the link BAZAR"; current_batch += 1; if (log_msgs == "dict") { @@ -223,6 +222,7 @@ void TxSenderHandler::send(session s) void TxSenderHandler::on_sendable(sender &s) { + // TODO logger(trace) << "[on_sendable] IS THIS METHOD EVER CALLED IN TX MODE???"; logger(trace) << "[on_sendable] transaction: " << &s; if (ready) { @@ -245,7 +245,6 @@ void TxSenderHandler::on_transaction_declared(session s) { logger(trace) << "[on_transaction_declared] txn called " << (&s); logger(trace) << "[on_transaction_declared] txn is_empty " << (s.txn_is_empty()) << "\t" << s.txn_is_empty(); - // tx = t; send(s); } @@ -368,10 +367,11 @@ void TxSenderHandler::on_container_start(container &c) logger(trace) << "[on_container_start] Interval for duration: " << interval.milliseconds() << " ms"; } + // TODO // #if defined(__REACTOR_HAS_TIMER) // work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::timerEvent, this)); -// +// // if (duration_time > 0 && duration_mode == "after-send") { // work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); // } else if (duration_time > 0 && duration_mode == "before-send") { @@ -380,8 +380,6 @@ void TxSenderHandler::on_container_start(container &c) // work_q->schedule(duration::IMMEDIATE, make_work(&TxSenderHandler::checkIfCanSend, this)); // } // #endif - -// tx = transaction(); } void TxSenderHandler::on_transaction_declare_failed(session) {} diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index 3fcbbfb6..d4997fb5 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -115,7 +115,7 @@ class TxSenderHandler : public SenderHandler, transaction_handler { // overrides void checkIfCanSend(); - void send(session sess); + void send(session s); // reactor methods void on_sender_close(sender &s); From c9ee456c39914b4a9dd08fd8f3ae7d4b2a8283c5 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Tue, 18 Mar 2025 20:09:11 +0100 Subject: [PATCH 41/53] refactoring fixup --- src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index cb4e486d..db676b17 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -117,7 +117,7 @@ void TxSenderHandler::checkIfCanSend() { if (sndr.credit() > 0) { logger(debug) << "[checkIfCanSend] Preparing to send message"; // TODO test w/ session defined - send(); + // send(); } else { ready = true; } From ad85241cb293af924c6e0426509ecc50d6017c94 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Tue, 18 Mar 2025 20:13:04 +0100 Subject: [PATCH 42/53] todo closed --- src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index db676b17..be5c475d 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -222,8 +222,6 @@ void TxSenderHandler::send(session s) void TxSenderHandler::on_sendable(sender &s) { - // TODO - logger(trace) << "[on_sendable] IS THIS METHOD EVER CALLED IN TX MODE???"; logger(trace) << "[on_sendable] transaction: " << &s; if (ready) { send(s.session()); From 5cfb44f384a93494cae883943d8f54c9e7ad629f Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Wed, 20 Aug 2025 14:15:17 +0200 Subject: [PATCH 43/53] incorporate recent development changes --- .../reactor/handler/TxReceiverHandler.cpp | 12 ++++++------ .../reactor/handler/TxReceiverHandler.h | 3 +-- .../reactor/handler/TxSenderHandler.cpp | 18 +++++++++--------- .../reactor/handler/TxSenderHandler.h | 3 +-- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 316c4958..8c152291 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -156,7 +156,7 @@ void TxReceiverHandler::on_transaction_declared(session s) { batch_size = count; } logger(trace) << "[on_transaction_declared] txn called " << (&s); - logger(debug) << "[on_transaction_declared] txn is_empty " << (s.txn_is_empty()); + logger(debug) << "[on_transaction_declared] txn is_empty " << (s.transaction_is_empty()); } void TxReceiverHandler::on_transaction_aborted(session s) { @@ -371,7 +371,7 @@ void TxReceiverHandler::on_message(delivery &d, message &m) // TODO legit? session s = d.session(); - s.txn_accept(d); + s.transaction_accept(d); current_batch += 1; logger(debug) << "[on_message] current batch: " << current_batch; @@ -440,9 +440,9 @@ void TxReceiverHandler::on_message(delivery &d, message &m) if(current_batch == batch_size) { logger(debug) << "[send] Transaction attempt: " << tx_action; if (tx_action == "commit") { - s.txn_commit(); + s.transaction_commit(); } else if (tx_action == "rollback") { - s.txn_abort(); + s.transaction_abort(); } if (tx_action == "none") { @@ -462,9 +462,9 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } else if (count != 0 && processed + current_batch == count) { logger(debug) << "[send] Transaction attempt (endloop): " << tx_endloop_action; if (tx_endloop_action == "commit") { - s.txn_commit(); + s.transaction_commit(); } else if (tx_endloop_action == "rollback") { - s.txn_abort(); + s.transaction_abort(); } else { recv.connection().close(); } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index ac642e14..c89554e7 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -14,11 +14,10 @@ #ifndef TXRECEIVERHANDLER_H #define TXRECEIVERHANDLER_H -#include +#include #include "ReceiverHandler.h" -using proton::transaction; using proton::session; using proton::transaction_handler; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index be5c475d..4d377d5a 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -152,12 +152,12 @@ void TxSenderHandler::send(session s) } - logger(trace) << "[send] Transaction is empty: " << s.txn_is_empty(); + logger(trace) << "[send] Transaction is empty: " << s.transaction_is_empty(); logger(debug) << "[send] Messages processed: " << processed; logger(trace) << "[send] Current batch: " << current_batch; - while (s.txn_is_declared() && sndr.credit() && (processed + current_batch) < count) + while (s.transaction_is_declared() && sndr.credit() && (processed + current_batch) < count) { - s.txn_send(sndr, message_to_send); + sndr.send(message_to_send); current_batch += 1; if (log_msgs == "dict") { @@ -187,9 +187,9 @@ void TxSenderHandler::send(session s) if(current_batch == batch_size) { logger(debug) << "[send] Transaction attempt: " << tx_action; if (tx_action == "commit") { - s.txn_commit(); + s.transaction_commit(); } else if (tx_action == "rollback") { - s.txn_abort(); + s.transaction_abort(); } if (tx_action == "none") { @@ -204,9 +204,9 @@ void TxSenderHandler::send(session s) } else if (processed + current_batch == count) { logger(debug) << "[send] Transaction attempt (endloop): " << tx_endloop_action; if (tx_endloop_action == "commit") { - s.txn_commit(); + s.transaction_commit(); } else if (tx_endloop_action == "rollback") { - s.txn_abort(); + s.transaction_abort(); } sndr.connection().close(); } @@ -241,8 +241,8 @@ void TxSenderHandler::on_connection_close(connection &c) void TxSenderHandler::on_transaction_declared(session s) { logger(trace) << "[on_transaction_declared] txn called " << (&s); - logger(trace) << "[on_transaction_declared] txn is_empty " << (s.txn_is_empty()) - << "\t" << s.txn_is_empty(); + logger(trace) << "[on_transaction_declared] txn is_empty " << (s.transaction_is_empty()) + << "\t" << s.transaction_is_empty(); send(s); } diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index d4997fb5..678ad5cd 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -14,11 +14,10 @@ #ifndef TXSENDERHANDLER_H #define TXSENDERHANDLER_H -#include +#include #include "SenderHandler.h" -using proton::transaction; using proton::session; using proton::transaction_handler; From 2822d881ab0c272d150108355376d8fec08c9631 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 11 Jul 2024 12:28:18 +0200 Subject: [PATCH 44/53] advance C++ compile standard to c++17 --- BUILD.md | 2 +- CMakeLists.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/BUILD.md b/BUILD.md index 92669025..1277bb22 100644 --- a/BUILD.md +++ b/BUILD.md @@ -23,7 +23,7 @@ This project can be built either with CMake, or with CMake executed by Bazel. -DProton_DIR=... -DProtonCpp_DIR=... -DENABLE_QPID_PROTON=ON - -DCMAKE_USER_C_FLAGS='-std=c++11' + -DCMAKE_USER_C_FLAGS='-std=c++17' ### Bazel command line diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b2f881b..8f683765 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.20.0) project(cli-cpp) enable_language(CXX) -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) @@ -97,7 +97,7 @@ if(NOT CMAKE_BUILD_TYPE) endif(NOT CMAKE_BUILD_TYPE) if (CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") set(CMAKE_C_FLAGS "-Wall -Wshadow -fdiagnostics-color=auto" CACHE STRING "Flags used by the compiler during all build types." FORCE From 69e99e7ccf2d4c990cedcf316b16af561ae8eb8d Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Tue, 16 Sep 2025 14:36:20 +0200 Subject: [PATCH 45/53] incorporate recent development changes (af4814e1) --- .../reactor/handler/TxReceiverHandler.cpp | 13 ++++++------- .../qpid-proton/reactor/handler/TxSenderHandler.cpp | 13 +++++-------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 8c152291..d6171b04 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -134,7 +134,7 @@ int TxReceiverHandler::getBatchSize() const void TxReceiverHandler::on_session_open(session &s) { logger(trace) << "[on_session_open] declare_txn started..."; - s.declare_transaction(*this); + s.transaction_declare(*this); logger(trace) << "[on_session_open] declare_txn ended..."; logger(debug) << "[on_session_open] transaction batch size: " << batch_size; } @@ -155,8 +155,7 @@ void TxReceiverHandler::on_transaction_declared(session s) { } else if (count != 0) { batch_size = count; } - logger(trace) << "[on_transaction_declared] txn called " << (&s); - logger(debug) << "[on_transaction_declared] txn is_empty " << (s.transaction_is_empty()); + logger(trace) << "[on_transaction_declared] txn called " << s.transaction_id(); } void TxReceiverHandler::on_transaction_aborted(session s) { @@ -164,7 +163,7 @@ void TxReceiverHandler::on_transaction_aborted(session s) { current_batch = 0; logger(debug) << "[on_transaction_aborted] messages aborted, processed: " << processed; if (count == 0 || processed < count) { - s.declare_transaction(*this); + s.transaction_declare(*this); } else { logger(info) << "[on_transaction_aborted] All messages processed"; s.connection().close(); @@ -176,7 +175,7 @@ void TxReceiverHandler::on_transaction_committed(session s) { current_batch = 0; logger(debug) << "[on_transaction_committed] messages committed, processed: " << processed; if (count == 0 || processed < count) { - s.declare_transaction(*this); + s.transaction_declare(*this); } else { logger(info) << "[on_transaction_committed] All messages processed"; s.connection().close(); @@ -371,7 +370,7 @@ void TxReceiverHandler::on_message(delivery &d, message &m) // TODO legit? session s = d.session(); - s.transaction_accept(d); + d.accept(); current_batch += 1; logger(debug) << "[on_message] current batch: " << current_batch; @@ -451,7 +450,7 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } else { processed += current_batch; current_batch = 0; - s.declare_transaction(*this); + s.transaction_declare(*this); } } diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 4d377d5a..54e09c28 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -152,7 +152,6 @@ void TxSenderHandler::send(session s) } - logger(trace) << "[send] Transaction is empty: " << s.transaction_is_empty(); logger(debug) << "[send] Messages processed: " << processed; logger(trace) << "[send] Current batch: " << current_batch; while (s.transaction_is_declared() && sndr.credit() && (processed + current_batch) < count) @@ -198,7 +197,7 @@ void TxSenderHandler::send(session s) } else { processed += current_batch; current_batch = 0; - s.declare_transaction(*this); + s.transaction_declare(*this); } } } else if (processed + current_batch == count) { @@ -240,9 +239,7 @@ void TxSenderHandler::on_connection_close(connection &c) } void TxSenderHandler::on_transaction_declared(session s) { - logger(trace) << "[on_transaction_declared] txn called " << (&s); - logger(trace) << "[on_transaction_declared] txn is_empty " << (s.transaction_is_empty()) - << "\t" << s.transaction_is_empty(); + logger(trace) << "[on_transaction_declared] txn called " << s.transaction_id(); send(s); } @@ -256,7 +253,7 @@ void TxSenderHandler::on_transaction_committed(session s) { } else { logger(trace) << "[on_transaction_committed] Declaring new transaction"; current_batch = 0; - s.declare_transaction(*this); + s.transaction_declare(*this); } } @@ -270,7 +267,7 @@ void TxSenderHandler::on_transaction_aborted(session s) { } else { logger(trace) << "[on_transaction_aborted] Declaring new transaction"; current_batch = 0; - s.declare_transaction(*this); + s.transaction_declare(*this); } } @@ -280,7 +277,7 @@ void TxSenderHandler::on_sender_close(sender &s) { void TxSenderHandler::on_session_open(session &s) { logger(trace) << "[on_session_open] declare_txn started..."; - s.declare_transaction(*this); + s.transaction_declare(*this); logger(trace) << "[on_session_open] declare_txn ended..."; } From 4d791f03171eb5916bda07bf7d834db41c19ff64 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 23 Oct 2025 14:27:38 +0200 Subject: [PATCH 46/53] get rid of client dep on transaction_handler, handled in session now --- src/api/qpid-proton/reactor/handler/TxReceiverHandler.h | 5 +---- src/api/qpid-proton/reactor/handler/TxSenderHandler.h | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index c89554e7..bf073c73 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -14,12 +14,9 @@ #ifndef TXRECEIVERHANDLER_H #define TXRECEIVERHANDLER_H -#include - #include "ReceiverHandler.h" using proton::session; -using proton::transaction_handler; #ifdef PN_CPP_HAS_STD_FUNCTION #undef PN_CPP_HAS_STD_FUNCTION @@ -32,7 +29,7 @@ namespace reactor { /** * A proton transaction message handler that handles message receive events */ -class TxReceiverHandler : public ReceiverHandler, transaction_handler { +class TxReceiverHandler : public ReceiverHandler { public: /** * Constructor diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index 678ad5cd..2ab6d9df 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -14,12 +14,9 @@ #ifndef TXSENDERHANDLER_H #define TXSENDERHANDLER_H -#include - #include "SenderHandler.h" using proton::session; -using proton::transaction_handler; namespace dtests { namespace proton { @@ -30,7 +27,7 @@ using dtests::common::Timer; /** * A proton transaction message handler that handles message send events */ -class TxSenderHandler : public SenderHandler, transaction_handler { +class TxSenderHandler : public SenderHandler { public: /** * Constructor From 368c848e209dec496602a749daadaf85209ff082 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 30 Oct 2025 18:43:30 +0100 Subject: [PATCH 47/53] incorporate recent development changes (3dcb6a78) --- .../reactor/handler/ConnectorHandler.cpp | 2 +- .../reactor/handler/TxReceiverHandler.cpp | 56 +++++++++---------- .../reactor/handler/TxReceiverHandler.h | 7 +-- .../reactor/handler/TxSenderHandler.cpp | 51 ++++++++--------- .../reactor/handler/TxSenderHandler.h | 11 ++-- 5 files changed, 55 insertions(+), 72 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/ConnectorHandler.cpp b/src/api/qpid-proton/reactor/handler/ConnectorHandler.cpp index 6b00957a..c39f7460 100644 --- a/src/api/qpid-proton/reactor/handler/ConnectorHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/ConnectorHandler.cpp @@ -205,7 +205,7 @@ void ConnectorHandler::on_transport_close(transport &t) { void ConnectorHandler::on_session_error(session &s) { logger(error) << "The remote peer at " << broker_url.getHost() << ":" << broker_url.getPort() << - " closed the session with an error condition"; + " closed the session with an error condition: " + s.error().what(); closeObjects(); } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index d6171b04..0e38ea24 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -133,51 +133,47 @@ int TxReceiverHandler::getBatchSize() const // reactor methods void TxReceiverHandler::on_session_open(session &s) { - logger(trace) << "[on_session_open] declare_txn started..."; - s.transaction_declare(*this); - logger(trace) << "[on_session_open] declare_txn ended..."; - logger(debug) << "[on_session_open] transaction batch size: " << batch_size; + if(!s.transaction_is_declared()) { + logger(trace) << "[on_session_open] New session is open"; + s.transaction_declare(*this); + } else { + logger(trace) << "[on_session_open] Transaction is declared: " << s.transaction_id(); + recv.add_credit(batch_size); + logger(debug) << "[on_session_open] Receiver credit: " << recv.credit(); + if (count != 0 && processed + batch_size > count) { + batch_size = count % batch_size; + } + } } -void TxReceiverHandler::on_transaction_declare_failed(session) {} - -void TxReceiverHandler::on_transaction_commit_failed(session s) { - logger(debug) << "[on_transaction_commit_failed] Transaction Commit Failed"; +void TxReceiverHandler::on_session_transaction_commit_failed(session &s) { + logger(debug) << "[on_session_transaction_commit_failed] Transaction Commit Failed"; s.connection().close(); exit(-1); } -void TxReceiverHandler::on_transaction_declared(session s) { - // TODO python some weird magic around count 0, doesn't make much sense to me yet - // when fixes take care about all count checks ofr zero - if (count != 0 && processed + batch_size > count) { - batch_size = count % batch_size; - } else if (count != 0) { - batch_size = count; - } - logger(trace) << "[on_transaction_declared] txn called " << s.transaction_id(); -} - -void TxReceiverHandler::on_transaction_aborted(session s) { +void TxReceiverHandler::on_session_transaction_aborted(session &s) { processed += current_batch; current_batch = 0; - logger(debug) << "[on_transaction_aborted] messages aborted, processed: " << processed; + logger(debug) << "[on_session_transaction_aborted] messages aborted, processed: " << processed; if (count == 0 || processed < count) { + logger(info) << "[on_session_transaction_aborted] re-declaring transaction"; s.transaction_declare(*this); } else { - logger(info) << "[on_transaction_aborted] All messages processed"; + logger(info) << "[on_session_transaction_aborted] All messages processed"; s.connection().close(); } } -void TxReceiverHandler::on_transaction_committed(session s) { +void TxReceiverHandler::on_session_transaction_committed(session &s) { processed += current_batch; current_batch = 0; - logger(debug) << "[on_transaction_committed] messages committed, processed: " << processed; + logger(debug) << "[on_session_transaction_committed] messages committed, processed: " << processed; if (count == 0 || processed < count) { + logger(info) << "[on_session_transaction_committed] re-declaring transaction"; s.transaction_declare(*this); } else { - logger(info) << "[on_transaction_committed] All messages processed"; + logger(info) << "[on_session_transaction_committed] All messages processed"; s.connection().close(); } } @@ -367,14 +363,10 @@ void TxReceiverHandler::on_message(delivery &d, message &m) { logger(debug) << "[on_message] Processing received message"; - // TODO legit? session s = d.session(); - d.accept(); current_batch += 1; - logger(debug) << "[on_message] current batch: " << current_batch; - if (log_msgs == "dict") { logger(trace) << "[on_message] Decoding message"; ReactorDecoder decoder = ReactorDecoder(m); @@ -436,8 +428,10 @@ void TxReceiverHandler::on_message(delivery &d, message &m) #endif } + logger(debug) << "[on_message] Receiver credit: " << recv.credit(); + logger(debug) << "[on_message] Current batch: " << current_batch; if(current_batch == batch_size) { - logger(debug) << "[send] Transaction attempt: " << tx_action; + logger(debug) << "[on_message] Transaction attempt: " << tx_action; if (tx_action == "commit") { s.transaction_commit(); } else if (tx_action == "rollback") { @@ -459,7 +453,7 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } } else if (count != 0 && processed + current_batch == count) { - logger(debug) << "[send] Transaction attempt (endloop): " << tx_endloop_action; + logger(debug) << "[on_message] Transaction attempt (endloop): " << tx_endloop_action; if (tx_endloop_action == "commit") { s.transaction_commit(); } else if (tx_endloop_action == "rollback") { diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index bf073c73..3a21e831 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -142,10 +142,9 @@ class TxReceiverHandler : public ReceiverHandler { // reactor method void on_session_open(session &s); void on_transaction_declare_failed(session); - void on_transaction_commit_failed(session s); - void on_transaction_declared(session s); - void on_transaction_committed(session s); - void on_transaction_aborted(session s); + void on_session_transaction_commit_failed(session &s); + void on_session_transaction_committed(session &s); + void on_session_transaction_aborted(session &s); // overrides void on_container_start(container &c); diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 54e09c28..5dc60d01 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -124,8 +124,9 @@ void TxSenderHandler::checkIfCanSend() { } } -void TxSenderHandler::send(session s) +void TxSenderHandler::send() { + session s = sndr.session(); logger(debug) << "[send] Preparing to send message"; int credit = sndr.credit(); @@ -223,49 +224,39 @@ void TxSenderHandler::on_sendable(sender &s) { logger(trace) << "[on_sendable] transaction: " << &s; if (ready) { - send(s.session()); + send(); } } -void TxSenderHandler::on_tracker_accept(tracker &t) -{ - logger(trace) << "[on_tracker_accept] Message accepted, confirmed message delivery: " << processed; -} - void TxSenderHandler::on_connection_close(connection &c) { current_batch = 0; logger(debug) << "[on_connection_close] Closing connection"; } -void TxSenderHandler::on_transaction_declared(session s) { - logger(trace) << "[on_transaction_declared] txn called " << s.transaction_id(); - send(s); -} - -void TxSenderHandler::on_transaction_committed(session s) { - logger(trace) << "[on_transaction_committed] Messages committed"; +void TxSenderHandler::on_session_transaction_committed(session &s) { + logger(trace) << "[on_session_transaction_committed] Messages committed"; processed += current_batch; - logger(debug) << "[on_transaction_committed] Messages processed" << processed; + logger(debug) << "[on_session_transaction_committed] Messages processed: " << processed; if (processed == count) { - logger(trace) << "[on_transaction_committed] All messages processed"; + logger(trace) << "[on_session_transaction_committed] All messages processed"; s.connection().close(); } else { - logger(trace) << "[on_transaction_committed] Declaring new transaction"; + logger(trace) << "[on_session_transaction_committed] Declaring new transaction"; current_batch = 0; s.transaction_declare(*this); } } -void TxSenderHandler::on_transaction_aborted(session s) { - logger(trace) << "[on_transaction_aborted] Messages aborted"; +void TxSenderHandler::on_session_transaction_aborted(session &s) { + logger(trace) << "[on_session_transaction_aborted] Messages aborted"; processed += current_batch; - logger(debug) << "[on_transaction_aborted] Messages processed" << processed; + logger(debug) << "[on_session_transaction_aborted] Messages processed: " << processed; if (processed == count) { - logger(trace) << "[on_transaction_aborted] All messages processed"; + logger(trace) << "[on_session_transaction_aborted] All messages processed"; s.connection().close(); } else { - logger(trace) << "[on_transaction_aborted] Declaring new transaction"; + logger(trace) << "[on_session_transaction_aborted] Declaring new transaction"; current_batch = 0; s.transaction_declare(*this); } @@ -276,9 +267,13 @@ void TxSenderHandler::on_sender_close(sender &s) { } void TxSenderHandler::on_session_open(session &s) { - logger(trace) << "[on_session_open] declare_txn started..."; - s.transaction_declare(*this); - logger(trace) << "[on_session_open] declare_txn ended..."; + if(!s.transaction_is_declared()) { + logger(trace) << "[on_session_open] New session is open"; + s.transaction_declare(*this); + } else { + logger(trace) << "[on_session_open] Transaction is declared: " << s.transaction_id(); + send(); + } } void TxSenderHandler::on_container_start(container &c) @@ -377,10 +372,8 @@ void TxSenderHandler::on_container_start(container &c) // #endif } -void TxSenderHandler::on_transaction_declare_failed(session) {} - -void TxSenderHandler::on_transaction_commit_failed(session s) { - logger(error) << "[on_transaction_commit_failed] Transaction Commit Failed"; +void TxSenderHandler::on_session_transaction_commit_failed(session &s) { + logger(error) << "[on_session_transaction_commit_failed] Transaction Commit Failed"; s.connection().close(); exit(1); } diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index 2ab6d9df..146ba684 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -111,21 +111,18 @@ class TxSenderHandler : public SenderHandler { // overrides void checkIfCanSend(); - void send(session s); + void send(); // reactor methods void on_sender_close(sender &s); - void on_transaction_declared(session s); - void on_transaction_committed(session s); - void on_transaction_aborted(session s); - void on_transaction_declare_failed(session s); - void on_transaction_commit_failed(session s); + void on_session_transaction_commit_failed(session &s); + void on_session_transaction_committed(session &s); + void on_session_transaction_aborted(session &s); // overrides void on_container_start(container &c); void on_session_open(session &s); void on_sendable(sender &s); - void on_tracker_accept(tracker &t); void on_connection_close(connection &c); private: From 4dbb9004895db7a5e9e52857a8f7d2e1ad1f0e02 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Wed, 5 Nov 2025 22:29:25 +0100 Subject: [PATCH 48/53] credit handling fix --- src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 0e38ea24..b8195f41 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -138,11 +138,13 @@ void TxReceiverHandler::on_session_open(session &s) { s.transaction_declare(*this); } else { logger(trace) << "[on_session_open] Transaction is declared: " << s.transaction_id(); + if (count != 0 && (processed + batch_size > count)) { + batch_size = count % batch_size; + } else if (count == 0) { + batch_size = 1; + } recv.add_credit(batch_size); logger(debug) << "[on_session_open] Receiver credit: " << recv.credit(); - if (count != 0 && processed + batch_size > count) { - batch_size = count % batch_size; - } } } From ff40e0446e2afc0acae9261a20bd25be034cb4f9 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 6 Nov 2025 14:18:52 +0100 Subject: [PATCH 49/53] passing tx-size fix, default batch size set to 10 --- src/api/qpid-proton/reactor/TxReceivingClient.cpp | 10 +++++----- .../qpid-proton/reactor/handler/TxReceiverHandler.cpp | 7 +++++-- .../qpid-proton/reactor/handler/TxReceiverHandler.h | 2 +- src/api/qpid-proton/reactor/handler/TxSenderHandler.h | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/api/qpid-proton/reactor/TxReceivingClient.cpp b/src/api/qpid-proton/reactor/TxReceivingClient.cpp index 647bb832..90d4746a 100644 --- a/src/api/qpid-proton/reactor/TxReceivingClient.cpp +++ b/src/api/qpid-proton/reactor/TxReceivingClient.cpp @@ -315,7 +315,7 @@ int TxReceivingClient::run(int argc, char **argv) const std::transform(recv_listen.begin(), recv_listen.end(), recv_listen.begin(), ::tolower); } - int recv_credit_window = -1; + int recv_credit_window = 0; if(options.is_set("recv-credit-window")) { recv_credit_window = atoi(options["recv-credit-window"].c_str()); } @@ -386,16 +386,16 @@ int TxReceivingClient::run(int argc, char **argv) const recv_listen, recv_listen_port, recv_credit_window, - recv_drain_after_credit_window + recv_drain_after_credit_window, + tx_action, + tx_endloop_action ); if (selector != "") { handler.setSelector(selector); } - // TODO python defaults to 10 - // int tx_size = 10; - int tx_size = 0; + int tx_size = 10; if (options.is_set("tx-size")) { tx_size = static_cast (options.get("tx-size")); } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index b8195f41..0a85f370 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -438,6 +438,9 @@ void TxReceiverHandler::on_message(delivery &d, message &m) s.transaction_commit(); } else if (tx_action == "rollback") { s.transaction_abort(); + if (count == 0) { + recv.connection().close(); + } } if (tx_action == "none") { @@ -453,7 +456,6 @@ void TxReceiverHandler::on_message(delivery &d, message &m) if (duration_time > 0 && duration_mode == "after-receive-action-tx-action") { // TODO: not implemented yet } - } else if (count != 0 && processed + current_batch == count) { logger(debug) << "[on_message] Transaction attempt (endloop): " << tx_endloop_action; if (tx_endloop_action == "commit") { @@ -461,9 +463,10 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } else if (tx_endloop_action == "rollback") { s.transaction_abort(); } else { - recv.connection().close(); + recv.connection().close(); } } + } void TxReceiverHandler::on_transport_close(transport &t) { diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 3a21e831..6c4c3117 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -154,7 +154,7 @@ class TxReceiverHandler : public ReceiverHandler { private: typedef ReceiverHandler super; - int batch_size = 0; + int batch_size = 10; int current_batch = 0; int processed = 0; string tx_action = "commit"; diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index 146ba684..d0038b1a 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -128,7 +128,7 @@ class TxSenderHandler : public SenderHandler { private: typedef SenderHandler super; - int batch_size = 0; + int batch_size = 10; int current_batch = 0; int processed = 0; string tx_action = "commit"; From f97224dd495dbb13d7c7252e8a7769c3f0d82c90 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 6 Nov 2025 22:57:26 +0100 Subject: [PATCH 50/53] default endloop tx action is none --- src/api/qpid-proton/reactor/handler/TxReceiverHandler.h | 2 +- src/api/qpid-proton/reactor/handler/TxSenderHandler.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 6c4c3117..94132991 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -158,7 +158,7 @@ class TxReceiverHandler : public ReceiverHandler { int current_batch = 0; int processed = 0; string tx_action = "commit"; - string tx_endloop_action = "commit"; + string tx_endloop_action = "none"; }; } /* namespace reactor */ diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index d0038b1a..5c2ae2d7 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -132,7 +132,7 @@ class TxSenderHandler : public SenderHandler { int current_batch = 0; int processed = 0; string tx_action = "commit"; - string tx_endloop_action = "commit"; + string tx_endloop_action = "none"; }; } /* namespace reactor */ From 59858bb60502e549a478c535c7820dc08d18b357 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 13 Nov 2025 16:47:03 +0100 Subject: [PATCH 51/53] credit handling fix#2 --- src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp | 6 ++++-- src/api/qpid-proton/reactor/handler/TxReceiverHandler.h | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 0a85f370..7ed9eead 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -138,12 +138,14 @@ void TxReceiverHandler::on_session_open(session &s) { s.transaction_declare(*this); } else { logger(trace) << "[on_session_open] Transaction is declared: " << s.transaction_id(); + credit = batch_size; if (count != 0 && (processed + batch_size > count)) { - batch_size = count % batch_size; + credit = count % batch_size; } else if (count == 0) { batch_size = 1; + credit = batch_size; } - recv.add_credit(batch_size); + recv.add_credit(credit); logger(debug) << "[on_session_open] Receiver credit: " << recv.credit(); } } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 94132991..67ea8136 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -157,6 +157,7 @@ class TxReceiverHandler : public ReceiverHandler { int batch_size = 10; int current_batch = 0; int processed = 0; + int credit = 0; string tx_action = "commit"; string tx_endloop_action = "none"; }; From 36b0b074940c3726f21cf7840ab2d341ed6e87d1 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 28 Nov 2025 14:39:33 +0100 Subject: [PATCH 52/53] incorporate recent development changes (d21f064a) --- .../reactor/handler/TxReceiverHandler.cpp | 42 +++++++++++-------- .../reactor/handler/TxReceiverHandler.h | 5 ++- .../reactor/handler/TxSenderHandler.cpp | 24 +++++------ .../reactor/handler/TxSenderHandler.h | 3 +- 4 files changed, 41 insertions(+), 33 deletions(-) diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp index 7ed9eead..cd0064ad 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.cpp @@ -133,36 +133,42 @@ int TxReceiverHandler::getBatchSize() const // reactor methods void TxReceiverHandler::on_session_open(session &s) { - if(!s.transaction_is_declared()) { - logger(trace) << "[on_session_open] New session is open"; - s.transaction_declare(*this); - } else { - logger(trace) << "[on_session_open] Transaction is declared: " << s.transaction_id(); + logger(trace) << "[on_session_open] New session is open"; + s.transaction_declare(); +} + +void TxReceiverHandler::on_session_transaction_declared(session &s) { + logger(trace) << "[on_session_open] Transaction is declared: " << s.transaction_id(); + credit = batch_size; + if (count != 0 && (processed + batch_size > count)) { + credit = count % batch_size; + } else if (count == 0) { + batch_size = 1; credit = batch_size; - if (count != 0 && (processed + batch_size > count)) { - credit = count % batch_size; - } else if (count == 0) { - batch_size = 1; - credit = batch_size; - } - recv.add_credit(credit); - logger(debug) << "[on_session_open] Receiver credit: " << recv.credit(); } + recv.add_credit(credit); + logger(debug) << "[on_session_open] Receiver credit: " << recv.credit(); } -void TxReceiverHandler::on_session_transaction_commit_failed(session &s) { - logger(debug) << "[on_session_transaction_commit_failed] Transaction Commit Failed"; +void TxReceiverHandler::on_session_error(session &s) { + logger(debug) << "[on_session_error] Session error: " << s.error().what(); s.connection().close(); exit(-1); } +void TxReceiverHandler::on_session_transaction_error(session &s) { + logger(error) << "[on_session_transaction_commit_failed] Transaction Error: " << s.error().what(); + s.connection().close(); + exit(1); +} + void TxReceiverHandler::on_session_transaction_aborted(session &s) { processed += current_batch; current_batch = 0; logger(debug) << "[on_session_transaction_aborted] messages aborted, processed: " << processed; if (count == 0 || processed < count) { logger(info) << "[on_session_transaction_aborted] re-declaring transaction"; - s.transaction_declare(*this); + s.transaction_declare(); } else { logger(info) << "[on_session_transaction_aborted] All messages processed"; s.connection().close(); @@ -175,7 +181,7 @@ void TxReceiverHandler::on_session_transaction_committed(session &s) { logger(debug) << "[on_session_transaction_committed] messages committed, processed: " << processed; if (count == 0 || processed < count) { logger(info) << "[on_session_transaction_committed] re-declaring transaction"; - s.transaction_declare(*this); + s.transaction_declare(); } else { logger(info) << "[on_session_transaction_committed] All messages processed"; s.connection().close(); @@ -451,7 +457,7 @@ void TxReceiverHandler::on_message(delivery &d, message &m) } else { processed += current_batch; current_batch = 0; - s.transaction_declare(*this); + s.transaction_declare(); } } diff --git a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h index 67ea8136..68ede5d8 100644 --- a/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxReceiverHandler.h @@ -141,8 +141,9 @@ class TxReceiverHandler : public ReceiverHandler { // reactor method void on_session_open(session &s); - void on_transaction_declare_failed(session); - void on_session_transaction_commit_failed(session &s); + void on_session_transaction_declared(session &s); + void on_session_error(session &s); + void on_session_transaction_error(session &s); void on_session_transaction_committed(session &s); void on_session_transaction_aborted(session &s); diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp index 5dc60d01..0c3f0b52 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.cpp @@ -198,7 +198,7 @@ void TxSenderHandler::send() } else { processed += current_batch; current_batch = 0; - s.transaction_declare(*this); + s.transaction_declare(); } } } else if (processed + current_batch == count) { @@ -244,7 +244,7 @@ void TxSenderHandler::on_session_transaction_committed(session &s) { } else { logger(trace) << "[on_session_transaction_committed] Declaring new transaction"; current_batch = 0; - s.transaction_declare(*this); + s.transaction_declare(); } } @@ -258,7 +258,7 @@ void TxSenderHandler::on_session_transaction_aborted(session &s) { } else { logger(trace) << "[on_session_transaction_aborted] Declaring new transaction"; current_batch = 0; - s.transaction_declare(*this); + s.transaction_declare(); } } @@ -267,13 +267,13 @@ void TxSenderHandler::on_sender_close(sender &s) { } void TxSenderHandler::on_session_open(session &s) { - if(!s.transaction_is_declared()) { - logger(trace) << "[on_session_open] New session is open"; - s.transaction_declare(*this); - } else { - logger(trace) << "[on_session_open] Transaction is declared: " << s.transaction_id(); - send(); - } + logger(trace) << "[on_session_open] New session is open"; + s.transaction_declare(); +} + +void TxSenderHandler::on_session_transaction_declared(session& s) { + logger(trace) << "[on_session_transaction_declared] Transaction is declared: " << s.transaction_id(); + send(); } void TxSenderHandler::on_container_start(container &c) @@ -372,8 +372,8 @@ void TxSenderHandler::on_container_start(container &c) // #endif } -void TxSenderHandler::on_session_transaction_commit_failed(session &s) { - logger(error) << "[on_session_transaction_commit_failed] Transaction Commit Failed"; +void TxSenderHandler::on_session_transaction_error(session &s) { + logger(error) << "[on_session_transaction_commit_failed] Transaction Error: " << s.error().what(); s.connection().close(); exit(1); } diff --git a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h index 5c2ae2d7..595bfc18 100644 --- a/src/api/qpid-proton/reactor/handler/TxSenderHandler.h +++ b/src/api/qpid-proton/reactor/handler/TxSenderHandler.h @@ -115,9 +115,10 @@ class TxSenderHandler : public SenderHandler { // reactor methods void on_sender_close(sender &s); - void on_session_transaction_commit_failed(session &s); + void on_session_transaction_error(session &s); void on_session_transaction_committed(session &s); void on_session_transaction_aborted(session &s); + void on_session_transaction_declared(session &s); // overrides void on_container_start(container &c); From 0a87ebeab54bff477ea1ff1732e452216caed850 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Fri, 28 Nov 2025 17:50:23 +0100 Subject: [PATCH 53/53] fix cmake warnings --- src/api/qpid-proton/CMakeLists.txt | 10 +++++----- src/common/CMakeLists.txt | 2 +- src/common/logger/test/CMakeLists.txt | 4 ++-- src/common/options/test/CMakeLists.txt | 2 +- src/common/output/test/CMakeLists.txt | 2 +- src/common/test/CMakeLists.txt | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/api/qpid-proton/CMakeLists.txt b/src/api/qpid-proton/CMakeLists.txt index 757b762b..6350bc6b 100644 --- a/src/api/qpid-proton/CMakeLists.txt +++ b/src/api/qpid-proton/CMakeLists.txt @@ -1,6 +1,6 @@ PROJECT(dtests-proton-cpp) -set(PROTON_DIR /usr CACHE String "QPID Proton base directory") +set(PROTON_DIR /usr CACHE STRING "QPID Proton base directory") include_directories( ${PROTON_DIR}/include @@ -27,10 +27,10 @@ else () endif () -cmake_policy(SET CMP0003 OLD) +cmake_policy(SET CMP0003 NEW) add_library( dtests-proton-common - + common/ModernClient.cpp ${MODERNClient_tracing_src} ) @@ -53,7 +53,7 @@ else (WIN32) ) endif (WIN32) -cmake_policy(SET CMP0003 OLD) +cmake_policy(SET CMP0003 NEW) add_library( dtests-proton-reactor @@ -104,7 +104,7 @@ set(proton-reactor-clients ) foreach(client ${proton-reactor-clients}) - cmake_policy(SET CMP0003 OLD) + cmake_policy(SET CMP0003 NEW) add_executable(${client} clients/${client}.cpp ) diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 4d1a8b23..657b2b17 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -63,7 +63,7 @@ else (WIN32) ) endif (WIN32) -cmake_policy(SET CMP0003 OLD) +cmake_policy(SET CMP0003 NEW) add_library(dtests-cpp-common-options options/modern/StringAppendCallback.cpp diff --git a/src/common/logger/test/CMakeLists.txt b/src/common/logger/test/CMakeLists.txt index 0d94fac4..be12d21c 100644 --- a/src/common/logger/test/CMakeLists.txt +++ b/src/common/logger/test/CMakeLists.txt @@ -2,7 +2,7 @@ PROJECT(dtests-proton-cpp-tests) set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/target/tests/bin) -cmake_policy(SET CMP0003 OLD) +cmake_policy(SET CMP0003 NEW) add_executable(ut_logger_test ut_logger_test.cpp ) @@ -15,7 +15,7 @@ add_test(NAME LoggerTest COMMAND ut_logger_test) -cmake_policy(SET CMP0003 OLD) +cmake_policy(SET CMP0003 NEW) add_executable(ut_logger_test_stdout ut_logger_test_stdout.cpp ) diff --git a/src/common/options/test/CMakeLists.txt b/src/common/options/test/CMakeLists.txt index e8abbe5d..2293d528 100644 --- a/src/common/options/test/CMakeLists.txt +++ b/src/common/options/test/CMakeLists.txt @@ -2,7 +2,7 @@ PROJECT(dtests-proton-cpp-options-tests) set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/target/tests/bin) -cmake_policy(SET CMP0003 OLD) +cmake_policy(SET CMP0003 NEW) add_executable(ut_options_test ut_options_test.cpp ) diff --git a/src/common/output/test/CMakeLists.txt b/src/common/output/test/CMakeLists.txt index 804ecc7c..b535e726 100644 --- a/src/common/output/test/CMakeLists.txt +++ b/src/common/output/test/CMakeLists.txt @@ -2,7 +2,7 @@ PROJECT(dtests-proton-cpp-tests) set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/target/tests/bin) -cmake_policy(SET CMP0003 OLD) +cmake_policy(SET CMP0003 NEW) add_executable(ut_printer_test ut_printer_test.cpp ) diff --git a/src/common/test/CMakeLists.txt b/src/common/test/CMakeLists.txt index b6a3a357..130cb226 100644 --- a/src/common/test/CMakeLists.txt +++ b/src/common/test/CMakeLists.txt @@ -2,7 +2,7 @@ PROJECT(dtests-proton-cpp-tests) set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/target/tests/bin) -cmake_policy(SET CMP0003 OLD) +cmake_policy(SET CMP0003 NEW) add_executable(ut_beanutils_test ut_beanutils_test.cpp FakeBean.cpp @@ -16,7 +16,7 @@ add_test(NAME BeanUtilsTest COMMAND ut_beanutils_test) -cmake_policy(SET CMP0003 OLD) +cmake_policy(SET CMP0003 NEW) add_executable(ut_stlutils_test ut_stlutils_test.cpp )