diff options
author | Gregory Wlodarek <gregory.wlodarek@mongodb.com> | 2023-05-05 20:10:27 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-05-05 20:50:53 +0000 |
commit | 07c79a03fbe63f5c9734f68d44513cc15bb5ed2a (patch) | |
tree | 8ab245a93aa12bfa699b5c8e99b716ee532bec8b /src | |
parent | 815022dd56eafabcd8e710331f89122da9769fb5 (diff) | |
download | mongo-07c79a03fbe63f5c9734f68d44513cc15bb5ed2a.tar.gz |
SERVER-76715 Log WriteConflictException reason in writeConflictRetry()
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/catalog/capped_utils.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/concurrency/exception_util.cpp | 8 | ||||
-rw-r--r-- | src/mongo/db/concurrency/exception_util.h | 9 | ||||
-rw-r--r-- | src/mongo/db/query/plan_executor_impl.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/query/plan_yield_policy.cpp | 4 |
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 |