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