Fix some issues present in the upstream patch for condvar issue
Leftover "#define static" from upstream testing Unnecessary renaming of variables/functions Resolves: #1394862
This commit is contained in:
		
							parent
							
								
									559da4d941
								
							
						
					
					
						commit
						9ded8d2c32
					
				| @ -191,39 +191,6 @@ diff -r db78da0996b1 src/db/db_meta.c | |||||||
|  	switch (pagep->type) { |  	switch (pagep->type) { | ||||||
|  	case P_OVERFLOW: |  	case P_OVERFLOW: | ||||||
|  	case P_INVALID: |  	case P_INVALID: | ||||||
| diff -r db78da0996b1 src/dbinc/atomic.h
 |  | ||||||
| --- a/src/dbinc/atomic.h	Mon Sep 09 11:09:35 2013 -0400
 |  | ||||||
| +++ b/src/dbinc/atomic.h	Sat Apr 29 04:10:18 2017 -0700
 |  | ||||||
| @@ -144,7 +144,7 @@
 |  | ||||||
|  #define	atomic_inc(env, p)	__atomic_inc(p) |  | ||||||
|  #define	atomic_dec(env, p)	__atomic_dec(p) |  | ||||||
|  #define	atomic_compare_exchange(env, p, o, n)	\ |  | ||||||
| -	__atomic_compare_exchange((p), (o), (n))
 |  | ||||||
| +	__db_atomic_compare_exchange((p), (o), (n))
 |  | ||||||
|  static inline int __atomic_inc(db_atomic_t *p) |  | ||||||
|  { |  | ||||||
|  	int	temp; |  | ||||||
| @@ -176,7 +176,7 @@
 |  | ||||||
|   * http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html |  | ||||||
|   * which configure could be changed to use. |  | ||||||
|   */ |  | ||||||
| -static inline int __atomic_compare_exchange(
 |  | ||||||
| +static inline int __db_atomic_compare_exchange(
 |  | ||||||
|  	db_atomic_t *p, atomic_value_t oldval, atomic_value_t newval) |  | ||||||
|  { |  | ||||||
|  	atomic_value_t was; |  | ||||||
| diff -r db78da0996b1 src/dbinc/db_int.in
 |  | ||||||
| --- a/src/dbinc/db_int.in	Mon Sep 09 11:09:35 2013 -0400
 |  | ||||||
| +++ b/src/dbinc/db_int.in	Sat Apr 29 04:10:18 2017 -0700
 |  | ||||||
| @@ -792,7 +792,7 @@
 |  | ||||||
|   |  | ||||||
|  	pid_t	pid_cache;		/* Cached process ID */ |  | ||||||
|   |  | ||||||
| -	DB_FH	*lockfhp;		/* fcntl(2) locking file handle */
 |  | ||||||
| +	DB_FH	*primary_fhp;		/* fcntl(2) locking on __db.001 */
 |  | ||||||
|   |  | ||||||
|  	DB_LOCKER *env_lref;		/* Locker in non-threaded handles */ |  | ||||||
|   |  | ||||||
| diff -r db78da0996b1 src/dbinc/region.h
 | diff -r db78da0996b1 src/dbinc/region.h
 | ||||||
| --- a/src/dbinc/region.h	Mon Sep 09 11:09:35 2013 -0400
 | --- a/src/dbinc/region.h	Mon Sep 09 11:09:35 2013 -0400
 | ||||||
| +++ b/src/dbinc/region.h	Sat Apr 29 04:10:18 2017 -0700
 | +++ b/src/dbinc/region.h	Sat Apr 29 04:10:18 2017 -0700
 | ||||||
| @ -278,15 +245,6 @@ diff -r db78da0996b1 src/dbinc_auto/os_ext.h | |||||||
| diff -r db78da0996b1 src/env/env_open.c
 | diff -r db78da0996b1 src/env/env_open.c
 | ||||||
| --- a/src/env/env_open.c	Mon Sep 09 11:09:35 2013 -0400
 | --- a/src/env/env_open.c	Mon Sep 09 11:09:35 2013 -0400
 | ||||||
| +++ b/src/env/env_open.c	Sat Apr 29 04:10:18 2017 -0700
 | +++ b/src/env/env_open.c	Sat Apr 29 04:10:18 2017 -0700
 | ||||||
| @@ -937,6 +937,8 @@
 |  | ||||||
|  { |  | ||||||
|  	DB_FH *fhp; |  | ||||||
|   |  | ||||||
| +	if (env->primary_fhp != NULL)
 |  | ||||||
| +		env->primary_fhp = NULL;
 |  | ||||||
|  	if (TAILQ_FIRST(&env->fdlist) == NULL) |  | ||||||
|  		return (0); |  | ||||||
|   |  | ||||||
| @@ -1031,11 +1033,11 @@
 | @@ -1031,11 +1033,11 @@
 | ||||||
|  		goto err; |  		goto err; | ||||||
|   |   | ||||||
| @ -302,401 +260,6 @@ diff -r db78da0996b1 src/env/env_open.c | |||||||
|  	 */ |  	 */ | ||||||
|  	if (FLD_ISSET(init_flags, DB_INITENV_CDB)) |  	if (FLD_ISSET(init_flags, DB_INITENV_CDB)) | ||||||
|  		LF_SET(DB_INIT_CDB); |  		LF_SET(DB_INIT_CDB); | ||||||
| diff -r db78da0996b1 src/env/env_region.c
 |  | ||||||
| --- a/src/env/env_region.c	Mon Sep 09 11:09:35 2013 -0400
 |  | ||||||
| +++ b/src/env/env_region.c	Sat Apr 29 04:10:18 2017 -0700
 |  | ||||||
| @@ -14,17 +14,54 @@
 |  | ||||||
|  #include "dbinc/log.h" |  | ||||||
|  #include "dbinc/txn.h" |  | ||||||
|   |  | ||||||
| +#define static 
 |  | ||||||
|  static int  __env_des_get __P((ENV *, REGINFO *, REGINFO *, REGION **)); |  | ||||||
|  static int  __env_faultmem __P((ENV *, void *, size_t, int)); |  | ||||||
|  static int  __env_sys_attach __P((ENV *, REGINFO *, REGION *)); |  | ||||||
|  static int  __env_sys_detach __P((ENV *, REGINFO *, int)); |  | ||||||
| +static int  __env_check_recreate __P((ENV *, REGENV *, u_int32_t));
 |  | ||||||
|  static void __env_des_destroy __P((ENV *, REGION *)); |  | ||||||
|  static void __env_remove_file __P((ENV *)); |  | ||||||
|   |  | ||||||
| +
 |  | ||||||
| +/*
 |  | ||||||
| + * If the system supports flock()-like file locking, then the primary region
 |  | ||||||
| + * file __db.001 is exclusively locked during creation, and is read-locked while
 |  | ||||||
| + * the environment is open. Most Unix-like systems have flock(), with the
 |  | ||||||
| + * notable exception of Solaris.
 |  | ||||||
| + * Note: fcntl cannot be used for this locking because of the unfortunate
 |  | ||||||
| + * definition of its interaction with close(2). A process's fcntl locks are
 |  | ||||||
| + * released whenever it closes any file descriptor for that file. So, if an
 |  | ||||||
| + * environment is opened more than once, closing one of the DB_ENV handles would
 |  | ||||||
| + * release the read lock that protects the other handle.
 |  | ||||||
| + */
 |  | ||||||
| +#ifdef HAVE_FLOCK
 |  | ||||||
| +#define ENV_PRIMARY_LOCK(env, lockmode, async)	\
 |  | ||||||
| +	((env)->primary_fhp == NULL ? 0 :	\
 |  | ||||||
| +	__os_fdlock((env), (env)->primary_fhp, -1, lockmode, async))
 |  | ||||||
| +#define ENV_PRIMARY_UNLOCK(env)			\
 |  | ||||||
| +	((env)->primary_fhp == NULL ? 0 :	\
 |  | ||||||
| +	__os_fdlock((env), (env)->primary_fhp, -1, DB_LOCK_NG, 0))
 |  | ||||||
| +#else
 |  | ||||||
| +#define ENV_PRIMARY_LOCK(env, lockmode, async)	(0)
 |  | ||||||
| +#define ENV_PRIMARY_UNLOCK(env)			(0)
 |  | ||||||
| +#endif
 |  | ||||||
| +
 |  | ||||||
|  /* |  | ||||||
|   * __env_attach |  | ||||||
|   *	Join/create the environment |  | ||||||
|   * |  | ||||||
| + * Safely detecting and managing multiple processes' environment handles:
 |  | ||||||
| + *	BDB uses a shared or exclusive fcntl()-style lock on the first byte
 |  | ||||||
| + *	of the primary region file (__db.001) to detect whether other processes
 |  | ||||||
| + *	have the environment open, and to single-thread attempts to create the
 |  | ||||||
| + *	environment.  If the open includes DB_CREATE, an exclusive lock is
 |  | ||||||
| + *	obtained during the open call.  After the creation is finished, and
 |  | ||||||
| + *	anytime during a non-DB_CREATE env open, the process holds a shared
 |  | ||||||
| + *	lock. 
 |  | ||||||
| + *	- single-thread creation of the environment
 |  | ||||||
| + *	- detect whether any other processes are currently attached to it.
 |  | ||||||
| + *
 |  | ||||||
|   * PUBLIC: int __env_attach __P((ENV *, u_int32_t *, int, int)); |  | ||||||
|   */ |  | ||||||
|  int |  | ||||||
| @@ -104,7 +141,7 @@
 |  | ||||||
|  	if (create_ok) { |  | ||||||
|  		if ((ret = __os_open(env, infop->name, 0, |  | ||||||
|  		    DB_OSO_CREATE | DB_OSO_EXCL | DB_OSO_REGION, |  | ||||||
| -		    env->db_mode, &env->lockfhp)) == 0)
 |  | ||||||
| +		    env->db_mode, &env->primary_fhp)) == 0)
 |  | ||||||
|  			goto creation; |  | ||||||
|  		if (ret != EEXIST) { |  | ||||||
|  			__db_err(env, ret, "%s", infop->name); |  | ||||||
| @@ -120,8 +157,13 @@
 |  | ||||||
|  	 * we're done.) |  | ||||||
|  	 */ |  | ||||||
|  	if ((ret = __os_open( |  | ||||||
| -	    env, infop->name, 0, DB_OSO_REGION, 0, &env->lockfhp)) != 0)
 |  | ||||||
| +	    env, infop->name, 0, DB_OSO_REGION, 0, &env->primary_fhp)) != 0)
 |  | ||||||
|  		goto err; |  | ||||||
| +	/* Wait to get shared access to the primary region. */
 |  | ||||||
| +	if ((ret = ENV_PRIMARY_LOCK(env, DB_LOCK_READ, 0)) != 0) {
 |  | ||||||
| +		__db_err(env, ret, "__env_attach: existing: shared lock error");
 |  | ||||||
| +		goto err;
 |  | ||||||
| +	}
 |  | ||||||
|   |  | ||||||
|  	/* |  | ||||||
|  	 * !!! |  | ||||||
| @@ -153,7 +195,7 @@
 |  | ||||||
|  	 * now, trying to make different versions of it work.) |  | ||||||
|  	 */ |  | ||||||
|  	if ((ret = __os_ioinfo(env, infop->name, |  | ||||||
| -	    env->lockfhp, &mbytes, &bytes, NULL)) != 0) {
 |  | ||||||
| +	    env->primary_fhp, &mbytes, &bytes, NULL)) != 0) {
 |  | ||||||
|  		__db_err(env, ret, "%s", infop->name); |  | ||||||
|  		goto err; |  | ||||||
|  	} |  | ||||||
| @@ -189,14 +231,14 @@
 |  | ||||||
|  			ret = EINVAL; |  | ||||||
|  			__db_err(env, ret, DB_STR_A("1535", |  | ||||||
|  		    "%s: existing environment not created in system memory", |  | ||||||
| -			    "%s"), infop->name);
 |  | ||||||
| -			goto err;
 |  | ||||||
| +			"%s"), infop->name);
 |  | ||||||
| +		    goto err;
 |  | ||||||
|  		} else { |  | ||||||
| -			if ((ret = __os_read(env, env->lockfhp, &rbuf,
 |  | ||||||
| +			if ((ret = __os_read(env, env->primary_fhp, &rbuf,
 |  | ||||||
|  			    sizeof(rbuf), &nrw)) != 0 || |  | ||||||
|  			    nrw < (size_t)sizeof(rbuf) || |  | ||||||
|  			    (ret = __os_seek(env, |  | ||||||
| -			    env->lockfhp, 0, 0, rbuf.region_off)) != 0) {
 |  | ||||||
| +			    env->primary_fhp, 0, 0, rbuf.region_off)) != 0) {
 |  | ||||||
|  				__db_err(env, ret, DB_STR_A("1536", |  | ||||||
|  				     "%s: unable to read region info", "%s"), |  | ||||||
|  				     infop->name); |  | ||||||
| @@ -204,7 +246,7 @@
 |  | ||||||
|  			} |  | ||||||
|  		} |  | ||||||
|   |  | ||||||
| -		if ((ret = __os_read(env, env->lockfhp, &ref,
 |  | ||||||
| +		if ((ret = __os_read(env, env->primary_fhp, &ref,
 |  | ||||||
|  		    sizeof(ref), &nrw)) != 0 || nrw < (size_t)sizeof(ref)) { |  | ||||||
|  			if (ret == 0) |  | ||||||
|  				ret = EIO; |  | ||||||
| @@ -218,14 +260,13 @@
 |  | ||||||
|  		segid = ref.segid; |  | ||||||
|  	} |  | ||||||
|   |  | ||||||
| -#ifndef HAVE_MUTEX_FCNTL
 |  | ||||||
| +#if !defined(HAVE_FCNTL) && !defined(HAVE_PTHREADS_TIMESTAMP)
 |  | ||||||
|  	/* |  | ||||||
| -	 * If we're not doing fcntl locking, we can close the file handle.  We
 |  | ||||||
| -	 * no longer need it and the less contact between the buffer cache and
 |  | ||||||
| -	 * the VM, the better.
 |  | ||||||
| +	 * Without fcntl-like support, we no longer need the file handle.  Close
 |  | ||||||
| +	 * it to limit the interaction between the buffer cache and the VM.
 |  | ||||||
|  	 */ |  | ||||||
| -	(void)__os_closehandle(env, env->lockfhp);
 |  | ||||||
| -	 env->lockfhp = NULL;
 |  | ||||||
| +	(void)__os_closehandle(env, env->primary_fhp);
 |  | ||||||
| +	 env->primary_fhp = NULL;
 |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
|  	/* Call the region join routine to acquire the region. */ |  | ||||||
| @@ -233,6 +274,8 @@
 |  | ||||||
|  	tregion.size = (roff_t)size; |  | ||||||
|  	tregion.max = (roff_t)max; |  | ||||||
|  	tregion.segid = segid; |  | ||||||
| +	/* Attach to the existing primary region. */
 |  | ||||||
| +	/* The leaking db.001 gets open inside of here, in __os_attach(). */
 |  | ||||||
|  	if ((ret = __env_sys_attach(env, infop, &tregion)) != 0) |  | ||||||
|  		goto err; |  | ||||||
|   |  | ||||||
| @@ -246,20 +289,38 @@
 |  | ||||||
|  	infop->head = (u_int8_t *)infop->addr + sizeof(REGENV); |  | ||||||
|  	renv = infop->primary; |  | ||||||
|   |  | ||||||
| -	/*
 |  | ||||||
| -	 * Make sure the region matches our build.  Special case a region
 |  | ||||||
| -	 * that's all nul bytes, just treat it like any other corruption.
 |  | ||||||
| -	 */
 |  | ||||||
| +	if (create_ok &&
 |  | ||||||
| +	    __env_check_recreate(env, renv, signature) == DB_OLD_VERSION &&
 |  | ||||||
| +	    (ret = ENV_PRIMARY_LOCK(env, DB_LOCK_WRITE, 1)) == 0) {
 |  | ||||||
| +		if (FLD_ISSET(dbenv->verbose, DB_VERB_RECOVERY))
 |  | ||||||
| +			__db_msg(env, "Recreating idle environment");
 |  | ||||||
| +		F_SET(infop, REGION_CREATE_OK);
 |  | ||||||
| +
 |  | ||||||
| +		/*
 |  | ||||||
| +		 * Detach from the environment region; we need to unmap it (and
 |  | ||||||
| +		 * close any file handle) so that we don't leak memory or files.
 |  | ||||||
| +		 */
 |  | ||||||
| +		DB_ASSERT(env, infop->rp == NULL);
 |  | ||||||
| +		infop->rp = &tregion;
 |  | ||||||
| +		(void)__env_sys_detach(env, infop, 0);
 |  | ||||||
| +		goto creation;
 |  | ||||||
| +	}
 |  | ||||||
| +
 |  | ||||||
|  	if (renv->majver != DB_VERSION_MAJOR || |  | ||||||
|  	    renv->minver != DB_VERSION_MINOR) { |  | ||||||
| -		if (renv->majver != 0 || renv->minver != 0) {
 |  | ||||||
| +		/*
 |  | ||||||
| +		 * Special case a region that's all nul bytes, just treat it
 |  | ||||||
| +		 * like any other corruption.
 |  | ||||||
| +		 */
 |  | ||||||
| +		if (renv->majver == 0 && renv->minver == 0)
 |  | ||||||
| +			ret = EINVAL;
 |  | ||||||
| +		else {
 |  | ||||||
|  			__db_errx(env, DB_STR_A("1538", |  | ||||||
| -	    "Program version %d.%d doesn't match environment version %d.%d",
 |  | ||||||
| +	"Program version %d.%d doesn't match in-use environment version %d.%d",
 |  | ||||||
|  			    "%d %d %d %d"), DB_VERSION_MAJOR, DB_VERSION_MINOR, |  | ||||||
|  			    renv->majver, renv->minver); |  | ||||||
|  			ret = DB_VERSION_MISMATCH; |  | ||||||
| -		} else
 |  | ||||||
| -			ret = EINVAL;
 |  | ||||||
| +		}
 |  | ||||||
|  		goto err; |  | ||||||
|  	} |  | ||||||
|  	if (renv->signature != signature) { |  | ||||||
| @@ -289,6 +350,18 @@
 |  | ||||||
|  	} |  | ||||||
|  	if (renv->magic != DB_REGION_MAGIC) |  | ||||||
|  		goto retry; |  | ||||||
| +	    /*
 |  | ||||||
| +	     * A bad magic number means that the env is new and not yet available:
 |  | ||||||
| +	     * wait a while and try again.  If the magic number says recovery is in
 |  | ||||||
| +	     * process, remember the env creation time to record that recovery was
 |  | ||||||
| +	     * the reason that the open failed.
 |  | ||||||
| +	     */
 |  | ||||||
| +	    if (renv->magic != DB_REGION_MAGIC) {
 |  | ||||||
| +		    __db_msg(env, "attach sees bad region magic 0x%lx",
 |  | ||||||
| +			(u_long)renv->magic);
 |  | ||||||
| +		    goto retry;
 |  | ||||||
| +	    }
 |  | ||||||
| +
 |  | ||||||
|   |  | ||||||
|  	/* |  | ||||||
|  	 * Get a reference to the underlying REGION information for this |  | ||||||
| @@ -296,7 +369,7 @@
 |  | ||||||
|  	 */ |  | ||||||
|  	if ((ret = __env_des_get(env, infop, infop, &rp)) != 0 || rp == NULL) |  | ||||||
|  		goto find_err; |  | ||||||
| -	infop->rp = rp;
 |  | ||||||
| +	    infop->rp = rp;
 |  | ||||||
|   |  | ||||||
|  	/* |  | ||||||
|  	 * There's still a possibility for inconsistent data.  When we acquired |  | ||||||
| @@ -346,6 +419,12 @@
 |  | ||||||
|  	return (0); |  | ||||||
|   |  | ||||||
|  creation: |  | ||||||
| +	/* Should this wait for the lock (passing 0 instead of 1)? */
 |  | ||||||
| +	if ((ret = ENV_PRIMARY_LOCK(env, DB_LOCK_WRITE, 1)) != 0) {
 |  | ||||||
| +		__db_err(env, ret, "__env_attach: creation could not lock %s",
 |  | ||||||
| +		    env->primary_fhp->name);
 |  | ||||||
| +		goto err;
 |  | ||||||
| +	}
 |  | ||||||
|  	/* Create the environment region. */ |  | ||||||
|  	F_SET(infop, REGION_CREATE); |  | ||||||
|   |  | ||||||
| @@ -437,7 +516,14 @@
 |  | ||||||
|  	renv->minver = (u_int32_t)minver; |  | ||||||
|  	renv->patchver = (u_int32_t)patchver; |  | ||||||
|  	renv->signature = signature; |  | ||||||
| -
 |  | ||||||
| +#ifdef HAVE_PTHREADS_TIMESTAMP
 |  | ||||||
| +	renv->pthreads_timestamp = __os_pthreads_timestamp(env);
 |  | ||||||
| +	{
 |  | ||||||
| +		char *s = getenv("TS_ADJUST");
 |  | ||||||
| +		if (s != NULL)
 |  | ||||||
| +			renv->pthreads_timestamp -= atoi(s);
 |  | ||||||
| +	}
 |  | ||||||
| +#endif
 |  | ||||||
|  	(void)time(&renv->timestamp); |  | ||||||
|  	__os_unique_id(env, &renv->envid); |  | ||||||
|   |  | ||||||
| @@ -505,7 +591,7 @@
 |  | ||||||
|  		ref.segid = tregion.segid; |  | ||||||
|  		ref.max = tregion.max; |  | ||||||
|  		if ((ret = __os_write( |  | ||||||
| -		    env, env->lockfhp, &ref, sizeof(ref), &nrw)) != 0) {
 |  | ||||||
| +		    env, env->primary_fhp, &ref, sizeof(ref), &nrw)) != 0) {
 |  | ||||||
|  			__db_err(env, ret, DB_STR_A("1545", |  | ||||||
|  			    "%s: unable to write out public environment ID", |  | ||||||
|  			    "%s"), infop->name); |  | ||||||
| @@ -513,16 +599,24 @@
 |  | ||||||
|  		} |  | ||||||
|  	} |  | ||||||
|   |  | ||||||
| -#ifndef HAVE_MUTEX_FCNTL
 |  | ||||||
| -	/*
 |  | ||||||
| -	 * If we're not doing fcntl locking, we can close the file handle.  We
 |  | ||||||
| -	 * no longer need it and the less contact between the buffer cache and
 |  | ||||||
| -	 * the VM, the better.
 |  | ||||||
| -	 */
 |  | ||||||
| -	if (env->lockfhp != NULL) {
 |  | ||||||
| -		 (void)__os_closehandle(env, env->lockfhp);
 |  | ||||||
| -		 env->lockfhp = NULL;
 |  | ||||||
| +#ifdef HAVE_FCNTL
 |  | ||||||
| +	if ((ret = ENV_PRIMARY_UNLOCK(env)) != 0) {
 |  | ||||||
| +		__db_err(env, ret, "__env_attach: release exclusive lock");
 |  | ||||||
| +		goto err;
 |  | ||||||
|  	} |  | ||||||
| +	if ((ret = ENV_PRIMARY_LOCK(env, DB_LOCK_READ, 0)) != 0) {
 |  | ||||||
| +		__db_err(env, ret, "__env_attach: new: acquire shared lock");
 |  | ||||||
| +		goto err;
 |  | ||||||
| +	}
 |  | ||||||
| +#else
 |  | ||||||
| + 	/*
 |  | ||||||
| +	 * We no longer need the primary region file's handle and the less
 |  | ||||||
| +	 * contact between the buffer cache and the VM, the better.
 |  | ||||||
| + 	 */
 |  | ||||||
| +	if (env->primary_fhp != NULL) {
 |  | ||||||
| +		 (void)__os_closehandle(env, env->primary_fhp);
 |  | ||||||
| +		 env->primary_fhp = NULL;
 |  | ||||||
| + 	}
 |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
|  	/* Everything looks good, we're done. */ |  | ||||||
| @@ -531,9 +625,9 @@
 |  | ||||||
|   |  | ||||||
|  err: |  | ||||||
|  retry:	/* Close any open file handle. */ |  | ||||||
| -	if (env->lockfhp != NULL) {
 |  | ||||||
| -		(void)__os_closehandle(env, env->lockfhp);
 |  | ||||||
| -		env->lockfhp = NULL;
 |  | ||||||
| +	if (env->primary_fhp != NULL) {
 |  | ||||||
| +		(void)__os_closehandle(env, env->primary_fhp);
 |  | ||||||
| +		env->primary_fhp = NULL;
 |  | ||||||
|  	} |  | ||||||
|   |  | ||||||
|  	/* |  | ||||||
| @@ -562,9 +656,9 @@
 |  | ||||||
|  	/* If we had a temporary error, wait awhile and try again. */ |  | ||||||
|  	if (ret == 0) { |  | ||||||
|  		if (!retry_ok || ++retry_cnt > 3) { |  | ||||||
| +			ret = EAGAIN;
 |  | ||||||
|  			__db_errx(env, DB_STR("1546", |  | ||||||
|  			    "unable to join the environment")); |  | ||||||
| -			ret = EAGAIN;
 |  | ||||||
|  		} else { |  | ||||||
|  			__os_yield(env, retry_cnt * 3, 0); |  | ||||||
|  			goto loop; |  | ||||||
| @@ -575,6 +669,59 @@
 |  | ||||||
|  } |  | ||||||
|   |  | ||||||
|  /* |  | ||||||
| + * __env_check_recreate --
 |  | ||||||
| + *	Determine whether an existing on-disk environment should be recreated
 |  | ||||||
| + *	because it is not compatible with this compiled BDB library.
 |  | ||||||
| + *
 |  | ||||||
| + *	Returns:
 |  | ||||||
| + *	    0 -
 |  | ||||||
| + *		The env was generated by this library. No recreation needed.
 |  | ||||||
| + *	    DB_OLD_VERSION -
 |  | ||||||
| + *		It was created by an earlier BDB version, or by an earlier
 |  | ||||||
| + *		version of libpthreads (on certain Linux systems).  The caller
 |  | ||||||
| + *		will try to recreate it with the currently configured settings.
 |  | ||||||
| + *	    DB_VERSION_MISMATCH -
 |  | ||||||
| + *		It was created by a newer version of BDB.  Do not attempt to
 |  | ||||||
| + *		fix it, something is probably wrong with the application setup.
 |  | ||||||
| + */
 |  | ||||||
| +static int
 |  | ||||||
| +__env_check_recreate(env, renv, signature)
 |  | ||||||
| +	ENV	*env;
 |  | ||||||
| +	REGENV	*renv;
 |  | ||||||
| +	u_int32_t signature;
 |  | ||||||
| +{
 |  | ||||||
| +#ifdef HAVE_PTHREADS_TIMESTAMP
 |  | ||||||
| +	time_t pthreads_time;
 |  | ||||||
| +	char envtime[CTIME_BUFLEN], libtime[CTIME_BUFLEN];
 |  | ||||||
| +#endif
 |  | ||||||
| +
 |  | ||||||
| +	/* First, bail out if the env is too new for this code to handle. */
 |  | ||||||
| +	if (renv->majver > DB_VERSION_MAJOR ||
 |  | ||||||
| +	    (renv->majver == DB_VERSION_MAJOR &&
 |  | ||||||
| +	    renv->minver > DB_VERSION_MINOR))
 |  | ||||||
| +	    	return (DB_VERSION_MISMATCH);
 |  | ||||||
| +
 |  | ||||||
| +#ifdef HAVE_PTHREADS_TIMESTAMP
 |  | ||||||
| +	pthreads_time = __os_pthreads_timestamp(env);
 |  | ||||||
| +	if (pthreads_time != renv->pthreads_timestamp) {
 |  | ||||||
| +		if (FLD_ISSET(env->dbenv->verbose, DB_VERB_RECOVERY))
 |  | ||||||
| +			__db_msg(env,
 |  | ||||||
| +			"Pthreads timestamp changed: env %.24s current %.24s",
 |  | ||||||
| +			    __os_ctime(&renv->pthreads_timestamp, envtime),
 |  | ||||||
| +			    __os_ctime(&pthreads_time, libtime));
 |  | ||||||
| +		return (DB_OLD_VERSION);
 |  | ||||||
| +	}
 |  | ||||||
| +#endif
 |  | ||||||
| +	if (renv->signature != signature || renv->majver != DB_VERSION_MAJOR ||
 |  | ||||||
| +	    renv->minver != DB_VERSION_MINOR) {
 |  | ||||||
| +		if (FLD_ISSET(env->dbenv->verbose, DB_VERB_RECOVERY))
 |  | ||||||
| +			__db_msg(env, "Signature or version changed");
 |  | ||||||
| +		return (DB_OLD_VERSION);
 |  | ||||||
| +	}
 |  | ||||||
| +    	return (0);
 |  | ||||||
| +}
 |  | ||||||
| +
 |  | ||||||
| +/*
 |  | ||||||
|   * __env_turn_on -- |  | ||||||
|   *	Turn on the created environment. |  | ||||||
|   * |  | ||||||
| @@ -794,12 +941,11 @@
 |  | ||||||
|  	renv = infop->primary; |  | ||||||
|  	ret = 0; |  | ||||||
|   |  | ||||||
| -	/* Close the locking file handle. */
 |  | ||||||
| -	if (env->lockfhp != NULL) {
 |  | ||||||
| +	if (env->primary_fhp != NULL) {
 |  | ||||||
|  		if ((t_ret = |  | ||||||
| -		    __os_closehandle(env, env->lockfhp)) != 0 && ret == 0)
 |  | ||||||
| +		    __os_closehandle(env, env->primary_fhp)) != 0 && ret == 0)
 |  | ||||||
|  			ret = t_ret; |  | ||||||
| -		env->lockfhp = NULL;
 |  | ||||||
| +		env->primary_fhp = NULL;
 |  | ||||||
|  	} |  | ||||||
|   |  | ||||||
|  	/* |  | ||||||
| diff -r db78da0996b1 src/env/env_register.c
 | diff -r db78da0996b1 src/env/env_register.c
 | ||||||
| --- a/src/env/env_register.c	Mon Sep 09 11:09:35 2013 -0400
 | --- a/src/env/env_register.c	Mon Sep 09 11:09:35 2013 -0400
 | ||||||
| +++ b/src/env/env_register.c	Sat Apr 29 04:10:18 2017 -0700
 | +++ b/src/env/env_register.c	Sat Apr 29 04:10:18 2017 -0700
 | ||||||
| @ -726,16 +289,6 @@ diff -r db78da0996b1 src/env/env_stat.c | |||||||
|  	STAT_HEX("Environment ID", renv->envid); |  	STAT_HEX("Environment ID", renv->envid); | ||||||
|  	__mutex_print_debug_single(env, |  	__mutex_print_debug_single(env, | ||||||
|  	    "Primary region allocation and reference count mutex", |  	    "Primary region allocation and reference count mutex", | ||||||
| @@ -429,7 +433,8 @@
 |  | ||||||
|   |  | ||||||
|  	STAT_ULONG("Pid cache", env->pid_cache); |  | ||||||
|   |  | ||||||
| -	STAT_ISSET("Lockfhp", env->lockfhp);
 |  | ||||||
| +	/* Change to Primary Region fhp? The name changed, but not its usage. */
 |  | ||||||
| +	STAT_ISSET("Lockfhp", env->primary_fhp);
 |  | ||||||
|   |  | ||||||
|  	STAT_ISSET("Locker", env->env_lref); |  | ||||||
|   |  | ||||||
| diff -r db78da0996b1 src/os/os_addrinfo.c
 | diff -r db78da0996b1 src/os/os_addrinfo.c
 | ||||||
| --- a/src/os/os_addrinfo.c	Mon Sep 09 11:09:35 2013 -0400
 | --- a/src/os/os_addrinfo.c	Mon Sep 09 11:09:35 2013 -0400
 | ||||||
| +++ b/src/os/os_addrinfo.c	Sat Apr 29 04:10:18 2017 -0700
 | +++ b/src/os/os_addrinfo.c	Sat Apr 29 04:10:18 2017 -0700
 | ||||||
| @ -947,8 +500,8 @@ diff -r db78da0996b1 src/os/os_flock.c | |||||||
| +}
 | +}
 | ||||||
|  #endif |  #endif | ||||||
| -}
 | -}
 | ||||||
| --- db-5.3.28/src/os/os_map.c.pthreads	2013-09-09 17:35:09.000000000 +0200
 | --- b/src/os/os_map.c.pthreads	2013-09-09 17:35:09.000000000 +0200
 | ||||||
| +++ db-5.3.28/src/os/os_map.c	2017-05-16 09:31:30.535713279 +0200
 | +++ b/src/os/os_map.c	2017-05-16 09:31:30.535713279 +0200
 | ||||||
| @@ -32,7 +32,7 @@
 | @@ -32,7 +32,7 @@
 | ||||||
|   |   | ||||||
|  /* |  /* | ||||||
| @ -966,3 +519,291 @@ diff -r db78da0996b1 src/os/os_flock.c | |||||||
|  	dbenv = env->dbenv; |  	dbenv = env->dbenv; | ||||||
|   |   | ||||||
|  	if (DB_GLOBAL(j_region_map) != NULL) { |  	if (DB_GLOBAL(j_region_map) != NULL) { | ||||||
|  | 
 | ||||||
|  | --- b/src/env/env_region.c.pthreads	2013-09-09 17:35:08.000000000 +0200
 | ||||||
|  | +++ b/src/env/env_region.c	2017-05-22 13:18:21.898595006 +0200
 | ||||||
|  | @@ -18,13 +18,49 @@
 | ||||||
|  |  static int  __env_faultmem __P((ENV *, void *, size_t, int)); | ||||||
|  |  static int  __env_sys_attach __P((ENV *, REGINFO *, REGION *)); | ||||||
|  |  static int  __env_sys_detach __P((ENV *, REGINFO *, int)); | ||||||
|  | +static int  __env_check_recreate __P((ENV *, REGENV *, u_int32_t));
 | ||||||
|  |  static void __env_des_destroy __P((ENV *, REGION *)); | ||||||
|  |  static void __env_remove_file __P((ENV *)); | ||||||
|  |   | ||||||
|  | +
 | ||||||
|  | +/*
 | ||||||
|  | + * If the system supports flock()-like file locking, then the primary region
 | ||||||
|  | + * file __db.001 is exclusively locked during creation, and is read-locked while
 | ||||||
|  | + * the environment is open. Most Unix-like systems have flock(), with the
 | ||||||
|  | + * notable exception of Solaris.
 | ||||||
|  | + * Note: fcntl cannot be used for this locking because of the unfortunate
 | ||||||
|  | + * definition of its interaction with close(2). A process's fcntl locks are
 | ||||||
|  | + * released whenever it closes any file descriptor for that file. So, if an
 | ||||||
|  | + * environment is opened more than once, closing one of the DB_ENV handles would
 | ||||||
|  | + * release the read lock that protects the other handle.
 | ||||||
|  | + */
 | ||||||
|  | +#ifdef HAVE_FLOCK
 | ||||||
|  | +#define ENV_PRIMARY_LOCK(env, lockmode, async)	\
 | ||||||
|  | +	((env)->lockfhp == NULL ? 0 :	\
 | ||||||
|  | +	__os_fdlock((env), (env)->lockfhp, -1, lockmode, async))
 | ||||||
|  | +#define ENV_PRIMARY_UNLOCK(env)			\
 | ||||||
|  | +	((env)->lockfhp == NULL ? 0 :	\
 | ||||||
|  | +	__os_fdlock((env), (env)->lockfhp, -1, DB_LOCK_NG, 0))
 | ||||||
|  | +#else
 | ||||||
|  | +#define ENV_PRIMARY_LOCK(env, lockmode, async)	(0)
 | ||||||
|  | +#define ENV_PRIMARY_UNLOCK(env)			(0)
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  |  /* | ||||||
|  |   * __env_attach | ||||||
|  |   *	Join/create the environment | ||||||
|  |   * | ||||||
|  | + * Safely detecting and managing multiple processes' environment handles:
 | ||||||
|  | + *	BDB uses a shared or exclusive fcntl()-style lock on the first byte
 | ||||||
|  | + *	of the primary region file (__db.001) to detect whether other processes
 | ||||||
|  | + *	have the environment open, and to single-thread attempts to create the
 | ||||||
|  | + *	environment.  If the open includes DB_CREATE, an exclusive lock is
 | ||||||
|  | + *	obtained during the open call.  After the creation is finished, and
 | ||||||
|  | + *	anytime during a non-DB_CREATE env open, the process holds a shared
 | ||||||
|  | + *	lock. 
 | ||||||
|  | + *	- single-thread creation of the environment
 | ||||||
|  | + *	- detect whether any other processes are currently attached to it.
 | ||||||
|  | + *
 | ||||||
|  |   * PUBLIC: int __env_attach __P((ENV *, u_int32_t *, int, int)); | ||||||
|  |   */ | ||||||
|  |  int | ||||||
|  | @@ -122,7 +158,11 @@
 | ||||||
|  |  	if ((ret = __os_open( | ||||||
|  |  	    env, infop->name, 0, DB_OSO_REGION, 0, &env->lockfhp)) != 0) | ||||||
|  |  		goto err; | ||||||
|  | -
 | ||||||
|  | +	/* Wait to get shared access to the primary region. */
 | ||||||
|  | +	if ((ret = ENV_PRIMARY_LOCK(env, DB_LOCK_READ, 0)) != 0) {
 | ||||||
|  | +		__db_err(env, ret, "__env_attach: existing: shared lock error");
 | ||||||
|  | +		goto err;
 | ||||||
|  | +	}
 | ||||||
|  |  	/* | ||||||
|  |  	 * !!! | ||||||
|  |  	 * The region may be in system memory not backed by the filesystem | ||||||
|  | @@ -218,11 +258,10 @@
 | ||||||
|  |  		segid = ref.segid; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -#ifndef HAVE_MUTEX_FCNTL
 | ||||||
|  | +#if !defined(HAVE_FCNTL) && !defined(HAVE_PTHREADS_TIMESTAMP)
 | ||||||
|  |  	/* | ||||||
|  | -	 * If we're not doing fcntl locking, we can close the file handle.  We
 | ||||||
|  | -	 * no longer need it and the less contact between the buffer cache and
 | ||||||
|  | -	 * the VM, the better.
 | ||||||
|  | +	 * Without fcntl-like support, we no longer need the file handle.  Close
 | ||||||
|  | +	 * it to limit the interaction between the buffer cache and the VM.
 | ||||||
|  |  	 */ | ||||||
|  |  	(void)__os_closehandle(env, env->lockfhp); | ||||||
|  |  	 env->lockfhp = NULL; | ||||||
|  | @@ -233,6 +272,8 @@
 | ||||||
|  |  	tregion.size = (roff_t)size; | ||||||
|  |  	tregion.max = (roff_t)max; | ||||||
|  |  	tregion.segid = segid; | ||||||
|  | +	/* Attach to the existing primary region. */
 | ||||||
|  | +	/* The leaking db.001 gets open inside of here, in __os_attach(). */
 | ||||||
|  |  	if ((ret = __env_sys_attach(env, infop, &tregion)) != 0) | ||||||
|  |  		goto err; | ||||||
|  |   | ||||||
|  | @@ -246,20 +287,38 @@
 | ||||||
|  |  	infop->head = (u_int8_t *)infop->addr + sizeof(REGENV); | ||||||
|  |  	renv = infop->primary; | ||||||
|  |   | ||||||
|  | -	/*
 | ||||||
|  | -	 * Make sure the region matches our build.  Special case a region
 | ||||||
|  | -	 * that's all nul bytes, just treat it like any other corruption.
 | ||||||
|  | -	 */
 | ||||||
|  | +	if (create_ok &&
 | ||||||
|  | +	    __env_check_recreate(env, renv, signature) == DB_OLD_VERSION &&
 | ||||||
|  | +	    (ret = ENV_PRIMARY_LOCK(env, DB_LOCK_WRITE, 1)) == 0) {
 | ||||||
|  | +		if (FLD_ISSET(dbenv->verbose, DB_VERB_RECOVERY))
 | ||||||
|  | +			__db_msg(env, "Recreating idle environment");
 | ||||||
|  | +		F_SET(infop, REGION_CREATE_OK);
 | ||||||
|  | +
 | ||||||
|  | +		/*
 | ||||||
|  | +		 * Detach from the environment region; we need to unmap it (and
 | ||||||
|  | +		 * close any file handle) so that we don't leak memory or files.
 | ||||||
|  | +		 */
 | ||||||
|  | +		DB_ASSERT(env, infop->rp == NULL);
 | ||||||
|  | +		infop->rp = &tregion;
 | ||||||
|  | +		(void)__env_sys_detach(env, infop, 0);
 | ||||||
|  | +		goto creation;
 | ||||||
|  | +	}
 | ||||||
|  | +
 | ||||||
|  |  	if (renv->majver != DB_VERSION_MAJOR || | ||||||
|  |  	    renv->minver != DB_VERSION_MINOR) { | ||||||
|  | -		if (renv->majver != 0 || renv->minver != 0) {
 | ||||||
|  | +		/*
 | ||||||
|  | +		 * Special case a region that's all nul bytes, just treat it
 | ||||||
|  | +		 * like any other corruption.
 | ||||||
|  | +		 */
 | ||||||
|  | +		if (renv->majver == 0 && renv->minver == 0)
 | ||||||
|  | +			ret = EINVAL;
 | ||||||
|  | +		else {
 | ||||||
|  |  			__db_errx(env, DB_STR_A("1538", | ||||||
|  | -	    "Program version %d.%d doesn't match environment version %d.%d",
 | ||||||
|  | +	"Program version %d.%d doesn't match in-use environment version %d.%d",
 | ||||||
|  |  			    "%d %d %d %d"), DB_VERSION_MAJOR, DB_VERSION_MINOR, | ||||||
|  |  			    renv->majver, renv->minver); | ||||||
|  |  			ret = DB_VERSION_MISMATCH; | ||||||
|  | -		} else
 | ||||||
|  | -			ret = EINVAL;
 | ||||||
|  | +		}
 | ||||||
|  |  		goto err; | ||||||
|  |  	} | ||||||
|  |  	if (renv->signature != signature) { | ||||||
|  | @@ -289,6 +348,18 @@
 | ||||||
|  |  	} | ||||||
|  |  	if (renv->magic != DB_REGION_MAGIC) | ||||||
|  |  		goto retry; | ||||||
|  | +	    /*
 | ||||||
|  | +	     * A bad magic number means that the env is new and not yet available:
 | ||||||
|  | +	     * wait a while and try again.  If the magic number says recovery is in
 | ||||||
|  | +	     * process, remember the env creation time to record that recovery was
 | ||||||
|  | +	     * the reason that the open failed.
 | ||||||
|  | +	     */
 | ||||||
|  | +	    if (renv->magic != DB_REGION_MAGIC) {
 | ||||||
|  | +		    __db_msg(env, "attach sees bad region magic 0x%lx",
 | ||||||
|  | +			(u_long)renv->magic);
 | ||||||
|  | +		    goto retry;
 | ||||||
|  | +	    }
 | ||||||
|  | +
 | ||||||
|  |   | ||||||
|  |  	/* | ||||||
|  |  	 * Get a reference to the underlying REGION information for this | ||||||
|  | @@ -346,6 +417,12 @@
 | ||||||
|  |  	return (0); | ||||||
|  |   | ||||||
|  |  creation: | ||||||
|  | +	/* Should this wait for the lock (passing 0 instead of 1)? */
 | ||||||
|  | +	if ((ret = ENV_PRIMARY_LOCK(env, DB_LOCK_WRITE, 1)) != 0) {
 | ||||||
|  | +		__db_err(env, ret, "__env_attach: creation could not lock %s",
 | ||||||
|  | +		    env->lockfhp->name);
 | ||||||
|  | +		goto err;
 | ||||||
|  | +	}
 | ||||||
|  |  	/* Create the environment region. */ | ||||||
|  |  	F_SET(infop, REGION_CREATE); | ||||||
|  |   | ||||||
|  | @@ -437,7 +514,14 @@
 | ||||||
|  |  	renv->minver = (u_int32_t)minver; | ||||||
|  |  	renv->patchver = (u_int32_t)patchver; | ||||||
|  |  	renv->signature = signature; | ||||||
|  | -
 | ||||||
|  | +#ifdef HAVE_PTHREADS_TIMESTAMP
 | ||||||
|  | +	renv->pthreads_timestamp = __os_pthreads_timestamp(env);
 | ||||||
|  | +	{
 | ||||||
|  | +		char *s = getenv("TS_ADJUST");
 | ||||||
|  | +		if (s != NULL)
 | ||||||
|  | +			renv->pthreads_timestamp -= atoi(s);
 | ||||||
|  | +	}
 | ||||||
|  | +#endif
 | ||||||
|  |  	(void)time(&renv->timestamp); | ||||||
|  |  	__os_unique_id(env, &renv->envid); | ||||||
|  |   | ||||||
|  | @@ -513,16 +597,24 @@
 | ||||||
|  |  		} | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -#ifndef HAVE_MUTEX_FCNTL
 | ||||||
|  | -	/*
 | ||||||
|  | -	 * If we're not doing fcntl locking, we can close the file handle.  We
 | ||||||
|  | -	 * no longer need it and the less contact between the buffer cache and
 | ||||||
|  | -	 * the VM, the better.
 | ||||||
|  | -	 */
 | ||||||
|  | +#ifdef HAVE_FCNTL
 | ||||||
|  | +	if ((ret = ENV_PRIMARY_UNLOCK(env)) != 0) {
 | ||||||
|  | +		__db_err(env, ret, "__env_attach: release exclusive lock");
 | ||||||
|  | +		goto err;
 | ||||||
|  | +	}
 | ||||||
|  | +	if ((ret = ENV_PRIMARY_LOCK(env, DB_LOCK_READ, 0)) != 0) {
 | ||||||
|  | +		__db_err(env, ret, "__env_attach: new: acquire shared lock");
 | ||||||
|  | +		goto err;
 | ||||||
|  | +	}
 | ||||||
|  | +#else
 | ||||||
|  | + 	/*
 | ||||||
|  | +	 * We no longer need the primary region file's handle and the less
 | ||||||
|  | +	 * contact between the buffer cache and the VM, the better.
 | ||||||
|  | + 	 */
 | ||||||
|  |  	if (env->lockfhp != NULL) { | ||||||
|  |  		 (void)__os_closehandle(env, env->lockfhp); | ||||||
|  |  		 env->lockfhp = NULL; | ||||||
|  | -	}
 | ||||||
|  | + 	}
 | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  |  	/* Everything looks good, we're done. */ | ||||||
|  | @@ -562,9 +654,9 @@
 | ||||||
|  |  	/* If we had a temporary error, wait awhile and try again. */ | ||||||
|  |  	if (ret == 0) { | ||||||
|  |  		if (!retry_ok || ++retry_cnt > 3) { | ||||||
|  | +			ret = EAGAIN;
 | ||||||
|  |  			__db_errx(env, DB_STR("1546", | ||||||
|  |  			    "unable to join the environment")); | ||||||
|  | -			ret = EAGAIN;
 | ||||||
|  |  		} else { | ||||||
|  |  			__os_yield(env, retry_cnt * 3, 0); | ||||||
|  |  			goto loop; | ||||||
|  | @@ -575,6 +667,59 @@
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /* | ||||||
|  | + * __env_check_recreate --
 | ||||||
|  | + *	Determine whether an existing on-disk environment should be recreated
 | ||||||
|  | + *	because it is not compatible with this compiled BDB library.
 | ||||||
|  | + *
 | ||||||
|  | + *	Returns:
 | ||||||
|  | + *	    0 -
 | ||||||
|  | + *		The env was generated by this library. No recreation needed.
 | ||||||
|  | + *	    DB_OLD_VERSION -
 | ||||||
|  | + *		It was created by an earlier BDB version, or by an earlier
 | ||||||
|  | + *		version of libpthreads (on certain Linux systems).  The caller
 | ||||||
|  | + *		will try to recreate it with the currently configured settings.
 | ||||||
|  | + *	    DB_VERSION_MISMATCH -
 | ||||||
|  | + *		It was created by a newer version of BDB.  Do not attempt to
 | ||||||
|  | + *		fix it, something is probably wrong with the application setup.
 | ||||||
|  | + */
 | ||||||
|  | +static int
 | ||||||
|  | +__env_check_recreate(env, renv, signature)
 | ||||||
|  | +	ENV	*env;
 | ||||||
|  | +	REGENV	*renv;
 | ||||||
|  | +	u_int32_t signature;
 | ||||||
|  | +{
 | ||||||
|  | +#ifdef HAVE_PTHREADS_TIMESTAMP
 | ||||||
|  | +	time_t pthreads_time;
 | ||||||
|  | +	char envtime[CTIME_BUFLEN], libtime[CTIME_BUFLEN];
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  | +	/* First, bail out if the env is too new for this code to handle. */
 | ||||||
|  | +	if (renv->majver > DB_VERSION_MAJOR ||
 | ||||||
|  | +	    (renv->majver == DB_VERSION_MAJOR &&
 | ||||||
|  | +	    renv->minver > DB_VERSION_MINOR))
 | ||||||
|  | +	    	return (DB_VERSION_MISMATCH);
 | ||||||
|  | +
 | ||||||
|  | +#ifdef HAVE_PTHREADS_TIMESTAMP
 | ||||||
|  | +	pthreads_time = __os_pthreads_timestamp(env);
 | ||||||
|  | +	if (pthreads_time != renv->pthreads_timestamp) {
 | ||||||
|  | +		if (FLD_ISSET(env->dbenv->verbose, DB_VERB_RECOVERY))
 | ||||||
|  | +			__db_msg(env,
 | ||||||
|  | +			"Pthreads timestamp changed: env %.24s current %.24s",
 | ||||||
|  | +			    __os_ctime(&renv->pthreads_timestamp, envtime),
 | ||||||
|  | +			    __os_ctime(&pthreads_time, libtime));
 | ||||||
|  | +		return (DB_OLD_VERSION);
 | ||||||
|  | +	}
 | ||||||
|  | +#endif
 | ||||||
|  | +	if (renv->signature != signature || renv->majver != DB_VERSION_MAJOR ||
 | ||||||
|  | +	    renv->minver != DB_VERSION_MINOR) {
 | ||||||
|  | +		if (FLD_ISSET(env->dbenv->verbose, DB_VERB_RECOVERY))
 | ||||||
|  | +			__db_msg(env, "Signature or version changed");
 | ||||||
|  | +		return (DB_OLD_VERSION);
 | ||||||
|  | +	}
 | ||||||
|  | +    	return (0);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +/*
 | ||||||
|  |   * __env_turn_on -- | ||||||
|  |   *	Turn on the created environment. | ||||||
|  |   * | ||||||
|  | |||||||
							
								
								
									
										36
									
								
								libdb.spec
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								libdb.spec
									
									
									
									
									
								
							| @ -4,7 +4,7 @@ | |||||||
| Summary: The Berkeley DB database library for C | Summary: The Berkeley DB database library for C | ||||||
| Name: libdb | Name: libdb | ||||||
| Version: 5.3.28 | Version: 5.3.28 | ||||||
| Release: 18%{?dist} | Release: 19%{?dist} | ||||||
| Source0: http://download.oracle.com/berkeley-db/db-%{version}.tar.gz | Source0: http://download.oracle.com/berkeley-db/db-%{version}.tar.gz | ||||||
| Source1: http://download.oracle.com/berkeley-db/db.1.85.tar.gz | Source1: http://download.oracle.com/berkeley-db/db.1.85.tar.gz | ||||||
| # For mt19937db.c | # For mt19937db.c | ||||||
| @ -32,7 +32,8 @@ Patch27: db-5.3.21-memp_stat-upstream-fix.patch | |||||||
| Patch28: db-5.3.21-mutex_leak.patch | Patch28: db-5.3.21-mutex_leak.patch | ||||||
| # fix for overflowing hash variable inside bundled lemon | # fix for overflowing hash variable inside bundled lemon | ||||||
| Patch29: db-5.3.28-lemon_hash.patch | Patch29: db-5.3.28-lemon_hash.patch | ||||||
| # fix for erroneous assumption about condition variable layout (rhbz#1394862) | # upstream patch adding the ability to recreate libdb's environment on version mismatch | ||||||
|  | # or when libpthread.so is modified (rhbz#1394862) | ||||||
| Patch30: db-5.3.28-condition_variable.patch | Patch30: db-5.3.28-condition_variable.patch | ||||||
| 
 | 
 | ||||||
| URL: http://www.oracle.com/database/berkeley-db/ | URL: http://www.oracle.com/database/berkeley-db/ | ||||||
| @ -208,25 +209,25 @@ for building programs which use the Berkeley DB in Java. | |||||||
| cp %{SOURCE2} . | cp %{SOURCE2} . | ||||||
| tar -xf %{SOURCE3} | tar -xf %{SOURCE3} | ||||||
| 
 | 
 | ||||||
| %patch0 -p1 -b .multiarch | %patch0 -p1 | ||||||
| pushd db.1.85/PORT/linux | pushd db.1.85/PORT/linux | ||||||
| %patch10 -p0 -b .1.1 | %patch10 -p0 | ||||||
| popd | popd | ||||||
| pushd db.1.85 | pushd db.1.85 | ||||||
| %patch11 -p0 -b .1.2 | %patch11 -p0 | ||||||
| %patch12 -p0 -b .1.3 | %patch12 -p0 | ||||||
| %patch13 -p0 -b .1.4 | %patch13 -p0 | ||||||
| %patch20 -p1 -b .errno | %patch20 -p1 | ||||||
| popd | popd | ||||||
| 
 | 
 | ||||||
| %patch22 -p1 -b .185compat | %patch22 -p1 | ||||||
| %patch24 -p1 -b .4.5.20.jni | %patch24 -p1 | ||||||
| %patch25 -p1 -b .licensefix | %patch25 -p1 | ||||||
| %patch26 -p1 -b .java8-fix | %patch26 -p1 | ||||||
| %patch27 -p1 -b .memp_stat-fix | %patch27 -p1 | ||||||
| %patch28 -p1 -b .mutex_leak | %patch28 -p1 | ||||||
| %patch29 -p1 -b .lemon_hash | %patch29 -p1 | ||||||
| %patch30 -p1 -b .condition_variable | %patch30 -p1 | ||||||
| 
 | 
 | ||||||
| cd dist | cd dist | ||||||
| ./s_config | ./s_config | ||||||
| @ -435,6 +436,9 @@ rm -rf ${RPM_BUILD_ROOT} | |||||||
| %{_libdir}/libdb_java.so | %{_libdir}/libdb_java.so | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Wed May 24 2017 Petr Kubat <pkubat@redhat.com> - 5.3.28-19 | ||||||
|  | - Fix some issues present in the upstream patch for rhbz#1394862 | ||||||
|  | 
 | ||||||
| * Tue May 23 2017 Adam Williamson <awilliam@redhat.com> - 5.3.28-18 | * Tue May 23 2017 Adam Williamson <awilliam@redhat.com> - 5.3.28-18 | ||||||
| - Fix issue causing RPM to hang when glibc/libpthread change (#1394862) | - Fix issue causing RPM to hang when glibc/libpthread change (#1394862) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user