/*-
* See the file LICENSE for redistribution information.
*
- * Copyright (c) 1996, 1997
+ * Copyright (c) 1996, 1997, 1998
* Sleepycat Software. All rights reserved.
*/
/*
#include "config.h"
#ifndef lint
-static const char sccsid[] = "@(#)log_rec.c 10.11 (Sleepycat) 8/20/97";
+static const char sccsid[] = "@(#)log_rec.c 10.20 (Sleepycat) 4/28/98";
#endif /* not lint */
#ifndef NO_SYSTEM_INCLUDES
#include <sys/types.h>
#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <stdlib.h>
#include <string.h>
#endif
#include "db_dispatch.h"
#include "common_ext.h"
-static int __log_open_file __P((DB_LOG *,
+static int __log_open_file __P((DB_LOG *,
u_int8_t *, char *, DBTYPE, u_int32_t));
/*
#ifdef DEBUG_RECOVER
__log_register_print(logp, dbtp, lsnp, redo, info);
#endif
- info = info; /* XXX: Shut the compiler up. */
- lsnp = lsnp;
+ COMPQUIET(info, NULL);
+ COMPQUIET(lsnp, NULL);
F_SET(logp, DB_AM_RECOVER);
if ((ret = __log_register_read(dbtp->data, &argp)) != 0)
goto out;
- ret = __log_open_file(logp,
- argp->uid.data, argp->name.data, argp->ftype, argp->id);
- if (ret == ENOENT) {
- if (redo == TXN_OPENFILES)
- __db_err(logp->dbenv,
- "warning: file %s not found", argp->name.data);
- ret = 0;
- }
-
-out: F_CLR(logp, DB_AM_RECOVER);
- if (argp != NULL)
- free(argp);
- return (ret);
-}
-
-/*
- * PUBLIC: int __log_unregister_recover
- * PUBLIC: __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
- */
-int
-__log_unregister_recover(logp, dbtp, lsnp, redo, info)
- DB_LOG *logp;
- DBT *dbtp;
- DB_LSN *lsnp;
- int redo;
- void *info;
-{
- __log_unregister_args *argp;
- int ret;
-
-#ifdef DEBUG_RECOVER
- __log_unregister_print(logp, dbtp, lsnp, redo, info);
-#endif
- info = info; /* XXX: Shut the compiler up. */
- lsnp = lsnp;
-
- if (redo == TXN_OPENFILES ||
- redo == TXN_BACKWARD_ROLL || redo == TXN_UNDO)
- return (0);
-
- F_SET(logp, DB_AM_RECOVER);
- if ((ret = __log_unregister_read(dbtp->data, &argp)) != 0)
- goto out;
-
- LOCK_LOGTHREAD(logp);
- if (logp->dbentry[argp->id].dbp == NULL)
- ret = EINVAL;
- else if (--logp->dbentry[argp->id].refcount == 0) {
- ret = logp->dbentry[argp->id].dbp->close(
- logp->dbentry[argp->id].dbp, 0);
- logp->dbentry[argp->id].dbp = NULL;
+ if ((argp->opcode == LOG_CHECKPOINT && redo == TXN_OPENFILES) ||
+ (argp->opcode == LOG_OPEN &&
+ (redo == TXN_REDO || redo == TXN_OPENFILES ||
+ redo == TXN_FORWARD_ROLL)) ||
+ (argp->opcode == LOG_CLOSE &&
+ (redo == TXN_UNDO || redo == TXN_BACKWARD_ROLL))) {
+ /*
+ * If we are redoing an open or undoing a close, then we need
+ * to open a file.
+ */
+ ret = __log_open_file(logp,
+ argp->uid.data, argp->name.data, argp->ftype, argp->id);
+ if (ret == ENOENT) {
+ if (redo == TXN_OPENFILES)
+ __db_err(logp->dbenv,
+ "warning: file %s not found",
+ argp->name.data);
+ ret = 0;
+ }
+ } else if (argp->opcode != LOG_CHECKPOINT) {
+ /*
+ * If we are redoing a close or undoing an open, then we need
+ * to close the file.
+ *
+ * If the file is deleted, then we can just ignore this close.
+ * Otherwise, we'd better have a valid dbp that we should either
+ * close or whose reference count should be decremented.
+ */
+ LOCK_LOGTHREAD(logp);
+ if (logp->dbentry[argp->id].dbp == NULL) {
+ if (!logp->dbentry[argp->id].deleted)
+ ret = EINVAL;
+ } else if (--logp->dbentry[argp->id].refcount == 0) {
+ F_SET(logp->dbentry[argp->id].dbp, DB_AM_RECOVER);
+ ret = logp->dbentry[argp->id].dbp->close(
+ logp->dbentry[argp->id].dbp, 0);
+ logp->dbentry[argp->id].dbp = NULL;
+ }
+ UNLOCK_LOGTHREAD(logp);
}
- UNLOCK_LOGTHREAD(logp);
out: F_CLR(logp, DB_AM_RECOVER);
if (argp != NULL)
- free(argp);
+ __db_free(argp);
return (ret);
}
*/
if (logp->dbentry_cnt <= ndx) {
if (logp->dbentry_cnt == 0) {
- logp->dbentry =
- (DB_ENTRY *)malloc(DB_GROW_SIZE * sizeof(DB_ENTRY));
+ logp->dbentry = (DB_ENTRY *)
+ __db_malloc(DB_GROW_SIZE * sizeof(DB_ENTRY));
if (logp->dbentry == NULL) {
ret = ENOMEM;
goto err;
}
} else {
- temp_entryp = (DB_ENTRY *)realloc(logp->dbentry,
+ temp_entryp = (DB_ENTRY *)__db_realloc(logp->dbentry,
(DB_GROW_SIZE + logp->dbentry_cnt) *
sizeof(DB_ENTRY));
if (temp_entryp == NULL) {