@@ -40,14 +40,18 @@ typedef uint32_t xid_t;
4040struct thread
4141{
4242 pthread_t t;
43- size_t proceeded;
43+ size_t transactions;
44+ size_t updates;
45+ size_t selects;
4446 size_t aborts;
4547 int id;
4648
4749 void start (int tid, thread_proc_t proc) {
4850 id = tid;
49- proceeded = 0 ;
51+ updates = 0 ;
52+ selects = 0 ;
5053 aborts = 0 ;
54+ transactions = 0 ;
5155 pthread_create (&t, NULL , proc, this );
5256 }
5357
@@ -62,13 +66,15 @@ struct config
6266 int nWriters;
6367 int nIterations;
6468 int nAccounts;
69+ int updatePercent;
6570 vector<string> connections;
6671
6772 config () {
6873 nReaders = 1 ;
6974 nWriters = 10 ;
7075 nIterations = 1000 ;
7176 nAccounts = 100000 ;
77+ updatePercent = 100 ;
7278 }
7379};
7480
@@ -123,7 +129,8 @@ void* reader(void* arg)
123129 printf (" Total=%ld\n " , sum);
124130 prevSum = sum;
125131 }
126- t.proceeded += 1 ;
132+ t.transactions += 1 ;
133+ t.selects += 1 ;
127134 txn.commit ();
128135 }
129136 return NULL ;
@@ -142,16 +149,26 @@ void* writer(void* arg)
142149 int srcAcc = random () % cfg.nAccounts ;
143150 int dstAcc = random () % cfg.nAccounts ;
144151 try {
145- exec (txn, " update t set v = v - 1 where u=%d" , srcAcc);
146- exec (txn, " update t set v = v + 1 where u=%d" , dstAcc);
152+ if (random () % 100 < cfg.updatePercent ) {
153+ exec (txn, " update t set v = v - 1 where u=%d" , srcAcc);
154+ exec (txn, " update t set v = v + 1 where u=%d" , dstAcc);
155+ t.updates += 2 ;
156+ } else {
157+ int64_t sum = execQuery (txn, " select v from t where u=%d" , srcAcc)
158+ + execQuery (txn, " select v from t where u=%d" , dstAcc);
159+ if (sum > cfg.nIterations *cfg.nWriters || sum < -cfg.nIterations *cfg.nWriters ) {
160+ printf (" Wrong sum=%ld\n " , sum);
161+ }
162+ t.selects += 2 ;
163+ }
147164 txn.commit ();
165+ t.transactions += 1 ;
148166 } catch (pqxx_exception const & x) {
149167 txn.abort ();
150168 t.aborts += 1 ;
151169 i -= 1 ;
152170 continue ;
153171 }
154- t.proceeded += 1 ;
155172 }
156173 return NULL ;
157174}
@@ -188,6 +205,9 @@ int main (int argc, char* argv[])
188205 case ' n' :
189206 cfg.nIterations = atoi (argv[++i]);
190207 continue ;
208+ case ' p' :
209+ cfg.updatePercent = atoi (argv[++i]);
210+ continue ;
191211 case ' c' :
192212 cfg.connections .push_back (string (argv[++i]));
193213 continue ;
@@ -201,6 +221,7 @@ int main (int argc, char* argv[])
201221 " \t -w N\t number of writers (10)\n "
202222 " \t -a N\t number of accounts (100000)\n "
203223 " \t -n N\t number of iterations (1000)\n "
224+ " \t -p N\t update percent (100)\n "
204225 " \t -c STR\t database connection string\n "
205226 " \t -i\t initialize database\n " );
206227 return 1 ;
@@ -216,10 +237,11 @@ int main (int argc, char* argv[])
216237
217238 vector<thread> readers (cfg.nReaders );
218239 vector<thread> writers (cfg.nWriters );
219- size_t nReads = 0 ;
220- size_t nWrites = 0 ;
221240 size_t nAborts = 0 ;
222-
241+ size_t nUpdates = 0 ;
242+ size_t nSelects = 0 ;
243+ size_t nTransactions = 0 ;
244+
223245 for (int i = 0 ; i < cfg.nReaders ; i++) {
224246 readers[i].start (i, reader);
225247 }
@@ -229,29 +251,35 @@ int main (int argc, char* argv[])
229251
230252 for (int i = 0 ; i < cfg.nWriters ; i++) {
231253 writers[i].wait ();
232- nWrites += writers[i].proceeded ;
254+ nUpdates += writers[i].updates ;
255+ nSelects += writers[i].selects ;
233256 nAborts += writers[i].aborts ;
257+ nTransactions += writers[i].transactions ;
234258 }
235259
236260 running = false ;
237261
238262 for (int i = 0 ; i < cfg.nReaders ; i++) {
239263 readers[i].wait ();
240- nReads += readers[i].proceeded ;
264+ nSelects += readers[i].selects ;
265+ nTransactions += writers[i].transactions ;
241266 }
242267
243268 time_t elapsed = getCurrentTime () - start;
244269
245270 printf (
246- " {\" update_tps\" :%f, \" read_tps\" :%f,"
247- " \" readers\" :%d, \" writers\" :%d, \" aborts\" :%ld, \" abort_percent\" : %d,"
248- " \" accounts\" :%d, \" iterations\" :%d, \" hosts\" :%ld}\n " ,
249- (double )(nWrites*USEC)/elapsed,
250- (double )(nReads*USEC)/elapsed,
271+ " {\" tps\" :%f, \" transactions\" :%ld,"
272+ " \" selects\" :%ld, \" updates\" :%ld, \" aborts\" :%ld, \" abort_percent\" : %d,"
273+ " \" readers\" :%d, \" writers\" :%d, \" update_percent\" :%d, \" accounts\" :%d, \" iterations\" :%d, \" hosts\" :%ld}\n " ,
274+ (double )(nTransactions*USEC)/elapsed,
275+ nTransactions,
276+ nSelects,
277+ nUpdates,
278+ nAborts,
279+ (int )(nAborts*100 /nTransactions),
251280 cfg.nReaders ,
252281 cfg.nWriters ,
253- nAborts,
254- (int )(nAborts*100 /nWrites),
282+ cfg.updatePercent ,
255283 cfg.nAccounts ,
256284 cfg.nIterations ,
257285 cfg.connections .size ()
0 commit comments