Submitted By: Dan Nicholson Date: 2006-09-02 Initial Package Version: 4.4.20 Origin: Upstream - http://www.sleepycat.com/update/4.4.20/patch.4.4.20.html Description: Bug fixes provided by the developer. Contains patches 1-4. diff -pNur db-4.4.20.orig/db/db_cam.c db-4.4.20/db/db_cam.c --- db-4.4.20.orig/db/db_cam.c 2006-01-10 16:19:21.000000000 +0000 +++ db-4.4.20/db/db_cam.c 2006-08-03 14:31:20.220319610 +0000 @@ -579,11 +579,12 @@ __db_c_get(dbc_arg, key, data, flags) flags == DB_NEXT || flags == DB_NEXT_DUP || flags == DB_PREV)) { if (tmp_rmw && (ret = dbc_arg->c_am_writelock(dbc_arg)) != 0) return (ret); - if ((ret = __db_c_idup(cp->opd, &opd, DB_POSITION)) != 0) + if (F_ISSET(dbc_arg, DBC_TRANSIENT)) + opd = cp->opd; + else if ((ret = __db_c_idup(cp->opd, &opd, DB_POSITION)) != 0) return (ret); - switch (ret = - opd->c_am_get(opd, key, data, flags, NULL)) { + switch (ret = opd->c_am_get(opd, key, data, flags, NULL)) { case 0: goto done; case DB_NOTFOUND: @@ -596,12 +597,18 @@ __db_c_get(dbc_arg, key, data, flags) if ((ret = __db_c_close(opd)) != 0) goto err; opd = NULL; + if (F_ISSET(dbc_arg, DBC_TRANSIENT)) + cp->opd = NULL; break; } goto err; default: goto err; } + } else if (cp->opd != NULL && F_ISSET(dbc_arg, DBC_TRANSIENT)) { + if ((ret = __db_c_close(cp->opd)) != 0) + goto err; + cp->opd = NULL; } /* diff -pNur db-4.4.20.orig/mp/mp_fget.c db-4.4.20/mp/mp_fget.c --- db-4.4.20.orig/mp/mp_fget.c 2005-10-12 17:53:36.000000000 +0000 +++ db-4.4.20/mp/mp_fget.c 2006-08-03 14:31:20.223318410 +0000 @@ -587,8 +587,11 @@ alloc: /* */ if (state != SECOND_MISS && bhp->ref == 1) { bhp->priority = UINT32_MAX; - SH_TAILQ_REMOVE(&hp->hash_bucket, bhp, hq, __bh); - SH_TAILQ_INSERT_TAIL(&hp->hash_bucket, bhp, hq); + if (SH_TAILQ_FIRST(&hp->hash_bucket, __bh) != + SH_TAILQ_LAST(&hp->hash_bucket, hq, __bh)) { + SH_TAILQ_REMOVE(&hp->hash_bucket, bhp, hq, __bh); + SH_TAILQ_INSERT_TAIL(&hp->hash_bucket, bhp, hq); + } hp->hash_priority = SH_TAILQ_FIRSTP(&hp->hash_bucket, __bh)->priority; } diff -pNur db-4.4.20.orig/qam/qam_files.c db-4.4.20/qam/qam_files.c --- db-4.4.20.orig/qam/qam_files.c 2005-10-20 18:57:12.000000000 +0000 +++ db-4.4.20/qam/qam_files.c 2006-08-03 14:31:20.211323209 +0000 @@ -411,6 +411,12 @@ __qam_fremove(dbp, pgnoaddr) DB_APP_DATA, buf, 0, NULL, &real_name)) != 0) goto err; #endif + + mpf = array->mpfarray[offset].mpf; + /* This extent my already be marked for delete and closed. */ + if (mpf == NULL) + goto err; + /* * The log must be flushed before the file is deleted. We depend on * the log record of the last delete to recreate the file if we crash. @@ -418,7 +424,6 @@ __qam_fremove(dbp, pgnoaddr) if (LOGGING_ON(dbenv) && (ret = __log_flush(dbenv, NULL)) != 0) goto err; - mpf = array->mpfarray[offset].mpf; (void)__memp_set_flags(mpf, DB_MPOOL_UNLINK, 1); /* Someone could be real slow, let them close it down. */ if (array->mpfarray[offset].pinref != 0) diff -pNur db-4.4.20.orig/txn/txn.c db-4.4.20/txn/txn.c --- db-4.4.20.orig/txn/txn.c 2005-11-01 14:50:03.000000000 +0000 +++ db-4.4.20/txn/txn.c 2006-08-03 14:31:20.215321609 +0000 @@ -1049,12 +1049,14 @@ __txn_set_name(txn, name) return (ret); memcpy(txn->name, name, len); + TXN_SYSTEM_LOCK(dbenv); if (td->name != INVALID_ROFF) { __db_shalloc_free( &mgr->reginfo, R_ADDR(&mgr->reginfo, td->name)); td->name = INVALID_ROFF; } if ((ret = __db_shalloc(&mgr->reginfo, len, 0, &p)) != 0) { + TXN_SYSTEM_UNLOCK(dbenv); __db_err(dbenv, "Unable to allocate memory for transaction name"); @@ -1063,6 +1065,7 @@ __txn_set_name(txn, name) return (ret); } + TXN_SYSTEM_UNLOCK(dbenv); td->name = R_OFFSET(&mgr->reginfo, p); memcpy(p, name, len);