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

📄 hash_rec.c

📁 这是linux下运行的mysql软件包,可用于linux 下安装 php + mysql + apach 的网络配置
💻 C
📖 第 1 页 / 共 3 页
字号:
	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &argp->pagelsn);	CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->pagelsn);	memset(&dbt, 0, sizeof(dbt));	flags = 0;	grow = 1;	if (cmp_p == 0 && DB_REDO(op)) {		/* Reapply the change as specified. */		dbt.data = argp->newitem.data;		dbt.size = argp->newitem.size;		grow = argp->newitem.size - argp->olditem.size;		LSN(pagep) = *lsnp;		flags = DB_MPOOL_DIRTY;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/* Undo the already applied change. */		dbt.data = argp->olditem.data;		dbt.size = argp->olditem.size;		grow = argp->olditem.size - argp->newitem.size;		LSN(pagep) = argp->pagelsn;		flags = DB_MPOOL_DIRTY;	}	if (flags) {		__ham_onpage_replace(file_dbp, pagep,		    argp->ndx, argp->off, grow, &dbt);		if (argp->makedup) {			hk = P_ENTRY(file_dbp, pagep, argp->ndx);			if (DB_REDO(op))				HPAGE_PTYPE(hk) = H_DUPLICATE;			else				HPAGE_PTYPE(hk) = H_KEYDATA;		}	}	if ((ret = mpf->put(mpf, pagep, flags)) != 0)		goto out;	pagep = NULL;done:	*lsnp = argp->prev_lsn;	ret = 0;out:	if (pagep != NULL)		(void)mpf->put(mpf, pagep, 0);	REC_CLOSE;}/* * __ham_splitdata_recover -- * * PUBLIC: int __ham_splitdata_recover * PUBLIC:    __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); */int__ham_splitdata_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__ham_splitdata_args *argp;	DB *file_dbp;	DBC *dbc;	DB_MPOOLFILE *mpf;	PAGE *pagep;	u_int32_t flags;	int cmp_n, cmp_p, ret;	pagep = NULL;	COMPQUIET(info, NULL);	REC_PRINT(__ham_splitdata_print);	REC_INTRO(__ham_splitdata_read, 1);	if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0) {		if (DB_UNDO(op)) {			/*			 * We are undoing and the page doesn't exist.  That			 * is equivalent to having a pagelsn of 0, so we			 * would not have to undo anything.  In this case,			 * don't bother creating a page.			 */			goto done;		} else if ((ret = mpf->get(mpf,		    &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)			goto out;	}	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &argp->pagelsn);	CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->pagelsn);	/*	 * There are two types of log messages here, one for the old page	 * and one for the new pages created.  The original image in the	 * SPLITOLD record is used for undo.  The image in the SPLITNEW	 * is used for redo.  We should never have a case where there is	 * a redo operation and the SPLITOLD record is on disk, but not	 * the SPLITNEW record.  Therefore, we only have work to do when	 * redo NEW messages and undo OLD messages, but we have to update	 * LSNs in both cases.	 */	flags = 0;	if (cmp_p == 0 && DB_REDO(op)) {		if (argp->opcode == SPLITNEW)			/* Need to redo the split described. */			memcpy(pagep, argp->pageimage.data,			    argp->pageimage.size);		LSN(pagep) = *lsnp;		flags = DB_MPOOL_DIRTY;	} else if (cmp_n == 0 && DB_UNDO(op)) {		if (argp->opcode == SPLITOLD) {			/* Put back the old image. */			memcpy(pagep, argp->pageimage.data,			    argp->pageimage.size);		} else			P_INIT(pagep, file_dbp->pgsize, argp->pgno,			    PGNO_INVALID, PGNO_INVALID, 0, P_HASH);		LSN(pagep) = argp->pagelsn;		flags = DB_MPOOL_DIRTY;	}	if ((ret = mpf->put(mpf, pagep, flags)) != 0)		goto out;	pagep = NULL;done:	*lsnp = argp->prev_lsn;	ret = 0;out:	if (pagep != NULL)		(void)mpf->put(mpf, pagep, 0);	REC_CLOSE;}/* * __ham_copypage_recover -- *	Recovery function for copypage. * * PUBLIC: int __ham_copypage_recover * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); */int__ham_copypage_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__ham_copypage_args *argp;	DB *file_dbp;	DBC *dbc;	DB_MPOOLFILE *mpf;	PAGE *pagep;	u_int32_t flags;	int cmp_n, cmp_p, ret;	pagep = NULL;	COMPQUIET(info, NULL);	REC_PRINT(__ham_copypage_print);	REC_INTRO(__ham_copypage_read, 1);	flags = 0;	/* This is the bucket page. */	if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0) {		if (DB_UNDO(op)) {			/*			 * We are undoing and the page doesn't exist.  That			 * is equivalent to having a pagelsn of 0, so we			 * would not have to undo anything.  In this case,			 * don't bother creating a page.			 */			ret = 0;			goto donext;		} else if ((ret = mpf->get(mpf,		    &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)			goto out;	}	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &argp->pagelsn);	CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->pagelsn);	if (cmp_p == 0 && DB_REDO(op)) {		/* Need to redo update described. */		memcpy(pagep, argp->page.data, argp->page.size);		PGNO(pagep) = argp->pgno;		PREV_PGNO(pagep) = PGNO_INVALID;		LSN(pagep) = *lsnp;		flags = DB_MPOOL_DIRTY;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/* Need to undo update described. */		P_INIT(pagep, file_dbp->pgsize, argp->pgno, PGNO_INVALID,		    argp->next_pgno, 0, P_HASH);		LSN(pagep) = argp->pagelsn;		flags = DB_MPOOL_DIRTY;	}	if ((ret = mpf->put(mpf, pagep, flags)) != 0)		goto out;	pagep = NULL;donext:	/* Now fix up the "next" page. */	if ((ret = mpf->get(mpf, &argp->next_pgno, 0, &pagep)) != 0) {		if (DB_UNDO(op)) {			/*			 * We are undoing and the page doesn't exist.  That			 * is equivalent to having a pagelsn of 0, so we			 * would not have to undo anything.  In this case,			 * don't bother creating a page.			 */			ret = 0;			goto do_nn;		} else if ((ret = mpf->get(mpf,		    &argp->next_pgno, DB_MPOOL_CREATE, &pagep)) != 0)			goto out;	}	/* For REDO just update the LSN. For UNDO copy page back. */	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &argp->nextlsn);	CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->nextlsn);	flags = 0;	if (cmp_p == 0 && DB_REDO(op)) {		LSN(pagep) = *lsnp;		flags = DB_MPOOL_DIRTY;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/* Need to undo update described. */		memcpy(pagep, argp->page.data, argp->page.size);		flags = DB_MPOOL_DIRTY;	}	if ((ret = mpf->put(mpf, pagep, flags)) != 0)		goto out;	pagep = NULL;	/* Now fix up the next's next page. */do_nn:	if (argp->nnext_pgno == PGNO_INVALID)		goto done;	if ((ret = mpf->get(mpf, &argp->nnext_pgno, 0, &pagep)) != 0) {		if (DB_UNDO(op)) {			/*			 * We are undoing and the page doesn't exist.  That			 * is equivalent to having a pagelsn of 0, so we			 * would not have to undo anything.  In this case,			 * don't bother creating a page.			 */			goto done;		} else if ((ret = mpf->get(mpf,		    &argp->nnext_pgno, DB_MPOOL_CREATE, &pagep)) != 0)			goto out;	}	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &argp->nnextlsn);	CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->nnextlsn);	flags = 0;	if (cmp_p == 0 && DB_REDO(op)) {		/* Need to redo update described. */		PREV_PGNO(pagep) = argp->pgno;		LSN(pagep) = *lsnp;		flags = DB_MPOOL_DIRTY;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/* Need to undo update described. */		PREV_PGNO(pagep) = argp->next_pgno;		LSN(pagep) = argp->nnextlsn;		flags = DB_MPOOL_DIRTY;	}	if ((ret = mpf->put(mpf, pagep, flags)) != 0)		goto out;	pagep = NULL;done:	*lsnp = argp->prev_lsn;	ret = 0;out:	if (pagep != NULL)		(void)mpf->put(mpf, pagep, 0);	REC_CLOSE;}/* * __ham_metagroup_recover -- *	Recovery function for metagroup. * * PUBLIC: int __ham_metagroup_recover * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); */int__ham_metagroup_recover(dbenv, dbtp, lsnp, op, info)	DB_ENV *dbenv;	DBT *dbtp;	DB_LSN *lsnp;	db_recops op;	void *info;{	__ham_metagroup_args *argp;	HASH_CURSOR *hcp;	DB *file_dbp;	DBMETA *mmeta;	DBC *dbc;	DB_MPOOLFILE *mpf;	PAGE *pagep;	db_pgno_t pgno;	u_int32_t flags, mmeta_flags;	int cmp_n, cmp_p, did_recover, groupgrow, ret;	COMPQUIET(info, NULL);	mmeta_flags = 0;	mmeta = NULL;	REC_PRINT(__ham_metagroup_print);	REC_INTRO(__ham_metagroup_read, 1);	/*	 * This logs the virtual create of pages pgno to pgno + bucket	 * Since the mpool page-allocation is not really able to be	 * transaction protected, we can never undo it.  Even in an abort,	 * we have to allocate these pages to the hash table if they	 * were actually created.  In particular, during disaster	 * recovery the metapage may be before this point if we	 * are rolling backward.  If the file has not been extended	 * then the metapage could not have been updated.	 * The log record contains:	 * bucket: new bucket being allocated.	 * pgno: page number of the new bucket.	 * if bucket is a power of 2, then we allocated a whole batch of	 * pages; if it's not, then we simply allocated one new page.	 */	groupgrow = (u_int32_t)(1 << __db_log2(argp->bucket + 1)) ==	    argp->bucket + 1;	pgno = argp->pgno;	if (argp->newalloc)		pgno += argp->bucket;	if ((ret = mpf->get(mpf, &pgno, DB_MPOOL_CREATE, &pagep)) != 0)		goto out;	cmp_n = log_compare(lsnp, &LSN(pagep));	cmp_p = log_compare(&LSN(pagep), &argp->pagelsn);	CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->pagelsn);	flags = 0;	if ((cmp_p == 0 && DB_REDO(op)) || (cmp_n == 0 && DB_UNDO(op))) {		/*		 * We need to make sure that we redo the allocation of the		 * pages.		 */		if (DB_REDO(op))			pagep->lsn = *lsnp;		else			pagep->lsn = argp->pagelsn;		flags = DB_MPOOL_DIRTY;	}	if ((ret = mpf->put(mpf, pagep, flags)) != 0)		goto out;	/* Now we have to update the meta-data page. */	hcp = (HASH_CURSOR *)dbc->internal;	if ((ret = __ham_get_meta(dbc)) != 0)		goto out;	cmp_n = log_compare(lsnp, &hcp->hdr->dbmeta.lsn);	cmp_p = log_compare(&hcp->hdr->dbmeta.lsn, &argp->metalsn);	CHECK_LSN(op, cmp_p, &hcp->hdr->dbmeta.lsn, &argp->metalsn);	did_recover = 0;	if (cmp_p == 0 && DB_REDO(op)) {		/* Redo the actual updating of bucket counts. */		++hcp->hdr->max_bucket;		if (groupgrow) {			hcp->hdr->low_mask = hcp->hdr->high_mask;			hcp->hdr->high_mask =			    (argp->bucket + 1) | hcp->hdr->low_mask;		}		hcp->hdr->dbmeta.lsn = *lsnp;		did_recover = 1;	} else if (cmp_n == 0 && DB_UNDO(op)) {		/* Undo the actual updating of bucket counts. */		--hcp->hdr->max_bucket;		if (groupgrow) {			hcp->hdr->high_mask = hcp->hdr->low_mask;			hcp->hdr->low_mask = hcp->hdr->high_mask >> 1;		}		hcp->hdr->dbmeta.lsn = argp->metalsn;		did_recover = 1;

⌨️ 快捷键说明

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