mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-24 16:49:39 -05:00
MDB_LOCK_VERSION -> MDB_LOCK_FORMAT.
Pid locking needs a different lockfile-version: MDB_env's with and without pid locking must not coexist, they can sabotage each other. Store MDB_LOCK_FORMAT = (version | "use locking" flag) instead.
This commit is contained in:
parent
1878213092
commit
d66739f947
1 changed files with 20 additions and 9 deletions
|
|
@ -140,6 +140,7 @@
|
|||
* @{
|
||||
*/
|
||||
#ifdef _WIN32
|
||||
#define MDB_PIDLOCK 0
|
||||
#define pthread_t DWORD
|
||||
#define pthread_mutex_t HANDLE
|
||||
#define pthread_key_t DWORD
|
||||
|
|
@ -172,6 +173,9 @@
|
|||
|
||||
#define Z "z"
|
||||
|
||||
/** For MDB_LOCK_FORMAT: True if readers take a pid lock in the lockfile */
|
||||
#define MDB_PIDLOCK 1
|
||||
|
||||
#ifdef MDB_USE_POSIX_SEM
|
||||
|
||||
#define LOCK_MUTEX_R(env) mdb_sem_wait((env)->me_rmutex)
|
||||
|
|
@ -523,8 +527,8 @@ typedef struct MDB_txbody {
|
|||
/** Stamp identifying this as an MDB file. It must be set
|
||||
* to #MDB_MAGIC. */
|
||||
uint32_t mtb_magic;
|
||||
/** Version number of this lock file. Must be set to #MDB_LOCK_VERSION. */
|
||||
uint32_t mtb_version;
|
||||
/** Format of this lock file. Must be set to #MDB_LOCK_FORMAT. */
|
||||
uint32_t mtb_format;
|
||||
#if defined(_WIN32) || defined(MDB_USE_POSIX_SEM)
|
||||
char mtb_rmname[MNAME_LEN];
|
||||
#else
|
||||
|
|
@ -550,7 +554,7 @@ typedef struct MDB_txninfo {
|
|||
union {
|
||||
MDB_txbody mtb;
|
||||
#define mti_magic mt1.mtb.mtb_magic
|
||||
#define mti_version mt1.mtb.mtb_version
|
||||
#define mti_format mt1.mtb.mtb_format
|
||||
#define mti_mutex mt1.mtb.mtb_mutex
|
||||
#define mti_rmname mt1.mtb.mtb_rmname
|
||||
#define mti_txnid mt1.mtb.mtb_txnid
|
||||
|
|
@ -569,6 +573,13 @@ typedef struct MDB_txninfo {
|
|||
} mt2;
|
||||
MDB_reader mti_readers[1];
|
||||
} MDB_txninfo;
|
||||
|
||||
/** Lockfile format signature: version, features and field layout */
|
||||
#define MDB_LOCK_FORMAT \
|
||||
((uint32_t) \
|
||||
((MDB_LOCK_VERSION) \
|
||||
/* Flags which describe functionality */ \
|
||||
+ (((MDB_PIDLOCK) != 0) << 16)))
|
||||
/** @} */
|
||||
|
||||
/** Common header for all page types.
|
||||
|
|
@ -2013,7 +2024,7 @@ mdb_cursors_close(MDB_txn *txn, unsigned merge)
|
|||
static void
|
||||
mdb_txn_reset0(MDB_txn *txn, const char *act);
|
||||
|
||||
#ifdef _WIN32
|
||||
#if !(MDB_PIDLOCK) /* Currently the same as defined(_WIN32) */
|
||||
enum Pidlock_op {
|
||||
Pidset, Pidcheck
|
||||
};
|
||||
|
|
@ -2034,7 +2045,7 @@ enum Pidlock_op {
|
|||
static int
|
||||
mdb_reader_pid(MDB_env *env, enum Pidlock_op op, pid_t pid)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
#if !(MDB_PIDLOCK) /* Currently the same as defined(_WIN32) */
|
||||
int ret = 0;
|
||||
HANDLE h;
|
||||
if (op == Pidcheck) {
|
||||
|
|
@ -3776,8 +3787,8 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
|
|||
pthread_mutexattr_destroy(&mattr);
|
||||
#endif /* _WIN32 || MDB_USE_POSIX_SEM */
|
||||
|
||||
env->me_txns->mti_version = MDB_LOCK_VERSION;
|
||||
env->me_txns->mti_magic = MDB_MAGIC;
|
||||
env->me_txns->mti_format = MDB_LOCK_FORMAT;
|
||||
env->me_txns->mti_txnid = 0;
|
||||
env->me_txns->mti_numreaders = 0;
|
||||
|
||||
|
|
@ -3787,9 +3798,9 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
|
|||
rc = MDB_INVALID;
|
||||
goto fail;
|
||||
}
|
||||
if (env->me_txns->mti_version != MDB_LOCK_VERSION) {
|
||||
DPRINTF("lock region is version %u, expected version %u",
|
||||
env->me_txns->mti_version, MDB_LOCK_VERSION);
|
||||
if (env->me_txns->mti_format != MDB_LOCK_FORMAT) {
|
||||
DPRINTF("lock region has format+version 0x%x, expected 0x%x",
|
||||
env->me_txns->mti_format, MDB_LOCK_FORMAT);
|
||||
rc = MDB_VERSION_MISMATCH;
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue