-
Notifications
You must be signed in to change notification settings - Fork 5.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
SERVER-36885: Make ASIO remember IOCP state when out of resources
- Loading branch information
1 parent
e65ff57
commit 67ab3ae
Showing
3 changed files
with
161 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
143 changes: 143 additions & 0 deletions
143
src/third_party/asio-master/patches/0006-MONGO-Fix-IOCP-out-of-resource-handling.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
From 28c949880a45147d5cb9d1af16dea7494f68f109 Mon Sep 17 00:00:00 2001 | ||
From: Spencer Jackson <spencer.jackson@mongodb.com> | ||
Date: Mon, 17 Sep 2018 18:12:33 -0400 | ||
Subject: [PATCH] [PATCH] MONGO: Fix IOCP out of resource handling | ||
|
||
--- | ||
.../asio/detail/impl/win_iocp_io_context.ipp | 15 ++++++++++----- | ||
asio/include/asio/detail/win_iocp_operation.hpp | 9 ++++++++- | ||
2 files changed, 18 insertions(+), 6 deletions(-) | ||
|
||
diff --git a/asio/include/asio/detail/impl/win_iocp_io_context.ipp b/asio/include/asio/detail/impl/win_iocp_io_context.ipp | ||
index c371b86b..ebb4b62b 100644 | ||
--- a/asio/include/asio/detail/impl/win_iocp_io_context.ipp | ||
+++ b/asio/include/asio/detail/impl/win_iocp_io_context.ipp | ||
@@ -250,11 +250,11 @@ void win_iocp_io_context::post_deferred_completion(win_iocp_operation* op) | ||
{ | ||
// Flag the operation as ready. | ||
op->ready_ = 1; | ||
|
||
// Enqueue the operation on the I/O completion port. | ||
- if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, op)) | ||
+ if (!::PostQueuedCompletionStatus(iocp_.handle, 0, op->completionKey(), op)) | ||
{ | ||
// Out of resources. Put on completed queue instead. | ||
mutex::scoped_lock lock(dispatch_mutex_); | ||
completed_ops_.push(op); | ||
::InterlockedExchange(&dispatch_required_, 1); | ||
@@ -270,11 +270,11 @@ void win_iocp_io_context::post_deferred_completions( | ||
|
||
// Flag the operation as ready. | ||
op->ready_ = 1; | ||
|
||
// Enqueue the operation on the I/O completion port. | ||
- if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, op)) | ||
+ if (!::PostQueuedCompletionStatus(iocp_.handle, 0, op->completionKey(), op)) | ||
{ | ||
// Out of resources. Put on completed queue instead. | ||
mutex::scoped_lock lock(dispatch_mutex_); | ||
completed_ops_.push(op); | ||
completed_ops_.push(ops); | ||
@@ -296,13 +296,14 @@ void win_iocp_io_context::abandon_operations( | ||
|
||
void win_iocp_io_context::on_pending(win_iocp_operation* op) | ||
{ | ||
if (::InterlockedCompareExchange(&op->ready_, 1, 0) == 1) | ||
{ | ||
+ op->completionKey() = overlapped_contains_result; | ||
// Enqueue the operation on the I/O completion port. | ||
if (!::PostQueuedCompletionStatus(iocp_.handle, | ||
- 0, overlapped_contains_result, op)) | ||
+ 0, op->completionKey(), op)) | ||
{ | ||
// Out of resources. Put on completed queue instead. | ||
mutex::scoped_lock lock(dispatch_mutex_); | ||
completed_ops_.push(op); | ||
::InterlockedExchange(&dispatch_required_, 1); | ||
@@ -320,13 +321,15 @@ void win_iocp_io_context::on_completion(win_iocp_operation* op, | ||
op->Internal = reinterpret_cast<ulong_ptr_t>( | ||
&asio::error::get_system_category()); | ||
op->Offset = last_error; | ||
op->OffsetHigh = bytes_transferred; | ||
|
||
+ | ||
// Enqueue the operation on the I/O completion port. | ||
+ op->completionKey() = overlapped_contains_result; | ||
if (!::PostQueuedCompletionStatus(iocp_.handle, | ||
- 0, overlapped_contains_result, op)) | ||
+ 0, op->completionKey(), op)) | ||
{ | ||
// Out of resources. Put on completed queue instead. | ||
mutex::scoped_lock lock(dispatch_mutex_); | ||
completed_ops_.push(op); | ||
::InterlockedExchange(&dispatch_required_, 1); | ||
@@ -342,13 +345,15 @@ void win_iocp_io_context::on_completion(win_iocp_operation* op, | ||
// Store results in the OVERLAPPED structure. | ||
op->Internal = reinterpret_cast<ulong_ptr_t>(&ec.category()); | ||
op->Offset = ec.value(); | ||
op->OffsetHigh = bytes_transferred; | ||
|
||
+ | ||
// Enqueue the operation on the I/O completion port. | ||
+ op->completionKey() = overlapped_contains_result; | ||
if (!::PostQueuedCompletionStatus(iocp_.handle, | ||
- 0, overlapped_contains_result, op)) | ||
+ 0, op->completionKey(), op)) | ||
{ | ||
// Out of resources. Put on completed queue instead. | ||
mutex::scoped_lock lock(dispatch_mutex_); | ||
completed_ops_.push(op); | ||
::InterlockedExchange(&dispatch_required_, 1); | ||
diff --git a/asio/include/asio/detail/win_iocp_operation.hpp b/asio/include/asio/detail/win_iocp_operation.hpp | ||
index 81d43f07..e0cbcc56 100644 | ||
--- a/asio/include/asio/detail/win_iocp_operation.hpp | ||
+++ b/asio/include/asio/detail/win_iocp_operation.hpp | ||
@@ -49,18 +49,23 @@ public: | ||
void destroy() | ||
{ | ||
func_(0, this, asio::error_code(), 0); | ||
} | ||
|
||
+ ULONG_PTR& completionKey() { | ||
+ return completionKey_; | ||
+ } | ||
+ | ||
protected: | ||
typedef void (*func_type)( | ||
void*, win_iocp_operation*, | ||
const asio::error_code&, std::size_t); | ||
|
||
win_iocp_operation(func_type func) | ||
: next_(0), | ||
- func_(func) | ||
+ func_(func), | ||
+ completionKey_(0) | ||
{ | ||
reset(); | ||
} | ||
|
||
// Prevents deletion through this type. | ||
@@ -74,18 +79,20 @@ protected: | ||
InternalHigh = 0; | ||
Offset = 0; | ||
OffsetHigh = 0; | ||
hEvent = 0; | ||
ready_ = 0; | ||
+ completionKey_ = 0; | ||
} | ||
|
||
private: | ||
friend class op_queue_access; | ||
friend class win_iocp_io_context; | ||
win_iocp_operation* next_; | ||
func_type func_; | ||
long ready_; | ||
+ ULONG_PTR completionKey_; | ||
}; | ||
|
||
} // namespace detail | ||
} // namespace asio | ||
|
||
-- | ||
2.19.0 | ||
|