⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db_rec.c

📁 这是linux下运行的mysql软件包,可用于linux 下安装 php + mysql + apach 的网络配置
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (cmp_p == 0 && DB_REDO(op)) {		/* Redo the relink. */		pagep->next_pgno = argp->next;		modified = 1;	} else if (log_compare(lsnp, &LSN(pagep)) == 0 && DB_UNDO(op)) {		/* Undo the relink. */		pagep->next_pgno = argp->pgno;		modified = 1;	}	if (modified == 1) {		if (DB_UNDO(op))			pagep->lsn = argp->lsn_prev;		else			pagep->lsn = *lsnp;	}	if ((ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0)		goto out;	pagep = NULL;done:	*lsnp = argp->prev_lsn;	ret = 0;out:	if (pagep != NULL)		(void)mpf->put(mpf, pagep, 0);	REC_CLOSE;}/* * __db_debug_recover -- *	Recovery function for debug. * * PUBLIC: int __db_debug_recover __P((DB_ENV *, * PUBLIC:     DBT *, DB_LSN *, db_recops, void *)); */int__db_debug_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__db_debug_args *argp;	int ret;	COMPQUIET(dbenv, NULL);	COMPQUIET(op, DB_TXN_ABORT);	COMPQUIET(info, NULL);	REC_PRINT(__db_debug_print);	REC_NOOP_INTRO(__db_debug_read);	*lsnp = argp->prev_lsn;	ret = 0;	REC_NOOP_CLOSE;}/* * __db_noop_recover -- *	Recovery function for noop. * * PUBLIC: int __db_noop_recover __P((DB_ENV *, * PUBLIC:      DBT *, DB_LSN *, db_recops, void *)); */int__db_noop_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__db_noop_args *argp;	DB *file_dbp;	DBC *dbc;	DB_MPOOLFILE *mpf;	PAGE *pagep;	u_int32_t change;	int cmp_n, cmp_p, ret;	pagep = NULL;	COMPQUIET(info, NULL);	REC_PRINT(__db_noop_print);	REC_INTRO(__db_noop_read, 0);	if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0)		goto out;	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &argp->prevlsn);	CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->prevlsn);	change = 0;	if (cmp_p == 0 && DB_REDO(op)) {		LSN(pagep) = *lsnp;		change = DB_MPOOL_DIRTY;	} else if (cmp_n == 0 && DB_UNDO(op)) {		LSN(pagep) = argp->prevlsn;		change = DB_MPOOL_DIRTY;	}	ret = mpf->put(mpf, pagep, change);	pagep = NULL;done:	*lsnp = argp->prev_lsn;out:	if (pagep != NULL)		(void)mpf->put(mpf, pagep, 0);	REC_CLOSE;}/* * __db_pg_alloc_recover -- *	Recovery function for pg_alloc. * * PUBLIC: int __db_pg_alloc_recover * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); */int__db_pg_alloc_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__db_pg_alloc_args *argp;	DB *file_dbp;	DBC *dbc;	DBMETA *meta;	DB_MPOOLFILE *mpf;	PAGE *pagep;	db_pgno_t pgno;	int cmp_n, cmp_p, created, level, modified, ret;	meta = NULL;	pagep = NULL;	REC_PRINT(__db_pg_alloc_print);	REC_INTRO(__db_pg_alloc_read, 0);	/*	 * Fix up the allocated page.  If we're redoing the operation, we have	 * to get the page (creating it if it doesn't exist), and update its	 * LSN.  If we're undoing the operation, we have to reset the page's	 * LSN and put it on the free list.	 *	 * Fix up the metadata page.  If we're redoing the operation, we have	 * to get the metadata page and update its LSN and its free pointer.	 * If we're undoing the operation and the page was ever created, we put	 * it on the freelist.	 */	pgno = PGNO_BASE_MD;	if ((ret = mpf->get(mpf, &pgno, 0, &meta)) != 0) {		/* The metadata page must always exist on redo. */		if (DB_REDO(op)) {			__db_pgerr(file_dbp, pgno, ret);			goto out;		} else			goto done;	}	created = modified = 0;	if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0) {		/*		 * We have to be able to identify if a page was newly		 * created so we can recover it properly.  We cannot simply		 * look for an empty header, because hash uses a pgin		 * function that will set the header.  Instead, we explicitly		 * try for the page without CREATE and if that fails, then		 * create it.		 */		if ((ret =		    mpf->get(mpf, &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0) {			__db_pgerr(file_dbp, argp->pgno, ret);			goto out;		}		created = modified = 1;	}	/* Fix up the allocated page. */	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &argp->page_lsn);	/*	 * If an inital allocation is aborted and then reallocated	 * during an archival restore the log record will have	 * an LSN for the page but the page will be empty.	 */	if (IS_ZERO_LSN(LSN(pagep)))		cmp_p = 0;	CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->page_lsn);	/*	 * If we we rolled back this allocation previously during an	 * archive restore, the page may have the LSN of the meta page	 * at the point of the roll back.  This will be no more	 * than the LSN of the metadata page at the time of this allocation.	 * Another special case we have to handle is if we ended up with a	 * page of all 0's which can happen if we abort between allocating a	 * page in mpool and initializing it.  In that case, even if we're	 * undoing, we need to re-initialize the page.	 */	if (DB_REDO(op) &&	    (cmp_p == 0 ||	    (IS_ZERO_LSN(argp->page_lsn) &&	    log_compare(&LSN(pagep), &argp->meta_lsn) <= 0))) {		/* Need to redo update described. */		switch (argp->ptype) {		case P_LBTREE:		case P_LRECNO:		case P_LDUP:			level = LEAFLEVEL;			break;		default:			level = 0;			break;		}		P_INIT(pagep, file_dbp->pgsize,		    argp->pgno, PGNO_INVALID, PGNO_INVALID, level, argp->ptype);		pagep->lsn = *lsnp;		modified = 1;	} else if (DB_UNDO(op) && (cmp_n == 0 || created)) {		/*		 * This is where we handle the case of a 0'd page (pagep->pgno		 * is equal to PGNO_INVALID).		 * Undo the allocation, reinitialize the page and		 * link its next pointer to the free list.		 */		P_INIT(pagep, file_dbp->pgsize,		    argp->pgno, PGNO_INVALID, argp->next, 0, P_INVALID);		pagep->lsn = argp->page_lsn;		modified = 1;	}	/*	 * If the page was newly created, put it on the limbo list.	 */	if (IS_ZERO_LSN(LSN(pagep)) &&	    IS_ZERO_LSN(argp->page_lsn) && DB_UNDO(op)) {		/* Put the page in limbo.*/		if ((ret = __db_add_limbo(dbenv,		    info, argp->fileid, argp->pgno, 1)) != 0)			goto out;	}	if ((ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0)		goto out;	pagep = NULL;	/* Fix up the metadata page. */	modified = 0;	cmp_n = log_compare(lsnp, &LSN(meta));	cmp_p = log_compare(&LSN(meta), &argp->meta_lsn);	CHECK_LSN(op, cmp_p, &LSN(meta), &argp->meta_lsn);	if (cmp_p == 0 && DB_REDO(op)) {		/* Need to redo update described. */		LSN(meta) = *lsnp;		meta->free = argp->next;		modified = 1;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/* Need to undo update described. */		LSN(meta) = argp->meta_lsn;		/*		 * If the page has a zero LSN then its newly created		 * and will go into limbo rather than directly on the		 * free list.		 */		if (!IS_ZERO_LSN(argp->page_lsn))			meta->free = argp->pgno;		modified = 1;	}	if ((ret = mpf->put(mpf, meta, modified ? DB_MPOOL_DIRTY : 0)) != 0)		goto out;	meta = NULL;	/*	 * This could be the metapage from a subdb which is read from disk	 * to recover its creation.	 */	if (F_ISSET(file_dbp, DB_AM_SUBDB))		switch (argp->type) {		case P_BTREEMETA:		case P_HASHMETA:		case P_QAMMETA:			file_dbp->sync(file_dbp, 0);			break;		}done:	*lsnp = argp->prev_lsn;	ret = 0;out:	if (pagep != NULL)		(void)mpf->put(mpf, pagep, 0);	if (meta != NULL)		(void)mpf->put(mpf, meta, 0);	if (ret == ENOENT && op == DB_TXN_BACKWARD_ALLOC)		ret = 0;	REC_CLOSE;}/* * __db_pg_free_recover -- *	Recovery function for pg_free. * * PUBLIC: int __db_pg_free_recover * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); */int__db_pg_free_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__db_pg_free_args *argp;	DB *file_dbp;	DBC *dbc;	DBMETA *meta;	DB_LSN copy_lsn;	DB_MPOOLFILE *mpf;	PAGE *pagep;	db_pgno_t pgno;	int cmp_n, cmp_p, modified, ret;	COMPQUIET(info, NULL);	meta = NULL;	pagep = NULL;	REC_PRINT(__db_pg_free_print);	REC_INTRO(__db_pg_free_read, 1);	/*	 * Fix up the freed page.  If we're redoing the operation we get the	 * page and explicitly discard its contents, then update its LSN.  If	 * we're undoing the operation, we get the page and restore its header.	 * Create the page if necessary, we may be freeing an aborted	 * create.	 */	if ((ret = mpf->get(mpf, &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)		goto out;	modified = 0;	(void)__ua_memcpy(&copy_lsn, &LSN(argp->header.data), sizeof(DB_LSN));	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &copy_lsn);	CHECK_LSN(op, cmp_p, &LSN(pagep), &copy_lsn);	if (DB_REDO(op) &&	    (cmp_p == 0 ||	    (IS_ZERO_LSN(copy_lsn) &&	    log_compare(&LSN(pagep), &argp->meta_lsn) <= 0))) {		/* Need to redo update described. */		P_INIT(pagep, file_dbp->pgsize,		    argp->pgno, PGNO_INVALID, argp->next, 0, P_INVALID);		pagep->lsn = *lsnp;		modified = 1;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/* Need to undo update described. */		memcpy(pagep, argp->header.data, argp->header.size);		modified = 1;	}	if ((ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0)		goto out;	pagep = NULL;	/*	 * Fix up the metadata page.  If we're redoing or undoing the operation	 * we get the page and update its LSN and free pointer.	 */	pgno = PGNO_BASE_MD;	if ((ret = mpf->get(mpf, &pgno, 0, &meta)) != 0) {		/* The metadata page must always exist. */		__db_pgerr(file_dbp, pgno, ret);		goto out;	}	modified = 0;	cmp_n = log_compare(lsnp, &LSN(meta));	cmp_p = log_compare(&LSN(meta), &argp->meta_lsn);	CHECK_LSN(op, cmp_p, &LSN(meta), &argp->meta_lsn);	if (cmp_p == 0 && DB_REDO(op)) {		/* Need to redo the deallocation. */		meta->free = argp->pgno;		LSN(meta) = *lsnp;		modified = 1;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/* Need to undo the deallocation. */		meta->free = argp->next;		LSN(meta) = argp->meta_lsn;		modified = 1;	}	if ((ret = mpf->put(mpf, meta, modified ? DB_MPOOL_DIRTY : 0)) != 0)		goto out;	meta = NULL;done:	*lsnp = argp->prev_lsn;	ret = 0;out:	if (pagep != NULL)		(void)mpf->put(mpf, pagep, 0);	if (meta != NULL)		(void)mpf->put(mpf, meta, 0);	REC_CLOSE;}/* * __db_cksum_recover -- *	Recovery function for checksum failure log record. * * PUBLIC: int __db_cksum_recover __P((DB_ENV *, * PUBLIC:      DBT *, DB_LSN *, db_recops, void *)); */int__db_cksum_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__db_cksum_args *argp;	int ret;	COMPQUIET(info, NULL);	COMPQUIET(lsnp, NULL);	COMPQUIET(op, DB_TXN_ABORT);	REC_PRINT(__db_cksum_print);	if ((ret = __db_cksum_read(dbenv, dbtp->data, &argp)) != 0)		return (ret);	/*	 * We had a checksum failure -- the only option is to run catastrophic	 * recovery.	 */	if (F_ISSET(dbenv, DB_ENV_FATAL))		ret = 0;	else {		__db_err(dbenv,		    "Checksum failure requires catastrophic recovery");		ret = __db_panic(dbenv, DB_RUNRECOVERY);	}	__os_free(dbenv, argp);	return (ret);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -