mirror of
https://github.com/isar/libmdbx.git
synced 2025-12-15 04:32:21 +08:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ecbc0b9c12 | ||
|
|
a783325a6d | ||
|
|
f55c30f286 | ||
|
|
4874852b79 | ||
|
|
6760ca87ae |
2
Makefile
2
Makefile
@@ -1,5 +1,5 @@
|
|||||||
# GNU Makefile for libmdbx (reliable lightning memory-mapped DB library for Linux).
|
# GNU Makefile for libmdbx (reliable lightning memory-mapped DB library for Linux).
|
||||||
# https://github.com/ReOpen/libmdbx
|
# https://github.com/leo-yuriev/libmdbx
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Configuration. The compiler options must enable threaded compilation.
|
# Configuration. The compiler options must enable threaded compilation.
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ libmdbx
|
|||||||
Extended LMDB, aka "Расширенная LMDB".
|
Extended LMDB, aka "Расширенная LMDB".
|
||||||
|
|
||||||
*The Future will Positive. Всё будет хорошо.*
|
*The Future will Positive. Всё будет хорошо.*
|
||||||
[](https://travis-ci.org/ReOpen/libmdbx)
|
[](https://travis-ci.org/leo-yuriev/libmdbx)
|
||||||
|
|
||||||
English version by Google [is here](https://translate.googleusercontent.com/translate_c?act=url&ie=UTF8&sl=ru&tl=en&u=https://github.com/ReOpen/libmdbx/tree/master).
|
English version by Google [is here](https://translate.googleusercontent.com/translate_c?act=url&ie=UTF8&sl=ru&tl=en&u=https://github.com/leo-yuriev/libmdbx/tree/stable%2F0.0).
|
||||||
|
|
||||||
|
|
||||||
## Кратко
|
## Кратко
|
||||||
@@ -28,7 +28,7 @@ _libmdbx_ является потомком "Lightning Memory-Mapped Database",
|
|||||||
известной под аббревиатурой
|
известной под аббревиатурой
|
||||||
[LMDB](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database).
|
[LMDB](https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database).
|
||||||
Изначально доработка производилась в составе проекта
|
Изначально доработка производилась в составе проекта
|
||||||
[ReOpenLDAP](https://github.com/ReOpen/ReOpenLDAP). Примерно за год
|
[ReOpenLDAP](https://github.com/leo-yuriev/ReOpenLDAP). Примерно за год
|
||||||
работы внесенные изменения приобрели самостоятельную ценность. Осенью
|
работы внесенные изменения приобрели самостоятельную ценность. Осенью
|
||||||
2015 доработанный движок был выделен в отдельный проект, который был
|
2015 доработанный движок был выделен в отдельный проект, который был
|
||||||
[представлен на конференции Highload++
|
[представлен на конференции Highload++
|
||||||
|
|||||||
2
lmdb.h
2
lmdb.h
@@ -212,7 +212,7 @@ typedef int mdb_filehandle_t;
|
|||||||
#define MDB_VERSION_DATE "2017-02-17"
|
#define MDB_VERSION_DATE "2017-02-17"
|
||||||
|
|
||||||
/** A stringifier for the version info */
|
/** A stringifier for the version info */
|
||||||
#define MDB_VERSTR(a,b,c,d) "MDBX " #a "." #b "." #c ": (" d ", https://github.com/ReOpen/libmdbx)"
|
#define MDB_VERSTR(a,b,c,d) "MDBX " #a "." #b "." #c ": (" d ", https://github.com/leo-yuriev/libmdbx)"
|
||||||
|
|
||||||
/** A helper for the stringifier macro */
|
/** A helper for the stringifier macro */
|
||||||
#define MDB_VERFOO(a,b,c,d) MDB_VERSTR(a,b,c,d)
|
#define MDB_VERFOO(a,b,c,d) MDB_VERSTR(a,b,c,d)
|
||||||
|
|||||||
21
mdb.c
21
mdb.c
@@ -1048,7 +1048,7 @@ typedef struct MDB_pgstate {
|
|||||||
} MDB_pgstate;
|
} MDB_pgstate;
|
||||||
|
|
||||||
/** Context for deferred cleanup of reader's threads.
|
/** Context for deferred cleanup of reader's threads.
|
||||||
* to avoid https://github.com/ReOpen/ReOpenLDAP/issues/48 */
|
* to avoid https://github.com/leo-yuriev/ReOpenLDAP/issues/48 */
|
||||||
typedef struct MDBX_rthc {
|
typedef struct MDBX_rthc {
|
||||||
struct MDBX_rthc *rc_next;
|
struct MDBX_rthc *rc_next;
|
||||||
pthread_t rc_thread;
|
pthread_t rc_thread;
|
||||||
@@ -4341,7 +4341,7 @@ mdb_env_create(MDB_env **env)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int __cold
|
static int __cold
|
||||||
mdb_env_map(MDB_env *env, void *addr, size_t usedsize)
|
mdb_env_map(MDB_env *env, void *addr)
|
||||||
{
|
{
|
||||||
unsigned flags = env->me_flags;
|
unsigned flags = env->me_flags;
|
||||||
|
|
||||||
@@ -4381,12 +4381,6 @@ mdb_env_map(MDB_env *env, void *addr, size_t usedsize)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MADV_REMOVE
|
|
||||||
if (flags & MDB_WRITEMAP) {
|
|
||||||
(void) madvise(env->me_map + usedsize, env->me_mapsize - usedsize, MADV_REMOVE);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Turn on/off readahead. It's harmful when the DB is larger than RAM. */
|
/* Turn on/off readahead. It's harmful when the DB is larger than RAM. */
|
||||||
if (madvise(env->me_map, env->me_mapsize, (flags & MDB_NORDAHEAD) ? MADV_RANDOM : MADV_WILLNEED))
|
if (madvise(env->me_map, env->me_mapsize, (flags & MDB_NORDAHEAD) ? MADV_RANDOM : MADV_WILLNEED))
|
||||||
return errno;
|
return errno;
|
||||||
@@ -4439,7 +4433,7 @@ mdb_env_set_mapsize(MDB_env *env, size_t size)
|
|||||||
#endif
|
#endif
|
||||||
env->me_mapsize = size;
|
env->me_mapsize = size;
|
||||||
old = (env->me_flags & MDB_FIXEDMAP) ? env->me_map : NULL;
|
old = (env->me_flags & MDB_FIXEDMAP) ? env->me_map : NULL;
|
||||||
rc = mdb_env_map(env, old, usedsize);
|
rc = mdb_env_map(env, old);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -4557,8 +4551,7 @@ mdb_env_open2(MDB_env *env, MDB_meta *meta)
|
|||||||
newenv = 0;
|
newenv = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t usedsize = (meta->mm_last_pg + 1) * env->me_psize;
|
rc = mdb_env_map(env, (flags & MDB_FIXEDMAP) ? meta->mm_address : NULL);
|
||||||
rc = mdb_env_map(env, (flags & MDB_FIXEDMAP) ? meta->mm_address : NULL, usedsize);
|
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
@@ -4631,7 +4624,7 @@ void mdbx_rthc_dtor(void)
|
|||||||
* TSD-деструкторах и поэтому может выгрузить lib.so до того как
|
* TSD-деструкторах и поэтому может выгрузить lib.so до того как
|
||||||
* отработали все деструкторы.
|
* отработали все деструкторы.
|
||||||
* - Исходное проявление проблемы было зафиксировано
|
* - Исходное проявление проблемы было зафиксировано
|
||||||
* в https://github.com/ReOpen/ReOpenLDAP/issues/48
|
* в https://github.com/leo-yuriev/ReOpenLDAP/issues/48
|
||||||
*
|
*
|
||||||
* Предыдущее решение посредством выделяемого динамически MDB_rthc
|
* Предыдущее решение посредством выделяемого динамически MDB_rthc
|
||||||
* было не удачным, так как порождало либо утечку памяти,
|
* было не удачным, так как порождало либо утечку памяти,
|
||||||
@@ -8812,8 +8805,10 @@ mdb_cursor_del0(MDB_cursor *mc)
|
|||||||
if (m3->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) {
|
if (m3->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) {
|
||||||
if (!(node->mn_flags & F_SUBDATA))
|
if (!(node->mn_flags & F_SUBDATA))
|
||||||
m3->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(node);
|
m3->mc_xcursor->mx_cursor.mc_pg[0] = NODEDATA(node);
|
||||||
} else
|
} else {
|
||||||
mdb_xcursor_init1(m3, node);
|
mdb_xcursor_init1(m3, node);
|
||||||
|
m3->mc_xcursor->mx_cursor.mc_flags |= C_DEL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
3
mdbx.c
3
mdbx.c
@@ -864,13 +864,14 @@ int mdbx_set_attr(MDB_txn *txn, MDB_dbi dbi,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
old_attr = 0;
|
||||||
rc = mdbx_attr_peek(&old_data, &old_attr);
|
rc = mdbx_attr_peek(&old_data, &old_attr);
|
||||||
if (unlikely(rc != MDB_SUCCESS))
|
if (unlikely(rc != MDB_SUCCESS))
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if (old_attr == attr && (!data ||
|
if (old_attr == attr && (!data ||
|
||||||
(data->mv_size == old_data.mv_size
|
(data->mv_size == old_data.mv_size
|
||||||
&& memcpy(data->mv_data, old_data.mv_data, old_data.mv_size) == 0)))
|
&& memcmp(data->mv_data, old_data.mv_data, old_data.mv_size) == 0)))
|
||||||
return MDB_SUCCESS;
|
return MDB_SUCCESS;
|
||||||
|
|
||||||
mc.mc_next = txn->mt_cursors[dbi];
|
mc.mc_next = txn->mt_cursors[dbi];
|
||||||
|
|||||||
Reference in New Issue
Block a user