-
-
Notifications
You must be signed in to change notification settings - Fork 112
Database corruption by cross-merging LEAF and BRANCH pages (inherited from LMDB) #38
Comments
English version by Google. Это одна из фатальных ошибок унаследованных из LMDB - существенное упущение в дизайне и алгоритмах, которое замаскированно плохим стилем кодирования. Суть проблемы:
Рост дерева возможен при существенном различии/разбросе длины ключей, так как:
Соответственно, если при вставке/удалении на странице меняется значение ключа у первой записи, то это изменение должно быть вытолкнуто в родительскую страницу, и при необходимости рекурсивно до корня дерева. Однако, при таком обновлении, новое значение ключа может быть существенно длиннее предыдущего. Из-за чего на родительской странице может не хватить места. В том числе, это может произойти при удалении. Например, если было две записи {key="a", value="x"} и {key="bbb...bbb", value="y"} и мы удаляем первую, то в родительской странице короткий ключ "a" должен быть заменен на длинный "bbb...bbb". Если на родительской странице не хватает места, то она должна быть разделена. В свою очередь, это потребует вставки в её родительскую страницу, и в ней тоже может не быть места, и так далее. В результате, удаление может привести к увеличению высоты дерева страниц и LMDB уничтожит ваши данные. |
Yes @hyc , this is the same bug/issue, but it newer has been fixed (corresponding ITS-patch is applied a time ago). Briefly, independent of merge-or-move strategy it is possible that a tree will be higher after the deletion than the before. |
Testcase is simple (typo is fixed for now):
|
By "odd" and "even" do you mean the long and short keys are interleaved? Otherwise I don't see how this can trigger the issue. Does the its8258 test program succeed or crash for you? It runs fine here. |
Yes, certainly. |
Unable to reproduce any failure... |
I tried the given mtest7 and then made some changes to fit the scenario I tried to describe above. Unfortunately it don't reproduce the failure nor in the original LMDB, nor in the MDBX. On the other hand, it looks like I'm close to fixing the problem in MDBX. I expect to complete the work within a week. After that, we can try to adapt the stochastic test for LMDB and check if there is this problem. |
Fixed in the 'master' branch now. |
This bug discovered by long-running test, which add/update/delete key-value pairs with stochastically choosing the length of key and data.
Running such test with quantity of transaction in range from 100,000 to 1,000,000 fails with a probability of about 0.1 - 1%.
The investigation showed that the damage to the database structure is due to erroneous / invalid merging of different types of pages, i.e. mering LEAF into BRANCH or BRANCH into LEAF.
The text was updated successfully, but these errors were encountered: