1 /*
2  * Copyright (c) 2005, 2020 Oracle and/or its affiliates.  All rights reserved.
3  *
4  * See the file LICENSE for license information.
5  *
6  * $Id$
7  */
8 #include "bench.h"
9 
10 static int usage __P((void));
11 
12 #ifdef DB_INIT_REP
13 static int b_txn_write_send __P((DB_ENV *,
14     const DBT *, const DBT *, const DB_LSN *, int, u_int32_t));
15 
16 /*
17  * b_txn_write_send --
18  *	A stubbed-out replication message function.
19  */
20 static int
b_txn_write_send(dbenv,control,rec,lsn,eid,flags)21 b_txn_write_send(dbenv, control, rec, lsn, eid, flags)
22 	DB_ENV *dbenv;
23 	const DBT *control, *rec;
24 	const DB_LSN *lsn;
25 	int eid;
26 	u_int32_t flags;
27 {
28 	COMPQUIET(dbenv, NULL);
29 	COMPQUIET(control, NULL);
30 	COMPQUIET(rec, NULL);
31 	COMPQUIET(lsn, NULL);
32 	COMPQUIET(eid, 0);
33 	COMPQUIET(flags, 0);
34 	return (0);
35 }
36 #endif
37 
38 int
b_txn_write(int argc,char * argv[])39 b_txn_write(int argc, char *argv[])
40 {
41 	extern char *optarg;
42 	extern int optind;
43 	DB *dbp;
44 	DBT key, data;
45 	DB_ENV *dbenv;
46 	DB_TXN *txn;
47 	u_int32_t flags, oflags;
48 	int ch, i, count, rep_stub;
49 	char *config;
50 
51 	count = 1000;
52 	oflags = flags = 0;
53 	rep_stub = 0;
54 	config = "synchronous";
55 	while ((ch = getopt(argc, argv, "ac:rw")) != EOF)
56 		switch (ch) {
57 		case 'a':
58 			config = "nosync";
59 			flags = DB_TXN_NOSYNC;
60 			break;
61 		case 'c':
62 			count = atoi(optarg);
63 			break;
64 		case 'r':
65 #ifdef DB_INIT_REP
66 			rep_stub = 1;
67 #else
68 			exit(0);
69 #endif
70 			break;
71 		case 'w':
72 			config = "write-nosync";
73 #ifdef DB_TXN_WRITE_NOSYNC
74 			flags = DB_TXN_WRITE_NOSYNC;
75 #else
76 			exit(0);
77 #endif
78 			break;
79 		case '?':
80 		default:
81 			return (usage());
82 		}
83 	argc -= optind;
84 	argv += optind;
85 	if (argc != 0)
86 		return (usage());
87 
88 	/* Create the environment. */
89 	DB_BENCH_ASSERT(db_env_create(&dbenv, 0) == 0);
90 	dbenv->set_errfile(dbenv, stderr);
91 
92 #ifdef DB_INIT_REP
93 	if (rep_stub) {
94 #if DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 5 || DB_VERSION_MAJOR > 4
95 		DB_BENCH_ASSERT(
96 		    dbenv->rep_set_transport(dbenv, 1, b_txn_write_send) == 0);
97 #else
98 		DB_BENCH_ASSERT(
99 		    dbenv->set_rep_transport(dbenv, 1, b_txn_write_send) == 0);
100 #endif
101 		oflags |= DB_INIT_REP;
102 	}
103 #endif
104 	oflags |= DB_CREATE | DB_INIT_LOCK |
105 	    DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_PRIVATE;
106 #if DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR == 0
107 	DB_BENCH_ASSERT(
108 	    dbenv->open(dbenv, TESTDIR, NULL, flags | oflags, 0666) == 0);
109 #endif
110 #if DB_VERSION_MAJOR == 3 && DB_VERSION_MINOR == 1
111 	DB_BENCH_ASSERT(
112 	    dbenv->open(dbenv, TESTDIR, flags | oflags, 0666) == 0);
113 #endif
114 #if DB_VERSION_MAJOR > 3 || DB_VERSION_MINOR > 1
115 	if (flags != 0)
116 		DB_BENCH_ASSERT(dbenv->set_flags(dbenv, flags, 1) == 0);
117 	DB_BENCH_ASSERT(dbenv->open(dbenv, TESTDIR, oflags, 0666) == 0);
118 #endif
119 
120 #ifdef DB_INIT_REP
121 	if (rep_stub)
122 		DB_BENCH_ASSERT(
123 		    dbenv->rep_start(dbenv, NULL, DB_REP_MASTER) == 0);
124 #endif
125 
126 	/* Create the database. */
127 	DB_BENCH_ASSERT(db_create(&dbp, dbenv, 0) == 0);
128 #if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1)
129 	DB_BENCH_ASSERT(dbp->open(dbp, NULL,
130 	    TESTFILE, NULL, DB_BTREE, DB_CREATE | DB_AUTO_COMMIT, 0666) == 0);
131 #else
132 	DB_BENCH_ASSERT(
133 	    dbp->open(dbp, TESTFILE, NULL, DB_BTREE, DB_CREATE, 0666) == 0);
134 #endif
135 
136 	/* Initialize the data. */
137 	memset(&key, 0, sizeof(key));
138 	memset(&data, 0, sizeof(data));
139 	key.size = data.size = 20;
140 	key.data = data.data = "01234567890123456789";
141 
142 	/* Start/commit a transaction count times. */
143 	TIMER_START;
144 	for (i = 0; i < count; ++i) {
145 #if DB_VERSION_MAJOR < 4
146 		DB_BENCH_ASSERT(txn_begin(dbenv, NULL, &txn, 0) == 0);
147 		DB_BENCH_ASSERT(dbp->put(dbp, txn, &key, &data, 0) == 0);
148 		DB_BENCH_ASSERT(txn_commit(txn, 0) == 0);
149 #else
150 		DB_BENCH_ASSERT(dbenv->txn_begin(dbenv, NULL, &txn, 0) == 0);
151 		DB_BENCH_ASSERT(dbp->put(dbp, txn, &key, &data, 0) == 0);
152 		DB_BENCH_ASSERT(txn->commit(txn, 0) == 0);
153 #endif
154 	}
155 	TIMER_STOP;
156 
157 	printf("# %d %stransactions write %s commit pairs\n",
158 	    count, rep_stub ? "replicated ": "", config);
159 	TIMER_DISPLAY(count);
160 
161 	DB_BENCH_ASSERT(dbp->close(dbp, 0) == 0);
162 	DB_BENCH_ASSERT(dbenv->close(dbenv, 0) == 0);
163 
164 	return (0);
165 }
166 
167 static int
usage()168 usage()
169 {
170 	(void)fprintf(stderr, "usage: b_txn_write [-arw] [-c count]\n");
171 	return (EXIT_FAILURE);
172 }
173