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, true);
27 tabDef
.addField("f2", typeString
, 12);
28 rv
= dbMgr
->createTable("t1", tabDef
);
29 if (rv
!= OK
) { printf("Table creation failed\n"); return -1; }
30 HashIndexInitInfo
*idxInfo
= new HashIndexInitInfo();
31 strcpy(idxInfo
->tableName
, "t1");
32 idxInfo
->list
.append("f1");
33 idxInfo
->isPrimary
= true;
34 idxInfo
->isUnique
= true;
36 idxInfo
->indType
= hashIndex
;
37 rv
= dbMgr
->createIndex("indx1", idxInfo
);
38 if (rv
!= OK
) { printf("Index creation failed\n"); return -1; }
41 idxInfo
->indType
= treeIndex
;
42 rv
= dbMgr
->createIndex("indx1", idxInfo
);
43 if (rv
!= OK
) { printf("Index creation failed\n"); return -1; }
46 pthread_t thr
[THREADS
];
49 for (int i
=0; i
<THREADS
; i
++) {
51 pthread_create (&thr
[i
], NULL
,
52 &runInsTest
, (void *) &message
[i
]);
54 for (int i
=0; i
<THREADS
; i
++) {
55 pthread_join(thr
[i
], (void**)&status
);
58 Table
*table
= dbMgr
->openTable("t1");
59 if (table
== NULL
) { printf("Unable to open table\n"); return -1; }
60 table
->setCondition(NULL
);
61 rv
= conn
.startTransaction();
62 if (rv
!= OK
) while (rv
!=OK
) rv
= conn
.startTransaction();
66 while ((tuple
= (char*) table
->fetch())) {
69 printf("Tuples found: %d\n", count
);
76 p1
.setTerm("f1", OpEquals
, &valTerm
);
77 table
->setCondition(&p1
);
79 for(int i
= 0; i
< THREADS
* ITERATION
; i
++)
81 rv
= conn
.startTransaction();
82 if (rv
!= OK
) while (rv
!=OK
) rv
= conn
.startTransaction();
84 rv
= table
->execute();
85 tuple
= (char*)table
->fetch() ;
86 if (tuple
== NULL
) break;
90 //if (i%ITERATION == 0) printf("%d\n", i);
92 printf("Index Tuples found: %d\n", icount
);
97 dbMgr
->closeTable(table
);
99 for (int i
=0; i
<THREADS
; i
++) {
101 pthread_create (&thr
[i
], NULL
,
102 &runSelTest
, (void *) &message
[i
]);
104 for (int i
=0; i
<THREADS
; i
++) {
105 pthread_join(thr
[i
], (void**)&status
);
108 dbMgr
->dropTable("t1");
113 void* runInsTest(void *message
)
116 DbRetVal rv
= conn
.open("root", "manager");
119 printf("Error during connection %d\n", rv
);
122 DatabaseManager
*dbMgr
= conn
.getDatabaseManager();
123 if (dbMgr
== NULL
) { printf("Auth failed\n"); return NULL
;}
124 Table
*table
= dbMgr
->openTable("t1");
125 if (table
== NULL
) { printf("Unable to open table\n"); return NULL
; }
127 char name
[20] = "PRABAKARAN";
128 //table->bindFld("f1", &id);
129 table
->bindFld("f2", name
);
134 int val
= *(int*)message
;
136 for(i
= val
* ITERATION
; i
< (val
*ITERATION
) +ITERATION
; i
++)
138 rv
= conn
.startTransaction();
139 if (rv
!= OK
) while (rv
!=OK
) rv
= conn
.startTransaction();
141 strcpy(name
, "KARAN123");
142 ret
= table
->insertTuple();
144 while (ret
== ErrLockTimeOut
)
146 rv
= conn
.rollback();
148 while (rv
== ErrLockTimeOut
)
150 printf("retrying abort\n");
151 rv
= conn
.rollback();
154 if (retrycnt
== 3) { ret
= 1; break;}
155 rv
= conn
.startTransaction();
157 while (rv
== ErrLockTimeOut
)
159 printf("retrying startTransaction\n");
160 rv
= conn
.startTransaction();
163 ret
= table
->insertTuple();
165 //ret =1; break; //temp to analyse issue
167 if (ret
!= 0) { printf("RETURNING EARLY: %d with i:%d\n", ret
, i
); break;}
171 printf("COMMIT returned %d\n", rv
);
173 while (rv
== ErrLockTimeOut
) {
174 printf("retrying commit\n");
178 //if (icount %ITERATION ==0) printf("%d\n", i);
181 sprintf(msgBuf
,"Insert: Thread %lu %d: Total rows :%d\n",os::getthrid(), val
, icount
);
182 os::write(1,msgBuf
,strlen(msgBuf
));
183 dbMgr
->closeTable(table
);
187 void* runSelTest(void *message
)
190 DbRetVal rv
= conn
.open("root", "manager");
193 printf("Error during connection %d\n", rv
);
196 DatabaseManager
*dbMgr
= conn
.getDatabaseManager();
197 if (dbMgr
== NULL
) { printf("Auth failed\n"); return NULL
;}
198 Table
*table
= dbMgr
->openTable("t1");
199 if (table
== NULL
) { printf("Unable to open table\n"); return NULL
; }
201 char name
[1020] = "PRABAKARAN";
202 table
->bindFld("f1", &id
);
203 table
->bindFld("f2", name
);
207 int val
= *(int*)message
;
211 p1
.setTerm("f1", OpEquals
, &valTerm
);
212 table
->setCondition(&p1
);
214 for(i
= val
* ITERATION
; i
< (val
*ITERATION
) +ITERATION
; i
++)
216 rv
= conn
.startTransaction();
217 if (rv
!= OK
) while (rv
!=OK
) rv
= conn
.startTransaction();
219 if (valTerm
==0) valTerm
=1;
220 rv
= table
->execute();
222 printf("Execute returned %d\n", rv
);
225 while (rv
== ErrLockTimeOut
) {
226 if (retry
== 0) break;
227 printf("retrying execute\n");
228 rv
= table
->execute();
232 tuple
= (char*)table
->fetch() ;
233 if (tuple
== NULL
) break;
238 while (rv
== ErrLockTimeOut
) {
239 printf("retrying commit\n");
246 sprintf(msgBuf
,"Select: Thread %lu %d: Total rows :%d\n",os::getthrid(), val
, icount
);
247 os::write(1,msgBuf
,strlen(msgBuf
));
248 dbMgr
->closeTable(table
);
252 void* runDelTest(void *message
)
255 DbRetVal rv
= conn
.open("root", "manager");
258 printf("Error during connection %d\n", rv
);
261 DatabaseManager
*dbMgr
= conn
.getDatabaseManager();
262 if (dbMgr
== NULL
) { printf("Auth failed\n"); return NULL
;}
263 Table
*table
= dbMgr
->openTable("t1");
264 if (table
== NULL
) { printf("Unable to open table\n"); return NULL
; }
266 char name
[20] = "PRABAKARAN";
267 table
->bindFld("f1", &id
);
268 table
->bindFld("f2", name
);
274 int val
= *(int*)message
;
278 p1
.setTerm("f1", OpEquals
, &valTerm
);
279 table
->setCondition(&p1
);
281 for(i
= val
* ITERATION
; i
< (val
*ITERATION
) +ITERATION
; i
++)
283 rv
= conn
.startTransaction();
284 if (rv
!= OK
) while (rv
!=OK
) rv
= conn
.startTransaction();
287 rv
= table
->execute();
289 printf("Execute returned %d\n", rv
);
292 while (rv
== ErrLockTimeOut
) {
293 if (retry
== 0) { printf("DELETE:execute failed\n"); break;}
294 printf("retrying execute\n");
295 rv
= table
->execute();
299 tuple
= (char*)table
->fetch() ;
300 if (tuple
== NULL
) { printf("DELETE:fetch failed\n");break;}
301 ret
= table
->deleteTuple();
303 while (ret
== ErrLockTimeOut
)
306 rv
= conn
.rollback();
308 while (rv
== ErrLockTimeOut
)
310 printf("retrying abort\n");
311 rv
= conn
.rollback();
314 if (retrycnt
== 10) { ret
= 1; break;}
315 rv
= conn
.startTransaction();
317 while (rv
== ErrLockTimeOut
)
319 printf("retrying startTransaction\n");
320 rv
= conn
.startTransaction();
323 rv
= table
->execute();
325 printf("Execute returned %d\n", rv
);
328 while (rv
== ErrLockTimeOut
) {
329 if (retry
== 0) { printf("DELETE:execute failed\n"); break;}
330 printf("retrying execute\n");
331 rv
= table
->execute();
335 tuple
= (char*)table
->fetch() ;
336 if (tuple
== NULL
) { printf("DELETE:fetch failed\n");break;}
337 ret
= table
->deleteTuple();
340 if (ret
!= 0) { printf("RETURNING EARLY: %d with i:%d\n", ret
, i
); break;}
344 printf("COMMIT returned %d for record %d\n", rv
, i
);
345 if (rv
!= ErrLockTimeOut
)
347 printf("RETURNING EARLY: with i:%d\n", i
);
352 while (rv
== ErrLockTimeOut
) {
353 printf("retrying commit\n");
360 sprintf(msgBuf
,"Delete: Thread %lu %d: Total rows :%d\n",os::getthrid(), val
, icount
);
361 os::write(1,msgBuf
,strlen(msgBuf
));
362 dbMgr
->closeTable(table
);