-
Type: Improvement
-
Resolution: Fixed
-
Priority: Major - P3
-
Affects Version/s: None
-
Component/s: Internal Code
-
Service Arch
-
Fully Compatible
-
Service Arch 2023-02-06, Service Arch 2023-02-20
-
155
At the time of writing this ticket, CurOp is defined as a decoration on OperationContext, through CurOpStack which may contain a stack of CurOp objects:
/** * This type decorates a Client object with a stack of active CurOp objects. * * It encapsulates the nesting logic for curops attached to a Client, along with * the notion that there is always a root CurOp attached to a Client. * * The stack itself is represented in the _parent pointers of the CurOp class. */ class CurOp::CurOpStack { ... private: OperationContext* _opCtx = nullptr; // Top of the stack of CurOps for a Client. CurOp* _top = nullptr; // The bottom-most CurOp for a client. const CurOp _base; };
CurOpStack holds a pointer to OperationContext, however, this pointer is not initialized until after the first CurOp is pushed to the stack:
void CurOpStack::push(OperationContext* opCtx, CurOp* curOp) { invariant(opCtx); if (_opCtx) { invariant(_opCtx == opCtx); } else { _opCtx = opCtx; } stdx::lock_guard<Client> lk(*_opCtx->getClient()); push_nolock(curOp); }
We can use constructor actions (similar to the following example) to initialize the _opCtx member on CurOpStack during the construction of OperationContext, making sure _opCtx is always initialized and obviating the need to provide opCtx as an argument to CurOpStack and CurOp member functions. This also helps with simplifying the changes introduced by SERVER-70032.
class CurOpClientObserver final : public ServiceContext::ClientObserver { void onCreateClient(Client*) {} void onDestroyClient(Client*) {} void onCreateOperationContext(OperationContext* opCtx) { _curopStack(opCtx).setOpCtx(opCtx); } void onDestroyOperationContext(OperationContext*) {} }; ServiceContext::ConstructorActionRegisterer registerCurOpClientObserver{"CurOpClientObserver", [](ServiceContext* service) { service->registerClientObserver(std::make_unique<CurOpClientObserver>()); }};
- is related to
-
SERVER-70032 Collect and report operation CPU time by default
- Closed