summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGregory Wlodarek <gregory.wlodarek@mongodb.com>2023-05-05 20:10:27 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-05-05 20:50:53 +0000
commit07c79a03fbe63f5c9734f68d44513cc15bb5ed2a (patch)
tree8ab245a93aa12bfa699b5c8e99b716ee532bec8b /src
parent815022dd56eafabcd8e710331f89122da9769fb5 (diff)
downloadmongo-07c79a03fbe63f5c9734f68d44513cc15bb5ed2a.tar.gz
SERVER-76715 Log WriteConflictException reason in writeConflictRetry()
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/catalog/capped_utils.cpp5
-rw-r--r--src/mongo/db/concurrency/exception_util.cpp8
-rw-r--r--src/mongo/db/concurrency/exception_util.h9
-rw-r--r--src/mongo/db/query/plan_executor_impl.cpp3
-rw-r--r--src/mongo/db/query/plan_yield_policy.cpp4
5 files changed, 19 insertions, 10 deletions
diff --git a/src/mongo/db/catalog/capped_utils.cpp b/src/mongo/db/catalog/capped_utils.cpp
index ebaa77a74b4..c018b8889b4 100644
--- a/src/mongo/db/catalog/capped_utils.cpp
+++ b/src/mongo/db/catalog/capped_utils.cpp
@@ -248,10 +248,11 @@ void cloneCollectionAsCapped(OperationContext* opCtx,
// Go to the next document
retries = 0;
- } catch (const WriteConflictException&) {
+ } catch (const WriteConflictException& e) {
CurOp::get(opCtx)->debug().additiveMetrics.incrementWriteConflicts(1);
retries++; // logAndBackoff expects this to be 1 on first call.
- logWriteConflictAndBackoff(retries, "cloneCollectionAsCapped", fromNss.ns());
+ logWriteConflictAndBackoff(
+ retries, "cloneCollectionAsCapped", e.reason(), fromNss.ns());
// Can't use writeConflictRetry since we need to save/restore exec around call to
// abandonSnapshot.
diff --git a/src/mongo/db/concurrency/exception_util.cpp b/src/mongo/db/concurrency/exception_util.cpp
index 37c447d3cd2..5da044911a5 100644
--- a/src/mongo/db/concurrency/exception_util.cpp
+++ b/src/mongo/db/concurrency/exception_util.cpp
@@ -43,13 +43,17 @@ namespace mongo {
MONGO_FAIL_POINT_DEFINE(skipWriteConflictRetries);
-void logWriteConflictAndBackoff(int attempt, StringData operation, StringData ns) {
+void logWriteConflictAndBackoff(int attempt,
+ StringData operation,
+ StringData reason,
+ StringData ns) {
logAndBackoff(4640401,
logv2::LogComponent::kWrite,
logv2::LogSeverity::Debug(1),
static_cast<size_t>(attempt),
"Caught WriteConflictException",
"operation"_attr = operation,
+ "reason"_attr = reason,
logAttrs(NamespaceString(ns)));
}
@@ -133,7 +137,7 @@ void handleTransactionTooLargeForCacheException(OperationContext* opCtx,
// Handle as write conflict.
CurOp::get(opCtx)->debug().additiveMetrics.incrementWriteConflicts(1);
- logWriteConflictAndBackoff(*writeConflictAttempts, opStr, ns);
+ logWriteConflictAndBackoff(*writeConflictAttempts, opStr, e.reason(), ns);
++(*writeConflictAttempts);
opCtx->recoveryUnit()->abandonSnapshot();
}
diff --git a/src/mongo/db/concurrency/exception_util.h b/src/mongo/db/concurrency/exception_util.h
index 6106bcc95ca..dca5b4f109e 100644
--- a/src/mongo/db/concurrency/exception_util.h
+++ b/src/mongo/db/concurrency/exception_util.h
@@ -45,7 +45,10 @@ extern FailPoint skipWriteConflictRetries;
* @param attempt - what attempt is this, 1 based
* @param operation - e.g. "update"
*/
-void logWriteConflictAndBackoff(int attempt, StringData operation, StringData ns);
+void logWriteConflictAndBackoff(int attempt,
+ StringData operation,
+ StringData reason,
+ StringData ns);
void handleTemporarilyUnavailableException(OperationContext* opCtx,
int attempts,
@@ -149,9 +152,9 @@ auto writeConflictRetry(OperationContext* opCtx, StringData opStr, StringData ns
while (true) {
try {
return f();
- } catch (WriteConflictException const&) {
+ } catch (WriteConflictException const& e) {
CurOp::get(opCtx)->debug().additiveMetrics.incrementWriteConflicts(1);
- logWriteConflictAndBackoff(writeConflictAttempts, opStr, ns);
+ logWriteConflictAndBackoff(writeConflictAttempts, opStr, e.reason(), ns);
++writeConflictAttempts;
opCtx->recoveryUnit()->abandonSnapshot();
} catch (TemporarilyUnavailableException const& e) {
diff --git a/src/mongo/db/query/plan_executor_impl.cpp b/src/mongo/db/query/plan_executor_impl.cpp
index 83c475dfd50..ad6df4918cd 100644
--- a/src/mongo/db/query/plan_executor_impl.cpp
+++ b/src/mongo/db/query/plan_executor_impl.cpp
@@ -492,7 +492,8 @@ PlanExecutor::ExecState PlanExecutorImpl::_getNextImpl(Snapshotted<Document>* ob
CurOp::get(_opCtx)->debug().additiveMetrics.incrementWriteConflicts(1);
writeConflictsInARow++;
- logWriteConflictAndBackoff(writeConflictsInARow, "plan execution", _nss.ns());
+ logWriteConflictAndBackoff(
+ writeConflictsInARow, "plan execution", ""_sd, _nss.ns());
}
// Yield next time through the loop.
diff --git a/src/mongo/db/query/plan_yield_policy.cpp b/src/mongo/db/query/plan_yield_policy.cpp
index 6f44d0b652b..0ac2339ab90 100644
--- a/src/mongo/db/query/plan_yield_policy.cpp
+++ b/src/mongo/db/query/plan_yield_policy.cpp
@@ -178,11 +178,11 @@ Status PlanYieldPolicy::yieldOrInterrupt(OperationContext* opCtx,
? stdx::get<const Yieldable*>(yieldable)
: nullptr);
return Status::OK();
- } catch (const WriteConflictException&) {
+ } catch (const WriteConflictException& e) {
if (_callbacks) {
_callbacks->handledWriteConflict(opCtx);
}
- logWriteConflictAndBackoff(attempt, "query yield", ""_sd);
+ logWriteConflictAndBackoff(attempt, "query yield", e.reason(), ""_sd);
// Retry the yielding process.
} catch (...) {
// Errors other than write conflicts don't get retried, and should instead result in