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

📄 ex_tpcb.c

📁 File system using stacked.
💻 C
📖 第 1 页 / 共 2 页
字号:
	(void)dbp->set_h_ffactor(dbp, 0);	(void)dbp->set_h_nelem(dbp, (u_int32_t)tellers);	(void)dbp->set_pagesize(dbp, 512);	if ((ret = dbp->open(dbp, NULL, "teller", NULL,	    DB_HASH, oflags, 0644)) != 0) {		env->err(env, ret, "DB->open: teller");		return (1);	}	start_tnum = idnum;	populate(dbp, idnum, balance, tellers, "teller");	idnum += tellers;	end_tnum = idnum - 1;	if ((ret = dbp->close(dbp, 0)) != 0) {		env->err(env, ret, "DB->close: teller");		return (1);	}	if (verbose)		printf("Populated tellers: %ld - %ld\n",		    (long)start_tnum, (long)end_tnum);	if ((ret = db_create(&dbp, env, 0)) != 0) {		env->err(env, ret, "db_create");		return (1);	}	(void)dbp->set_re_len(dbp, HISTORY_LEN);	if ((ret = dbp->open(dbp, NULL, "history", NULL,	    DB_RECNO, oflags, 0644)) != 0) {		env->err(env, ret, "DB->open: history");		return (1);	}	hpopulate(dbp, history, accounts, branches, tellers);	if ((ret = dbp->close(dbp, 0)) != 0) {		env->err(env, ret, "DB->close: history");		return (1);	}	return (0);}intpopulate(dbp, start_id, balance, nrecs, msg)	DB *dbp;	u_int32_t start_id, balance;	int nrecs;	const char *msg;{	DBT kdbt, ddbt;	defrec drec;	int i, ret;	kdbt.flags = 0;	kdbt.data = &drec.id;	kdbt.size = sizeof(u_int32_t);	ddbt.flags = 0;	ddbt.data = &drec;	ddbt.size = sizeof(drec);	memset(&drec.pad[0], 1, sizeof(drec.pad));	for (i = 0; i < nrecs; i++) {		drec.id = start_id + (u_int32_t)i;		drec.balance = balance;		if ((ret =		    (dbp->put)(dbp, NULL, &kdbt, &ddbt, DB_NOOVERWRITE)) != 0) {			dbp->err(dbp,			    ret, "Failure initializing %s file\n", msg);			return (1);		}	}	return (0);}inthpopulate(dbp, history, accounts, branches, tellers)	DB *dbp;	int history, accounts, branches, tellers;{	DBT kdbt, ddbt;	histrec hrec;	db_recno_t key;	int i, ret;	memset(&kdbt, 0, sizeof(kdbt));	memset(&ddbt, 0, sizeof(ddbt));	ddbt.data = &hrec;	ddbt.size = sizeof(hrec);	kdbt.data = &key;	kdbt.size = sizeof(key);	memset(&hrec.pad[0], 1, sizeof(hrec.pad));	hrec.amount = 10;	for (i = 1; i <= history; i++) {		hrec.aid = random_id(ACCOUNT, accounts, branches, tellers);		hrec.bid = random_id(BRANCH, accounts, branches, tellers);		hrec.tid = random_id(TELLER, accounts, branches, tellers);		if ((ret = dbp->put(dbp, NULL, &kdbt, &ddbt, DB_APPEND)) != 0) {			dbp->err(dbp, ret, "dbp->put");			return (1);		}	}	return (0);}u_int32_trandom_int(lo, hi)	u_int32_t lo, hi;{	u_int32_t ret;	int t;#ifndef RAND_MAX#define	RAND_MAX	0x7fffffff#endif	t = rand();	ret = (u_int32_t)(((double)t / ((double)(RAND_MAX) + 1)) *	    (hi - lo + 1));	ret += lo;	return (ret);}u_int32_trandom_id(type, accounts, branches, tellers)	FTYPE type;	int accounts, branches, tellers;{	u_int32_t min, max, num;	max = min = BEGID;	num = accounts;	switch(type) {	case TELLER:		min += branches;		num = tellers;		/* FALLTHROUGH */	case BRANCH:		if (type == BRANCH)			num = branches;		min += accounts;		/* FALLTHROUGH */	case ACCOUNT:		max = min + num - 1;	}	return (random_int(min, max));}inttp_run(dbenv, n, accounts, branches, tellers, verbose)	DB_ENV *dbenv;	int n, accounts, branches, tellers, verbose;{	DB *adb, *bdb, *hdb, *tdb;	double gtps, itps;	int failed, ifailed, ret, txns;	time_t starttime, curtime, lasttime;	adb = bdb = hdb = tdb = NULL;	txns = failed = 0;	/*	 * Open the database files.	 */	if ((ret = db_create(&adb, dbenv, 0)) != 0) {		dbenv->err(dbenv, ret, "db_create");		goto err;	}	if ((ret = adb->open(adb, NULL, "account", NULL, DB_UNKNOWN,	    DB_AUTO_COMMIT, 0)) != 0) {		dbenv->err(dbenv, ret, "DB->open: account");		goto err;	}	if ((ret = db_create(&bdb, dbenv, 0)) != 0) {		dbenv->err(dbenv, ret, "db_create");		goto err;	}	if ((ret = bdb->open(bdb, NULL, "branch", NULL, DB_UNKNOWN,	    DB_AUTO_COMMIT, 0)) != 0) {		dbenv->err(dbenv, ret, "DB->open: branch");		goto err;	}	if ((ret = db_create(&hdb, dbenv, 0)) != 0) {		dbenv->err(dbenv, ret, "db_create");		goto err;	}	if ((ret = hdb->open(hdb, NULL, "history", NULL, DB_UNKNOWN,	    DB_AUTO_COMMIT, 0)) != 0) {		dbenv->err(dbenv, ret, "DB->open: history");		goto err;	}	if ((ret = db_create(&tdb, dbenv, 0)) != 0) {		dbenv->err(dbenv, ret, "db_create");		goto err;	}	if ((ret = tdb->open(tdb, NULL, "teller", NULL, DB_UNKNOWN,	    DB_AUTO_COMMIT, 0)) != 0) {		dbenv->err(dbenv, ret, "DB->open: teller");		goto err;	}	starttime = time(NULL);	lasttime = starttime;	for (ifailed = 0; n-- > 0;) {		txns++;		ret = tp_txn(dbenv, adb, bdb, tdb, hdb,		    accounts, branches, tellers, verbose);		if (ret != 0) {			failed++;			ifailed++;		}		if (n % 5000 == 0) {			curtime = time(NULL);			gtps = (double)(txns - failed) / (curtime - starttime);			itps = (double)(5000 - ifailed) / (curtime - lasttime);			printf("%d txns %d failed ", txns, failed);			printf("%6.2f TPS (gross) %6.2f TPS (interval)\n",			   gtps, itps);			lasttime = curtime;			ifailed = 0;		}	}err:	if (adb != NULL)		(void)adb->close(adb, 0);	if (bdb != NULL)		(void)bdb->close(bdb, 0);	if (tdb != NULL)		(void)tdb->close(tdb, 0);	if (hdb != NULL)		(void)hdb->close(hdb, 0);	printf("%ld transactions begun %ld failed\n", (long)txns, (long)failed);	return (ret == 0 ? 0 : 1);}/* * XXX Figure out the appropriate way to pick out IDs. */inttp_txn(dbenv, adb, bdb, tdb, hdb, accounts, branches, tellers, verbose)	DB_ENV *dbenv;	DB *adb, *bdb, *tdb, *hdb;	int accounts, branches, tellers, verbose;{	DBC *acurs, *bcurs, *tcurs;	DBT d_dbt, d_histdbt, k_dbt, k_histdbt;	DB_TXN *t;	db_recno_t key;	defrec rec;	histrec hrec;	int account, branch, teller, ret;	t = NULL;	acurs = bcurs = tcurs = NULL;	/*	 * XXX We could move a lot of this into the driver to make this	 * faster.	 */	account = random_id(ACCOUNT, accounts, branches, tellers);	branch = random_id(BRANCH, accounts, branches, tellers);	teller = random_id(TELLER, accounts, branches, tellers);	memset(&d_histdbt, 0, sizeof(d_histdbt));	memset(&k_histdbt, 0, sizeof(k_histdbt));	k_histdbt.data = &key;	k_histdbt.size = sizeof(key);	memset(&k_dbt, 0, sizeof(k_dbt));	k_dbt.size = sizeof(int);	memset(&d_dbt, 0, sizeof(d_dbt));	d_dbt.flags = DB_DBT_USERMEM;	d_dbt.data = &rec;	d_dbt.ulen = sizeof(rec);	hrec.aid = account;	hrec.bid = branch;	hrec.tid = teller;	hrec.amount = 10;	/* Request 0 bytes since we're just positioning. */	d_histdbt.flags = DB_DBT_PARTIAL;	/* START TIMING */	if (dbenv->txn_begin(dbenv, NULL, &t, 0) != 0)		goto err;	if (adb->cursor(adb, t, &acurs, 0) != 0 ||	    bdb->cursor(bdb, t, &bcurs, 0) != 0 ||	    tdb->cursor(tdb, t, &tcurs, 0) != 0)		goto err;	/* Account record */	k_dbt.data = &account;	if (acurs->c_get(acurs, &k_dbt, &d_dbt, DB_SET) != 0)		goto err;	rec.balance += 10;	if (acurs->c_put(acurs, &k_dbt, &d_dbt, DB_CURRENT) != 0)		goto err;	/* Branch record */	k_dbt.data = &branch;	if (bcurs->c_get(bcurs, &k_dbt, &d_dbt, DB_SET) != 0)		goto err;	rec.balance += 10;	if (bcurs->c_put(bcurs, &k_dbt, &d_dbt, DB_CURRENT) != 0)		goto err;	/* Teller record */	k_dbt.data = &teller;	if (tcurs->c_get(tcurs, &k_dbt, &d_dbt, DB_SET) != 0)		goto err;	rec.balance += 10;	if (tcurs->c_put(tcurs, &k_dbt, &d_dbt, DB_CURRENT) != 0)		goto err;	/* History record */	d_histdbt.flags = 0;	d_histdbt.data = &hrec;	d_histdbt.ulen = sizeof(hrec);	if (hdb->put(hdb, t, &k_histdbt, &d_histdbt, DB_APPEND) != 0)		goto err;	if (acurs->c_close(acurs) != 0 || bcurs->c_close(bcurs) != 0 ||	    tcurs->c_close(tcurs) != 0)		goto err;	ret = t->commit(t, 0);	t = NULL;	if (ret != 0)		goto err;	/* END TIMING */	return (0);err:	if (acurs != NULL)		(void)acurs->c_close(acurs);	if (bcurs != NULL)		(void)bcurs->c_close(bcurs);	if (tcurs != NULL)		(void)tcurs->c_close(tcurs);	if (t != NULL)		(void)t->abort(t);	if (verbose)		printf("Transaction A=%ld B=%ld T=%ld failed\n",		    (long)account, (long)branch, (long)teller);	return (-1);}

⌨️ 快捷键说明

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