diff --git a/src/msg/Message.h b/src/msg/Message.h
index ddba0e57a89..a53f282f33d 100644
--- a/src/msg/Message.h
+++ b/src/msg/Message.h
@@ -294,8 +294,7 @@ protected:
   virtual ~Message() {
     if (byte_throttler)
       byte_throttler->put(payload.length() + middle.length() + data.length());
-    if (msg_throttler)
-      msg_throttler->put();
+    release_message_throttle();
     /* call completion hooks (if any) */
     if (completion_hook)
       completion_hook->complete(0);
@@ -347,6 +346,11 @@ public:
     data.clear();
     clear_buffers(); // let subclass drop buffers as well
   }
+  void release_message_throttle() {
+    if (msg_throttler)
+      msg_throttler->put();
+    msg_throttler = nullptr;
+  }
 
   bool empty_payload() const { return payload.length() == 0; }
   bufferlist& get_payload() { return payload; }
diff --git a/src/osd/OpRequest.cc b/src/osd/OpRequest.cc
index 60fff4c14b0..8805d1a62f0 100644
--- a/src/osd/OpRequest.cc
+++ b/src/osd/OpRequest.cc
@@ -81,6 +81,7 @@ void OpRequest::_dump_op_descriptor_unlocked(ostream& stream) const
 void OpRequest::_unregistered() {
   request->clear_data();
   request->clear_payload();
+  request->release_message_throttle();
 }
 
 bool OpRequest::check_rmw(int flag) {