Skip to content
This repository has been archived by the owner on Sep 22, 2022. It is now read-only.

Recursive use of SRW-lock on Windows cause by MDBX_NOTLS option. #203

Closed
erthink opened this issue Jun 9, 2021 · 1 comment
Closed

Recursive use of SRW-lock on Windows cause by MDBX_NOTLS option. #203

erthink opened this issue Jun 9, 2021 · 1 comment

Comments

@erthink
Copy link
Owner

erthink commented Jun 9, 2021

Windows is unable to extend or shrink mapped region without closing/unmap it.
So in Windows, a SRW-lock is used to protect threads with a read transaction from accessing a temporary unmapped region during it shrink or expand.

However, with MDBX_NOTLS option transactions could be used from other threads and the same thread could start more than one read transaction.
Thus this causes recursive acquiring the same SRW-lock by the same thread.

This should be fixed, or at least documented:

  1. don't resize a database on Windows when using MDBX_NOTLS.
  2. or replace native SRW-lock by a custom recursive untied-to-thread mutex.
@erthink
Copy link
Owner Author

erthink commented Jun 11, 2021

@vorot93, по-возможности проверьте это исправление в вашей "акуле".

Здесь проблема устранена ценой определенных ограничений (см. комментарий в самом коммите), т.е. это "костыль".
Тем не менее, именно это исправление пойдет в master и затем в ближайший минорный релиз.

А уже после этого я намерен:

erthink added a commit that referenced this issue Jul 26, 2021
Acknowledgements:
-----------------
 - [Alex Sharov](https://github.com/AskAlexSharov) for reporting and testing.
 - [Andrea Lanfranchi](https://github.com/AndreaLanfranchi) for reporting bugs.
 - [Lionel Debroux](https://github.com/debrouxl) for fuzzing tests and reporting bugs.
 - [Sergey Fedotov](https://github.com/SergeyFromHell/) for [`node-mdbx` NodeJS bindings](https://www.npmjs.com/package/node-mdbx).
 - [Kris Zyp](https://github.com/kriszyp) for [`lmdbx-store` NodeJS bindings](https://github.com/kriszyp/lmdbx-store).
 - [Noel Kuntze](https://github.com/Thermi) for [draft Python bindings](https://github.com/erthink/libmdbx/commits/python-bindings).

New features, extensions and improvements:
------------------------------------------
 - [Allow to predefine/override `MDBX_BUILD_TIMESTAMP` for builds reproducibility](#201).
 - Added options support for `long-stochastic` script.
 - Avoided `MDBX_TXN_FULL` error for large transactions when possible.
 - The `MDBX_READERS_LIMIT` increased to `32767`.
 - Raise `MDBX_TOO_LARGE` under Valgrind/ASAN if being opened DB is 100 larger than RAM (to avoid hangs and OOM).
 - Minimized the size of poisoned/unpoisoned regions to avoid Valgrind/ASAN stuck.
 - Added more workarounds for QEMU for testing builds for 32-bit platforms, Alpha and Sparc architectures.
 - `mdbx_chk` now skips iteration & checking of DB' records if corresponding page-tree is corrupted (to avoid `SIGSEGV`, ASAN failures, etc).
 - Added more checks for [rare/fuzzing corruption cases](#217).

Backward compatibility break:
-----------------------------
 - Use file `VERSION.txt` for version information instead of `VERSION` to avoid collision with `#include <version>`.
 - Rename `slice::from/to_FOO_bytes()` to `slice::envisage_from/to_FOO_length()'.
 - Rename `MDBX_TEST_EXTRA` make's variable to `MDBX_SMOKE_EXTRA`.
 - Some details of the C++ API have been changed for subsequent freezing.

Fixes:
------
 - Fixed excess meta-pages checks in case `mdbx_chk` is called to check the DB for a specific meta page and thus could prevent switching to the selected meta page, even if the check passed without errors.
 - Fixed [recursive use of SRW-lock on Windows cause by `MDBX_NOTLS` option](#203).
 - Fixed [log a warning during a new DB creation](#205).
 - Fixed [false-negative `mdbx_cursor_eof()` result](#207).
 - Fixed [`make install` with non-GNU `install` utility (OSX, BSD)](#208).
 - Fixed [installation by `CMake` in special cases by complete use `GNUInstallDirs`'s variables](#209).
 - Fixed [C++ Buffer issue with `std::string` and alignment](#191).
 - Fixed `safe64_reset()` for platforms without atomic 64-bit compare-and-swap.
 - Fixed hang/shutdown on big-endian platforms without `__cxa_thread_atexit()`.
 - Fixed [using bad meta-pages if DB was partially/recoverable corrupted](#217).
 - Fixed extra `noexcept` for `buffer::&assign_reference()`.
 - Fixed `bootid` generation on Windows for case of change system' time.
 - Fixed [test framework keygen-related issue](#127).
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

1 participant