Storage Engine API
write_conflict_exception.h
Go to the documentation of this file.
1 // write_conflict_exception.h
2 
31 #pragma once
32 
33 #include <exception>
34 
35 #include "mongo/base/string_data.h"
36 #include "mongo/db/curop.h"
37 #include "mongo/util/assert_util.h"
38 
39 namespace mongo {
40 
46 class WriteConflictException final : public DBException {
47 public:
49 
56  static void logAndBackoff(int attempt, StringData operation, StringData ns);
57 
62  static AtomicBool trace;
63 
64 private:
66 };
67 
78 template <typename F>
79 auto writeConflictRetry(OperationContext* opCtx, StringData opStr, StringData ns, F&& f) {
80  invariant(opCtx);
81  invariant(opCtx->lockState());
82  invariant(opCtx->recoveryUnit());
83 
84  if (opCtx->lockState()->inAWriteUnitOfWork()) {
85  return f();
86  }
87 
88  int attempts = 0;
89  while (true) {
90  try {
91  return f();
92  } catch (WriteConflictException const&) {
93  ++CurOp::get(opCtx)->debug().writeConflicts;
94  WriteConflictException::logAndBackoff(attempts, opStr, ns);
95  ++attempts;
96  opCtx->recoveryUnit()->abandonSnapshot();
97  }
98  }
99 }
100 
101 } // namespace mongo
Collection *const const NamespaceString & ns
Definition: collection_info_cache_impl.cpp:53
auto writeConflictRetry(OperationContext *opCtx, StringData opStr, StringData ns, F &&f)
Runs the argument function f as many times as needed for f to complete or throw an exception other th...
Definition: write_conflict_exception.h:79
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
static void logAndBackoff(int attempt, StringData operation, StringData ns)
Will log a message if sensible and will do an exponential backoff to make sure we don&#39;t hammer the sa...
Definition: write_conflict_exception.cpp:49
WriteConflictException()
Definition: write_conflict_exception.cpp:42
This is thrown if during a write, two or more operations conflict with each other.
Definition: write_conflict_exception.h:46
static AtomicBool trace
If true, will call printStackTrace on every WriteConflictException created.
Definition: write_conflict_exception.h:62
void defineOnlyInFinalSubclassToPreventSlicing() final
Definition: write_conflict_exception.h:65
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80