1 //#include <NanoTimer.h>
2 //TestCase: It creates 5 threads and all threads insert ITERATION records simultanesouly.
3 //after insertion, it checks whether 50000 records are there in the table
4 //after that, 5 threads select 10K records each simultanesouly.
5 //verify that 10K records are selected in each thread.
6 //The test is repeated with no index, hash index and tree index
9 #define ITERATION 25000
10 void* runInsTest(void *p
);
11 void* runSelTest(void *p
);
12 void* runDelTest(void *p
);
17 DbRetVal rv
= conn
.open("root", "manager");
20 printf("Error during connection %d\n", rv
);
23 DatabaseManager
*dbMgr
= conn
.getDatabaseManager();
24 if (dbMgr
== NULL
) { printf("Auth failed\n"); return -1;}
26 tabDef
.addField("f1", typeInt
, 0, NULL
, true);
28 tabDef
.addField("f2", typeVarchar
, 12);
30 tabDef
.addField("f2", typeString
, 12);
32 rv
= dbMgr
->createTable("t1", tabDef
);
33 if (rv
!= OK
) { printf("Table creation failed\n"); return -1; }
34 HashIndexInitInfo
*idxInfo
= new HashIndexInitInfo();
35 strcpy(idxInfo
->tableName
, "t1");
36 idxInfo
->list
.append("f1");
38 idxInfo
->indType
= hashIndex
;
39 rv
= dbMgr
->createIndex("indx1", idxInfo
);
40 if (rv
!= OK
) { printf("Index creation failed\n"); return -1; }
43 idxInfo
->indType
= treeIndex
;
44 //idxInfo->bucketSize = 25;
45 rv
= dbMgr
->createIndex("indx1", idxInfo
);
46 if (rv
!= OK
) { printf("Index creation failed\n"); return -1; }
49 pthread_t thr
[THREADS
];
52 for (int i
=0; i
<THREADS
; i
++) {
54 pthread_create (&thr
[i
], NULL
,
55 &runInsTest
, (void *) &message
[i
]);
57 for (int i
=0; i
<THREADS
; i
++) {
58 pthread_join(thr
[i
], (void**)&status
);
61 Table
*table
= dbMgr
->openTable("t1");
62 if (table
== NULL
) { printf("Unable to open table\n"); return -1; }
63 table
->setCondition(NULL
);
64 rv
= conn
.startTransaction();
65 if (rv
!= OK
) while (rv
!=OK
) rv
= conn
.startTransaction();
69 while ((tuple
= (char*) table
->fetch())) {
72 printf("Tuples found: %d\n", count
);
79 p1
.setTerm("f1", OpEquals
, &valTerm
);
80 table
->setCondition(&p1
);
82 for(int i
= 0; i
< THREADS
* ITERATION
; i
++)
84 rv
= conn
.startTransaction();
85 if (rv
!= OK
) while (rv
!=OK
) rv
= conn
.startTransaction();
87 rv
= table
->execute();
88 tuple
= (char*)table
->fetch() ;
89 if (tuple
== NULL
) break;
93 //if (i%ITERATION == 0) printf("%d\n", i);
95 printf("Index Tuples found: %d\n", icount
);
100 dbMgr
->closeTable(table
);
102 for (int i
=0; i
<THREADS
; i
++) {
104 pthread_create (&thr
[i
], NULL
,
105 &runSelTest
, (void *) &message
[i
]);
107 for (int i
=0; i
<THREADS
; i
++) {
108 pthread_join(thr
[i
], (void**)&status
);
111 for (int i
=0; i
<THREADS
; i
++) {
113 pthread_create (&thr
[i
], NULL
,
114 &runDelTest
, (void *) &message
[i
]);
116 for (int i
=0; i
<THREADS
; i
++) {
117 pthread_join(thr
[i
], (void**)&status
);
121 dbMgr
->dropTable("t1");
126 void* runInsTest(void *message
)
129 DbRetVal rv
= conn
.open("root", "manager");
132 printf("Error during connection %d\n", rv
);
135 DatabaseManager
*dbMgr
= conn
.getDatabaseManager();
136 if (dbMgr
== NULL
) { printf("Auth failed\n"); return NULL
;}
137 Table
*table
= dbMgr
->openTable("t1");
138 if (table
== NULL
) { printf("Unable to open table\n"); return NULL
; }
140 char name
[20] = "PRABAKARAN";
141 table
->bindFld("f1", &id
);
142 table
->bindFld("f2", name
);
147 int val
= *(int*)message
;
149 for(i
= val
* ITERATION
; i
< (val
*ITERATION
) +ITERATION
; i
++)
151 rv
= conn
.startTransaction();
152 if (rv
!= OK
) while (rv
!=OK
) rv
= conn
.startTransaction();
154 strcpy(name
, "KARAN123");
155 ret
= table
->insertTuple();
157 while (ret
== ErrLockTimeOut
)
159 rv
= conn
.rollback();
161 while (rv
== ErrLockTimeOut
)
163 printf("retrying abort\n");
164 rv
= conn
.rollback();
167 if (retrycnt
== 3) { ret
= 1; break;}
168 rv
= conn
.startTransaction();
170 while (rv
== ErrLockTimeOut
)
172 printf("retrying startTransaction\n");
173 rv
= conn
.startTransaction();
176 ret
= table
->insertTuple();
178 //ret =1; break; //temp to analyse issue
180 if (ret
!= 0) { printf("RETURNING EARLY: %d with i:%d\n", ret
, i
); break;}
184 printf("COMMIT returned %d\n", rv
);
186 while (rv
== ErrLockTimeOut
) {
187 printf("retrying commit\n");
191 //if (icount %ITERATION ==0) printf("%d\n", i);
194 sprintf(msgBuf
,"Insert: Thread %lu %d: Total rows :%d\n",os::getthrid(), val
, icount
);
195 os::write(1,msgBuf
,strlen(msgBuf
));
196 dbMgr
->closeTable(table
);
200 void* runSelTest(void *message
)
203 DbRetVal rv
= conn
.open("root", "manager");
206 printf("Error during connection %d\n", rv
);
209 DatabaseManager
*dbMgr
= conn
.getDatabaseManager();
210 if (dbMgr
== NULL
) { printf("Auth failed\n"); return NULL
;}
211 Table
*table
= dbMgr
->openTable("t1");
212 if (table
== NULL
) { printf("Unable to open table\n"); return NULL
; }
214 char name
[1020] = "PRABAKARAN";
215 table
->bindFld("f1", &id
);
216 table
->bindFld("f2", name
);
220 int val
= *(int*)message
;
224 p1
.setTerm("f1", OpEquals
, &valTerm
);
225 table
->setCondition(&p1
);
227 for(i
= val
* ITERATION
; i
< (val
*ITERATION
) +ITERATION
; i
++)
229 rv
= conn
.startTransaction();
230 if (rv
!= OK
) while (rv
!=OK
) rv
= conn
.startTransaction();
232 rv
= table
->execute();
234 printf("Execute returned %d\n", rv
);
237 while (rv
== ErrLockTimeOut
) {
238 if (retry
== 0) break;
239 printf("retrying execute\n");
240 rv
= table
->execute();
244 tuple
= (char*)table
->fetch() ;
245 if (tuple
== NULL
) break;
250 while (rv
== ErrLockTimeOut
) {
251 printf("retrying commit\n");
258 sprintf(msgBuf
,"Select: Thread %lu %d: Total rows :%d\n",os::getthrid(), val
, icount
);
259 os::write(1,msgBuf
,strlen(msgBuf
));
260 dbMgr
->closeTable(table
);
264 void* runDelTest(void *message
)
267 DbRetVal rv
= conn
.open("root", "manager");
270 printf("Error during connection %d\n", rv
);
273 DatabaseManager
*dbMgr
= conn
.getDatabaseManager();
274 if (dbMgr
== NULL
) { printf("Auth failed\n"); return NULL
;}
275 Table
*table
= dbMgr
->openTable("t1");
276 if (table
== NULL
) { printf("Unable to open table\n"); return NULL
; }
278 char name
[20] = "PRABAKARAN";
279 table
->bindFld("f1", &id
);
280 table
->bindFld("f2", name
);
286 int val
= *(int*)message
;
290 p1
.setTerm("f1", OpEquals
, &valTerm
);
291 table
->setCondition(&p1
);
293 for(i
= val
* ITERATION
; i
< (val
*ITERATION
) +ITERATION
; i
++)
295 rv
= conn
.startTransaction();
296 if (rv
!= OK
) while (rv
!=OK
) rv
= conn
.startTransaction();
299 rv
= table
->execute();
301 printf("Execute returned %d\n", rv
);
304 while (rv
== ErrLockTimeOut
) {
305 if (retry
== 0) { printf("DELETE:execute failed\n"); break;}
306 printf("retrying execute\n");
307 rv
= table
->execute();
311 tuple
= (char*)table
->fetch() ;
312 if (tuple
== NULL
) { printf("DELETE:fetch failed\n");break;}
313 ret
= table
->deleteTuple();
315 while (ret
== ErrLockTimeOut
)
318 rv
= conn
.rollback();
320 while (rv
== ErrLockTimeOut
)
322 printf("retrying abort\n");
323 rv
= conn
.rollback();
326 if (retrycnt
== 10) { ret
= 1; break;}
327 rv
= conn
.startTransaction();
329 while (rv
== ErrLockTimeOut
)
331 printf("retrying startTransaction\n");
332 rv
= conn
.startTransaction();
335 rv
= table
->execute();
337 printf("Execute returned %d\n", rv
);
340 while (rv
== ErrLockTimeOut
) {
341 if (retry
== 0) { printf("DELETE:execute failed\n"); break;}
342 printf("retrying execute\n");
343 rv
= table
->execute();
347 tuple
= (char*)table
->fetch() ;
348 if (tuple
== NULL
) { printf("DELETE:fetch failed\n");break;}
349 ret
= table
->deleteTuple();
352 if (ret
!= 0) { printf("RETURNING EARLY: %d with i:%d\n", ret
, i
); break;}
356 printf("COMMIT returned %d for record %d\n", rv
, i
);
357 if (rv
!= ErrLockTimeOut
)
359 printf("RETURNING EARLY: with i:%d\n", i
);
364 while (rv
== ErrLockTimeOut
) {
365 printf("retrying commit\n");
372 sprintf(msgBuf
,"Delete: Thread %lu %d: Total rows :%d\n",os::getthrid(), val
, icount
);
373 os::write(1,msgBuf
,strlen(msgBuf
));
374 dbMgr
->closeTable(table
);