diff options
Diffstat (limited to 'db2/btree')
-rw-r--r-- | db2/btree/bt_close.c | 8 | ||||
-rw-r--r-- | db2/btree/bt_cursor.c | 30 | ||||
-rw-r--r-- | db2/btree/bt_delete.c | 7 | ||||
-rw-r--r-- | db2/btree/bt_open.c | 19 | ||||
-rw-r--r-- | db2/btree/bt_page.c | 26 | ||||
-rw-r--r-- | db2/btree/bt_put.c | 19 | ||||
-rw-r--r-- | db2/btree/bt_rec.c | 113 | ||||
-rw-r--r-- | db2/btree/bt_recno.c | 31 | ||||
-rw-r--r-- | db2/btree/btree_auto.c | 22 |
9 files changed, 170 insertions, 105 deletions
diff --git a/db2/btree/bt_close.c b/db2/btree/bt_close.c index 7dd7139..ecccc9f 100644 --- a/db2/btree/bt_close.c +++ b/db2/btree/bt_close.c @@ -47,7 +47,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)bt_close.c 10.24 (Sleepycat) 9/17/97"; +static const char sccsid[] = "@(#)bt_close.c 10.25 (Sleepycat) 1/6/98"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -144,7 +144,7 @@ __bam_upstat(dbp) { BTREE *t; BTMETA *meta; - DB_LOCK mlock; + DB_LOCK metalock; db_pgno_t pgno; int flags, ret; @@ -161,7 +161,7 @@ __bam_upstat(dbp) pgno = PGNO_METADATA; /* Lock and retrieve the page. */ - if (__bam_lget(dbp, 0, pgno, DB_LOCK_WRITE, &mlock) != 0) + if (__bam_lget(dbp, 0, pgno, DB_LOCK_WRITE, &metalock) != 0) return; if (__bam_pget(dbp, (PAGE **)&meta, &pgno, 0) == 0) { /* Log the change. */ @@ -178,5 +178,5 @@ __bam_upstat(dbp) } err: (void)memp_fput(dbp->mpf, (PAGE *)meta, flags); - (void)__BT_LPUT(dbp, mlock); + (void)__BT_LPUT(dbp, metalock); } diff --git a/db2/btree/bt_cursor.c b/db2/btree/bt_cursor.c index 47ecd7c..f526c96 100644 --- a/db2/btree/bt_cursor.c +++ b/db2/btree/bt_cursor.c @@ -8,7 +8,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)bt_cursor.c 10.37 (Sleepycat) 11/22/97"; +static const char sccsid[] = "@(#)bt_cursor.c 10.41 (Sleepycat) 1/8/98"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -128,22 +128,25 @@ __bam_c_iclose(dbp, dbc) CURSOR *cp; int ret; - cp = dbc->internal; + /* + * All cursors are queued from the master DB structure. For + * now, discard the DB handle which triggered this call, and + * replace it with the cursor's reference. + */ + dbp = dbc->dbp; /* If a cursor key was deleted, perform the actual deletion. */ + cp = dbc->internal; ret = F_ISSET(cp, C_DELETED) ? __bam_c_physdel(dbp, cp, NULL) : 0; /* Discard any lock if we're not inside a transaction. */ if (cp->lock != LOCK_INVALID) (void)__BT_TLPUT(dbp, cp->lock); - /* - * All cursors are queued from the master DB structure. Remove the - * cursor from that queue. - */ - DB_THREAD_LOCK(dbc->dbp); - TAILQ_REMOVE(&dbc->dbp->curs_queue, dbc, links); - DB_THREAD_UNLOCK(dbc->dbp); + /* Remove the cursor from the queue. */ + DB_THREAD_LOCK(dbp); + TAILQ_REMOVE(&dbp->curs_queue, dbc, links); + DB_THREAD_UNLOCK(dbp); /* Discard the structures. */ FREE(dbc->internal, sizeof(CURSOR)); @@ -452,6 +455,8 @@ __bam_c_rget(dbp, cp, data, flags) db_recno_t recno; int exact, ret; + COMPQUIET(flags, 0); + /* Get the page with the current item on it. */ if ((ret = __bam_pget(dbp, &cp->page, &cp->pgno, 0)) != 0) return (ret); @@ -1086,6 +1091,8 @@ __bam_ovfl_chk(dbp, cp, indx, to_end) /* * __bam_cprint -- * Display the current btree cursor list. + * + * PUBLIC: int __bam_cprint __P((DB *)); */ int __bam_cprint(dbp) @@ -1258,12 +1265,11 @@ __bam_ca_dup(dbp, fpgno, first, fi, tpgno, ti) * __bam_ca_move -- * Adjust the cursors when moving data items to another page. * - * PUBLIC: void __bam_ca_move __P((DB *, BTREE *, db_pgno_t, db_pgno_t)); + * PUBLIC: void __bam_ca_move __P((DB *, db_pgno_t, db_pgno_t)); */ void -__bam_ca_move(dbp, t, fpgno, tpgno) +__bam_ca_move(dbp, fpgno, tpgno) DB *dbp; - BTREE *t; db_pgno_t fpgno, tpgno; { CURSOR *cp; diff --git a/db2/btree/bt_delete.c b/db2/btree/bt_delete.c index dbd1995..baa8a25 100644 --- a/db2/btree/bt_delete.c +++ b/db2/btree/bt_delete.c @@ -47,7 +47,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)bt_delete.c 10.23 (Sleepycat) 11/22/97"; +static const char sccsid[] = "@(#)bt_delete.c 10.25 (Sleepycat) 1/8/98"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -500,7 +500,8 @@ __bam_dpages(dbp, t) db_recno_t rcnt; int ret; - rcnt = 0; /* XXX: Shut the compiler up. */ + COMPQUIET(rcnt, 0); + epg = t->bt_sp; /* @@ -581,7 +582,7 @@ __bam_dpages(dbp, t) ++t->lstat.bt_freed; /* Adjust the cursors. */ - __bam_ca_move(dbp, t, h->pgno, PGNO_ROOT); + __bam_ca_move(dbp, h->pgno, PGNO_ROOT); } /* Release the top page in the subtree. */ diff --git a/db2/btree/bt_open.c b/db2/btree/bt_open.c index 2361f69..dd9f109 100644 --- a/db2/btree/bt_open.c +++ b/db2/btree/bt_open.c @@ -47,7 +47,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)bt_open.c 10.21 (Sleepycat) 10/25/97"; +static const char sccsid[] = "@(#)bt_open.c 10.22 (Sleepycat) 1/6/98"; #endif /* not lint */ /* @@ -265,18 +265,18 @@ __bam_setmeta(dbp, t) { BTMETA *meta; PAGE *root; - DB_LOCK mlock, rlock; + DB_LOCK metalock, rootlock; db_pgno_t pgno; int ret; /* Get, and optionally create the metadata page. */ pgno = PGNO_METADATA; if ((ret = - __bam_lget(dbp, 0, PGNO_METADATA, DB_LOCK_WRITE, &mlock)) != 0) + __bam_lget(dbp, 0, PGNO_METADATA, DB_LOCK_WRITE, &metalock)) != 0) return (ret); if ((ret = __bam_pget(dbp, (PAGE **)&meta, &pgno, DB_MPOOL_CREATE)) != 0) { - (void)__BT_LPUT(dbp, mlock); + (void)__BT_LPUT(dbp, metalock); return (ret); } @@ -290,7 +290,7 @@ __bam_setmeta(dbp, t) t->bt_minkey = meta->minkey; (void)memp_fput(dbp->mpf, (PAGE *)meta, 0); - (void)__BT_LPUT(dbp, mlock); + (void)__BT_LPUT(dbp, metalock); return (0); } @@ -320,10 +320,11 @@ __bam_setmeta(dbp, t) /* Create and initialize a root page. */ pgno = PGNO_ROOT; - if ((ret = __bam_lget(dbp, 0, PGNO_ROOT, DB_LOCK_WRITE, &rlock)) != 0) + if ((ret = + __bam_lget(dbp, 0, PGNO_ROOT, DB_LOCK_WRITE, &rootlock)) != 0) return (ret); if ((ret = __bam_pget(dbp, &root, &pgno, DB_MPOOL_CREATE)) != 0) { - (void)__BT_LPUT(dbp, rlock); + (void)__BT_LPUT(dbp, rootlock); return (ret); } P_INIT(root, dbp->pgsize, PGNO_ROOT, PGNO_INVALID, @@ -348,8 +349,8 @@ __bam_setmeta(dbp, t) ret = EINVAL; /* Release the locks. */ - (void)__BT_LPUT(dbp, mlock); - (void)__BT_LPUT(dbp, rlock); + (void)__BT_LPUT(dbp, metalock); + (void)__BT_LPUT(dbp, rootlock); return (ret); } diff --git a/db2/btree/bt_page.c b/db2/btree/bt_page.c index 7ee74ff..853317e 100644 --- a/db2/btree/bt_page.c +++ b/db2/btree/bt_page.c @@ -47,7 +47,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)bt_page.c 10.5 (Sleepycat) 8/18/97"; +static const char sccsid[] = "@(#)bt_page.c 10.7 (Sleepycat) 1/7/98"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -75,17 +75,17 @@ __bam_new(dbp, type, pagepp) PAGE **pagepp; { BTMETA *meta; - DB_LOCK mlock; + DB_LOCK metalock; PAGE *h; db_pgno_t pgno; int ret; meta = NULL; h = NULL; - mlock = LOCK_INVALID; + metalock = LOCK_INVALID; pgno = PGNO_METADATA; - if ((ret = __bam_lget(dbp, 0, pgno, DB_LOCK_WRITE, &mlock)) != 0) + if ((ret = __bam_lget(dbp, 0, pgno, DB_LOCK_WRITE, &metalock)) != 0) goto err; if ((ret = __bam_pget(dbp, (PAGE **)&meta, &pgno, 0)) != 0) goto err; @@ -112,7 +112,7 @@ __bam_new(dbp, type, pagepp) } (void)memp_fput(dbp->mpf, (PAGE *)meta, DB_MPOOL_DIRTY); - (void)__BT_TLPUT(dbp, mlock); + (void)__BT_TLPUT(dbp, metalock); P_INIT(h, dbp->pgsize, h->pgno, PGNO_INVALID, PGNO_INVALID, 0, type); *pagepp = h; @@ -122,8 +122,8 @@ err: if (h != NULL) (void)memp_fput(dbp->mpf, h, 0); if (meta != NULL) (void)memp_fput(dbp->mpf, meta, 0); - if (mlock != LOCK_INVALID) - (void)__BT_TLPUT(dbp, mlock); + if (metalock != LOCK_INVALID) + (void)__BT_TLPUT(dbp, metalock); return (ret); } @@ -140,7 +140,7 @@ __bam_free(dbp, h) { BTMETA *meta; DBT ldbt; - DB_LOCK mlock; + DB_LOCK metalock; db_pgno_t pgno; int is_dirty, ret, t_ret; @@ -152,10 +152,10 @@ __bam_free(dbp, h) */ is_dirty = 0; pgno = PGNO_METADATA; - if ((ret = __bam_lget(dbp, 0, pgno, DB_LOCK_WRITE, &mlock)) != 0) + if ((ret = __bam_lget(dbp, 0, pgno, DB_LOCK_WRITE, &metalock)) != 0) goto err; if ((ret = __bam_pget(dbp, (PAGE **)&meta, &pgno, 0)) != 0) { - (void)__BT_TLPUT(dbp, mlock); + (void)__BT_TLPUT(dbp, metalock); goto err; } @@ -168,7 +168,7 @@ __bam_free(dbp, h) dbp->txn, &meta->lsn, 0, dbp->log_fileid, h->pgno, &meta->lsn, &ldbt, meta->free)) != 0) { (void)memp_fput(dbp->mpf, (PAGE *)meta, 0); - (void)__BT_TLPUT(dbp, mlock); + (void)__BT_TLPUT(dbp, metalock); return (ret); } LSN(h) = LSN(meta); @@ -194,7 +194,7 @@ __bam_free(dbp, h) /* Discard the metadata page. */ ret = memp_fput(dbp->mpf, (PAGE *)meta, DB_MPOOL_DIRTY); - if ((t_ret = __BT_TLPUT(dbp, mlock)) != 0) + if ((t_ret = __BT_TLPUT(dbp, metalock)) != 0) ret = t_ret; /* Discard the caller's page reference. */ @@ -213,6 +213,8 @@ err: if ((t_ret = memp_fput(dbp->mpf, h, is_dirty)) != 0 && ret == 0) /* * __bam_lt -- * Print out the list of currently held locks. + * + * PUBLIC: int __bam_lt __P((DB *)); */ int __bam_lt(dbp) diff --git a/db2/btree/bt_put.c b/db2/btree/bt_put.c index 3161b02..87f3fd9 100644 --- a/db2/btree/bt_put.c +++ b/db2/btree/bt_put.c @@ -47,7 +47,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)bt_put.c 10.35 (Sleepycat) 11/22/97"; +static const char sccsid[] = "@(#)bt_put.c 10.38 (Sleepycat) 1/8/98"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -69,8 +69,7 @@ static int __bam_lookup __P((DB *, DBT *, int *)); static int __bam_ndup __P((DB *, PAGE *, u_int32_t)); static int __bam_ovput __P((DB *, PAGE *, u_int32_t, DBT *)); static int __bam_partial __P((DB *, DBT *, PAGE *, u_int32_t, u_int32_t)); -static u_int32_t - __bam_partsize __P((DB *, DBT *, PAGE *, u_int32_t)); +static u_int32_t __bam_partsize __P((DBT *, PAGE *, u_int32_t)); /* * __bam_put -- @@ -446,11 +445,11 @@ __bam_iitem(dbp, hp, indxp, key, data, op, flags) u_int32_t data_size, have_bytes, need_bytes, needed; int bigkey, bigdata, dupadjust, replace, ret; + COMPQUIET(bk, NULL); + t = dbp->internal; h = *hp; indx = *indxp; - - bk = NULL; /* XXX: Shut the compiler up. */ dupadjust = replace = 0; /* @@ -490,7 +489,7 @@ __bam_iitem(dbp, hp, indxp, key, data, op, flags) */ bigkey = LF_ISSET(BI_NEWKEY) && key->size > t->bt_ovflsize; data_size = F_ISSET(data, DB_DBT_PARTIAL) ? - __bam_partsize(dbp, data, h, indx) : data->size; + __bam_partsize(data, h, indx) : data->size; bigdata = data_size > t->bt_ovflsize; needed = 0; @@ -626,7 +625,7 @@ __bam_iitem(dbp, hp, indxp, key, data, op, flags) /* * 5. Delete/re-add the data item. * - * If we're dealing with offpage items, we have to + * If we're dealing with offpage items, we have to * delete and then re-add the item. */ if (bigdata || B_TYPE(bk->type) != B_KEYDATA) { @@ -693,8 +692,7 @@ __bam_iitem(dbp, hp, indxp, key, data, op, flags) * Figure out how much space a partial data item is in total. */ static u_int32_t -__bam_partsize(dbp, data, h, indx) - DB *dbp; +__bam_partsize(data, h, indx) DBT *data; PAGE *h; u_int32_t indx; @@ -1041,7 +1039,8 @@ __bam_partial(dbp, dbt, h, indx, nbytes) int ret; u_int8_t *p; - bo = NULL; /* XXX: Shut the compiler up. */ + COMPQUIET(bo, NULL); + t = dbp->internal; /* We use the record data return memory, it's only a short-term use. */ diff --git a/db2/btree/bt_rec.c b/db2/btree/bt_rec.c index c0b7c8a..90ee137 100644 --- a/db2/btree/bt_rec.c +++ b/db2/btree/bt_rec.c @@ -8,7 +8,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)bt_rec.c 10.17 (Sleepycat) 11/2/97"; +static const char sccsid[] = "@(#)bt_rec.c 10.18 (Sleepycat) 12/15/97"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -69,10 +69,17 @@ __bam_pg_alloc_recover(logp, dbtp, lsnp, redo, info) */ pgno = PGNO_METADATA; if ((ret = memp_fget(mpf, &pgno, 0, &meta)) != 0) { + /* The metadata page must always exist. */ (void)__db_pgerr(file_dbp, pgno); goto out; } if ((ret = memp_fget(mpf, &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0) { + /* + * We specify creation and check for it later, because this + * operation was supposed to create the page, and even in + * the undo case it's going to get linked onto the freelist + * which we're also fixing up. + */ (void)__db_pgerr(file_dbp, argp->pgno); (void)memp_fput(mpf, meta, 0); goto out; @@ -162,6 +169,15 @@ __bam_pg_free_recover(logp, dbtp, lsnp, redo, info) * we're undoing the operation, we get the page and restore its header. */ if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0) { + /* + * We don't automatically create the page. The only way the + * page might not exist is if the alloc never happened, and + * the only way the alloc might never have happened is if we + * are undoing, in which case there's no reason to create the + * page. + */ + if (!redo) + goto done; (void)__db_pgerr(file_dbp, argp->pgno); goto out; } @@ -192,6 +208,7 @@ __bam_pg_free_recover(logp, dbtp, lsnp, redo, info) */ pgno = PGNO_METADATA; if ((ret = memp_fget(mpf, &pgno, 0, &meta)) != 0) { + /* The metadata page must always exist. */ (void)__db_pgerr(file_dbp, pgno); goto out; } @@ -217,7 +234,7 @@ __bam_pg_free_recover(logp, dbtp, lsnp, redo, info) goto out; } - *lsnp = argp->prev_lsn; +done: *lsnp = argp->prev_lsn; ret = 0; out: REC_CLOSE; @@ -389,7 +406,7 @@ __bam_split_recover(logp, dbtp, lsnp, redo, info) * interest only if it wasn't a root split -- inserting a new * page in the tree requires that any following page have its * previous-page pointer updated to our new page. The next - * page had better exist. + * page must exist because we're redoing the operation. */ if (!rootsplit && !IS_ZERO_LSN(argp->nlsn)) { if ((ret = memp_fget(mpf, &argp->npgno, 0, &np)) != 0) { @@ -409,12 +426,14 @@ __bam_split_recover(logp, dbtp, lsnp, redo, info) } else { /* * If the split page is wrong, replace its contents with the - * logged page contents. The split page had better exist. + * logged page contents. If the page doesn't exist, it means + * that the create of the page never happened, nor did any of + * the adds onto the page that caused the split, and there's + * really no undo-ing to be done. */ if ((ret = memp_fget(mpf, &pgno, 0, &pp)) != 0) { - (void)__db_pgerr(file_dbp, pgno); pp = NULL; - goto out; + goto lrundo; } if (log_compare(lsnp, &LSN(pp)) == 0) { memcpy(pp, argp->pg.data, argp->pg.size); @@ -424,13 +443,14 @@ __bam_split_recover(logp, dbtp, lsnp, redo, info) } /* - * If it's a root split and the left child ever existed, put - * it on the free list. (If it's not a root split, we just - * updated the left page -- it's the same as the split page.) - * If the right child ever existed, root split or not, put it - * on the free list. + * If it's a root split and the left child ever existed, update + * its LSN. (If it's not a root split, we've updated the left + * page already -- it's the same as the split page.) If the + * right child ever existed, root split or not, update its LSN. + * The undo of the page allocation(s) will restore them to the + * free list. */ - if ((rootsplit && lp != NULL) || rp != NULL) { +lrundo: if ((rootsplit && lp != NULL) || rp != NULL) { if (rootsplit && lp != NULL && log_compare(lsnp, &LSN(lp)) == 0) { lp->lsn = argp->llsn; @@ -453,14 +473,14 @@ __bam_split_recover(logp, dbtp, lsnp, redo, info) * Finally, undo the next-page link if necessary. This is of * interest only if it wasn't a root split -- inserting a new * page in the tree requires that any following page have its - * previous-page pointer updated to our new page. The next - * page had better exist. + * previous-page pointer updated to our new page. Since it's + * possible that the next-page never existed, we ignore it as + * if there's nothing to undo. */ if (!rootsplit && !IS_ZERO_LSN(argp->nlsn)) { if ((ret = memp_fget(mpf, &argp->npgno, 0, &np)) != 0) { - (void)__db_pgerr(file_dbp, argp->npgno); np = NULL; - goto out; + goto done; } if (log_compare(lsnp, &LSN(np)) == 0) { PREV_PGNO(np) = argp->left; @@ -472,8 +492,8 @@ __bam_split_recover(logp, dbtp, lsnp, redo, info) } } -done: ret = 0; - *lsnp = argp->prev_lsn; +done: *lsnp = argp->prev_lsn; + ret = 0; if (0) { fatal: (void)__db_panic(file_dbp); @@ -525,8 +545,8 @@ __bam_rsplit_recover(logp, dbtp, lsnp, redo, info) /* Fix the root page. */ pgno = PGNO_ROOT; if ((ret = memp_fget(mpf, &pgno, 0, &pagep)) != 0) { + /* The root page must always exist. */ __db_pgerr(file_dbp, pgno); - pagep = NULL; goto out; } modified = 0; @@ -554,10 +574,15 @@ __bam_rsplit_recover(logp, dbtp, lsnp, redo, info) goto out; } - /* Fix the page copied over the root page. */ + /* + * Fix the page copied over the root page. It's possible that the + * page never made it to disk, so if we're undo-ing and the page + * doesn't exist, it's okay and there's nothing further to do. + */ if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0) { + if (!redo) + goto done; (void)__db_pgerr(file_dbp, argp->pgno); - pagep = NULL; goto out; } modified = 0; @@ -577,8 +602,8 @@ __bam_rsplit_recover(logp, dbtp, lsnp, redo, info) goto out; } +done: *lsnp = argp->prev_lsn; ret = 0; - *lsnp = argp->prev_lsn; out: REC_CLOSE; } @@ -607,9 +632,11 @@ __bam_adj_recover(logp, dbtp, lsnp, redo, info) REC_PRINT(__bam_adj_print); REC_INTRO(__bam_adj_read); + /* Get the page; if it never existed and we're undoing, we're done. */ if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0) { + if (!redo) + goto done; (void)__db_pgerr(file_dbp, argp->pgno); - pagep = NULL; goto out; } @@ -633,8 +660,11 @@ __bam_adj_recover(logp, dbtp, lsnp, redo, info) LSN(pagep) = argp->lsn; modified = 1; } - if ((ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) == 0) - *lsnp = argp->prev_lsn; + if ((ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0) + goto out; + +done: *lsnp = argp->prev_lsn; + ret = 0; if (0) { err: (void)memp_fput(mpf, pagep, 0); @@ -667,9 +697,11 @@ __bam_cadjust_recover(logp, dbtp, lsnp, redo, info) REC_PRINT(__bam_cadjust_print); REC_INTRO(__bam_cadjust_read); + /* Get the page; if it never existed and we're undoing, we're done. */ if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0) { + if (!redo) + goto done; (void)__db_pgerr(file_dbp, argp->pgno); - pagep = NULL; goto out; } @@ -708,8 +740,11 @@ __bam_cadjust_recover(logp, dbtp, lsnp, redo, info) LSN(pagep) = argp->lsn; modified = 1; } - if ((ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) == 0) - *lsnp = argp->prev_lsn; + if ((ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0) + goto out; + +done: *lsnp = argp->prev_lsn; + ret = 0; out: REC_CLOSE; } @@ -738,9 +773,11 @@ __bam_cdel_recover(logp, dbtp, lsnp, redo, info) REC_PRINT(__bam_cdel_print); REC_INTRO(__bam_cdel_read); + /* Get the page; if it never existed and we're undoing, we're done. */ if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0) { + if (!redo) + goto done; (void)__db_pgerr(file_dbp, argp->pgno); - pagep = NULL; goto out; } @@ -760,8 +797,11 @@ __bam_cdel_recover(logp, dbtp, lsnp, redo, info) LSN(pagep) = argp->lsn; modified = 1; } - if ((ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) == 0) - *lsnp = argp->prev_lsn; + if ((ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0) + goto out; + +done: *lsnp = argp->prev_lsn; + ret = 0; out: REC_CLOSE; } @@ -793,9 +833,11 @@ __bam_repl_recover(logp, dbtp, lsnp, redo, info) REC_PRINT(__bam_repl_print); REC_INTRO(__bam_repl_read); + /* Get the page; if it never existed and we're undoing, we're done. */ if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0) { + if (!redo) + goto done; (void)__db_pgerr(file_dbp, argp->pgno); - pagep = NULL; goto out; } bk = GET_BKEYDATA(pagep, argp->indx); @@ -860,8 +902,11 @@ __bam_repl_recover(logp, dbtp, lsnp, redo, info) LSN(pagep) = argp->lsn; modified = 1; } - if ((ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) == 0) - *lsnp = argp->prev_lsn; + if ((ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0) + goto out; + +done: *lsnp = argp->prev_lsn; + ret = 0; if (0) { err: (void)memp_fput(mpf, pagep, 0); diff --git a/db2/btree/bt_recno.c b/db2/btree/bt_recno.c index 5e1cbc4..70ab63b 100644 --- a/db2/btree/bt_recno.c +++ b/db2/btree/bt_recno.c @@ -8,7 +8,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)bt_recno.c 10.22 (Sleepycat) 10/25/97"; +static const char sccsid[] = "@(#)bt_recno.c 10.26 (Sleepycat) 1/8/98"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -72,6 +72,8 @@ __ram_open(dbp, type, dbinfo) RECNO *rp; int ret; + COMPQUIET(type, DB_RECNO); + ret = 0; /* Allocate and initialize the private RECNO structure. */ @@ -402,12 +404,16 @@ __ram_c_iclose(dbp, dbc) DBC *dbc; { /* - * All cursors are queued from the master DB structure. Remove the - * cursor from that queue. + * All cursors are queued from the master DB structure. For + * now, discard the DB handle which triggered this call, and + * replace it with the cursor's reference. */ - DB_THREAD_LOCK(dbc->dbp); - TAILQ_REMOVE(&dbc->dbp->curs_queue, dbc, links); - DB_THREAD_UNLOCK(dbc->dbp); + dbp = dbc->dbp; + + /* Remove the cursor from the queue. */ + DB_THREAD_LOCK(dbp); + TAILQ_REMOVE(&dbp->curs_queue, dbc, links); + DB_THREAD_UNLOCK(dbp); /* Discard the structures. */ FREE(dbc->internal, sizeof(RCURSOR)); @@ -699,6 +705,8 @@ __ram_ca(dbp, recno, op) /* * __ram_cprint -- * Display the current recno cursor list. + * + * PUBLIC: int __ram_cprint __P((DB *)); */ int __ram_cprint(dbp) @@ -844,7 +852,8 @@ __ram_source(dbp, rp, fname) RECNO *rp; const char *fname; { - off_t size; + size_t size; + u_int32_t mbytes, bytes; int oflags, ret; if ((ret = __db_appname(dbp->dbenv, @@ -866,15 +875,17 @@ __ram_source(dbp, rp, fname) * compiler will perpetrate, doing the comparison in a portable way is * flatly impossible. Hope that mmap fails if the file is too large. */ - if ((ret = __db_ioinfo(rp->re_source, rp->re_fd, &size, NULL)) != 0) { + if ((ret = __db_ioinfo(rp->re_source, + rp->re_fd, &mbytes, &bytes, NULL)) != 0) { __db_err(dbp->dbenv, "%s: %s", rp->re_source, strerror(ret)); goto err; } - if (size == 0) { + if (mbytes == 0 && bytes == 0) { F_SET(rp, RECNO_EOF); return (0); } + size = mbytes * MEGABYTE + bytes; if ((ret = __db_map(rp->re_fd, (size_t)size, 1, 1, &rp->re_smap)) != 0) goto err; rp->re_cmap = rp->re_smap; @@ -981,7 +992,7 @@ __ram_writeback(dbp) } memset(pad, rp->re_pad, rp->re_len); } else - pad = NULL; /* XXX: Shut the compiler up. */ + COMPQUIET(pad, NULL); for (keyno = 1;; ++keyno) { switch (ret = dbp->get(dbp, NULL, &key, &data, 0)) { case 0: diff --git a/db2/btree/btree_auto.c b/db2/btree/btree_auto.c index 18b9b34..18bbd5d 100644 --- a/db2/btree/btree_auto.c +++ b/db2/btree/btree_auto.c @@ -182,7 +182,7 @@ __bam_pg_alloc_read(recbuf, argpp) /* * PUBLIC: int __bam_pg_free_log * PUBLIC: __P((DB_LOG *, DB_TXN *, DB_LSN *, u_int32_t, - * PUBLIC: u_int32_t, db_pgno_t, DB_LSN *, DBT *, + * PUBLIC: u_int32_t, db_pgno_t, DB_LSN *, const DBT *, * PUBLIC: db_pgno_t)); */ int __bam_pg_free_log(logp, txnid, ret_lsnp, flags, @@ -194,7 +194,7 @@ int __bam_pg_free_log(logp, txnid, ret_lsnp, flags, u_int32_t fileid; db_pgno_t pgno; DB_LSN * meta_lsn; - DBT *header; + const DBT *header; db_pgno_t next; { DBT logrec; @@ -354,7 +354,7 @@ __bam_pg_free_read(recbuf, argpp) * PUBLIC: __P((DB_LOG *, DB_TXN *, DB_LSN *, u_int32_t, * PUBLIC: u_int32_t, db_pgno_t, DB_LSN *, db_pgno_t, * PUBLIC: DB_LSN *, u_int32_t, db_pgno_t, DB_LSN *, - * PUBLIC: DBT *)); + * PUBLIC: const DBT *)); */ int __bam_split_log(logp, txnid, ret_lsnp, flags, fileid, left, llsn, right, rlsn, indx, @@ -371,7 +371,7 @@ int __bam_split_log(logp, txnid, ret_lsnp, flags, u_int32_t indx; db_pgno_t npgno; DB_LSN * nlsn; - DBT *pg; + const DBT *pg; { DBT logrec; DB_LSN *lsnp, null_lsn; @@ -560,8 +560,8 @@ __bam_split_read(recbuf, argpp) /* * PUBLIC: int __bam_rsplit_log * PUBLIC: __P((DB_LOG *, DB_TXN *, DB_LSN *, u_int32_t, - * PUBLIC: u_int32_t, db_pgno_t, DBT *, db_pgno_t, - * PUBLIC: DBT *, DB_LSN *)); + * PUBLIC: u_int32_t, db_pgno_t, const DBT *, db_pgno_t, + * PUBLIC: const DBT *, DB_LSN *)); */ int __bam_rsplit_log(logp, txnid, ret_lsnp, flags, fileid, pgno, pgdbt, nrec, rootent, rootlsn) @@ -571,9 +571,9 @@ int __bam_rsplit_log(logp, txnid, ret_lsnp, flags, u_int32_t flags; u_int32_t fileid; db_pgno_t pgno; - DBT *pgdbt; + const DBT *pgdbt; db_pgno_t nrec; - DBT *rootent; + const DBT *rootent; DB_LSN * rootlsn; { DBT logrec; @@ -1215,7 +1215,7 @@ __bam_cdel_read(recbuf, argpp) * PUBLIC: int __bam_repl_log * PUBLIC: __P((DB_LOG *, DB_TXN *, DB_LSN *, u_int32_t, * PUBLIC: u_int32_t, db_pgno_t, DB_LSN *, u_int32_t, - * PUBLIC: u_int32_t, DBT *, DBT *, u_int32_t, + * PUBLIC: u_int32_t, const DBT *, const DBT *, u_int32_t, * PUBLIC: u_int32_t)); */ int __bam_repl_log(logp, txnid, ret_lsnp, flags, @@ -1230,8 +1230,8 @@ int __bam_repl_log(logp, txnid, ret_lsnp, flags, DB_LSN * lsn; u_int32_t indx; u_int32_t isdeleted; - DBT *orig; - DBT *repl; + const DBT *orig; + const DBT *repl; u_int32_t prefix; u_int32_t suffix; { |