mirror of
https://github.com/isar/libmdbx.git
synced 2025-04-21 16:27:46 +08:00
mdbx: исправление неверной assert-проверки и микрооптимизация (backport).
В пути фиксации вложенных транзакций, условие в assert-проверке не было корректным для случая, когда таблица уже существовала и её дескриптор был открыт, использовался в завершаемой вложенной транзакции, но не использовался в родительской. Это исправление недочета также передаёт, уже загруженное из БД, кешируемое состояние таблицы в родительскую транзакцию.
This commit is contained in:
parent
5d38add405
commit
0e3b093eb5
@ -545,15 +545,16 @@ int mdbx_txn_commit_ex(MDBX_txn *txn, MDBX_commit_latency *latency) {
|
|||||||
/* Update parent's DBs array */
|
/* Update parent's DBs array */
|
||||||
eASSERT(env, parent->n_dbi == txn->n_dbi);
|
eASSERT(env, parent->n_dbi == txn->n_dbi);
|
||||||
TXN_FOREACH_DBI_ALL(txn, dbi) {
|
TXN_FOREACH_DBI_ALL(txn, dbi) {
|
||||||
if (txn->dbi_state[dbi] & (DBI_CREAT | DBI_FRESH | DBI_DIRTY)) {
|
if (txn->dbi_state[dbi] != (parent->dbi_state[dbi] & ~(DBI_FRESH | DBI_CREAT | DBI_DIRTY))) {
|
||||||
|
eASSERT(env, (txn->dbi_state[dbi] & (DBI_CREAT | DBI_FRESH | DBI_DIRTY)) != 0 ||
|
||||||
|
(txn->dbi_state[dbi] | DBI_STALE) ==
|
||||||
|
(parent->dbi_state[dbi] & ~(DBI_FRESH | DBI_CREAT | DBI_DIRTY)));
|
||||||
parent->dbs[dbi] = txn->dbs[dbi];
|
parent->dbs[dbi] = txn->dbs[dbi];
|
||||||
/* preserve parent's status */
|
/* preserve parent's status */
|
||||||
const uint8_t state = txn->dbi_state[dbi] | (parent->dbi_state[dbi] & (DBI_CREAT | DBI_FRESH | DBI_DIRTY));
|
const uint8_t state = txn->dbi_state[dbi] | (parent->dbi_state[dbi] & (DBI_CREAT | DBI_FRESH | DBI_DIRTY));
|
||||||
DEBUG("dbi %zu dbi-state %s 0x%02x -> 0x%02x", dbi, (parent->dbi_state[dbi] != state) ? "update" : "still",
|
DEBUG("dbi %zu dbi-state %s 0x%02x -> 0x%02x", dbi, (parent->dbi_state[dbi] != state) ? "update" : "still",
|
||||||
parent->dbi_state[dbi], state);
|
parent->dbi_state[dbi], state);
|
||||||
parent->dbi_state[dbi] = state;
|
parent->dbi_state[dbi] = state;
|
||||||
} else {
|
|
||||||
eASSERT(env, txn->dbi_state[dbi] == (parent->dbi_state[dbi] & ~(DBI_FRESH | DBI_CREAT | DBI_DIRTY)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user