diff --git a/include/caosdb/file_transmission/download_request_handler.h b/include/caosdb/file_transmission/download_request_handler.h index 965db6419de180f46e1a712d4a4d5795857599ab..9c82b232bed9e0b702c38eeeeb762899a3071528 100644 --- a/include/caosdb/file_transmission/download_request_handler.h +++ b/include/caosdb/file_transmission/download_request_handler.h @@ -55,10 +55,10 @@ #include "caosdb/file_transmission/file_writer.h" // for FileWriter #include "caosdb/handler_interface.h" // for HandlerTag, Handl... #include <cstdint> // for uint64_t -#include <grpcpp/impl/codegen/async_stream.h> // for ClientAsyncReader -#include <grpcpp/impl/codegen/client_context.h> // for ClientContext -#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue -#include <grpcpp/impl/codegen/status.h> // for Status +#include <grpcpp/client_context.h> // for ClientContext +#include <grpcpp/completion_queue.h> // for CompletionQueue +#include <grpcpp/support/async_stream.h> // for ClientAsyncReader +#include <grpcpp/support/status.h> // for Status #include <memory> // for unique_ptr namespace caosdb::transaction { diff --git a/include/caosdb/file_transmission/register_file_upload_handler.h b/include/caosdb/file_transmission/register_file_upload_handler.h index 37df2dbf0fb895cd77f63bab2596a0b124c48b9c..37cc6cf6ae83aa23781cc65924cefba83be22627 100644 --- a/include/caosdb/file_transmission/register_file_upload_handler.h +++ b/include/caosdb/file_transmission/register_file_upload_handler.h @@ -49,13 +49,13 @@ #ifndef CAOSDB_FILE_TRANSMISSION_REGISTER_FILE_UPLOAD_H #define CAOSDB_FILE_TRANSMISSION_REGISTER_FILE_UPLOAD_H -#include "caosdb/entity/v1/main.grpc.pb.h" // for FileTransmissionS... -#include "caosdb/entity/v1/main.pb.h" // for FileDownloadResponse -#include "caosdb/handler_interface.h" // for HandlerTag, Handl... -#include "caosdb/unary_rpc_handler.h" -#include <grpcpp/impl/codegen/async_unary_call.h> // for ClientAsyncRespons... -#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue -#include <memory> // for unique_ptr +#include "caosdb/entity/v1/main.grpc.pb.h" // for FileTransmissionS... +#include "caosdb/entity/v1/main.pb.h" // for FileDownloadResponse +#include "caosdb/handler_interface.h" // for HandlerTag, Handl... +#include "caosdb/unary_rpc_handler.h" // for UnaryRpcHandler +#include <grpcpp/completion_queue.h> // for CompletionQueue +#include <grpcpp/support/async_unary_call.h> // for ClientAsyncResponseReader +#include <memory> // for unique_ptr namespace caosdb::transaction { diff --git a/include/caosdb/file_transmission/upload_request_handler.h b/include/caosdb/file_transmission/upload_request_handler.h index 099e39e62a087111308f7afdf77631a3e42c5d09..f9d6aab9abf1800ab7e5ebece6f2f7011f86cca0 100644 --- a/include/caosdb/file_transmission/upload_request_handler.h +++ b/include/caosdb/file_transmission/upload_request_handler.h @@ -55,10 +55,10 @@ #include "caosdb/file_transmission/file_reader.h" // for FileReader #include "caosdb/handler_interface.h" // for HandlerTag, Handl... #include <cstdint> // for uint64_t -#include <grpcpp/impl/codegen/async_stream.h> // for ClientAsyncWriter -#include <grpcpp/impl/codegen/client_context.h> // for ClientContext -#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue -#include <grpcpp/impl/codegen/status.h> // for Status +#include <grpcpp/client_context.h> // for ClientContext +#include <grpcpp/completion_queue.h> // for CompletionQueue +#include <grpcpp/support/async_stream.h> // for ClientAsyncReader +#include <grpcpp/support/status.h> // for Status #include <memory> // for unique_ptr namespace caosdb::transaction { diff --git a/include/caosdb/transaction_handler.h b/include/caosdb/transaction_handler.h index 6fa386be32628d5d0ae80a90dda1e1293d1eae70..3f9fc811a2137d9b8c8d0205c15704179a1c3554 100644 --- a/include/caosdb/transaction_handler.h +++ b/include/caosdb/transaction_handler.h @@ -1,11 +1,11 @@ #pragma once -#include "caosdb/entity/v1/main.grpc.pb.h" // for FileTransmissionS... -#include "caosdb/entity/v1/main.pb.h" // for FileDownloadResponse -#include "caosdb/handler_interface.h" // for HandlerTag -#include "caosdb/unary_rpc_handler.h" // for HandlerTag, Handl... -#include <grpcpp/impl/codegen/async_unary_call.h> // for ClientAsyncRespons... -#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue -#include <memory> // for unique_ptr +#include "caosdb/entity/v1/main.grpc.pb.h" // for FileTransmissionS... +#include "caosdb/entity/v1/main.pb.h" // for FileDownloadResponse +#include "caosdb/handler_interface.h" // for HandlerTag +#include "caosdb/unary_rpc_handler.h" // for HandlerTag, Handl... +#include <grpcpp/completion_queue.h> // for CompletionQueue +#include <grpcpp/support/async_unary_call.h> // for ClientAsyncResponseReader +#include <memory> // for unique_ptr namespace caosdb::transaction { diff --git a/include/caosdb/unary_rpc_handler.h b/include/caosdb/unary_rpc_handler.h index a505a8724d67b5434b3535e15bc1ccb9eb635de4..06b9457ceae715b4319739f46d810d7a892612d7 100644 --- a/include/caosdb/unary_rpc_handler.h +++ b/include/caosdb/unary_rpc_handler.h @@ -49,11 +49,11 @@ #ifndef CAOSDB_UNARY_RPC_HANDLER_H #define CAOSDB_UNARY_RPC_HANDLER_H -#include "caosdb/handler_interface.h" // for HandlerTag, Handl... -#include "caosdb/transaction_status.h" // for TransactionStatus -#include <grpcpp/impl/codegen/client_context.h> // for ClientContext -#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue -#include <grpcpp/impl/codegen/status.h> // for Status +#include "caosdb/handler_interface.h" // for HandlerTag, Handl... +#include "caosdb/transaction_status.h" // for TransactionStatus +#include <grpcpp/client_context.h> // for ClientContext +#include <grpcpp/completion_queue.h> // for CompletionQueue +#include <grpcpp/support/status.h> // for Status namespace caosdb::transaction { diff --git a/src/caosdb/file_transmission/download_request_handler.cpp b/src/caosdb/file_transmission/download_request_handler.cpp index e079d28390b59cd439efa7476c5df672a63c1ecc..821ed79477045f4e3bf49c061cfac622b814700d 100644 --- a/src/caosdb/file_transmission/download_request_handler.cpp +++ b/src/caosdb/file_transmission/download_request_handler.cpp @@ -47,23 +47,23 @@ * > DEALINGS IN THE SOFTWARE. */ #include "caosdb/file_transmission/download_request_handler.h" -#include "caosdb/logging.h" // for CAOSDB_LOG_TRACE -#include "caosdb/protobuf_helper.h" // for get_arena -#include "caosdb/status_code.h" // for GENERIC_RPC_E... -#include "caosdb/transaction_status.h" // for TransactionStatus -#include <exception> // IWYU pragma: keep +#include "caosdb/logging.h" // for CAOSDB_LOG_TRACE +#include "caosdb/protobuf_helper.h" // for get_arena +#include "caosdb/status_code.h" // for GENERIC_RPC_E... +#include "caosdb/transaction_status.h" // for TransactionStatus +#include <exception> // IWYU pragma: keep +#include <filesystem> // for operator<<, path +#include <google/protobuf/arena.h> // for Arena +#include <grpcpp/client_context.h> // for ClientContext +#include <grpcpp/completion_queue.h> // for CompletionQueue +#include <grpcpp/support/async_stream.h> // for ClientAsyncReader +#include <grpcpp/support/status.h> // for Status +#include <grpcpp/support/status_code_enum.h> // for OK +#include <stdexcept> // for runtime_error +#include <string> // for string, opera... +#include <utility> // for move // IWYU pragma: no_include <bits/exception.h> -#include <filesystem> // for operator<<, path -#include <google/protobuf/arena.h> // for Arena -#include <grpcpp/impl/codegen/async_stream.h> // for ClientAsyncRe... -#include <grpcpp/impl/codegen/client_context.h> // for ClientContext -#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue -#include <grpcpp/impl/codegen/status.h> // for Status -#include <grpcpp/impl/codegen/status_code_enum.h> // for OK, UNAUTHENT... -#include <stdexcept> // for runtime_error -#include <string> // for string, opera... -#include <utility> // for move - +// namespace caosdb::transaction { using caosdb::StatusCode; using caosdb::utility::get_arena; diff --git a/src/caosdb/file_transmission/register_file_upload_handler.cpp b/src/caosdb/file_transmission/register_file_upload_handler.cpp index 9460d187e883d843dae21c9e4e3ba00376ecbb01..3a47715c75eb797120e1a0116c37743ef6d2b92a 100644 --- a/src/caosdb/file_transmission/register_file_upload_handler.cpp +++ b/src/caosdb/file_transmission/register_file_upload_handler.cpp @@ -47,9 +47,7 @@ * > DEALINGS IN THE SOFTWARE. */ #include "caosdb/file_transmission/register_file_upload_handler.h" -#include "caosdb/logging.h" // for CAOSDB_LOG_TRACE -#include <grpcpp/impl/codegen/async_unary_call.h> // for ClientAsyncRes... -#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue +#include "caosdb/logging.h" // for CAOSDB_LOG_TRACE namespace caosdb::transaction { diff --git a/src/caosdb/file_transmission/upload_request_handler.cpp b/src/caosdb/file_transmission/upload_request_handler.cpp index e4fb985b70b73e25869f54e635cb089901bb41a1..32bb8132e0b4a966774c5f8111800151895b6ced 100644 --- a/src/caosdb/file_transmission/upload_request_handler.cpp +++ b/src/caosdb/file_transmission/upload_request_handler.cpp @@ -47,24 +47,20 @@ * > DEALINGS IN THE SOFTWARE. */ #include "caosdb/file_transmission/upload_request_handler.h" -#include "caosdb/logging.h" // for CAOSDB_LOG_ERROR -#include "caosdb/protobuf_helper.h" // for get_arena -#include "caosdb/status_code.h" // for GENERIC_RPC_E... -#include "caosdb/transaction_status.h" // for TransactionStatus -#include <algorithm> // for min -#include <cstdint> // for uint64_t -#include <exception> // IWYU pragma: keep +#include "caosdb/logging.h" // for CAOSDB_LOG_ERROR +#include "caosdb/protobuf_helper.h" // for get_arena +#include "caosdb/status_code.h" // for GENERIC_RPC_E... +#include "caosdb/transaction_status.h" // for TransactionStatus +#include <algorithm> // for min +#include <cstdint> // for uint64_t +#include <exception> // IWYU pragma: keep +#include <filesystem> // for operator<<, path +#include <google/protobuf/arena.h> // for Arena +#include <grpcpp/impl/codegen/call_op_set.h> // for WriteOptions +#include <grpcpp/support/status_code_enum.h> // for OK +#include <string> // for basic_string +#include <utility> // for move // IWYU pragma: no_include <bits/exception.h> -#include <filesystem> // for operator<<, path -#include <google/protobuf/arena.h> // for Arena -#include <grpcpp/impl/codegen/async_stream.h> // for ClientAsyncWr... -#include <grpcpp/impl/codegen/call_op_set.h> // for WriteOptions -#include <grpcpp/impl/codegen/client_context.h> // for ClientContext -#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue -#include <grpcpp/impl/codegen/status.h> // for Status -#include <grpcpp/impl/codegen/status_code_enum.h> // for OK, UNAUTHENT... -#include <string> // for basic_string -#include <utility> // for move namespace caosdb::transaction { using caosdb::StatusCode; diff --git a/src/caosdb/transaction.cpp b/src/caosdb/transaction.cpp index 8d1897f1bd365fc4031acbc19271608a528c1784..c75fdeb7fcf5b1a5854464dcabf76c11bb5a4262 100644 --- a/src/caosdb/transaction.cpp +++ b/src/caosdb/transaction.cpp @@ -28,7 +28,6 @@ #include "caosdb/status_code.h" // for StatusCode #include "caosdb/transaction_handler.h" // for EntityTransactionHandler #include <algorithm> // for max -#include <chrono> // for chrono_literals #include <exception> // IWYU pragma: keep #include <filesystem> // for operator<<, path #include <future> // for async, future @@ -38,7 +37,6 @@ #include <memory> // for unique_ptr #include <random> // for mt19937, rand... #include <system_error> // for std::system_error -#include <thread> // for sleep #include <utility> // for move, pair // IWYU pragma: no_include <bits/exception.h> // IWYU pragma: no_include <cxxabi.h> @@ -423,14 +421,17 @@ auto Transaction::WaitForIt() const noexcept -> TransactionStatus { return this->status; } -// NOLINTNEXTLINE auto Transaction::ProcessCalls() -> TransactionStatus { - CAOSDB_LOG_TRACE_ENTER_AND_LEAVE(logger_name, "Transaction::ProcessCalls()") - if (this->status.GetCode() != StatusCode::EXECUTING) { - CAOSDB_LOG_ERROR(logger_name) - << "Transaction::ProcessCalls() was called, TransactionStatus was: " - << std::to_string(this->status.GetCode()) << " - " << this->status.GetDescription(); - return status; + CAOSDB_LOG_TRACE_ENTER_AND_LEAVE(logger_name, "Transaction::ProcessCalls()") { + TRANSACTION_SYNCRONIZED_BLOCK + if (this->status.GetCode() != StatusCode::EXECUTING) { + CAOSDB_LOG_ERROR(logger_name) + << "Transaction::ProcessCalls() was called, TransactionStatus was: " + << std::to_string(this->status.GetCode()) << " - " << this->status.GetDescription(); + return status; + } + + handler_->Start(); } gpr_timespec deadline; @@ -439,7 +440,6 @@ auto Transaction::ProcessCalls() -> TransactionStatus { deadline.clock_type = gpr_clock_type::GPR_TIMESPAN; TransactionStatus result = TransactionStatus::EXECUTING(); - handler_->Start(); void *tag = nullptr; bool ok = false; @@ -486,29 +486,28 @@ Transaction::~Transaction() { void Transaction::Cancel() { CAOSDB_LOG_TRACE_ENTER_AND_LEAVE(logger_name, "Transaction::Cancel()") - TRANSACTION_SYNCRONIZED_BLOCK - - if (this->status.GetCode() > 0) { - // Prevent canceling before the queue even started. - // Temporary fix for a bug in GRPC. - // Fix is in the making: - // https://github.com/grpc/grpc/pull/30004 - using namespace std::chrono_literals; - std::this_thread::sleep_for(5ms); + if (this->status.GetCode() == StatusCode::CANCELLED) { + return; } - this->status = TransactionStatus::CANCELLED(); - if (handler_ != nullptr) { - handler_->Cancel(); - } + { - completion_queue.Shutdown(); + TRANSACTION_SYNCRONIZED_BLOCK - // drain the queue - void *ignoredTag = nullptr; - bool ok = false; - while (completion_queue.Next(&ignoredTag, &ok)) { - ; + if (handler_ != nullptr) { + handler_->Cancel(); + } + + this->status = TransactionStatus::CANCELLED(); + + completion_queue.Shutdown(); + + // drain the queue + void *ignoredTag = nullptr; + bool ok = false; + while (completion_queue.Next(&ignoredTag, &ok)) { + ; + } } if (transaction_future.valid()) { diff --git a/src/caosdb/transaction_handler.cpp b/src/caosdb/transaction_handler.cpp index cbcbf76332f437712ea3883be72c347370f75924..ef4897d1392f46b374fbdf5831c3a9e74ebf9d63 100644 --- a/src/caosdb/transaction_handler.cpp +++ b/src/caosdb/transaction_handler.cpp @@ -2,8 +2,6 @@ #include "caosdb/logging.h" // for CAOSDB_LOG_TRACE #include <exception> // IWYU pragma: keep // IWYU pragma: no_include <bits/exception.h> -#include <grpcpp/impl/codegen/async_unary_call.h> // for ClientAsyncRes... -#include <grpcpp/impl/codegen/completion_queue.h> // for CompletionQueue namespace caosdb::transaction { diff --git a/src/caosdb/unary_rpc_handler.cpp b/src/caosdb/unary_rpc_handler.cpp index 6770cae1981fa193105d5af9af4934d90a6b0aca..06afc127cecea22b1b805d20a68eab177841e981 100644 --- a/src/caosdb/unary_rpc_handler.cpp +++ b/src/caosdb/unary_rpc_handler.cpp @@ -47,14 +47,12 @@ * > DEALINGS IN THE SOFTWARE. */ #include "caosdb/unary_rpc_handler.h" -#include "caosdb/logging.h" // for CAOSDB_LOG_TRACE -#include "caosdb/status_code.h" // for GENERIC_RPC_E... +#include "caosdb/logging.h" // for CAOSDB_LOG_TRACE +#include "caosdb/status_code.h" // for GENERIC_RPC_E... +#include <exception> // IWYU pragma: keep +#include <grpcpp/support/status_code_enum.h> // for OK +#include <string> // for string, opera... // IWYU pragma: no_include <bits/exception.h> -#include <exception> // IWYU pragma: keep -#include <grpcpp/impl/codegen/client_context.h> // for ClientContext -#include <grpcpp/impl/codegen/status.h> // for Status -#include <grpcpp/impl/codegen/status_code_enum.h> // for OK, UNAUTHENT... -#include <string> // for string, opera... namespace caosdb::transaction {