]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
common: use boost::shared_mutex on Windows
authorLucian Petrut <lpetrut@cloudbasesolutions.com>
Mon, 4 Jul 2022 13:59:46 +0000 (13:59 +0000)
committerLucian Petrut <lpetrut@cloudbasesolutions.com>
Wed, 27 Jul 2022 11:50:42 +0000 (11:50 +0000)
The winpthreads shared mutex implementation causes deadlocks on
Windows [1][2]. Specifically, async RBD IO calls are hanging. This
also prevents the images from being unmounted.

For this reason, we're switching to boost::shared_mutex when using
MinGW.

[1] https://github.com/cloudbase/wnbd/issues/63#issuecomment-1161547102
[2] https://github.com/msys2/MINGW-packages/issues/3319
Trace: https://pastebin.com/raw/i3jpTyS3

Fixes: https://tracker.ceph.com/issues/56480
Signed-off-by: Lucian Petrut <lpetrut@cloudbasesolutions.com>
CMakeLists.txt
src/common/ceph_mutex.h
win32_deps_build.sh

index c0870323a943461912464021955167e51582d58e..de7160055f17e225af4b0275c36e899a222e6499 100644 (file)
@@ -39,7 +39,15 @@ if(WIN32)
   # the targeted Windows version. The availability of certain functions and
   # structures will depend on it.
   set(WIN32_WINNT "0x0A00" CACHE STRING "Targeted Windows version.")
-  add_definitions(-D_WIN32_WINNT=${WIN32_WINNT})
+  # In order to avoid known winpthread issues, we're using the boost
+  # shared mutex implementation.
+  # https://github.com/msys2/MINGW-packages/issues/3319
+  add_definitions(
+    -D_WIN32_WINNT=${WIN32_WINNT}
+    -DBOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN
+    -DBOOST_THREAD_V2_SHARED_MUTEX
+  )
+  set(Boost_THREADAPI "win32")
 endif()
 
 if(MINGW)
index 4029a5a9f159ce9f4ace47834ba7a21d33214aef..81777c7dbe2a0962a51685c76853f7b00a049881 100644 (file)
@@ -69,6 +69,9 @@ namespace ceph {
 // ============================================================================
 // debug (lockdep-capable, various sanity checks and asserts)
 // ============================================================================
+//
+// Note: this is known to cause deadlocks on Windows because
+// of the winpthreads shared mutex implementation.
 
 #include "common/condition_variable_debug.h"
 #include "common/mutex_debug.h"
@@ -115,27 +118,39 @@ namespace ceph {
 
 #include <condition_variable>
 #include <mutex>
-#include <shared_mutex>
 
+// The winpthreads shared mutex implementation is broken.
+// We'll use boost::shared_mutex instead.
+// https://github.com/msys2/MINGW-packages/issues/3319
+#if __MINGW32__
+#include <boost/thread/shared_mutex.hpp>
+#else
+#include <shared_mutex>
+#endif
 
 namespace ceph {
 
   typedef std::mutex mutex;
   typedef std::recursive_mutex recursive_mutex;
   typedef std::condition_variable condition_variable;
+
+#if __MINGW32__
+  typedef boost::shared_mutex shared_mutex;
+#else
   typedef std::shared_mutex shared_mutex;
+#endif
 
   // discard arguments to make_mutex (they are for debugging only)
   template <typename ...Args>
-  std::mutex make_mutex(Args&& ...args) {
+  mutex make_mutex(Args&& ...args) {
     return {};
   }
   template <typename ...Args>
-  std::recursive_mutex make_recursive_mutex(Args&& ...args) {
+  recursive_mutex make_recursive_mutex(Args&& ...args) {
     return {};
   }
   template <typename ...Args>
-  std::shared_mutex make_shared_mutex(Args&& ...args) {
+  shared_mutex make_shared_mutex(Args&& ...args) {
     return {};
   }
 
index dba562dfadf6c152c46620f4ced56487f1bf7d67..2baefd988219565d428953b3e848dd1ea575b5c3 100755 (executable)
@@ -201,7 +201,7 @@ EOL
 ./b2 install --user-config=user-config.jam toolset=gcc-mingw32 \
     target-os=windows release \
     link=static,shared \
-    threadapi=pthread --prefix=$boostDir \
+    threadapi=win32 --prefix=$boostDir \
     address-model=64 architecture=x86 \
     binary-format=pe abi=ms -j $NUM_WORKERS \
     -sZLIB_INCLUDE=$zlibDir/include -sZLIB_LIBRARY_PATH=$zlibDir/lib \