Patches for Berkeley DB version 4.2.52

  1. Long-running applications can hang in the Berkeley DB cache.
  2. Apply the following patch to the db-4.2.52 release. text
    *** mp/mp_fget.c.orig	25 Sep 2003 02:15:16 -0000	11.81
    --- mp/mp_fget.c	9 Dec 2003 19:06:28 -0000	11.82
    ***************
    *** 440,446 ****
      		c_mp->stat.st_pages--;
      		alloc_bhp = NULL;
      		R_UNLOCK(dbenv, &dbmp->reginfo[n_cache]);
    - 		MUTEX_LOCK(dbenv, &hp->hash_mutex);
      
      		/*
      		 * We can't use the page we found in the pool if DB_MPOOL_NEW
    --- 440,445 ----
    ***************
    *** 455,460 ****
    --- 454,462 ----
      			b_incr = 0;
      			goto alloc;
      		}
    + 
    + 		/* We can use the page -- get the bucket lock. */
    + 		MUTEX_LOCK(dbenv, &hp->hash_mutex);
      		break;
      	case SECOND_MISS:
      		/*
    *** mp/mp_fput.c.orig	30 Sep 2003 17:12:00 -0000	11.48
    --- mp/mp_fput.c	13 Dec 2003 00:08:29 -0000	11.49
    ***************
    *** 285,290 ****
    --- 285,291 ----
      		    bhp != NULL; bhp = SH_TAILQ_NEXT(bhp, hq, __bh))
      			if (bhp->priority != UINT32_T_MAX &&
      			    bhp->priority > MPOOL_BASE_DECREMENT)
    + 				bhp->priority -= MPOOL_BASE_DECREMENT;
      		MUTEX_UNLOCK(dbenv, &hp->hash_mutex);
      	}
      }
    

  3. Replication clients fail to lock all the necessary pages when applying updates if there were more than one database in the transaction.
  4. Apply the following patch to the db-4.2.52 release. text
    *** lock/lock.c.save	2004-01-30 10:48:33.000000000 -0800
    --- lock/lock.c	2004-01-30 10:55:58.000000000 -0800
    ***************
    *** 2216,2226 ****
      					dp = (u_int8_t *)dp +		\
      					    sizeof(db_pgno_t);		\
      				} while (0)
    ! #define COPY_OBJ(dp, obj)	do {					   \
    ! 					memcpy(dp, obj->data, obj->size);  \
    ! 					dp = (u_int8_t *)dp +		   \
    ! 					     ALIGN(obj->size,		   \
    ! 					     sizeof(u_int32_t)); 	   \
      				} while (0)
      
      #define GET_COUNT(dp, count)	do {					\
    --- 2216,2227 ----
      					dp = (u_int8_t *)dp +		\
      					    sizeof(db_pgno_t);		\
      				} while (0)
    ! #define COPY_OBJ(dp, obj)	do {					\
    ! 					memcpy(dp,			\
    ! 					    (obj)->data, (obj)->size);  \
    ! 					dp = (u_int8_t *)dp +		\
    ! 					     ALIGN((obj)->size,		\
    ! 					    sizeof(u_int32_t)); 	\
      				} while (0)
      
      #define GET_COUNT(dp, count)	do {					\
    ***************
    *** 2339,2345 ****
      		for (i = 0; i < nlocks; i = j) {
      			PUT_PCOUNT(dp, obj[i].ulen);
      			PUT_SIZE(dp, obj[i].size);
    ! 			COPY_OBJ(dp, obj);
      			lock = (DB_LOCK_ILOCK *)obj[i].data;
      			for (j = i + 1; j <= i + obj[i].ulen; j++) {
      				lock = (DB_LOCK_ILOCK *)obj[j].data;
    --- 2340,2346 ----
      		for (i = 0; i < nlocks; i = j) {
      			PUT_PCOUNT(dp, obj[i].ulen);
      			PUT_SIZE(dp, obj[i].size);
    ! 			COPY_OBJ(dp, &obj[i]);
      			lock = (DB_LOCK_ILOCK *)obj[i].data;
      			for (j = i + 1; j <= i + obj[i].ulen; j++) {
      				lock = (DB_LOCK_ILOCK *)obj[j].data;