couchbase 4.2.1 → 4.2.2
Sign up to get free protection for your applications and to get access to all the features.
- package/CMakeLists.txt +1 -0
- package/deps/couchbase-cxx-client/.gitmodules +3 -0
- package/deps/couchbase-cxx-client/.idea/misc.xml +1 -0
- package/deps/couchbase-cxx-client/.idea/vcs.xml +1 -0
- package/deps/couchbase-cxx-client/CMakeLists.txt +11 -1
- package/deps/couchbase-cxx-client/README.md +3 -3
- package/deps/couchbase-cxx-client/cmake/CompilerWarnings.cmake +4 -1
- package/deps/couchbase-cxx-client/cmake/VersionInfo.cmake +13 -1
- package/deps/couchbase-cxx-client/cmake/build_version.hxx.in +1 -0
- package/deps/couchbase-cxx-client/core/cluster.hxx +15 -5
- package/deps/couchbase-cxx-client/core/impl/build_deferred_query_indexes.cxx +17 -6
- package/deps/couchbase-cxx-client/core/impl/cluster.cxx +1 -1
- package/deps/couchbase-cxx-client/core/impl/collection_query_index_manager.cxx +93 -0
- package/deps/couchbase-cxx-client/core/impl/configuration_profiles_registry.cxx +11 -0
- package/deps/couchbase-cxx-client/core/impl/create_query_index.cxx +119 -0
- package/deps/couchbase-cxx-client/core/impl/drop_query_index.cxx +108 -0
- package/deps/couchbase-cxx-client/core/impl/get.cxx +1 -1
- package/deps/couchbase-cxx-client/core/impl/get_all_query_indexes.cxx +76 -0
- package/deps/couchbase-cxx-client/core/impl/query.cxx +5 -7
- package/deps/couchbase-cxx-client/core/impl/watch_query_indexes.cxx +168 -0
- package/deps/couchbase-cxx-client/core/io/mcbp_session.cxx +15 -1
- package/deps/couchbase-cxx-client/core/logger/configuration.hxx +3 -0
- package/deps/couchbase-cxx-client/core/logger/level.hxx +21 -0
- package/deps/couchbase-cxx-client/core/logger/logger.hxx +4 -6
- package/deps/couchbase-cxx-client/core/meta/CMakeLists.txt +4 -2
- package/deps/couchbase-cxx-client/core/meta/features.hxx +31 -0
- package/deps/couchbase-cxx-client/core/meta/version.cxx +67 -5
- package/deps/couchbase-cxx-client/core/meta/version.hxx +12 -1
- package/deps/couchbase-cxx-client/core/metrics/CMakeLists.txt +4 -1
- package/deps/couchbase-cxx-client/core/metrics/logging_meter.cxx +46 -5
- package/deps/couchbase-cxx-client/core/metrics/logging_meter.hxx +10 -26
- package/deps/couchbase-cxx-client/core/operations/document_get_projected.cxx +3 -2
- package/deps/couchbase-cxx-client/core/operations/document_query.cxx +10 -12
- package/deps/couchbase-cxx-client/core/operations/document_query.hxx +1 -3
- package/deps/couchbase-cxx-client/core/operations/management/query_index_build.cxx +8 -14
- package/deps/couchbase-cxx-client/core/operations/management/query_index_build.hxx +2 -1
- package/deps/couchbase-cxx-client/core/operations/management/query_index_build_deferred.hxx +15 -8
- package/deps/couchbase-cxx-client/core/operations/management/query_index_create.cxx +7 -14
- package/deps/couchbase-cxx-client/core/operations/management/query_index_create.hxx +2 -0
- package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.cxx +11 -16
- package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.hxx +2 -0
- package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.cxx +8 -12
- package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.hxx +4 -3
- package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.cxx +21 -12
- package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.hxx +3 -2
- package/deps/couchbase-cxx-client/core/origin.hxx +1 -1
- package/deps/couchbase-cxx-client/core/platform/uuid.cc +1 -2
- package/deps/couchbase-cxx-client/core/protocol/cmd_hello.hxx +5 -1
- package/deps/couchbase-cxx-client/core/query_context.hxx +79 -0
- package/deps/couchbase-cxx-client/core/tracing/CMakeLists.txt +3 -1
- package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.cxx +19 -4
- package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.hxx +2 -2
- package/deps/couchbase-cxx-client/core/transactions/async_attempt_context.hxx +10 -4
- package/deps/couchbase-cxx-client/core/transactions/atr_cleanup_entry.cxx +52 -63
- package/deps/couchbase-cxx-client/core/transactions/attempt_context.hxx +8 -3
- package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.cxx +163 -126
- package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.hxx +24 -37
- package/deps/couchbase-cxx-client/core/transactions/forward_compat.hxx +4 -4
- package/deps/couchbase-cxx-client/core/transactions/internal/atr_cleanup_entry.hxx +51 -13
- package/deps/couchbase-cxx-client/core/transactions/internal/client_record.hxx +26 -1
- package/deps/couchbase-cxx-client/core/transactions/internal/doc_record.hxx +21 -0
- package/deps/couchbase-cxx-client/core/transactions/internal/logging.hxx +40 -18
- package/deps/couchbase-cxx-client/core/transactions/internal/transaction_context.hxx +5 -0
- package/deps/couchbase-cxx-client/core/transactions/result.hxx +26 -0
- package/deps/couchbase-cxx-client/core/transactions/staged_mutation.cxx +48 -47
- package/deps/couchbase-cxx-client/core/transactions/staged_mutation.hxx +6 -6
- package/deps/couchbase-cxx-client/core/transactions/transaction_context.cxx +33 -19
- package/deps/couchbase-cxx-client/core/transactions/transaction_get_result.hxx +18 -2
- package/deps/couchbase-cxx-client/core/transactions/transaction_links.hxx +25 -2
- package/deps/couchbase-cxx-client/core/transactions/transactions.cxx +4 -4
- package/deps/couchbase-cxx-client/core/transactions/transactions_cleanup.cxx +49 -56
- package/deps/couchbase-cxx-client/core/transactions/waitable_op_list.hxx +7 -7
- package/deps/couchbase-cxx-client/core/transactions.hxx +0 -12
- package/deps/couchbase-cxx-client/core/utils/binary.hxx +1 -1
- package/deps/couchbase-cxx-client/core/utils/keyspace.hxx +55 -0
- package/deps/couchbase-cxx-client/couchbase/build_query_index_options.hxx +12 -45
- package/deps/couchbase-cxx-client/couchbase/cluster.hxx +1 -1
- package/deps/couchbase-cxx-client/couchbase/cluster_options.hxx +6 -7
- package/deps/couchbase-cxx-client/couchbase/collection.hxx +8 -0
- package/deps/couchbase-cxx-client/couchbase/collection_query_index_manager.hxx +218 -0
- package/deps/couchbase-cxx-client/couchbase/configuration_profiles_registry.hxx +3 -0
- package/deps/couchbase-cxx-client/couchbase/create_primary_query_index_options.hxx +166 -0
- package/deps/couchbase-cxx-client/couchbase/create_query_index_options.hxx +172 -0
- package/deps/couchbase-cxx-client/couchbase/drop_primary_query_index_options.hxx +129 -0
- package/deps/couchbase-cxx-client/couchbase/drop_query_index_options.hxx +116 -0
- package/deps/couchbase-cxx-client/couchbase/fmt/cas.hxx +1 -1
- package/deps/couchbase-cxx-client/couchbase/fmt/query_scan_consistency.hxx +46 -0
- package/deps/couchbase-cxx-client/couchbase/fmt/query_status.hxx +70 -0
- package/deps/couchbase-cxx-client/couchbase/fmt/tls_verify_mode.hxx +46 -0
- package/deps/couchbase-cxx-client/couchbase/get_all_query_indexes_options.hxx +100 -0
- package/deps/couchbase-cxx-client/{core → couchbase}/management/query_index.hxx +2 -2
- package/deps/couchbase-cxx-client/couchbase/metrics/meter.hxx +16 -0
- package/deps/couchbase-cxx-client/couchbase/query_index_manager.hxx +178 -6
- package/deps/couchbase-cxx-client/couchbase/query_options.hxx +1 -18
- package/deps/couchbase-cxx-client/couchbase/scope.hxx +5 -2
- package/deps/couchbase-cxx-client/couchbase/tracing/request_tracer.hxx +16 -0
- package/deps/couchbase-cxx-client/couchbase/transactions/async_attempt_context.hxx +11 -4
- package/deps/couchbase-cxx-client/couchbase/transactions/attempt_context.hxx +5 -3
- package/deps/couchbase-cxx-client/couchbase/transactions/transaction_keyspace.hxx +16 -0
- package/deps/couchbase-cxx-client/couchbase/transactions/transaction_query_options.hxx +0 -6
- package/deps/couchbase-cxx-client/couchbase/watch_query_indexes_options.hxx +115 -0
- package/deps/couchbase-cxx-client/examples/minimal.cxx +3 -1
- package/deps/couchbase-cxx-client/test/test_integration_crud.cxx +72 -0
- package/deps/couchbase-cxx-client/test/test_integration_management.cxx +727 -310
- package/deps/couchbase-cxx-client/test/test_integration_query.cxx +4 -8
- package/deps/couchbase-cxx-client/test/test_integration_transcoders.cxx +14 -0
- package/deps/couchbase-cxx-client/test/test_transaction_transaction_public_blocking_api.cxx +34 -19
- package/deps/couchbase-cxx-client/test/test_unit_transaction_logging.cxx +66 -22
- package/deps/couchbase-cxx-client/test/test_unit_utils.cxx +51 -0
- package/deps/couchbase-cxx-client/test/tools/tool_kv_loader.cxx +2 -2
- package/deps/couchbase-cxx-client/test/utils/integration_test_guard.cxx +2 -0
- package/deps/couchbase-cxx-client/test/utils/wait_until.cxx +4 -4
- package/deps/couchbase-cxx-client/third_party/docopt/.travis.yml +103 -0
- package/deps/couchbase-cxx-client/third_party/docopt/CMakeLists.txt +129 -0
- package/deps/couchbase-cxx-client/third_party/docopt/LICENSE-Boost-1.0 +23 -0
- package/deps/couchbase-cxx-client/third_party/docopt/LICENSE-MIT +23 -0
- package/deps/couchbase-cxx-client/third_party/docopt/README.rst +479 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt-config.cmake +1 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt.cpp +687 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt.h +98 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt.pc.in +9 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt_private.h +676 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt_util.h +122 -0
- package/deps/couchbase-cxx-client/third_party/docopt/docopt_value.h +341 -0
- package/deps/couchbase-cxx-client/third_party/docopt/examples/naval_fate.cpp +36 -0
- package/deps/couchbase-cxx-client/third_party/docopt/main.cpp +16 -0
- package/deps/couchbase-cxx-client/third_party/docopt/run_testcase.cpp +40 -0
- package/deps/couchbase-cxx-client/third_party/docopt/run_tests.py +72 -0
- package/deps/couchbase-cxx-client/third_party/docopt/testcases.docopt +957 -0
- package/deps/couchbase-cxx-client/tools/CMakeLists.txt +14 -0
- package/deps/couchbase-cxx-client/tools/cbc.cxx +65 -0
- package/deps/couchbase-cxx-client/tools/command.hxx +31 -0
- package/deps/couchbase-cxx-client/tools/command_registry.cxx +43 -0
- package/deps/couchbase-cxx-client/tools/command_registry.hxx +39 -0
- package/deps/couchbase-cxx-client/tools/get.cxx +267 -0
- package/deps/couchbase-cxx-client/tools/get.hxx +26 -0
- package/deps/couchbase-cxx-client/tools/query.cxx +441 -0
- package/deps/couchbase-cxx-client/tools/query.hxx +26 -0
- package/deps/couchbase-cxx-client/tools/utils.cxx +418 -0
- package/deps/couchbase-cxx-client/tools/utils.hxx +150 -0
- package/deps/couchbase-cxx-client/tools/version.cxx +82 -0
- package/deps/couchbase-cxx-client/tools/version.hxx +26 -0
- package/dist/authenticators.d.ts +2 -2
- package/dist/authenticators.js +1 -2
- package/dist/binding.d.ts +32 -16
- package/dist/cluster.js +14 -7
- package/dist/collection.d.ts +6 -0
- package/dist/collection.js +8 -0
- package/dist/queryexecutor.js +1 -1
- package/dist/queryindexmanager.d.ts +100 -4
- package/dist/queryindexmanager.js +344 -118
- package/dist/transactions.js +0 -2
- package/package.json +1 -1
- package/src/connection.cpp +2 -0
- package/src/connection.hpp +1 -0
- package/src/connection_autogen.cpp +16 -0
- package/src/jstocbpp_autogen.hpp +93 -23
- package/src/jstocbpp_basic.hpp +24 -0
- package/src/jstocbpp_transactions.hpp +0 -8
- package/tools/gen-bindings-js.js +1 -0
- package/tools/gen-bindings-json.py +4 -2
- package/deps/couchbase-cxx-client/core/transactions/logging.cxx +0 -107
@@ -17,6 +17,8 @@
|
|
17
17
|
|
18
18
|
#include "threshold_logging_tracer.hxx"
|
19
19
|
|
20
|
+
#include "couchbase/build_info.hxx"
|
21
|
+
|
20
22
|
#include "constants.hxx"
|
21
23
|
#include "core/logger/logger.hxx"
|
22
24
|
#include "core/meta/version.hxx"
|
@@ -25,10 +27,11 @@
|
|
25
27
|
#include "core/utils/json.hxx"
|
26
28
|
|
27
29
|
#include <asio/steady_timer.hpp>
|
30
|
+
#include <tao/json/value.hpp>
|
31
|
+
|
28
32
|
#include <chrono>
|
29
33
|
#include <mutex>
|
30
34
|
#include <queue>
|
31
|
-
#include <tao/json/value.hpp>
|
32
35
|
|
33
36
|
namespace couchbase::core::tracing
|
34
37
|
{
|
@@ -285,6 +288,12 @@ class threshold_logging_tracer_impl
|
|
285
288
|
rearm_threshold_reporter();
|
286
289
|
}
|
287
290
|
|
291
|
+
void stop()
|
292
|
+
{
|
293
|
+
emit_orphan_report_.cancel();
|
294
|
+
emit_threshold_report_.cancel();
|
295
|
+
}
|
296
|
+
|
288
297
|
void add_orphan(std::shared_ptr<threshold_logging_span> span)
|
289
298
|
{
|
290
299
|
orphan_queue_.emplace(convert(std::move(span)));
|
@@ -338,7 +347,7 @@ class threshold_logging_tracer_impl
|
|
338
347
|
tao::json::value report
|
339
348
|
{
|
340
349
|
{ "count", queue.size() },
|
341
|
-
#if
|
350
|
+
#if COUCHBASE_CXX_CLIENT_DEBUG_BUILD
|
342
351
|
{ "emit_interval_ms", options_.orphaned_emit_interval.count() }, { "sample_size", options_.orphaned_sample_size },
|
343
352
|
#endif
|
344
353
|
};
|
@@ -361,7 +370,7 @@ class threshold_logging_tracer_impl
|
|
361
370
|
tao::json::value report
|
362
371
|
{
|
363
372
|
{ "count", queue.size() }, { "service", fmt::format("{}", service) },
|
364
|
-
#if
|
373
|
+
#if COUCHBASE_CXX_CLIENT_DEBUG_BUILD
|
365
374
|
{ "emit_interval_ms", options_.threshold_emit_interval.count() }, { "sample_size", options_.threshold_sample_size },
|
366
375
|
{ "threshold_ms",
|
367
376
|
std::chrono::duration_cast<std::chrono::microseconds>(options_.threshold_for_service(service)).count() },
|
@@ -403,8 +412,8 @@ threshold_logging_tracer::report(std::shared_ptr<threshold_logging_span> span)
|
|
403
412
|
|
404
413
|
threshold_logging_tracer::threshold_logging_tracer(asio::io_context& ctx, threshold_logging_options options)
|
405
414
|
: options_{ options }
|
415
|
+
, impl_(std::make_shared<threshold_logging_tracer_impl>(options_, ctx))
|
406
416
|
{
|
407
|
-
impl_ = std::make_shared<threshold_logging_tracer_impl>(options_, ctx);
|
408
417
|
}
|
409
418
|
|
410
419
|
void
|
@@ -413,6 +422,12 @@ threshold_logging_tracer::start()
|
|
413
422
|
impl_->start();
|
414
423
|
}
|
415
424
|
|
425
|
+
void
|
426
|
+
threshold_logging_tracer::stop()
|
427
|
+
{
|
428
|
+
impl_->stop();
|
429
|
+
}
|
430
|
+
|
416
431
|
void
|
417
432
|
threshold_logging_span::end()
|
418
433
|
{
|
@@ -38,11 +38,11 @@ class threshold_logging_tracer
|
|
38
38
|
public:
|
39
39
|
threshold_logging_tracer(asio::io_context& ctx, threshold_logging_options options);
|
40
40
|
|
41
|
-
void start();
|
42
|
-
|
43
41
|
std::shared_ptr<couchbase::tracing::request_span> start_span(std::string name,
|
44
42
|
std::shared_ptr<couchbase::tracing::request_span> parent) override;
|
45
43
|
void report(std::shared_ptr<threshold_logging_span> span);
|
44
|
+
void start() override;
|
45
|
+
void stop() override;
|
46
46
|
|
47
47
|
private:
|
48
48
|
threshold_logging_options options_;
|
@@ -113,6 +113,11 @@ class async_attempt_context
|
|
113
113
|
*/
|
114
114
|
virtual void remove(const transaction_get_result& document, VoidCallback&& cb) = 0;
|
115
115
|
|
116
|
+
virtual void query(const std::string& statement,
|
117
|
+
const couchbase::transactions::transaction_query_options& options,
|
118
|
+
std::optional<std::string> query_context,
|
119
|
+
QueryCallback&& cb) = 0;
|
120
|
+
|
116
121
|
/**
|
117
122
|
* Performs a Query, within the current transaction.
|
118
123
|
*
|
@@ -120,9 +125,10 @@ class async_attempt_context
|
|
120
125
|
* @param options options to apply to the query.
|
121
126
|
* @param cb callback which is called when the query completes.
|
122
127
|
*/
|
123
|
-
|
124
|
-
|
125
|
-
|
128
|
+
void query(const std::string& statement, const couchbase::transactions::transaction_query_options& options, QueryCallback&& cb)
|
129
|
+
{
|
130
|
+
return query(statement, options, {}, std::move(cb));
|
131
|
+
}
|
126
132
|
|
127
133
|
/**
|
128
134
|
* Performs a Query, within the current transaction.
|
@@ -133,7 +139,7 @@ class async_attempt_context
|
|
133
139
|
void query(const std::string& statement, QueryCallback&& cb)
|
134
140
|
{
|
135
141
|
couchbase::transactions::transaction_query_options opts;
|
136
|
-
return query(statement, opts, std::move(cb));
|
142
|
+
return query(statement, opts, {}, std::move(cb));
|
137
143
|
}
|
138
144
|
|
139
145
|
/**
|
@@ -16,13 +16,11 @@
|
|
16
16
|
|
17
17
|
#include "active_transaction_record.hxx"
|
18
18
|
#include "attempt_context_impl.hxx"
|
19
|
-
#include "attempt_context_testing_hooks.hxx"
|
20
19
|
#include "cleanup_testing_hooks.hxx"
|
21
20
|
#include "durability_level.hxx"
|
22
21
|
#include "forward_compat.hxx"
|
23
22
|
|
24
23
|
#include "core/transactions.hxx"
|
25
|
-
#include "exceptions.hxx"
|
26
24
|
#include "internal/atr_cleanup_entry.hxx"
|
27
25
|
#include "internal/logging.hxx"
|
28
26
|
#include "internal/transactions_cleanup.hxx"
|
@@ -83,9 +81,9 @@ atr_cleanup_entry::atr_cleanup_entry(attempt_context& ctx)
|
|
83
81
|
}
|
84
82
|
|
85
83
|
void
|
86
|
-
atr_cleanup_entry::clean(
|
84
|
+
atr_cleanup_entry::clean(transactions_cleanup_attempt* result)
|
87
85
|
{
|
88
|
-
|
86
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("cleaning {}", *this);
|
89
87
|
// get atr entry if needed
|
90
88
|
atr_entry entry;
|
91
89
|
if (nullptr == atr_entry_) {
|
@@ -96,21 +94,21 @@ atr_cleanup_entry::clean(std::shared_ptr<spdlog::logger> logger, transactions_cl
|
|
96
94
|
std::find_if(atr->entries().begin(), atr->entries().end(), [&](const atr_entry& e) { return e.attempt_id() == attempt_id_; });
|
97
95
|
if (it != atr->entries().end()) {
|
98
96
|
atr_entry_ = &(*it);
|
99
|
-
return check_atr_and_cleanup(
|
97
|
+
return check_atr_and_cleanup(result);
|
100
98
|
} else {
|
101
|
-
|
99
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("could not find attempt {}, nothing to clean", attempt_id_);
|
102
100
|
return;
|
103
101
|
}
|
104
102
|
} else {
|
105
|
-
|
103
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("could not find atr {}, nothing to clean", atr_id_);
|
106
104
|
return;
|
107
105
|
}
|
108
106
|
}
|
109
|
-
check_atr_and_cleanup(
|
107
|
+
check_atr_and_cleanup(result);
|
110
108
|
}
|
111
109
|
|
112
110
|
void
|
113
|
-
atr_cleanup_entry::check_atr_and_cleanup(
|
111
|
+
atr_cleanup_entry::check_atr_and_cleanup(transactions_cleanup_attempt* result)
|
114
112
|
{
|
115
113
|
// ExtStoreDurability: this is the first point where we're guaranteed to have the ATR entry
|
116
114
|
auto durability_level_raw = atr_entry_->durability_level();
|
@@ -118,12 +116,8 @@ atr_cleanup_entry::check_atr_and_cleanup(std::shared_ptr<spdlog::logger> logger,
|
|
118
116
|
if (durability_level_raw.has_value()) {
|
119
117
|
durability_level = store_string_to_durability_level(durability_level_raw.value());
|
120
118
|
}
|
121
|
-
// Too verbose to log, but leaving here commented as it may be useful later for internal debugging
|
122
|
-
// logger->trace("found attempt {}/{} check_if_expired_={} has_expired={} safety_margin_ms_={}", atr_entry_->atr_id(),
|
123
|
-
// atr_entry_->attempt_id(),
|
124
|
-
// check_if_expired_, atr_entry_->has_expired(safety_margin_ms_),safety_margin_ms_);
|
125
119
|
if (check_if_expired_ && !atr_entry_->has_expired(safety_margin_ms_)) {
|
126
|
-
|
120
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("not expired, nothing to clean");
|
127
121
|
return;
|
128
122
|
}
|
129
123
|
if (result) {
|
@@ -133,12 +127,12 @@ atr_cleanup_entry::check_atr_and_cleanup(std::shared_ptr<spdlog::logger> logger,
|
|
133
127
|
if (err) {
|
134
128
|
throw *err;
|
135
129
|
}
|
136
|
-
cleanup_docs(
|
130
|
+
cleanup_docs(durability_level);
|
137
131
|
auto ec = cleanup_->config().cleanup_hooks->on_cleanup_docs_completed();
|
138
132
|
if (ec) {
|
139
133
|
throw client_error(*ec, "on_cleanup_docs_completed hook threw error");
|
140
134
|
}
|
141
|
-
cleanup_entry(
|
135
|
+
cleanup_entry(durability_level);
|
142
136
|
ec = cleanup_->config().cleanup_hooks->on_cleanup_completed();
|
143
137
|
if (ec) {
|
144
138
|
throw client_error(*ec, "on_cleanup_completed hook threw error");
|
@@ -147,31 +141,30 @@ atr_cleanup_entry::check_atr_and_cleanup(std::shared_ptr<spdlog::logger> logger,
|
|
147
141
|
}
|
148
142
|
|
149
143
|
void
|
150
|
-
atr_cleanup_entry::cleanup_docs(
|
144
|
+
atr_cleanup_entry::cleanup_docs(durability_level dl)
|
151
145
|
{
|
152
146
|
switch (atr_entry_->state()) {
|
153
147
|
case attempt_state::COMMITTED:
|
154
|
-
commit_docs(
|
155
|
-
commit_docs(
|
156
|
-
remove_docs_staged_for_removal(
|
148
|
+
commit_docs(atr_entry_->inserted_ids(), dl);
|
149
|
+
commit_docs(atr_entry_->replaced_ids(), dl);
|
150
|
+
remove_docs_staged_for_removal(atr_entry_->removed_ids(), dl);
|
157
151
|
break;
|
158
152
|
// half-finished commit
|
159
153
|
case attempt_state::ABORTED:
|
160
154
|
// half finished rollback
|
161
|
-
remove_docs(
|
162
|
-
remove_txn_links(
|
163
|
-
remove_txn_links(
|
155
|
+
remove_docs(atr_entry_->inserted_ids(), dl);
|
156
|
+
remove_txn_links(atr_entry_->replaced_ids(), dl);
|
157
|
+
remove_txn_links(atr_entry_->removed_ids(), dl);
|
164
158
|
break;
|
165
159
|
default:
|
166
|
-
|
160
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("attempt in {}, nothing to do in cleanup_docs", attempt_state_name(atr_entry_->state()));
|
167
161
|
}
|
168
162
|
}
|
169
163
|
|
170
164
|
void
|
171
|
-
atr_cleanup_entry::do_per_doc(std::
|
172
|
-
std::vector<doc_record> docs,
|
165
|
+
atr_cleanup_entry::do_per_doc(std::vector<doc_record> docs,
|
173
166
|
bool require_crc_to_match,
|
174
|
-
const std::function<void(
|
167
|
+
const std::function<void(transaction_get_result&, bool)>& call)
|
175
168
|
{
|
176
169
|
for (const auto& dr : docs) {
|
177
170
|
try {
|
@@ -203,40 +196,40 @@ atr_cleanup_entry::do_per_doc(std::shared_ptr<spdlog::logger> logger,
|
|
203
196
|
auto res = wrap_operation_future(f);
|
204
197
|
|
205
198
|
if (res.values.empty()) {
|
206
|
-
|
199
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("cannot create a transaction document from {}, ignoring", res);
|
207
200
|
continue;
|
208
201
|
}
|
209
202
|
auto doc = transaction_get_result::create_from(dr.document_id(), res);
|
210
203
|
// now let's decide if we call the function or not
|
211
204
|
if (!(doc.links().has_staged_content() || doc.links().is_document_being_removed()) || !doc.links().has_staged_write()) {
|
212
|
-
|
213
|
-
|
214
|
-
|
205
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("document {} has no staged content - assuming it was "
|
206
|
+
"committed and skipping",
|
207
|
+
dr.id());
|
215
208
|
continue;
|
216
209
|
} else if (doc.links().staged_attempt_id() != attempt_id_) {
|
217
|
-
|
210
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE(
|
218
211
|
"document {} staged for different attempt {}, skipping", dr.id(), doc.links().staged_attempt_id().value_or("<none>)"));
|
219
212
|
continue;
|
220
213
|
}
|
221
214
|
if (require_crc_to_match) {
|
222
215
|
if (!doc.metadata()->crc32() || !doc.links().crc32_of_staging() ||
|
223
216
|
doc.links().crc32_of_staging() != doc.metadata()->crc32()) {
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
217
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("document {} crc32 {} doesn't match staged value {}, skipping",
|
218
|
+
dr.id(),
|
219
|
+
doc.metadata()->crc32().value_or("<none>"),
|
220
|
+
doc.links().crc32_of_staging().value_or("<none>"));
|
228
221
|
continue;
|
229
222
|
}
|
230
223
|
}
|
231
|
-
call(
|
224
|
+
call(doc, res.is_deleted);
|
232
225
|
} catch (const client_error& e) {
|
233
226
|
error_class ec = e.ec();
|
234
227
|
switch (ec) {
|
235
228
|
case FAIL_DOC_NOT_FOUND:
|
236
|
-
|
229
|
+
CB_ATTEMPT_CLEANUP_LOG_ERROR("document {} not found - ignoring ", dr);
|
237
230
|
break;
|
238
231
|
default:
|
239
|
-
|
232
|
+
CB_ATTEMPT_CLEANUP_LOG_ERROR("got error \"{}\", not ignoring this", e.what());
|
240
233
|
throw;
|
241
234
|
}
|
242
235
|
}
|
@@ -244,10 +237,10 @@ atr_cleanup_entry::do_per_doc(std::shared_ptr<spdlog::logger> logger,
|
|
244
237
|
}
|
245
238
|
|
246
239
|
void
|
247
|
-
atr_cleanup_entry::commit_docs(std::
|
240
|
+
atr_cleanup_entry::commit_docs(std::optional<std::vector<doc_record>> docs, durability_level dl)
|
248
241
|
{
|
249
242
|
if (docs) {
|
250
|
-
do_per_doc(
|
243
|
+
do_per_doc(*docs, true, [&](transaction_get_result& doc, bool) {
|
251
244
|
if (doc.links().has_staged_content()) {
|
252
245
|
auto content = doc.links().staged_content();
|
253
246
|
auto ec = cleanup_->config().cleanup_hooks->before_commit_doc(doc.id().key());
|
@@ -281,18 +274,18 @@ atr_cleanup_entry::commit_docs(std::shared_ptr<spdlog::logger> logger, std::opti
|
|
281
274
|
});
|
282
275
|
wrap_operation_future(f);
|
283
276
|
}
|
284
|
-
|
277
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("commit_docs replaced content of doc {} with {}", doc.id(), to_string(content));
|
285
278
|
} else {
|
286
|
-
|
279
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("commit_docs skipping document {}, no staged content", doc.id());
|
287
280
|
}
|
288
281
|
});
|
289
282
|
}
|
290
283
|
}
|
291
284
|
void
|
292
|
-
atr_cleanup_entry::remove_docs(std::
|
285
|
+
atr_cleanup_entry::remove_docs(std::optional<std::vector<doc_record>> docs, durability_level dl)
|
293
286
|
{
|
294
287
|
if (docs) {
|
295
|
-
do_per_doc(
|
288
|
+
do_per_doc(*docs, true, [&](transaction_get_result& doc, bool is_deleted) {
|
296
289
|
auto ec = cleanup_->config().cleanup_hooks->before_remove_doc(doc.id().key());
|
297
290
|
if (ec) {
|
298
291
|
throw client_error(*ec, "before_remove_doc hook threw error");
|
@@ -324,18 +317,16 @@ atr_cleanup_entry::remove_docs(std::shared_ptr<spdlog::logger> logger, std::opti
|
|
324
317
|
});
|
325
318
|
wrap_operation_future(f);
|
326
319
|
}
|
327
|
-
|
320
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("remove_docs removed doc {}", doc.id());
|
328
321
|
});
|
329
322
|
}
|
330
323
|
}
|
331
324
|
|
332
325
|
void
|
333
|
-
atr_cleanup_entry::remove_docs_staged_for_removal(std::
|
334
|
-
std::optional<std::vector<doc_record>> docs,
|
335
|
-
durability_level dl)
|
326
|
+
atr_cleanup_entry::remove_docs_staged_for_removal(std::optional<std::vector<doc_record>> docs, durability_level dl)
|
336
327
|
{
|
337
328
|
if (docs) {
|
338
|
-
do_per_doc(
|
329
|
+
do_per_doc(*docs, true, [&](transaction_get_result& doc, bool) {
|
339
330
|
if (doc.links().is_document_being_removed()) {
|
340
331
|
auto ec = cleanup_->config().cleanup_hooks->before_remove_doc_staged_for_removal(doc.id().key());
|
341
332
|
if (ec) {
|
@@ -350,23 +341,21 @@ atr_cleanup_entry::remove_docs_staged_for_removal(std::shared_ptr<spdlog::logger
|
|
350
341
|
barrier->set_value(result::create_from_mutation_response(resp));
|
351
342
|
});
|
352
343
|
wrap_operation_future(f);
|
353
|
-
|
344
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("remove_docs_staged_for_removal removed doc {}", doc.id());
|
354
345
|
} else {
|
355
|
-
|
356
|
-
|
357
|
-
|
346
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("remove_docs_staged_for_removal found document {} not "
|
347
|
+
"marked for removal, skipping",
|
348
|
+
doc.id());
|
358
349
|
}
|
359
350
|
});
|
360
351
|
}
|
361
352
|
}
|
362
353
|
|
363
354
|
void
|
364
|
-
atr_cleanup_entry::remove_txn_links(std::
|
365
|
-
std::optional<std::vector<doc_record>> docs,
|
366
|
-
durability_level dl)
|
355
|
+
atr_cleanup_entry::remove_txn_links(std::optional<std::vector<doc_record>> docs, durability_level dl)
|
367
356
|
{
|
368
357
|
if (docs) {
|
369
|
-
do_per_doc(
|
358
|
+
do_per_doc(*docs, false, [&](transaction_get_result& doc, bool) {
|
370
359
|
auto ec = cleanup_->config().cleanup_hooks->before_remove_links(doc.id().key());
|
371
360
|
if (ec) {
|
372
361
|
throw client_error(*ec, "before_remove_links hook threw error");
|
@@ -385,13 +374,13 @@ atr_cleanup_entry::remove_txn_links(std::shared_ptr<spdlog::logger> logger,
|
|
385
374
|
cleanup_->cluster_ref()->execute(
|
386
375
|
req, [barrier](core::operations::mutate_in_response resp) { barrier->set_value(result::create_from_subdoc_response(resp)); });
|
387
376
|
wrap_operation_future(f);
|
388
|
-
|
377
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("remove_txn_links removed links for doc {}", doc.id());
|
389
378
|
});
|
390
379
|
}
|
391
380
|
}
|
392
381
|
|
393
382
|
void
|
394
|
-
atr_cleanup_entry::cleanup_entry(
|
383
|
+
atr_cleanup_entry::cleanup_entry(durability_level dl)
|
395
384
|
{
|
396
385
|
try {
|
397
386
|
auto ec = cleanup_->config().cleanup_hooks->before_atr_remove();
|
@@ -412,15 +401,15 @@ atr_cleanup_entry::cleanup_entry(std::shared_ptr<spdlog::logger> logger, durabil
|
|
412
401
|
cleanup_->cluster_ref()->execute(
|
413
402
|
req, [barrier](core::operations::mutate_in_response resp) { barrier->set_value(result::create_from_subdoc_response(resp)); });
|
414
403
|
wrap_operation_future(f);
|
415
|
-
|
404
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("successfully removed attempt {}", attempt_id_);
|
416
405
|
} catch (const client_error& e) {
|
417
406
|
error_class ec = e.ec();
|
418
407
|
switch (ec) {
|
419
408
|
case FAIL_PATH_NOT_FOUND:
|
420
|
-
|
409
|
+
CB_ATTEMPT_CLEANUP_LOG_TRACE("found attempt {} has also inserted 'p' field indicating collision with main algo");
|
421
410
|
return;
|
422
411
|
default:
|
423
|
-
|
412
|
+
CB_ATTEMPT_CLEANUP_LOG_ERROR("cleanup couldn't remove attempt {} due to {} {}", attempt_id_, ec, e.what());
|
424
413
|
throw;
|
425
414
|
}
|
426
415
|
}
|
@@ -129,16 +129,20 @@ class attempt_context
|
|
129
129
|
* rethrown if it is caught.
|
130
130
|
*/
|
131
131
|
virtual void remove(const transaction_get_result& document) = 0;
|
132
|
+
|
132
133
|
/**
|
133
134
|
* Performs a Query, within the current transaction.
|
134
135
|
*
|
135
136
|
* @param statement query statement to execute.
|
136
137
|
* @param options options to apply to the query.
|
138
|
+
* @param query_context query context, if any.
|
137
139
|
* @returns result of the query.
|
138
140
|
*/
|
139
|
-
core::operations::query_response query(const std::string& statement,
|
141
|
+
core::operations::query_response query(const std::string& statement,
|
142
|
+
const couchbase::transactions::transaction_query_options& opts,
|
143
|
+
std::optional<std::string> query_context = {})
|
140
144
|
{
|
141
|
-
return do_core_query(statement, opts);
|
145
|
+
return do_core_query(statement, opts, query_context);
|
142
146
|
};
|
143
147
|
/**
|
144
148
|
* Performs a Query, within the current transaction.
|
@@ -184,7 +188,8 @@ class attempt_context
|
|
184
188
|
virtual transaction_get_result replace_raw(const transaction_get_result& document, const std::vector<std::byte>& content) = 0;
|
185
189
|
|
186
190
|
virtual core::operations::query_response do_core_query(const std::string&,
|
187
|
-
const couchbase::transactions::transaction_query_options& opts
|
191
|
+
const couchbase::transactions::transaction_query_options& opts,
|
192
|
+
std::optional<std::string> query_context) = 0;
|
188
193
|
};
|
189
194
|
|
190
195
|
} // namespace couchbase::core::transactions
|