mirror of
https://github.com/isar/libmdbx.git
synced 2025-07-18 15:04:44 +08:00
RKL — сортированный набор txnid, использующий внутри комбинацию непрерывного интервала и списка. Обеспечивает хранение id записей при переработке, очистку и обновлении GC, включая возврат остатков переработанных страниц. Итератор для RKL — обеспечивает изоляцию внутреннего устройства rkl от остального кода, чем существенно его упрощает. Фактически именно использованием rkl с итераторами ликвидируется "ребус" исторически образовавшийся в gc-update. -- При переработке GC записи преимущественно выбираются последовательно, но это не гарантируется. В LIFO-режиме переработка и добавление записей в rkl происходит преимущественно в обратном порядке, но из-за завершения читающих транзакций могут быть «скачки» в прямом направлении. В FIFO-режиме записи GC перерабатываются в прямом порядке и при этом линейно, но не обязательно строго последовательно, при этом гарантируется что между добавляемыми в rkl идентификаторами в GC нет записей, т.е. между первой (минимальный id) и последней (максимальный id) в GC нет записей и весь интервал может быть использован для возврата остатков страниц в GC. Таким образом, комбинация линейного интервала и списка (отсортированного в порядке возрастания элементов) является рациональным решением, близким к теоретически оптимальному пределу. Реализация rkl достаточно проста/прозрачная, если не считать неочевидную «магию» обмена непрерывного интервала и образующихся в списке последовательностей. Однако, именно этот автоматически выполняемый без лишних операций обмен оправдывает все накладные расходы.
59 lines
1.3 KiB
C
59 lines
1.3 KiB
C
/// \copyright SPDX-License-Identifier: Apache-2.0
|
|
/// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2025
|
|
|
|
#define xMDBX_ALLOY 1 /* alloyed build */
|
|
#include "internals.h" /* must be included first */
|
|
|
|
#include "api-cold.c"
|
|
#include "api-copy.c"
|
|
#include "api-cursor.c"
|
|
#include "api-dbi.c"
|
|
#include "api-env.c"
|
|
#include "api-extra.c"
|
|
#include "api-key-transform.c"
|
|
#include "api-misc.c"
|
|
#include "api-opts.c"
|
|
#include "api-range-estimate.c"
|
|
#include "api-txn-data.c"
|
|
#include "api-txn.c"
|
|
#include "audit.c"
|
|
#include "chk.c"
|
|
#include "cogs.c"
|
|
#include "coherency.c"
|
|
#include "cursor.c"
|
|
#include "dbi.c"
|
|
#include "dpl.c"
|
|
#include "dxb.c"
|
|
#include "env.c"
|
|
#include "gc-get.c"
|
|
#include "gc-put.c"
|
|
#include "global.c"
|
|
#include "lck-posix.c"
|
|
#include "lck-windows.c"
|
|
#include "lck.c"
|
|
#include "logging_and_debug.c"
|
|
#include "meta.c"
|
|
#include "mvcc-readers.c"
|
|
#include "node.c"
|
|
#include "osal.c"
|
|
#include "page-get.c"
|
|
#include "page-iov.c"
|
|
#include "page-ops.c"
|
|
#include "pnl.c"
|
|
#include "refund.c"
|
|
#include "rkl.c"
|
|
#include "spill.c"
|
|
#include "table.c"
|
|
#include "tls.c"
|
|
#include "tree-ops.c"
|
|
#include "tree-search.c"
|
|
#include "txl.c"
|
|
#include "txn-basal.c"
|
|
#include "txn-nested.c"
|
|
#include "txn-ro.c"
|
|
#include "txn.c"
|
|
#include "utils.c"
|
|
#include "version.c"
|
|
#include "walk.c"
|
|
#include "windows-import.c"
|