couchbase 4.2.1 → 4.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/CMakeLists.txt +1 -0
  2. package/deps/couchbase-cxx-client/.gitmodules +3 -0
  3. package/deps/couchbase-cxx-client/.idea/misc.xml +1 -0
  4. package/deps/couchbase-cxx-client/.idea/vcs.xml +1 -0
  5. package/deps/couchbase-cxx-client/CMakeLists.txt +11 -1
  6. package/deps/couchbase-cxx-client/README.md +3 -3
  7. package/deps/couchbase-cxx-client/cmake/CompilerWarnings.cmake +4 -1
  8. package/deps/couchbase-cxx-client/cmake/VersionInfo.cmake +13 -1
  9. package/deps/couchbase-cxx-client/cmake/build_version.hxx.in +1 -0
  10. package/deps/couchbase-cxx-client/core/cluster.hxx +15 -5
  11. package/deps/couchbase-cxx-client/core/impl/build_deferred_query_indexes.cxx +17 -6
  12. package/deps/couchbase-cxx-client/core/impl/cluster.cxx +1 -1
  13. package/deps/couchbase-cxx-client/core/impl/collection_query_index_manager.cxx +93 -0
  14. package/deps/couchbase-cxx-client/core/impl/configuration_profiles_registry.cxx +11 -0
  15. package/deps/couchbase-cxx-client/core/impl/create_query_index.cxx +119 -0
  16. package/deps/couchbase-cxx-client/core/impl/drop_query_index.cxx +108 -0
  17. package/deps/couchbase-cxx-client/core/impl/get.cxx +1 -1
  18. package/deps/couchbase-cxx-client/core/impl/get_all_query_indexes.cxx +76 -0
  19. package/deps/couchbase-cxx-client/core/impl/query.cxx +5 -7
  20. package/deps/couchbase-cxx-client/core/impl/watch_query_indexes.cxx +168 -0
  21. package/deps/couchbase-cxx-client/core/io/mcbp_session.cxx +15 -1
  22. package/deps/couchbase-cxx-client/core/logger/configuration.hxx +3 -0
  23. package/deps/couchbase-cxx-client/core/logger/level.hxx +21 -0
  24. package/deps/couchbase-cxx-client/core/logger/logger.hxx +4 -6
  25. package/deps/couchbase-cxx-client/core/meta/CMakeLists.txt +4 -2
  26. package/deps/couchbase-cxx-client/core/meta/features.hxx +31 -0
  27. package/deps/couchbase-cxx-client/core/meta/version.cxx +67 -5
  28. package/deps/couchbase-cxx-client/core/meta/version.hxx +12 -1
  29. package/deps/couchbase-cxx-client/core/metrics/CMakeLists.txt +4 -1
  30. package/deps/couchbase-cxx-client/core/metrics/logging_meter.cxx +46 -5
  31. package/deps/couchbase-cxx-client/core/metrics/logging_meter.hxx +10 -26
  32. package/deps/couchbase-cxx-client/core/operations/document_get_projected.cxx +3 -2
  33. package/deps/couchbase-cxx-client/core/operations/document_query.cxx +10 -12
  34. package/deps/couchbase-cxx-client/core/operations/document_query.hxx +1 -3
  35. package/deps/couchbase-cxx-client/core/operations/management/query_index_build.cxx +8 -14
  36. package/deps/couchbase-cxx-client/core/operations/management/query_index_build.hxx +2 -1
  37. package/deps/couchbase-cxx-client/core/operations/management/query_index_build_deferred.hxx +15 -8
  38. package/deps/couchbase-cxx-client/core/operations/management/query_index_create.cxx +7 -14
  39. package/deps/couchbase-cxx-client/core/operations/management/query_index_create.hxx +2 -0
  40. package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.cxx +11 -16
  41. package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.hxx +2 -0
  42. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.cxx +8 -12
  43. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.hxx +4 -3
  44. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.cxx +21 -12
  45. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.hxx +3 -2
  46. package/deps/couchbase-cxx-client/core/origin.hxx +1 -1
  47. package/deps/couchbase-cxx-client/core/platform/uuid.cc +1 -2
  48. package/deps/couchbase-cxx-client/core/protocol/cmd_hello.hxx +5 -1
  49. package/deps/couchbase-cxx-client/core/query_context.hxx +79 -0
  50. package/deps/couchbase-cxx-client/core/tracing/CMakeLists.txt +3 -1
  51. package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.cxx +19 -4
  52. package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.hxx +2 -2
  53. package/deps/couchbase-cxx-client/core/transactions/async_attempt_context.hxx +10 -4
  54. package/deps/couchbase-cxx-client/core/transactions/atr_cleanup_entry.cxx +52 -63
  55. package/deps/couchbase-cxx-client/core/transactions/attempt_context.hxx +8 -3
  56. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.cxx +163 -126
  57. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.hxx +24 -37
  58. package/deps/couchbase-cxx-client/core/transactions/forward_compat.hxx +4 -4
  59. package/deps/couchbase-cxx-client/core/transactions/internal/atr_cleanup_entry.hxx +51 -13
  60. package/deps/couchbase-cxx-client/core/transactions/internal/client_record.hxx +26 -1
  61. package/deps/couchbase-cxx-client/core/transactions/internal/doc_record.hxx +21 -0
  62. package/deps/couchbase-cxx-client/core/transactions/internal/logging.hxx +40 -18
  63. package/deps/couchbase-cxx-client/core/transactions/internal/transaction_context.hxx +5 -0
  64. package/deps/couchbase-cxx-client/core/transactions/result.hxx +26 -0
  65. package/deps/couchbase-cxx-client/core/transactions/staged_mutation.cxx +48 -47
  66. package/deps/couchbase-cxx-client/core/transactions/staged_mutation.hxx +6 -6
  67. package/deps/couchbase-cxx-client/core/transactions/transaction_context.cxx +33 -19
  68. package/deps/couchbase-cxx-client/core/transactions/transaction_get_result.hxx +18 -2
  69. package/deps/couchbase-cxx-client/core/transactions/transaction_links.hxx +25 -2
  70. package/deps/couchbase-cxx-client/core/transactions/transactions.cxx +4 -4
  71. package/deps/couchbase-cxx-client/core/transactions/transactions_cleanup.cxx +49 -56
  72. package/deps/couchbase-cxx-client/core/transactions/waitable_op_list.hxx +7 -7
  73. package/deps/couchbase-cxx-client/core/transactions.hxx +0 -12
  74. package/deps/couchbase-cxx-client/core/utils/binary.hxx +1 -1
  75. package/deps/couchbase-cxx-client/core/utils/keyspace.hxx +55 -0
  76. package/deps/couchbase-cxx-client/couchbase/build_query_index_options.hxx +12 -45
  77. package/deps/couchbase-cxx-client/couchbase/cluster.hxx +1 -1
  78. package/deps/couchbase-cxx-client/couchbase/cluster_options.hxx +6 -7
  79. package/deps/couchbase-cxx-client/couchbase/collection.hxx +8 -0
  80. package/deps/couchbase-cxx-client/couchbase/collection_query_index_manager.hxx +218 -0
  81. package/deps/couchbase-cxx-client/couchbase/configuration_profiles_registry.hxx +3 -0
  82. package/deps/couchbase-cxx-client/couchbase/create_primary_query_index_options.hxx +166 -0
  83. package/deps/couchbase-cxx-client/couchbase/create_query_index_options.hxx +172 -0
  84. package/deps/couchbase-cxx-client/couchbase/drop_primary_query_index_options.hxx +129 -0
  85. package/deps/couchbase-cxx-client/couchbase/drop_query_index_options.hxx +116 -0
  86. package/deps/couchbase-cxx-client/couchbase/fmt/cas.hxx +1 -1
  87. package/deps/couchbase-cxx-client/couchbase/fmt/query_scan_consistency.hxx +46 -0
  88. package/deps/couchbase-cxx-client/couchbase/fmt/query_status.hxx +70 -0
  89. package/deps/couchbase-cxx-client/couchbase/fmt/tls_verify_mode.hxx +46 -0
  90. package/deps/couchbase-cxx-client/couchbase/get_all_query_indexes_options.hxx +100 -0
  91. package/deps/couchbase-cxx-client/{core → couchbase}/management/query_index.hxx +2 -2
  92. package/deps/couchbase-cxx-client/couchbase/metrics/meter.hxx +16 -0
  93. package/deps/couchbase-cxx-client/couchbase/query_index_manager.hxx +178 -6
  94. package/deps/couchbase-cxx-client/couchbase/query_options.hxx +1 -18
  95. package/deps/couchbase-cxx-client/couchbase/scope.hxx +5 -2
  96. package/deps/couchbase-cxx-client/couchbase/tracing/request_tracer.hxx +16 -0
  97. package/deps/couchbase-cxx-client/couchbase/transactions/async_attempt_context.hxx +11 -4
  98. package/deps/couchbase-cxx-client/couchbase/transactions/attempt_context.hxx +5 -3
  99. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_keyspace.hxx +16 -0
  100. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_query_options.hxx +0 -6
  101. package/deps/couchbase-cxx-client/couchbase/watch_query_indexes_options.hxx +115 -0
  102. package/deps/couchbase-cxx-client/examples/minimal.cxx +3 -1
  103. package/deps/couchbase-cxx-client/test/test_integration_crud.cxx +72 -0
  104. package/deps/couchbase-cxx-client/test/test_integration_management.cxx +727 -310
  105. package/deps/couchbase-cxx-client/test/test_integration_query.cxx +4 -8
  106. package/deps/couchbase-cxx-client/test/test_integration_transcoders.cxx +14 -0
  107. package/deps/couchbase-cxx-client/test/test_transaction_transaction_public_blocking_api.cxx +34 -19
  108. package/deps/couchbase-cxx-client/test/test_unit_transaction_logging.cxx +66 -22
  109. package/deps/couchbase-cxx-client/test/test_unit_utils.cxx +51 -0
  110. package/deps/couchbase-cxx-client/test/tools/tool_kv_loader.cxx +2 -2
  111. package/deps/couchbase-cxx-client/test/utils/integration_test_guard.cxx +2 -0
  112. package/deps/couchbase-cxx-client/test/utils/wait_until.cxx +4 -4
  113. package/deps/couchbase-cxx-client/third_party/docopt/.travis.yml +103 -0
  114. package/deps/couchbase-cxx-client/third_party/docopt/CMakeLists.txt +129 -0
  115. package/deps/couchbase-cxx-client/third_party/docopt/LICENSE-Boost-1.0 +23 -0
  116. package/deps/couchbase-cxx-client/third_party/docopt/LICENSE-MIT +23 -0
  117. package/deps/couchbase-cxx-client/third_party/docopt/README.rst +479 -0
  118. package/deps/couchbase-cxx-client/third_party/docopt/docopt-config.cmake +1 -0
  119. package/deps/couchbase-cxx-client/third_party/docopt/docopt.cpp +687 -0
  120. package/deps/couchbase-cxx-client/third_party/docopt/docopt.h +98 -0
  121. package/deps/couchbase-cxx-client/third_party/docopt/docopt.pc.in +9 -0
  122. package/deps/couchbase-cxx-client/third_party/docopt/docopt_private.h +676 -0
  123. package/deps/couchbase-cxx-client/third_party/docopt/docopt_util.h +122 -0
  124. package/deps/couchbase-cxx-client/third_party/docopt/docopt_value.h +341 -0
  125. package/deps/couchbase-cxx-client/third_party/docopt/examples/naval_fate.cpp +36 -0
  126. package/deps/couchbase-cxx-client/third_party/docopt/main.cpp +16 -0
  127. package/deps/couchbase-cxx-client/third_party/docopt/run_testcase.cpp +40 -0
  128. package/deps/couchbase-cxx-client/third_party/docopt/run_tests.py +72 -0
  129. package/deps/couchbase-cxx-client/third_party/docopt/testcases.docopt +957 -0
  130. package/deps/couchbase-cxx-client/tools/CMakeLists.txt +14 -0
  131. package/deps/couchbase-cxx-client/tools/cbc.cxx +65 -0
  132. package/deps/couchbase-cxx-client/tools/command.hxx +31 -0
  133. package/deps/couchbase-cxx-client/tools/command_registry.cxx +43 -0
  134. package/deps/couchbase-cxx-client/tools/command_registry.hxx +39 -0
  135. package/deps/couchbase-cxx-client/tools/get.cxx +267 -0
  136. package/deps/couchbase-cxx-client/tools/get.hxx +26 -0
  137. package/deps/couchbase-cxx-client/tools/query.cxx +441 -0
  138. package/deps/couchbase-cxx-client/tools/query.hxx +26 -0
  139. package/deps/couchbase-cxx-client/tools/utils.cxx +418 -0
  140. package/deps/couchbase-cxx-client/tools/utils.hxx +150 -0
  141. package/deps/couchbase-cxx-client/tools/version.cxx +82 -0
  142. package/deps/couchbase-cxx-client/tools/version.hxx +26 -0
  143. package/dist/authenticators.d.ts +2 -2
  144. package/dist/authenticators.js +1 -2
  145. package/dist/binding.d.ts +32 -16
  146. package/dist/cluster.js +14 -7
  147. package/dist/collection.d.ts +6 -0
  148. package/dist/collection.js +8 -0
  149. package/dist/queryexecutor.js +1 -1
  150. package/dist/queryindexmanager.d.ts +100 -4
  151. package/dist/queryindexmanager.js +344 -118
  152. package/dist/transactions.js +0 -2
  153. package/package.json +1 -1
  154. package/src/connection.cpp +2 -0
  155. package/src/connection.hpp +1 -0
  156. package/src/connection_autogen.cpp +16 -0
  157. package/src/jstocbpp_autogen.hpp +93 -23
  158. package/src/jstocbpp_basic.hpp +24 -0
  159. package/src/jstocbpp_transactions.hpp +0 -8
  160. package/tools/gen-bindings-js.js +1 -0
  161. package/tools/gen-bindings-json.py +4 -2
  162. package/deps/couchbase-cxx-client/core/transactions/logging.cxx +0 -107
@@ -57,9 +57,10 @@ attempt_context_impl::attempt_context_impl(transaction_context& transaction_ctx)
57
57
  {
58
58
  // put a new transaction_attempt in the context...
59
59
  overall_.add_attempt();
60
- trace("added new attempt, state {}, expiration in {}ms",
61
- attempt_state_name(state()),
62
- std::chrono::duration_cast<std::chrono::milliseconds>(overall_.remaining()).count());
60
+ CB_ATTEMPT_CTX_LOG_TRACE(this,
61
+ "added new attempt, state {}, expiration in {}ms",
62
+ attempt_state_name(state()),
63
+ std::chrono::duration_cast<std::chrono::milliseconds>(overall_.remaining()).count());
63
64
  }
64
65
 
65
66
  attempt_context_impl::~attempt_context_impl() = default;
@@ -73,11 +74,11 @@ attempt_context_impl::check_and_handle_blocking_transactions(const transaction_g
73
74
  // Check not just writing the same doc twice in the same transaction
74
75
  // NOTE: we check the transaction rather than attempt id. This is to handle [RETRY-ERR-AMBIG-REPLACE].
75
76
  if (doc.links().staged_transaction_id().value() == transaction_id()) {
76
- debug("doc {} has been written by this transaction, ok to continue", doc.id());
77
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "doc {} has been written by this transaction, ok to continue", doc.id());
77
78
  return cb(std::nullopt);
78
79
  }
79
80
  if (doc.links().atr_id() && doc.links().atr_bucket_name() && doc.links().staged_attempt_id()) {
80
- debug("doc {} in another txn, checking atr...", doc.id());
81
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "doc {} in another txn, checking atr...", doc.id());
81
82
  auto err = forward_compat::check(stage, doc.links().forward_compat());
82
83
  if (err) {
83
84
  return cb(err);
@@ -85,10 +86,11 @@ attempt_context_impl::check_and_handle_blocking_transactions(const transaction_g
85
86
  exp_delay delay(std::chrono::milliseconds(50), std::chrono::milliseconds(500), std::chrono::seconds(1));
86
87
  return check_atr_entry_for_blocking_document(doc, delay, std::move(cb));
87
88
  }
88
- debug("doc {} is in another transaction {}, but doesn't have enough info to check the atr. "
89
- "probably a bug, proceeding to overwrite",
90
- doc.id(),
91
- *doc.links().staged_attempt_id());
89
+ CB_ATTEMPT_CTX_LOG_DEBUG(this,
90
+ "doc {} is in another transaction {}, but doesn't have enough info to check the atr. "
91
+ "probably a bug, proceeding to overwrite",
92
+ doc.id(),
93
+ *doc.links().staged_attempt_id());
92
94
  }
93
95
  return cb(std::nullopt);
94
96
  }
@@ -300,11 +302,11 @@ attempt_context_impl::replace_raw(const transaction_get_result& document, const
300
302
  transaction_operation_failed(FAIL_DOC_NOT_FOUND, "can't replace empty doc")
301
303
  .cause(external_exception::DOCUMENT_NOT_FOUND_EXCEPTION));
302
304
  }
303
- trace("replacing {} with {}", document, to_string(content));
305
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "replacing {} with {}", document, to_string(content));
304
306
  check_if_done(cb);
305
307
  staged_mutation* existing_sm = staged_mutations_->find_any(document.id());
306
308
  if (existing_sm != nullptr && existing_sm->type() == staged_mutation_type::REMOVE) {
307
- debug("found existing REMOVE of {} while replacing", document);
309
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "found existing REMOVE of {} while replacing", document);
308
310
  return op_completed_with_error(
309
311
  std::move(cb),
310
312
  transaction_operation_failed(FAIL_DOC_NOT_FOUND,
@@ -334,7 +336,7 @@ attempt_context_impl::replace_raw(const transaction_get_result& document, const
334
336
  return op_completed_with_error(std::move(cb), *e2);
335
337
  }
336
338
  if (existing_sm != nullptr && existing_sm->type() == staged_mutation_type::INSERT) {
337
- debug("found existing INSERT of {} while replacing", document);
339
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "found existing INSERT of {} while replacing", document);
338
340
  exp_delay delay(
339
341
  std::chrono::milliseconds(5), std::chrono::milliseconds(300), overall_.config().expiration_time);
340
342
  create_staged_insert(document.id(), content, existing_sm->doc().cas().value(), delay, std::move(cb));
@@ -383,7 +385,8 @@ attempt_context_impl::create_staged_replace(const transaction_get_result& docume
383
385
  if (ec) {
384
386
  return error_handler(*ec, "before_staged_replace hook raised error", std::move(cb));
385
387
  }
386
- trace("about to replace doc {} with cas {} in txn {}", document.id(), document.cas().value(), overall_.transaction_id());
388
+ CB_ATTEMPT_CTX_LOG_TRACE(
389
+ this, "about to replace doc {} with cas {} in txn {}", document.id(), document.cas().value(), overall_.transaction_id());
387
390
  overall_.cluster_ref()->execute(
388
391
  req,
389
392
  [this, document = std::move(document), content, cb = std::move(cb), error_handler = std::move(error_handler)](
@@ -398,7 +401,7 @@ attempt_context_impl::create_staged_replace(const transaction_get_result& docume
398
401
  transaction_get_result out = document;
399
402
  out.cas(resp.cas.value());
400
403
  out.content(content);
401
- trace("replace staged content, result {}", out);
404
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "replace staged content, result {}", out);
402
405
  staged_mutations_->add(staged_mutation(out, content, staged_mutation_type::REPLACE));
403
406
  return op_completed_with_callback(std::move(cb), std::optional<transaction_get_result>(out));
404
407
  });
@@ -449,7 +452,7 @@ attempt_context_impl::insert_raw(const core::document_id& id, const std::vector<
449
452
  staged_mutation* existing_sm = staged_mutations_->find_any(id);
450
453
  if ((existing_sm != nullptr) &&
451
454
  (existing_sm->type() == staged_mutation_type::INSERT || existing_sm->type() == staged_mutation_type::REPLACE)) {
452
- debug("found existing insert or replace of {} while inserting", id);
455
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "found existing insert or replace of {} while inserting", id);
453
456
  return op_completed_with_error(
454
457
  std::move(cb),
455
458
  transaction_operation_failed(FAIL_DOC_ALREADY_EXISTS, "found existing insert or replace of same document"));
@@ -464,7 +467,7 @@ attempt_context_impl::insert_raw(const core::document_id& id, const std::vector<
464
467
  return op_completed_with_error(std::move(cb), *err);
465
468
  }
466
469
  if (existing_sm != nullptr && existing_sm->type() == staged_mutation_type::REMOVE) {
467
- debug("found existing remove of {} while inserting", id);
470
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "found existing remove of {} while inserting", id);
468
471
  return create_staged_replace(existing_sm->doc(), content, std::move(cb));
469
472
  }
470
473
  uint64_t cas = 0;
@@ -485,7 +488,7 @@ attempt_context_impl::select_atr_if_needed_unlocked(const core::document_id id,
485
488
  try {
486
489
  std::unique_lock<std::mutex> lock(mutex_);
487
490
  if (atr_id_) {
488
- trace("atr exists, moving on");
491
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "atr exists, moving on");
489
492
  return cb(std::nullopt);
490
493
  }
491
494
  std::size_t vbucket_id = 0;
@@ -500,11 +503,12 @@ attempt_context_impl::select_atr_if_needed_unlocked(const core::document_id id,
500
503
  overall_.atr_collection(collection_spec_from_id(id));
501
504
  overall_.atr_id(atr_id_->key());
502
505
  state(attempt_state::NOT_STARTED);
503
- trace(R"(first mutated doc in transaction is "{}" on vbucket {}, so using atr "{}")", id, vbucket_id, atr_id_.value());
506
+ CB_ATTEMPT_CTX_LOG_TRACE(
507
+ this, R"(first mutated doc in transaction is "{}" on vbucket {}, so using atr "{}")", id, vbucket_id, atr_id_.value());
504
508
  overall_.cleanup().add_collection({ atr_id_->bucket(), atr_id_->scope(), atr_id_->collection() });
505
509
  set_atr_pending_locked(id, std::move(lock), std::move(cb));
506
510
  } catch (const std::exception& e) {
507
- error("unexpected error \"{}\" during select atr if needed", e.what());
511
+ CB_ATTEMPT_CTX_LOG_ERROR(this, "unexpected error \"{}\" during select atr if needed", e.what());
508
512
  }
509
513
  }
510
514
  template<typename Handler, typename Delay>
@@ -539,15 +543,17 @@ attempt_context_impl::check_atr_entry_for_blocking_document(const transaction_ge
539
543
  switch (it->state()) {
540
544
  case attempt_state::COMPLETED:
541
545
  case attempt_state::ROLLED_BACK:
542
- debug("existing atr entry can be ignored due to state {}", attempt_state_name(it->state()));
546
+ CB_ATTEMPT_CTX_LOG_DEBUG(
547
+ this, "existing atr entry can be ignored due to state {}", attempt_state_name(it->state()));
543
548
  return cb(std::nullopt);
544
549
  default:
545
- debug("existing atr entry found in state {}, retrying", attempt_state_name(it->state()));
550
+ CB_ATTEMPT_CTX_LOG_DEBUG(
551
+ this, "existing atr entry found in state {}, retrying", attempt_state_name(it->state()));
546
552
  }
547
553
  return check_atr_entry_for_blocking_document(doc, delay, std::move(cb));
548
554
  }
549
555
  }
550
- debug("no blocking atr entry");
556
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "no blocking atr entry");
551
557
  return cb(std::nullopt);
552
558
  }
553
559
  // if we are here, there is still a write-write conflict
@@ -592,10 +598,10 @@ attempt_context_impl::remove(const transaction_get_result& document, VoidCallbac
592
598
  if (check_expiry_pre_commit(STAGE_REMOVE, document.id().key())) {
593
599
  return error_handler(FAIL_EXPIRY, "transaction expired", std::move(cb));
594
600
  }
595
- debug("removing {}", document);
601
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "removing {}", document);
596
602
  if (existing_sm != nullptr) {
597
603
  if (existing_sm->type() == staged_mutation_type::REMOVE) {
598
- debug("found existing REMOVE of {} while removing", document);
604
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "found existing REMOVE of {} while removing", document);
599
605
  return op_completed_with_error(
600
606
  std::move(cb),
601
607
  transaction_operation_failed(FAIL_DOC_NOT_FOUND,
@@ -627,7 +633,7 @@ attempt_context_impl::remove(const transaction_get_result& document, VoidCallbac
627
633
  if (auto ec = hooks_.before_staged_remove(this, document.id().key())) {
628
634
  return error_handler(*ec, "before_staged_remove hook raised error", std::move(cb));
629
635
  }
630
- trace("about to remove doc {} with cas {}", document.id(), document.cas().value());
636
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "about to remove doc {} with cas {}", document.id(), document.cas().value());
631
637
  auto req = create_staging_request(document.id(), &document, "remove");
632
638
  req.cas = document.cas();
633
639
  req.access_deleted = document.links().is_deleted();
@@ -640,7 +646,8 @@ attempt_context_impl::remove(const transaction_get_result& document, VoidCallbac
640
646
  ec = hooks_.after_staged_remove_complete(this, document.id().key());
641
647
  }
642
648
  if (!ec) {
643
- trace("removed doc {} CAS={}, rc={}", document.id(), resp.cas.value(), resp.ctx.ec().message());
649
+ CB_ATTEMPT_CTX_LOG_TRACE(
650
+ this, "removed doc {} CAS={}, rc={}", document.id(), resp.cas.value(), resp.ctx.ec().message());
644
651
  // TODO: this copy... can we do better?
645
652
  transaction_get_result new_res = document;
646
653
  new_res.cas(resp.cas.value());
@@ -672,7 +679,7 @@ attempt_context_impl::remove_staged_insert(const core::document_id& id, VoidCall
672
679
  return op_completed_with_error(std::move(cb), err.retry());
673
680
  }
674
681
  };
675
- debug("removing staged insert {}", id);
682
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "removing staged insert {}", id);
676
683
 
677
684
  if (auto err = hooks_.before_remove_staged_insert(this, id.key()); err) {
678
685
  return error_handler(*err, "before_remove_staged_insert hook returned error", std::move(cb));
@@ -701,7 +708,7 @@ attempt_context_impl::remove_staged_insert(const core::document_id& id, VoidCall
701
708
  op_completed_with_callback(std::move(cb));
702
709
  return;
703
710
  }
704
- debug("remove_staged_insert got error {}", *ec);
711
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "remove_staged_insert got error {}", *ec);
705
712
  return error_handler(*ec, resp.ctx.ec().message(), std::move(cb));
706
713
  });
707
714
  }
@@ -738,7 +745,7 @@ wrap_query_request(const couchbase::transactions::transaction_query_options& opt
738
745
  }
739
746
 
740
747
  void
741
- attempt_context_impl::query_begin_work(std::function<void(std::exception_ptr)>&& cb)
748
+ attempt_context_impl::query_begin_work(std::optional<std::string> query_context, std::function<void(std::exception_ptr)>&& cb)
742
749
  {
743
750
  // construct the txn_data and query options for the existing transaction
744
751
  couchbase::transactions::transaction_query_options opts;
@@ -784,19 +791,20 @@ attempt_context_impl::query_begin_work(std::function<void(std::exception_ptr)>&&
784
791
  }
785
792
  txdata["mutations"] = mutations;
786
793
  std::vector<core::json_string> params;
787
- trace("begin_work using txdata: {}", core::utils::json::generate(txdata));
794
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "begin_work using txdata: {}", core::utils::json::generate(txdata));
788
795
  wrap_query(BEGIN_WORK,
789
796
  opts,
790
797
  params,
791
798
  txdata,
792
799
  STAGE_QUERY_BEGIN_WORK,
793
800
  false,
801
+ query_context,
794
802
  [this, cb = std::move(cb)](std::exception_ptr err, core::operations::query_response resp) mutable {
795
803
  if (resp.served_by_node.empty()) {
796
- trace("begin_work didn't reach a query node, resetting mode to kv");
804
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "begin_work didn't reach a query node, resetting mode to kv");
797
805
  op_list_.reset_query_mode();
798
806
  } else {
799
- trace("begin_work setting query node to {}", resp.served_by_node);
807
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "begin_work setting query node to {}", resp.served_by_node);
800
808
  op_list_.set_query_node(resp.served_by_node);
801
809
  }
802
810
  // we check for expiry _after_ this call, so we always set the query node if we can.
@@ -841,7 +849,8 @@ attempt_context_impl::handle_query_error(const core::operations::query_response&
841
849
  }
842
850
  auto tx_resp = couchbase::core::impl::build_transaction_query_result(resp);
843
851
  // TODO: look at ambiguous and unambiguous timeout errors vs the codes, etc...
844
- trace("handling query error {}, {} errors in meta_data", resp.ctx.ec.message(), resp.meta.errors ? "has" : "no");
852
+ CB_ATTEMPT_CTX_LOG_TRACE(
853
+ this, "handling query error {}, {} errors in meta_data", resp.ctx.ec.message(), resp.meta.errors ? "has" : "no");
845
854
  if (resp.ctx.ec == couchbase::errc::common::ambiguous_timeout || resp.ctx.ec == couchbase::errc::common::unambiguous_timeout) {
846
855
  return std::make_exception_ptr(query_attempt_expired(tx_resp.ctx()));
847
856
  }
@@ -860,7 +869,7 @@ attempt_context_impl::handle_query_error(const core::operations::query_response&
860
869
 
861
870
  // just chose first one, to start with...
862
871
  auto chosen_error = choose_error(errors);
863
- trace("chosen query error: {}", jsonify(chosen_error));
872
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "chosen query error: {}", jsonify(chosen_error));
864
873
  auto code = chosen_error.at("code").as<uint64_t>();
865
874
 
866
875
  // we have a fixed strategy for these errors...
@@ -907,7 +916,7 @@ attempt_context_impl::handle_query_error(const core::operations::query_response&
907
916
  } else if (raise == std::string("failed_post_commit")) {
908
917
  err.failed_post_commit();
909
918
  } else if (raise != std::string("failed")) {
910
- trace("unknown value in raise field: {}, raising failed", raise);
919
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "unknown value in raise field: {}, raising failed", raise);
911
920
  }
912
921
  return std::make_exception_ptr(err);
913
922
  }
@@ -919,17 +928,19 @@ attempt_context_impl::handle_query_error(const core::operations::query_response&
919
928
  void
920
929
  attempt_context_impl::do_query(const std::string& statement,
921
930
  const couchbase::transactions::transaction_query_options& opts,
931
+ std::optional<std::string> query_context,
922
932
  QueryCallback&& cb)
923
933
  {
924
934
  std::vector<core::json_string> params;
925
935
  tao::json::value txdata;
926
- trace("do_query called with statement {}", statement);
936
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "do_query called with statement {}", statement);
927
937
  wrap_query(statement,
928
938
  opts,
929
939
  params,
930
940
  txdata,
931
941
  STAGE_QUERY,
932
942
  true,
943
+ query_context,
933
944
  [this, cb = std::move(cb)](std::exception_ptr err, core::operations::query_response resp) mutable {
934
945
  if (err) {
935
946
  return op_completed_with_error(std::move(cb), err);
@@ -961,6 +972,7 @@ attempt_context_impl::wrap_query(const std::string& statement,
961
972
  const tao::json::value& txdata,
962
973
  const std::string& hook_point,
963
974
  bool check_expiry,
975
+ std::optional<std::string> query_context,
964
976
  std::function<void(std::exception_ptr, core::operations::query_response)>&& cb)
965
977
  {
966
978
  auto req = wrap_query_request(opts, overall_);
@@ -972,8 +984,10 @@ attempt_context_impl::wrap_query(const std::string& statement,
972
984
  }
973
985
  }
974
986
  // set the query_context, if one has been set, unless this query already has one
975
- if (!req.scope_qualifier && !query_context_.empty()) {
976
- req.scope_qualifier = query_context_;
987
+ if (!query_context && !query_context_.empty()) {
988
+ req.query_context = query_context_;
989
+ } else if (query_context) {
990
+ req.query_context = query_context;
977
991
  }
978
992
 
979
993
  if (check_expiry) {
@@ -1003,9 +1017,9 @@ attempt_context_impl::wrap_query(const std::string& statement,
1003
1017
  }
1004
1018
  return cb(std::make_exception_ptr(transaction_operation_failed(*ec, "before_query hook raised error")), {});
1005
1019
  }
1006
- trace("http request: {}", dump_request(req));
1020
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "http request: {}", dump_request(req));
1007
1021
  overall_.cluster_ref()->execute(req, [this, cb = std::move(cb)](core::operations::query_response resp) mutable {
1008
- trace("response: {} status: {}", resp.ctx.http_body, resp.meta.status);
1022
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "response: {} status: {}", resp.ctx.http_body, resp.meta.status);
1009
1023
  if (auto ec = hooks_.after_query(this, resp.ctx.statement)) {
1010
1024
  auto err = std::make_exception_ptr(transaction_operation_failed(*ec, "after_query hook raised error"));
1011
1025
  return cb(err, {});
@@ -1017,34 +1031,38 @@ attempt_context_impl::wrap_query(const std::string& statement,
1017
1031
  void
1018
1032
  attempt_context_impl::query(const std::string& statement,
1019
1033
  const couchbase::transactions::transaction_query_options& options,
1034
+ std::optional<std::string> query_context,
1020
1035
  QueryCallback&& cb)
1021
1036
  {
1022
1037
  return cache_error_async(cb, [&]() {
1023
1038
  check_if_done(cb);
1024
1039
  // decrement in_flight, as we just incremented it in cache_error_async.
1025
1040
  op_list_.set_query_mode(
1026
- [this, statement, options, cb]() mutable {
1027
- // set query context if set in query options.
1028
- if (auto query_context = options.get_query_options().build().scope_qualifier; query_context) {
1041
+ [this, statement, options, query_context, cb]() mutable {
1042
+ // set query context if set
1043
+ if (query_context) {
1029
1044
  query_context_ = query_context.value();
1030
1045
  }
1031
- query_begin_work([this, statement, options, cb = std::move(cb)](std::exception_ptr err) mutable {
1032
- if (err) {
1033
- return op_completed_with_error(std::move(cb), err);
1034
- }
1035
- return do_query(statement, options, std::move(cb));
1036
- });
1046
+ query_begin_work(query_context,
1047
+ [this, statement, query_context, options, cb = std::move(cb)](std::exception_ptr err) mutable {
1048
+ if (err) {
1049
+ return op_completed_with_error(std::move(cb), err);
1050
+ }
1051
+ return do_query(statement, options, query_context, std::move(cb));
1052
+ });
1037
1053
  },
1038
- [this, statement, options, cb]() mutable { return do_query(statement, options, std::move(cb)); });
1054
+ [this, statement, options, query_context, cb]() mutable { return do_query(statement, options, query_context, std::move(cb)); });
1039
1055
  });
1040
1056
  }
1041
1057
 
1042
1058
  core::operations::query_response
1043
- attempt_context_impl::do_core_query(const std::string& statement, const couchbase::transactions::transaction_query_options& options)
1059
+ attempt_context_impl::do_core_query(const std::string& statement,
1060
+ const couchbase::transactions::transaction_query_options& options,
1061
+ std::optional<std::string> query_context)
1044
1062
  {
1045
1063
  auto barrier = std::make_shared<std::promise<core::operations::query_response>>();
1046
1064
  auto f = barrier->get_future();
1047
- query(statement, options, [barrier](std::exception_ptr err, std::optional<core::operations::query_response> resp) {
1065
+ query(statement, options, query_context, [barrier](std::exception_ptr err, std::optional<core::operations::query_response> resp) {
1048
1066
  if (err) {
1049
1067
  return barrier->set_exception(err);
1050
1068
  }
@@ -1054,10 +1072,12 @@ attempt_context_impl::do_core_query(const std::string& statement, const couchbas
1054
1072
  }
1055
1073
 
1056
1074
  couchbase::transactions::transaction_query_result_ptr
1057
- attempt_context_impl::do_public_query(const std::string& statement, const couchbase::transactions::transaction_query_options& opts)
1075
+ attempt_context_impl::do_public_query(const std::string& statement,
1076
+ const couchbase::transactions::transaction_query_options& opts,
1077
+ std::optional<std::string> query_context)
1058
1078
  {
1059
1079
  try {
1060
- auto result = do_core_query(statement, opts);
1080
+ auto result = do_core_query(statement, opts, query_context);
1061
1081
  return std::make_shared<couchbase::transactions::transaction_query_result>(core::impl::build_transaction_query_result(result));
1062
1082
  } catch (const transaction_operation_failed& e) {
1063
1083
  return std::make_shared<couchbase::transactions::transaction_query_result>(e.get_error_ctx());
@@ -1110,6 +1130,7 @@ attempt_context_impl::get_with_query(const core::document_id& id, bool optional,
1110
1130
  make_kv_txdata(),
1111
1131
  STAGE_QUERY_KV_GET,
1112
1132
  true,
1133
+ {},
1113
1134
  [this, id, optional, cb = std::move(cb)](std::exception_ptr err, core::operations::query_response resp) mutable {
1114
1135
  if (resp.ctx.ec == couchbase::errc::key_value::document_not_found) {
1115
1136
  return op_completed_with_callback(std::move(cb), std::optional<transaction_get_result>());
@@ -1121,7 +1142,7 @@ attempt_context_impl::get_with_query(const core::document_id& id, bool optional,
1121
1142
  return op_completed_with_error(
1122
1143
  std::move(cb), transaction_operation_failed(FAIL_DOC_NOT_FOUND, "document not found"));
1123
1144
  }
1124
- trace("get_with_query got: {}", resp.rows.front());
1145
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "get_with_query got: {}", resp.rows.front());
1125
1146
  transaction_get_result doc(id, core::utils::json::parse(resp.rows.front()));
1126
1147
  return op_completed_with_callback(std::move(cb), std::optional<transaction_get_result>(doc));
1127
1148
  } catch (const std::exception& e) {
@@ -1157,6 +1178,7 @@ attempt_context_impl::insert_raw_with_query(const core::document_id& id, const s
1157
1178
  make_kv_txdata(),
1158
1179
  STAGE_QUERY_KV_INSERT,
1159
1180
  true,
1181
+ {},
1160
1182
  [this, id, cb = std::move(cb)](std::exception_ptr err, core::operations::query_response resp) mutable {
1161
1183
  if (err) {
1162
1184
  try {
@@ -1175,7 +1197,7 @@ attempt_context_impl::insert_raw_with_query(const core::document_id& id, const s
1175
1197
  }
1176
1198
  // make a transaction_get_result from the row...
1177
1199
  try {
1178
- trace("insert_raw_with_query got: {}", resp.rows.front());
1200
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "insert_raw_with_query got: {}", resp.rows.front());
1179
1201
  transaction_get_result doc(id, core::utils::json::parse(resp.rows.front()));
1180
1202
  return op_completed_with_callback(std::move(cb), std::optional<transaction_get_result>(doc));
1181
1203
  } catch (const std::exception& e) {
@@ -1200,6 +1222,7 @@ attempt_context_impl::replace_raw_with_query(const transaction_get_result& docum
1200
1222
  make_kv_txdata(document),
1201
1223
  STAGE_QUERY_KV_REPLACE,
1202
1224
  true,
1225
+ {},
1203
1226
  [this, id = document.id(), cb = std::move(cb)](std::exception_ptr err, core::operations::query_response resp) mutable {
1204
1227
  if (err) {
1205
1228
  try {
@@ -1218,7 +1241,7 @@ attempt_context_impl::replace_raw_with_query(const transaction_get_result& docum
1218
1241
  }
1219
1242
  // make a transaction_get_result from the row...
1220
1243
  try {
1221
- trace("replace_raw_with_query got: {}", resp.rows.front());
1244
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "replace_raw_with_query got: {}", resp.rows.front());
1222
1245
  transaction_get_result doc(id, core::utils::json::parse(resp.rows.front()));
1223
1246
  return op_completed_with_callback(std::move(cb), std::optional<transaction_get_result>(doc));
1224
1247
  } catch (const std::exception& e) {
@@ -1242,6 +1265,7 @@ attempt_context_impl::remove_with_query(const transaction_get_result& document,
1242
1265
  make_kv_txdata(document),
1243
1266
  STAGE_QUERY_KV_REMOVE,
1244
1267
  true,
1268
+ {},
1245
1269
  [this, id = document.id(), cb = std::move(cb)](std::exception_ptr err, core::operations::query_response /* resp */) mutable {
1246
1270
  if (err) {
1247
1271
  try {
@@ -1268,7 +1292,7 @@ void
1268
1292
  attempt_context_impl::commit_with_query(VoidCallback&& cb)
1269
1293
  {
1270
1294
  core::operations::query_request req;
1271
- trace("commit_with_query called");
1295
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "commit_with_query called");
1272
1296
  couchbase::transactions::transaction_query_options opts;
1273
1297
  std::vector<core::json_string> params;
1274
1298
  wrap_query(
@@ -1278,6 +1302,7 @@ attempt_context_impl::commit_with_query(VoidCallback&& cb)
1278
1302
  make_kv_txdata(std::nullopt),
1279
1303
  STAGE_QUERY_COMMIT,
1280
1304
  true,
1305
+ {},
1281
1306
  [this, cb = std::move(cb)](std::exception_ptr err, core::operations::query_response /* resp */) mutable {
1282
1307
  is_done_ = true;
1283
1308
  if (err) {
@@ -1305,7 +1330,7 @@ void
1305
1330
  attempt_context_impl::rollback_with_query(VoidCallback&& cb)
1306
1331
  {
1307
1332
  core::operations::query_request req;
1308
- trace("rollback_with_query called");
1333
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "rollback_with_query called");
1309
1334
  couchbase::transactions::transaction_query_options opts;
1310
1335
  std::vector<core::json_string> params;
1311
1336
  wrap_query(ROLLBACK,
@@ -1314,6 +1339,7 @@ attempt_context_impl::rollback_with_query(VoidCallback&& cb)
1314
1339
  make_kv_txdata(std::nullopt),
1315
1340
  STAGE_QUERY_ROLLBACK,
1316
1341
  true,
1342
+ {},
1317
1343
  [this, cb = std::move(cb)](std::exception_ptr err, core::operations::query_response /* resp */) mutable {
1318
1344
  is_done_ = true;
1319
1345
  if (err) {
@@ -1322,13 +1348,14 @@ attempt_context_impl::rollback_with_query(VoidCallback&& cb)
1322
1348
  } catch (const transaction_operation_failed&) {
1323
1349
  return cb(std::current_exception());
1324
1350
  } catch (const query_attempt_not_found& e) {
1325
- debug("got query_attempt_not_found, assuming query was already rolled back successfullly: {}", e.what());
1351
+ CB_ATTEMPT_CTX_LOG_DEBUG(
1352
+ this, "got query_attempt_not_found, assuming query was already rolled back successfullly: {}", e.what());
1326
1353
  } catch (const std::exception& e) {
1327
1354
  return cb(std::make_exception_ptr(transaction_operation_failed(FAIL_OTHER, e.what()).no_rollback()));
1328
1355
  }
1329
1356
  }
1330
1357
  state(attempt_state::ROLLED_BACK);
1331
- trace("rollback successful");
1358
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "rollback successful");
1332
1359
  return cb({});
1333
1360
  });
1334
1361
  }
@@ -1358,7 +1385,7 @@ attempt_context_impl::atr_commit(bool ambiguity_resolution_mode)
1358
1385
  staged_mutations_->extract_to(prefix, req);
1359
1386
  auto barrier = std::make_shared<std::promise<result>>();
1360
1387
  auto f = barrier->get_future();
1361
- trace("updating atr {}, setting to {}", req.id, attempt_state_name(attempt_state::COMMITTED));
1388
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "updating atr {}, setting to {}", req.id, attempt_state_name(attempt_state::COMMITTED));
1362
1389
  overall_.cluster_ref()->execute(
1363
1390
  req, [barrier](core::operations::mutate_in_response resp) { barrier->set_value(result::create_from_subdoc_response(resp)); });
1364
1391
  auto res = wrap_operation_future(f, false);
@@ -1381,7 +1408,7 @@ attempt_context_impl::atr_commit(bool ambiguity_resolution_mode)
1381
1408
  throw out;
1382
1409
  }
1383
1410
  case FAIL_AMBIGUOUS:
1384
- debug("atr_commit got FAIL_AMBIGUOUS, resolving ambiguity...");
1411
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "atr_commit got FAIL_AMBIGUOUS, resolving ambiguity...");
1385
1412
  ambiguity_resolution_mode = true;
1386
1413
  throw retry_operation(e.what());
1387
1414
  case FAIL_TRANSIENT:
@@ -1427,11 +1454,12 @@ attempt_context_impl::atr_commit(bool ambiguity_resolution_mode)
1427
1454
  throw out;
1428
1455
  }
1429
1456
  default: {
1430
- error("failed to commit transaction {}, attempt {}, ambiguity_resolution_mode {}, with error {}",
1431
- transaction_id(),
1432
- id(),
1433
- ambiguity_resolution_mode,
1434
- e.what());
1457
+ CB_ATTEMPT_CTX_LOG_ERROR(this,
1458
+ "failed to commit transaction {}, attempt {}, ambiguity_resolution_mode {}, with error {}",
1459
+ transaction_id(),
1460
+ id(),
1461
+ ambiguity_resolution_mode,
1462
+ e.what());
1435
1463
  auto out = transaction_operation_failed(ec, e.what());
1436
1464
  if (ambiguity_resolution_mode) {
1437
1465
  out.no_rollback().ambiguous();
@@ -1464,7 +1492,7 @@ attempt_context_impl::atr_commit_ambiguity_resolution()
1464
1492
  req, [barrier](core::operations::lookup_in_response resp) { barrier->set_value(result::create_from_subdoc_response(resp)); });
1465
1493
  auto res = wrap_operation_future(f);
1466
1494
  auto atr_status_raw = res.values[0].content_as<std::string>();
1467
- debug("atr_commit_ambiguity_resolution read atr state {}", atr_status_raw);
1495
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "atr_commit_ambiguity_resolution read atr state {}", atr_status_raw);
1468
1496
  auto atr_status = attempt_state_value(atr_status_raw);
1469
1497
  switch (atr_status) {
1470
1498
  case attempt_state::COMMITTED:
@@ -1510,7 +1538,7 @@ attempt_context_impl::atr_complete()
1510
1538
  if (!!(ec = error_if_expired_and_not_in_overtime(STAGE_ATR_COMPLETE, {}))) {
1511
1539
  throw client_error(*ec, "atr_complete threw error");
1512
1540
  }
1513
- debug("removing attempt {} from atr", atr_id_.value());
1541
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "removing attempt {} from atr", atr_id_.value());
1514
1542
  std::string prefix(ATR_FIELD_ATTEMPTS + "." + id());
1515
1543
  core::operations::mutate_in_request req{ atr_id_.value() };
1516
1544
  req.specs =
@@ -1535,7 +1563,7 @@ attempt_context_impl::atr_complete()
1535
1563
  case FAIL_HARD:
1536
1564
  throw transaction_operation_failed(ec, er.what()).no_rollback().failed_post_commit();
1537
1565
  default:
1538
- info("ignoring error in atr_complete {}", er.what());
1566
+ CB_ATTEMPT_CTX_LOG_INFO(this, "ignoring error in atr_complete {}", er.what());
1539
1567
  }
1540
1568
  }
1541
1569
  }
@@ -1558,10 +1586,10 @@ attempt_context_impl::commit(VoidCallback&& cb)
1558
1586
  void
1559
1587
  attempt_context_impl::commit()
1560
1588
  {
1561
- debug("waiting on ops to finish...");
1589
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "waiting on ops to finish...");
1562
1590
  op_list_.wait_and_block_ops();
1563
1591
  existing_error(false);
1564
- debug("commit {}", id());
1592
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "commit {}", id());
1565
1593
  if (op_list_.get_mode().is_query()) {
1566
1594
  auto barrier = std::make_shared<std::promise<void>>();
1567
1595
  auto f = barrier->get_future();
@@ -1579,13 +1607,13 @@ attempt_context_impl::commit()
1579
1607
  }
1580
1608
  if (atr_id_ && !atr_id_->key().empty() && !is_done_) {
1581
1609
  retry_op_exp<void>([&]() { atr_commit(false); });
1582
- staged_mutations_->commit(*this);
1610
+ staged_mutations_->commit(this);
1583
1611
  atr_complete();
1584
1612
  is_done_ = true;
1585
1613
  } else {
1586
1614
  // no mutation, no need to commit
1587
1615
  if (!is_done_) {
1588
- debug("calling commit on attempt that has got no mutations, skipping");
1616
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "calling commit on attempt that has got no mutations, skipping");
1589
1617
  is_done_ = true;
1590
1618
  return;
1591
1619
  } // do not rollback or retry
@@ -1629,17 +1657,17 @@ attempt_context_impl::atr_abort()
1629
1657
  if (ec) {
1630
1658
  throw client_error(*ec, "after_atr_aborted hook threw error");
1631
1659
  }
1632
- debug("rollback completed atr abort phase");
1660
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "rollback completed atr abort phase");
1633
1661
  } catch (const client_error& e) {
1634
1662
  auto ec = e.ec();
1635
- trace("atr_abort got {} {}", ec, e.what());
1663
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "atr_abort got {} {}", ec, e.what());
1636
1664
  if (expiry_overtime_mode_.load()) {
1637
- debug("atr_abort got error \"{}\" while in overtime mode", e.what());
1665
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "atr_abort got error \"{}\" while in overtime mode", e.what());
1638
1666
  throw transaction_operation_failed(FAIL_EXPIRY, std::string("expired in atr_abort with {} ") + e.what())
1639
1667
  .no_rollback()
1640
1668
  .expired();
1641
1669
  }
1642
- debug("atr_abort got error {}", ec);
1670
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "atr_abort got error {}", ec);
1643
1671
  switch (ec) {
1644
1672
  case FAIL_EXPIRY:
1645
1673
  expiry_overtime_mode_ = true;
@@ -1692,28 +1720,28 @@ attempt_context_impl::atr_rollback_complete()
1692
1720
  } catch (const client_error& e) {
1693
1721
  auto ec = e.ec();
1694
1722
  if (expiry_overtime_mode_.load()) {
1695
- debug("atr_rollback_complete error while in overtime mode {}", e.what());
1723
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "atr_rollback_complete error while in overtime mode {}", e.what());
1696
1724
  throw transaction_operation_failed(FAIL_EXPIRY, std::string("expired in atr_rollback_complete with {} ") + e.what())
1697
1725
  .no_rollback()
1698
1726
  .expired();
1699
1727
  }
1700
- debug("atr_rollback_complete got error {}", ec);
1728
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "atr_rollback_complete got error {}", ec);
1701
1729
  switch (ec) {
1702
1730
  case FAIL_DOC_NOT_FOUND:
1703
1731
  case FAIL_PATH_NOT_FOUND:
1704
- debug("atr {} not found, ignoring", atr_id_->key());
1732
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "atr {} not found, ignoring", atr_id_->key());
1705
1733
  is_done_ = true;
1706
1734
  break;
1707
1735
  case FAIL_ATR_FULL:
1708
- debug("atr {} full!", atr_id_->key());
1736
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "atr {} full!", atr_id_->key());
1709
1737
  throw retry_operation(e.what());
1710
1738
  case FAIL_HARD:
1711
1739
  throw transaction_operation_failed(ec, e.what()).no_rollback();
1712
1740
  case FAIL_EXPIRY:
1713
- debug("timed out writing atr {}", atr_id_->key());
1741
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "timed out writing atr {}", atr_id_->key());
1714
1742
  throw transaction_operation_failed(ec, e.what()).no_rollback().expired();
1715
1743
  default:
1716
- debug("retrying atr_rollback_complete");
1744
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "retrying atr_rollback_complete");
1717
1745
  throw retry_operation(e.what());
1718
1746
  }
1719
1747
  }
@@ -1743,7 +1771,7 @@ void
1743
1771
  attempt_context_impl::rollback()
1744
1772
  {
1745
1773
  op_list_.wait_and_block_ops();
1746
- debug("rolling back {}", id());
1774
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "rolling back {}", id());
1747
1775
  if (op_list_.get_mode().is_query()) {
1748
1776
  auto barrier = std::make_shared<std::promise<void>>();
1749
1777
  auto f = barrier->get_future();
@@ -1760,13 +1788,13 @@ attempt_context_impl::rollback()
1760
1788
  check_expiry_during_commit_or_rollback(STAGE_ROLLBACK, std::nullopt);
1761
1789
  if (!atr_id_ || atr_id_->key().empty() || state() == attempt_state::NOT_STARTED) {
1762
1790
  // TODO: check this, but if we try to rollback an empty txn, we should prevent a subsequent commit
1763
- debug("rollback called on txn with no mutations");
1791
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "rollback called on txn with no mutations");
1764
1792
  is_done_ = true;
1765
1793
  return;
1766
1794
  }
1767
1795
  if (is_done()) {
1768
1796
  std::string msg("Transaction already done, cannot rollback");
1769
- error(msg);
1797
+ CB_ATTEMPT_CTX_LOG_ERROR(this, msg);
1770
1798
  // need to raise a FAIL_OTHER which is not retryable or rollback-able
1771
1799
  throw transaction_operation_failed(FAIL_OTHER, msg).no_rollback();
1772
1800
  }
@@ -1774,14 +1802,14 @@ attempt_context_impl::rollback()
1774
1802
  // (1) atr_abort
1775
1803
  retry_op_exp<void>([&]() { atr_abort(); });
1776
1804
  // (2) rollback staged mutations
1777
- staged_mutations_->rollback(*this);
1778
- debug("rollback completed unstaging docs");
1805
+ staged_mutations_->rollback(this);
1806
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "rollback completed unstaging docs");
1779
1807
 
1780
1808
  // (3) atr_rollback
1781
1809
  retry_op_exp<void>([&]() { atr_rollback_complete(); });
1782
1810
  } catch (const client_error& e) {
1783
1811
  error_class ec = e.ec();
1784
- error("rollback transaction {}, attempt {} fail with error {}", transaction_id(), id(), e.what());
1812
+ CB_ATTEMPT_CTX_LOG_ERROR(this, "rollback transaction {}, attempt {} fail with error {}", transaction_id(), id(), e.what());
1785
1813
  if (ec == FAIL_HARD) {
1786
1814
  throw transaction_operation_failed(ec, e.what()).no_rollback();
1787
1815
  }
@@ -1794,10 +1822,10 @@ attempt_context_impl::has_expired_client_side(std::string place, std::optional<c
1794
1822
  bool over = overall_.has_expired_client_side();
1795
1823
  bool hook = hooks_.has_expired_client_side(this, place, doc_id);
1796
1824
  if (over) {
1797
- debug("{} expired in {}", id(), place);
1825
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "{} expired in {}", id(), place);
1798
1826
  }
1799
1827
  if (hook) {
1800
- debug("{} fake expiry in {}", id(), place);
1828
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "{} fake expiry in {}", id(), place);
1801
1829
  }
1802
1830
  return over || hook;
1803
1831
  }
@@ -1806,7 +1834,8 @@ bool
1806
1834
  attempt_context_impl::check_expiry_pre_commit(std::string stage, std::optional<const std::string> doc_id)
1807
1835
  {
1808
1836
  if (has_expired_client_side(stage, std::move(doc_id))) {
1809
- debug("{} has expired in stage {}, entering expiry-overtime mode - will make one attempt to rollback", id(), stage);
1837
+ CB_ATTEMPT_CTX_LOG_DEBUG(
1838
+ this, "{} has expired in stage {}, entering expiry-overtime mode - will make one attempt to rollback", id(), stage);
1810
1839
 
1811
1840
  // [EXP-ROLLBACK] Combo of setting this mode and throwing AttemptExpired will result in an attempt to rollback, which will
1812
1841
  // ignore expiry, and bail out if anything fails
@@ -1820,11 +1849,11 @@ std::optional<error_class>
1820
1849
  attempt_context_impl::error_if_expired_and_not_in_overtime(const std::string& stage, std::optional<const std::string> doc_id)
1821
1850
  {
1822
1851
  if (expiry_overtime_mode_.load()) {
1823
- debug("not doing expired check in {} as already in expiry-overtime", stage);
1852
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "not doing expired check in {} as already in expiry-overtime", stage);
1824
1853
  return {};
1825
1854
  }
1826
1855
  if (has_expired_client_side(stage, std::move(doc_id))) {
1827
- debug("expired in {}", stage);
1856
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "expired in {}", stage);
1828
1857
  return FAIL_EXPIRY;
1829
1858
  }
1830
1859
  return {};
@@ -1836,11 +1865,12 @@ attempt_context_impl::check_expiry_during_commit_or_rollback(const std::string&
1836
1865
  // [EXP-COMMIT-OVERTIME]
1837
1866
  if (!expiry_overtime_mode_.load()) {
1838
1867
  if (has_expired_client_side(stage, std::move(doc_id))) {
1839
- debug("{} has expired in stage {}, entering expiry-overtime mode (one attempt to complete commit)", id(), stage);
1868
+ CB_ATTEMPT_CTX_LOG_DEBUG(
1869
+ this, "{} has expired in stage {}, entering expiry-overtime mode (one attempt to complete commit)", id(), stage);
1840
1870
  expiry_overtime_mode_ = true;
1841
1871
  }
1842
1872
  } else {
1843
- debug("{} ignoring expiry in stage {} as in expiry-overtime mode", id(), stage);
1873
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "{} ignoring expiry in stage {} as in expiry-overtime mode", id(), stage);
1844
1874
  }
1845
1875
  }
1846
1876
  template<typename Handler>
@@ -1859,7 +1889,7 @@ attempt_context_impl::set_atr_pending_locked(const core::document_id& id, std::u
1859
1889
  auto error_handler =
1860
1890
  [this, &lock](error_class ec, const std::string& message, const core::document_id& doc_id, Handler&& fn) mutable {
1861
1891
  transaction_operation_failed err(ec, message);
1862
- trace("got {} trying to set atr to pending", message);
1892
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "got {} trying to set atr to pending", message);
1863
1893
  if (expiry_overtime_mode_.load()) {
1864
1894
  return fn(err.no_rollback().expired());
1865
1895
  }
@@ -1877,7 +1907,7 @@ attempt_context_impl::set_atr_pending_locked(const core::document_id& id, std::u
1877
1907
  // Retry just this
1878
1908
  overall_.retry_delay();
1879
1909
  // keep it locked!
1880
- debug("got {}, retrying set atr pending", ec);
1910
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "got {}, retrying set atr pending", ec);
1881
1911
  return set_atr_pending_locked(doc_id, std::move(lock), std::move(fn));
1882
1912
  case FAIL_TRANSIENT:
1883
1913
  // Retry txn
@@ -1891,7 +1921,7 @@ attempt_context_impl::set_atr_pending_locked(const core::document_id& id, std::u
1891
1921
  if (auto ec = hooks_.before_atr_pending(this); ec) {
1892
1922
  return error_handler(*ec, "before_atr_pending hook raised error", id, std::forward<Handler>(fn));
1893
1923
  }
1894
- debug("updating atr {}", atr_id_.value());
1924
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "updating atr {}", atr_id_.value());
1895
1925
 
1896
1926
  // FIXME: do we need to capture "now" here?
1897
1927
  // std::chrono::time_point<std::chrono::steady_clock> now = std::chrono::steady_clock::now();
@@ -1935,7 +1965,7 @@ attempt_context_impl::set_atr_pending_locked(const core::document_id& id, std::u
1935
1965
  }
1936
1966
  if (!ec) {
1937
1967
  state(attempt_state::PENDING);
1938
- debug("set ATR {} to Pending, got CAS (start time) {}", atr_id_.value(), resp.cas.value());
1968
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "set ATR {} to Pending, got CAS (start time) {}", atr_id_.value(), resp.cas.value());
1939
1969
  return fn(std::nullopt);
1940
1970
  }
1941
1971
  return error_handler(*ec,
@@ -1945,7 +1975,7 @@ attempt_context_impl::set_atr_pending_locked(const core::document_id& id, std::u
1945
1975
  });
1946
1976
  }
1947
1977
  } catch (const std::exception& e) {
1948
- error("unexpected error setting atr pending {}", e.what());
1978
+ CB_ATTEMPT_CTX_LOG_ERROR(this, "unexpected error setting atr pending {}", e.what());
1949
1979
  return fn(transaction_operation_failed(FAIL_OTHER, "unexpected error setting atr pending"));
1950
1980
  }
1951
1981
  }
@@ -1986,13 +2016,13 @@ attempt_context_impl::do_get(const core::document_id& id, const std::optional<st
1986
2016
 
1987
2017
  staged_mutation* own_write = check_for_own_write(id);
1988
2018
  if (own_write) {
1989
- debug("found own-write of mutated doc {}", id);
2019
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "found own-write of mutated doc {}", id);
1990
2020
  return cb(std::nullopt, std::nullopt, transaction_get_result::create_from(own_write->doc(), own_write->content()));
1991
2021
  }
1992
2022
  staged_mutation* own_remove = staged_mutations_->find_remove(id);
1993
2023
  if (own_remove) {
1994
2024
  auto msg = fmt::format("found own-write of removed doc {}", id);
1995
- debug(msg);
2025
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, msg);
1996
2026
  return cb(FAIL_DOC_NOT_FOUND, msg, std::nullopt);
1997
2027
  }
1998
2028
 
@@ -2010,11 +2040,12 @@ attempt_context_impl::do_get(const core::document_id& id, const std::optional<st
2010
2040
  }
2011
2041
  if (!ec) {
2012
2042
  if (doc->links().is_document_in_transaction()) {
2013
- debug("doc {} in transaction, resolving_missing_atr_entry={}", *doc, resolving_missing_atr_entry.value_or("-"));
2043
+ CB_ATTEMPT_CTX_LOG_DEBUG(
2044
+ this, "doc {} in transaction, resolving_missing_atr_entry={}", *doc, resolving_missing_atr_entry.value_or("-"));
2014
2045
 
2015
2046
  if (resolving_missing_atr_entry.has_value() &&
2016
2047
  resolving_missing_atr_entry.value() == doc->links().staged_attempt_id()) {
2017
- debug("doc is in lost pending transaction");
2048
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "doc is in lost pending transaction");
2018
2049
 
2019
2050
  if (doc->links().is_document_being_inserted()) {
2020
2051
  // this document is being inserted, so should not be visible yet
@@ -2072,8 +2103,9 @@ attempt_context_impl::do_get(const core::document_id& id, const std::optional<st
2072
2103
  }
2073
2104
  } else {
2074
2105
  // failed to get the ATR entry
2075
- debug("could not get ATR entry, checking again with {}",
2076
- doc->links().staged_attempt_id().value_or("-"));
2106
+ CB_ATTEMPT_CTX_LOG_DEBUG(this,
2107
+ "could not get ATR entry, checking again with {}",
2108
+ doc->links().staged_attempt_id().value_or("-"));
2077
2109
  return do_get(id, doc->links().staged_attempt_id(), cb);
2078
2110
  }
2079
2111
  if (ignore_doc) {
@@ -2083,13 +2115,14 @@ attempt_context_impl::do_get(const core::document_id& id, const std::optional<st
2083
2115
 
2084
2116
  } else {
2085
2117
  // failed to get the ATR
2086
- debug("could not get ATR, checking again with {}", doc->links().staged_attempt_id().value_or("-"));
2118
+ CB_ATTEMPT_CTX_LOG_DEBUG(
2119
+ this, "could not get ATR, checking again with {}", doc->links().staged_attempt_id().value_or("-"));
2087
2120
  return do_get(id, doc->links().staged_attempt_id(), cb);
2088
2121
  }
2089
2122
  });
2090
2123
  } else {
2091
2124
  if (doc->links().is_deleted()) {
2092
- debug("doc not in txn, and is_deleted, so not returning it.");
2125
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "doc not in txn, and is_deleted, so not returning it.");
2093
2126
  // doc has been deleted, not in txn, so don't return it
2094
2127
  return cb(std::nullopt, std::nullopt, std::nullopt);
2095
2128
  }
@@ -2138,7 +2171,7 @@ attempt_context_impl::get_doc(
2138
2171
  overall_.cluster_ref()->execute(req, [this, id, cb = std::move(cb)](core::operations::lookup_in_response resp) {
2139
2172
  auto ec = error_class_from_response(resp);
2140
2173
  if (ec) {
2141
- trace("get_doc got error {} : {}", resp.ctx.ec().message(), *ec);
2174
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "get_doc got error {} : {}", resp.ctx.ec().message(), *ec);
2142
2175
  switch (*ec) {
2143
2176
  case FAIL_PATH_NOT_FOUND:
2144
2177
  return cb(*ec, resp.ctx.ec().message(), transaction_get_result::create_from(resp));
@@ -2164,7 +2197,7 @@ attempt_context_impl::create_staged_insert_error_handler(const core::document_id
2164
2197
  error_class ec,
2165
2198
  const std::string& message)
2166
2199
  {
2167
- trace("create_staged_insert got error class {}: {}", ec, message);
2200
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "create_staged_insert got error class {}: {}", ec, message);
2168
2201
  if (expiry_overtime_mode_.load()) {
2169
2202
  return op_completed_with_error(std::forward<Handler>(cb), transaction_operation_failed(FAIL_EXPIRY, "attempt timed out").expired());
2170
2203
  }
@@ -2176,7 +2209,7 @@ attempt_context_impl::create_staged_insert_error_handler(const core::document_id
2176
2209
  return op_completed_with_error(std::forward<Handler>(cb),
2177
2210
  transaction_operation_failed(ec, "transient error in insert").retry());
2178
2211
  case FAIL_AMBIGUOUS:
2179
- debug("FAIL_AMBIGUOUS in create_staged_insert, retrying");
2212
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "FAIL_AMBIGUOUS in create_staged_insert, retrying");
2180
2213
  delay();
2181
2214
  return create_staged_insert(id, content, cas, delay, std::forward<Handler>(cb));
2182
2215
  case FAIL_OTHER:
@@ -2187,9 +2220,10 @@ attempt_context_impl::create_staged_insert_error_handler(const core::document_id
2187
2220
  case FAIL_DOC_ALREADY_EXISTS:
2188
2221
  case FAIL_CAS_MISMATCH: {
2189
2222
  // special handling for doc already existing
2190
- debug("found existing doc {}, may still be able to insert", id);
2223
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "found existing doc {}, may still be able to insert", id);
2191
2224
  auto error_handler = [this, id, content](error_class ec2, const std::string& err_message, Handler&& cb) mutable {
2192
- trace("after a CAS_MISMATCH or DOC_ALREADY_EXISTS, then got error {} in create_staged_insert", ec2);
2225
+ CB_ATTEMPT_CTX_LOG_TRACE(
2226
+ this, "after a CAS_MISMATCH or DOC_ALREADY_EXISTS, then got error {} in create_staged_insert", ec2);
2193
2227
  if (expiry_overtime_mode_.load()) {
2194
2228
  return op_completed_with_error(std::move(cb), transaction_operation_failed(FAIL_EXPIRY, "attempt timed out").expired());
2195
2229
  }
@@ -2217,10 +2251,11 @@ attempt_context_impl::create_staged_insert_error_handler(const core::document_id
2217
2251
  std::optional<error_class> ec3, std::optional<std::string> err_message, std::optional<transaction_get_result> doc) mutable {
2218
2252
  if (!ec3) {
2219
2253
  if (doc) {
2220
- debug("document {} exists, is_in_transaction {}, is_deleted {} ",
2221
- doc->id(),
2222
- doc->links().is_document_in_transaction(),
2223
- doc->links().is_deleted());
2254
+ CB_ATTEMPT_CTX_LOG_DEBUG(this,
2255
+ "document {} exists, is_in_transaction {}, is_deleted {} ",
2256
+ doc->id(),
2257
+ doc->links().is_document_in_transaction(),
2258
+ doc->links().is_deleted());
2224
2259
 
2225
2260
  if (auto err = forward_compat::check(forward_compat_stage::WWC_INSERTING_GET, doc->links().forward_compat());
2226
2261
  err) {
@@ -2228,13 +2263,14 @@ attempt_context_impl::create_staged_insert_error_handler(const core::document_id
2228
2263
  }
2229
2264
  if (!doc->links().is_document_in_transaction() && doc->links().is_deleted()) {
2230
2265
  // it is just a deleted doc, so we are ok. Let's try again, but with the cas
2231
- debug("create staged insert found existing deleted doc, retrying with cas {}", doc->cas().value());
2266
+ CB_ATTEMPT_CTX_LOG_DEBUG(
2267
+ this, "create staged insert found existing deleted doc, retrying with cas {}", doc->cas().value());
2232
2268
  delay();
2233
2269
  return create_staged_insert(id, content, doc->cas().value(), delay, std::forward<Handler>(cb));
2234
2270
  }
2235
2271
  if (!doc->links().is_document_in_transaction()) {
2236
2272
  // doc was inserted outside txn elsewhere
2237
- trace("doc {} not in txn - was inserted outside txn", id);
2273
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "doc {} not in txn - was inserted outside txn", id);
2238
2274
  return op_completed_with_error(
2239
2275
  std::forward<Handler>(cb),
2240
2276
  document_exists({ couchbase::errc::transaction_op::document_exists_exception, key_value_error_context() }));
@@ -2254,13 +2290,14 @@ attempt_context_impl::create_staged_insert_error_handler(const core::document_id
2254
2290
  if (err) {
2255
2291
  return op_completed_with_error(std::move(cb), *err);
2256
2292
  }
2257
- debug("doc ok to overwrite, retrying create_staged_insert with cas {}", doc->cas().value());
2293
+ CB_ATTEMPT_CTX_LOG_DEBUG(
2294
+ this, "doc ok to overwrite, retrying create_staged_insert with cas {}", doc->cas().value());
2258
2295
  delay();
2259
2296
  return create_staged_insert(id, content, doc->cas().value(), delay, std::forward<Handler>(cb));
2260
2297
  });
2261
2298
  } else {
2262
2299
  // no doc now, just retry entire txn
2263
- trace("got {} from get_doc in exists during staged insert", *ec3);
2300
+ CB_ATTEMPT_CTX_LOG_TRACE(this, "got {} from get_doc in exists during staged insert", *ec3);
2264
2301
  return op_completed_with_error(
2265
2302
  std::move(cb),
2266
2303
  transaction_operation_failed(FAIL_DOC_NOT_FOUND, "insert failed as the doc existed, but now seems to not exist")
@@ -2295,7 +2332,7 @@ attempt_context_impl::create_staged_insert(const core::document_id& id,
2295
2332
  return create_staged_insert_error_handler(
2296
2333
  id, content, cas, std::forward<Delay>(delay), std::forward<Handler>(cb), *ec, "before_staged_insert hook threw error");
2297
2334
  }
2298
- debug("about to insert staged doc {} with cas {}", id, cas);
2335
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "about to insert staged doc {} with cas {}", id, cas);
2299
2336
  auto req = create_staging_request(id, nullptr, "insert", content);
2300
2337
  req.access_deleted = true;
2301
2338
  req.create_as_deleted = true;
@@ -2311,7 +2348,7 @@ attempt_context_impl::create_staged_insert(const core::document_id& id,
2311
2348
  id, content, cas, std::forward<Delay>(delay), std::forward<Handler>(cb), *ec, "after_staged_insert hook threw error");
2312
2349
  }
2313
2350
  if (!resp.ctx.ec()) {
2314
- debug("inserted doc {} CAS={}, {}", id, resp.cas.value(), resp.ctx.ec().message());
2351
+ CB_ATTEMPT_CTX_LOG_DEBUG(this, "inserted doc {} CAS={}, {}", id, resp.cas.value(), resp.ctx.ec().message());
2315
2352
 
2316
2353
  // TODO: clean this up (do most of this in transactions_document(...))
2317
2354
  transaction_links links(atr_id_->key(),