summaryrefslogtreecommitdiff
path: root/ndb/test/ndbapi/testOIBasic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ndb/test/ndbapi/testOIBasic.cpp')
-rw-r--r--ndb/test/ndbapi/testOIBasic.cpp313
1 files changed, 250 insertions, 63 deletions
diff --git a/ndb/test/ndbapi/testOIBasic.cpp b/ndb/test/ndbapi/testOIBasic.cpp
index c58dd8538e9..21862e02328 100644
--- a/ndb/test/ndbapi/testOIBasic.cpp
+++ b/ndb/test/ndbapi/testOIBasic.cpp
@@ -28,25 +28,33 @@
#include <NdbCondition.h>
#include <NdbThread.h>
#include <NdbTick.h>
+#include <my_sys.h>
// options
struct Opt {
// common options
unsigned m_batch;
+ const char* m_bound;
const char* m_case;
bool m_core;
+ const char* m_csname;
+ CHARSET_INFO* m_cs;
+ int m_die;
bool m_dups;
NdbDictionary::Object::FragmentType m_fragtype;
- unsigned m_idxloop;
+ unsigned m_subsubloop;
const char* m_index;
unsigned m_loop;
- bool m_nologging;
bool m_msglock;
+ bool m_nologging;
+ bool m_noverify;
+ unsigned m_pctnull;
unsigned m_rows;
unsigned m_samples;
- unsigned m_scanrd;
- unsigned m_scanex;
+ unsigned m_scanbat;
+ unsigned m_scanpar;
+ unsigned m_scanstop;
unsigned m_seed;
unsigned m_subloop;
const char* m_table;
@@ -54,23 +62,30 @@ struct Opt {
unsigned m_v;
Opt() :
m_batch(32),
+ m_bound("01234"),
m_case(0),
m_core(false),
+ m_csname("latin1_bin"),
+ m_cs(0),
+ m_die(0),
m_dups(false),
m_fragtype(NdbDictionary::Object::FragUndefined),
- m_idxloop(4),
+ m_subsubloop(4),
m_index(0),
m_loop(1),
- m_nologging(false),
m_msglock(true),
+ m_nologging(false),
+ m_noverify(false),
+ m_pctnull(10),
m_rows(1000),
m_samples(0),
- m_scanrd(240),
- m_scanex(240),
+ m_scanbat(0),
+ m_scanpar(0),
+ m_scanstop(0),
m_seed(0),
m_subloop(4),
m_table(0),
- m_threads(4),
+ m_threads(10),
m_v(1) {
}
};
@@ -87,17 +102,22 @@ printhelp()
ndbout
<< "usage: testOIbasic [options]" << endl
<< " -batch N pk operations in batch [" << d.m_batch << "]" << endl
+ << " -bound xyz use only these bound types 0-4 [" << d.m_bound << "]" << endl
<< " -case abc only given test cases (letters a-z)" << endl
<< " -core core dump on error [" << d.m_core << "]" << endl
+ << " -csname S charset (collation) of non-pk char column [" << d.m_csname << "]" << endl
+ << " -die nnn exit immediately on NDB error code nnn" << endl
<< " -dups allow duplicate tuples from index scan [" << d.m_dups << "]" << endl
<< " -fragtype T fragment type single/small/medium/large" << endl
<< " -index xyz only given index numbers (digits 1-9)" << endl
<< " -loop N loop count full suite 0=forever [" << d.m_loop << "]" << endl
<< " -nologging create tables in no-logging mode" << endl
+ << " -noverify skip index verifications" << endl
+ << " -pctnull N pct NULL values in nullable column [" << d.m_pctnull << "]" << endl
<< " -rows N rows per thread [" << d.m_rows << "]" << endl
<< " -samples N samples for some timings (0=all) [" << d.m_samples << "]" << endl
- << " -scanrd N scan read parallelism [" << d.m_scanrd << "]" << endl
- << " -scanex N scan exclusive parallelism [" << d.m_scanex << "]" << endl
+ << " -scanbat N scan batch per fragment (ignored by ndb api) [" << d.m_scanbat << "]" << endl
+ << " -scanpar N scan parallelism [" << d.m_scanpar << "]" << endl
<< " -seed N srandom seed 0=loop number[" << d.m_seed << "]" << endl
<< " -subloop N subtest loop count [" << d.m_subloop << "]" << endl
<< " -table xyz only given table numbers (digits 1-9)" << endl
@@ -117,7 +137,7 @@ static const bool g_compare_null = true;
// log and error macros
-static NdbMutex ndbout_mutex = NDB_MUTEX_INITIALIZER;
+static NdbMutex *ndbout_mutex= NULL;
static unsigned getthrno();
@@ -140,9 +160,9 @@ getthrstr()
#define LLN(n, s) \
do { \
if ((n) > g_opt.m_v) break; \
- if (g_opt.m_msglock) NdbMutex_Lock(&ndbout_mutex); \
+ if (g_opt.m_msglock) NdbMutex_Lock(ndbout_mutex); \
ndbout << getthrstr() << s << endl; \
- if (g_opt.m_msglock) NdbMutex_Unlock(&ndbout_mutex); \
+ if (g_opt.m_msglock) NdbMutex_Unlock(ndbout_mutex); \
} while(0)
#define LL0(s) LLN(0, s)
@@ -196,11 +216,14 @@ struct Par : public Opt {
Set& set() const { assert(m_set != 0); return *m_set; }
Tmr* m_tmr;
Tmr& tmr() const { assert(m_tmr != 0); return *m_tmr; }
+ unsigned m_lno;
+ unsigned m_slno;
unsigned m_totrows;
// value calculation
- unsigned m_pctnull;
unsigned m_range;
unsigned m_pctrange;
+ // choice of key
+ bool m_randomkey;
// do verify after read
bool m_verify;
// deadlock possible
@@ -213,10 +236,12 @@ struct Par : public Opt {
m_tab(0),
m_set(0),
m_tmr(0),
+ m_lno(0),
+ m_slno(0),
m_totrows(m_threads * m_rows),
- m_pctnull(10),
m_range(m_rows),
m_pctrange(0),
+ m_randomkey(false),
m_verify(false),
m_deadlock(false) {
}
@@ -678,13 +703,14 @@ struct Con {
int setBound(int num, int type, const void* value);
int execute(ExecType t);
int execute(ExecType t, bool& deadlock);
- int openScanRead(unsigned parallelism);
- int openScanExclusive(unsigned parallelism);
+ int openScanRead(unsigned scanbat, unsigned scanpar);
+ int openScanExclusive(unsigned scanbat, unsigned scanpar);
int executeScan();
int nextScanResult(bool fetchAllowed);
int nextScanResult(bool fetchAllowed, bool& deadlock);
int updateScanTuple(Con& con2);
int deleteScanTuple(Con& con2);
+ void closeScan();
void closeTransaction();
void printerror(NdbOut& out);
};
@@ -805,18 +831,20 @@ Con::execute(ExecType t, bool& deadlock)
}
int
-Con::openScanRead(unsigned parallelism)
+Con::openScanRead(unsigned scanbat, unsigned scanpar)
{
assert(m_tx != 0 && m_op != 0);
- CHKCON((m_resultset = m_scanop->readTuples(parallelism)) != 0, *this);
+ NdbOperation::LockMode lm = NdbOperation::LM_Read;
+ CHKCON((m_resultset = m_scanop->readTuples(lm, scanbat, scanpar)) != 0, *this);
return 0;
}
int
-Con::openScanExclusive(unsigned parallelism)
+Con::openScanExclusive(unsigned scanbat, unsigned scanpar)
{
assert(m_tx != 0 && m_op != 0);
- CHKCON((m_resultset = m_scanop->readTuplesExclusive(parallelism)) != 0, *this);
+ NdbOperation::LockMode lm = NdbOperation::LM_Exclusive;
+ CHKCON((m_resultset = m_scanop->readTuples(lm, scanbat, scanpar)) != 0, *this);
return 0;
}
@@ -870,11 +898,21 @@ Con::deleteScanTuple(Con& con2)
}
void
+Con::closeScan()
+{
+ assert(m_resultset != 0);
+ m_resultset->close();
+ m_scanop = 0, m_indexscanop = 0, m_resultset = 0;
+
+}
+
+void
Con::closeTransaction()
{
assert(m_ndb != 0 && m_tx != 0);
m_ndb->closeTransaction(m_tx);
m_tx = 0, m_op = 0;
+ m_scanop = 0, m_indexscanop = 0, m_resultset = 0;
}
void
@@ -883,27 +921,37 @@ Con::printerror(NdbOut& out)
m_errtype = ErrOther;
unsigned any = 0;
int code;
+ int die = 0;
if (m_ndb) {
if ((code = m_ndb->getNdbError().code) != 0) {
LL0(++any << " ndb: error " << m_ndb->getNdbError());
+ die += (code == g_opt.m_die);
}
if (m_dic && (code = m_dic->getNdbError().code) != 0) {
LL0(++any << " dic: error " << m_dic->getNdbError());
+ die += (code == g_opt.m_die);
}
if (m_tx) {
if ((code = m_tx->getNdbError().code) != 0) {
LL0(++any << " con: error " << m_tx->getNdbError());
+ die += (code == g_opt.m_die);
if (code == 266 || code == 274 || code == 296 || code == 297 || code == 499)
m_errtype = ErrDeadlock;
}
if (m_op && m_op->getNdbError().code != 0) {
LL0(++any << " op : error " << m_op->getNdbError());
+ die += (code == g_opt.m_die);
}
}
}
if (! any) {
LL0("failed but no NDB error code");
}
+ if (die) {
+ if (g_opt.m_core)
+ abort();
+ exit(1);
+ }
}
// dictionary operations
@@ -975,10 +1023,14 @@ createtable(Par par)
for (unsigned k = 0; k < tab.m_cols; k++) {
const Col& col = tab.m_col[k];
NdbDictionary::Column c(col.m_name);
- c.setPrimaryKey(col.m_pk);
c.setType(col.m_type);
c.setLength(col.m_length);
+ c.setPrimaryKey(col.m_pk);
c.setNullable(col.m_nullable);
+ if (c.getCharset()) { // test if char type
+ if (! col.m_pk)
+ c.setCharset(par.m_cs);
+ }
t.addColumn(c);
}
con.m_dic = con.m_ndb->getDictionary();
@@ -1622,7 +1674,6 @@ Set::calc(Par par, unsigned i)
m_row[i] = new Row(tab);
Row& row = *m_row[i];
// value generation parameters
- par.m_pctnull = 10;
par.m_pctrange = 40;
row.calc(par, i);
}
@@ -1898,8 +1949,11 @@ BSet::calc(Par par)
BVal& bval = *new BVal(icol);
m_bval[m_bvals++] = &bval;
bval.m_null = false;
- // equality bound only on i==0
- unsigned sel = urandom(5 - i);
+ unsigned sel;
+ do {
+ // equality bound only on i==0
+ sel = urandom(5 - i);
+ } while (strchr(par.m_bound, '0' + sel) == 0);
if (sel < 2)
bval.m_type = 0 | (1 << i);
else if (sel < 4)
@@ -1949,9 +2003,21 @@ BSet::calcpk(Par par, unsigned i)
int
BSet::setbnd(Par par) const
{
- for (unsigned j = 0; j < m_bvals; j++) {
- const BVal& bval = *m_bval[j];
- CHK(bval.setbnd(par) == 0);
+ if (m_bvals != 0) {
+ unsigned p1 = urandom(m_bvals);
+ unsigned p2 = 10009; // prime
+ // random order
+ for (unsigned j = 0; j < m_bvals; j++) {
+ unsigned k = p1 + p2 * j;
+ const BVal& bval = *m_bval[k % m_bvals];
+ CHK(bval.setbnd(par) == 0);
+ }
+ // duplicate
+ if (urandom(5) == 0) {
+ unsigned k = urandom(m_bvals);
+ const BVal& bval = *m_bval[k];
+ CHK(bval.setbnd(par) == 0);
+ }
}
return 0;
}
@@ -2038,7 +2104,8 @@ pkinsert(Par par)
CHK(con.startTransaction() == 0);
Lst lst;
for (unsigned j = 0; j < par.m_rows; j++) {
- unsigned i = thrrow(par, j);
+ unsigned j2 = ! par.m_randomkey ? j : urandom(par.m_rows);
+ unsigned i = thrrow(par, j2);
set.lock();
if (set.exist(i) || set.pending(i)) {
set.unlock();
@@ -2091,7 +2158,8 @@ pkupdate(Par par)
Lst lst;
bool deadlock = false;
for (unsigned j = 0; j < par.m_rows; j++) {
- unsigned i = thrrow(par, j);
+ unsigned j2 = ! par.m_randomkey ? j : urandom(par.m_rows);
+ unsigned i = thrrow(par, j2);
set.lock();
if (! set.exist(i) || set.pending(i)) {
set.unlock();
@@ -2142,7 +2210,8 @@ pkdelete(Par par)
Lst lst;
bool deadlock = false;
for (unsigned j = 0; j < par.m_rows; j++) {
- unsigned i = thrrow(par, j);
+ unsigned j2 = ! par.m_randomkey ? j : urandom(par.m_rows);
+ unsigned i = thrrow(par, j2);
set.lock();
if (! set.exist(i) || set.pending(i)) {
set.unlock();
@@ -2230,9 +2299,8 @@ pkreadfast(Par par, unsigned count)
keyrow.calc(par, i);
CHK(keyrow.selrow(par) == 0);
NdbRecAttr* rec;
- CHK(con.getValue((Uint32)0, rec) == 0);
- CHK(con.executeScan() == 0);
// get 1st column
+ CHK(con.getValue((Uint32)0, rec) == 0);
CHK(con.execute(Commit) == 0);
con.closeTransaction();
}
@@ -2253,7 +2321,7 @@ scanreadtable(Par par)
Set set2(tab, set.m_rows);
CHK(con.startTransaction() == 0);
CHK(con.getNdbScanOperation(tab) == 0);
- CHK(con.openScanRead(par.m_scanrd) == 0);
+ CHK(con.openScanRead(par.m_scanbat, par.m_scanpar) == 0);
set2.getval(par);
CHK(con.executeScan() == 0);
while (1) {
@@ -2281,7 +2349,7 @@ scanreadtablefast(Par par, unsigned countcheck)
LL3("scanfast " << tab.m_name);
CHK(con.startTransaction() == 0);
CHK(con.getNdbScanOperation(tab) == 0);
- CHK(con.openScanRead(par.m_scanrd) == 0);
+ CHK(con.openScanRead(par.m_scanbat, par.m_scanpar) == 0);
// get 1st column
NdbRecAttr* rec;
CHK(con.getValue((Uint32)0, rec) == 0);
@@ -2313,7 +2381,7 @@ scanreadindex(Par par, const ITab& itab, const BSet& bset)
Set set2(tab, set.m_rows);
CHK(con.startTransaction() == 0);
CHK(con.getNdbScanOperation(itab, tab) == 0);
- CHK(con.openScanRead(par.m_scanrd) == 0);
+ CHK(con.openScanRead(par.m_scanbat, par.m_scanpar) == 0);
CHK(bset.setbnd(par) == 0);
set2.getval(par);
CHK(con.executeScan() == 0);
@@ -2344,7 +2412,7 @@ scanreadindexfast(Par par, const ITab& itab, const BSet& bset, unsigned countche
LL4(bset);
CHK(con.startTransaction() == 0);
CHK(con.getNdbScanOperation(itab, tab) == 0);
- CHK(con.openScanRead(par.m_scanrd) == 0);
+ CHK(con.openScanRead(par.m_scanbat, par.m_scanpar) == 0);
CHK(bset.setbnd(par) == 0);
// get 1st column
NdbRecAttr* rec;
@@ -2367,7 +2435,7 @@ static int
scanreadindex(Par par, const ITab& itab)
{
const Tab& tab = par.tab();
- for (unsigned i = 0; i < par.m_idxloop; i++) {
+ for (unsigned i = 0; i < par.m_subsubloop; i++) {
BSet bset(tab, itab, par.m_rows);
bset.calc(par);
CHK(scanreadindex(par, itab, bset) == 0);
@@ -2463,7 +2531,7 @@ scanupdatetable(Par par)
Set set2(tab, set.m_rows);
CHK(con.startTransaction() == 0);
CHK(con.getNdbScanOperation(tab) == 0);
- CHK(con.openScanExclusive(par.m_scanex) == 0);
+ CHK(con.openScanExclusive(par.m_scanbat, par.m_scanpar) == 0);
set2.getval(par);
CHK(con.executeScan() == 0);
unsigned count = 0;
@@ -2483,6 +2551,10 @@ scanupdatetable(Par par)
LL1("scanupdatetable: stop on deadlock");
break;
}
+ if (par.m_scanstop != 0 && urandom(par.m_scanstop) == 0) {
+ con.closeScan();
+ break;
+ }
do {
unsigned i = (unsigned)-1;
CHK(set2.getkey(par, &i) == 0);
@@ -2542,7 +2614,7 @@ scanupdateindex(Par par, const ITab& itab, const BSet& bset)
Set set2(tab, set.m_rows);
CHK(con.startTransaction() == 0);
CHK(con.getNdbScanOperation(itab, tab) == 0);
- CHK(con.openScanExclusive(par.m_scanex) == 0);
+ CHK(con.openScanExclusive(par.m_scanbat, par.m_scanpar) == 0);
CHK(bset.setbnd(par) == 0);
set2.getval(par);
CHK(con.executeScan() == 0);
@@ -2563,6 +2635,10 @@ scanupdateindex(Par par, const ITab& itab, const BSet& bset)
LL1("scanupdateindex: stop on deadlock");
break;
}
+ if (par.m_scanstop != 0 && urandom(par.m_scanstop) == 0) {
+ con.closeScan();
+ break;
+ }
do {
unsigned i = (unsigned)-1;
CHK(set2.getkey(par, &i) == 0);
@@ -2614,7 +2690,7 @@ static int
scanupdateindex(Par par, const ITab& itab)
{
const Tab& tab = par.tab();
- for (unsigned i = 0; i < par.m_idxloop; i++) {
+ for (unsigned i = 0; i < par.m_subsubloop; i++) {
BSet bset(tab, itab, par.m_rows);
bset.calc(par);
CHK(scanupdateindex(par, itab, bset) == 0);
@@ -2648,6 +2724,8 @@ scanupdateall(Par par)
static int
readverify(Par par)
{
+ if (par.m_noverify)
+ return 0;
par.m_verify = true;
CHK(pkread(par) == 0);
CHK(scanreadall(par) == 0);
@@ -2655,6 +2733,55 @@ readverify(Par par)
}
static int
+readverifyfull(Par par)
+{
+ if (par.m_noverify)
+ return 0;
+ par.m_verify = true;
+ if (par.m_no == 0)
+ CHK(scanreadtable(par) == 0);
+ else {
+ const Tab& tab = par.tab();
+ unsigned i = par.m_no;
+ if (i <= tab.m_itabs && useindex(i)) {
+ const ITab& itab = tab.m_itab[i - 1];
+ BSet bset(tab, itab, par.m_rows);
+ CHK(scanreadindex(par, itab, bset) == 0);
+ }
+ }
+ return 0;
+}
+
+static int
+pkops(Par par)
+{
+ par.m_randomkey = true;
+ for (unsigned i = 0; i < par.m_subsubloop; i++) {
+ unsigned sel = urandom(10);
+ if (par.m_slno % 2 == 0) {
+ // favor insert
+ if (sel < 8) {
+ CHK(pkinsert(par) == 0);
+ } else if (sel < 9) {
+ CHK(pkupdate(par) == 0);
+ } else {
+ CHK(pkdelete(par) == 0);
+ }
+ } else {
+ // favor delete
+ if (sel < 1) {
+ CHK(pkinsert(par) == 0);
+ } else if (sel < 2) {
+ CHK(pkupdate(par) == 0);
+ } else {
+ CHK(pkdelete(par) == 0);
+ }
+ }
+ }
+ return 0;
+}
+
+static int
pkupdatescanread(Par par)
{
par.m_dups = true;
@@ -2676,6 +2803,7 @@ mixedoperations(Par par)
{
par.m_dups = true;
par.m_deadlock = true;
+ par.m_scanstop = par.m_totrows; // randomly close scans
unsigned sel = urandom(10);
if (sel < 2) {
CHK(pkdelete(par) == 0);
@@ -2695,6 +2823,7 @@ pkupdateindexbuild(Par par)
if (par.m_no == 0) {
CHK(createindex(par) == 0);
} else {
+ par.m_randomkey = true;
CHK(pkupdate(par) == 0);
}
return 0;
@@ -2898,6 +3027,8 @@ runstep(Par par, const char* fname, TFunc func, unsigned mode)
thr.m_par.m_tab = par.m_tab;
thr.m_par.m_set = par.m_set;
thr.m_par.m_tmr = par.m_tmr;
+ thr.m_par.m_lno = par.m_lno;
+ thr.m_par.m_slno = par.m_slno;
thr.m_func = func;
thr.start();
}
@@ -2921,8 +3052,8 @@ tbuild(Par par)
RUNSTEP(par, droptable, ST);
RUNSTEP(par, createtable, ST);
RUNSTEP(par, invalidatetable, MT);
- for (unsigned i = 0; i < par.m_subloop; i++) {
- if (i % 2 == 0) {
+ for (par.m_slno = 0; par.m_slno < par.m_subloop; par.m_slno++) {
+ if (par.m_slno % 2 == 0) {
RUNSTEP(par, createindex, ST);
RUNSTEP(par, invalidateindex, MT);
RUNSTEP(par, pkinsert, MT);
@@ -2931,9 +3062,10 @@ tbuild(Par par)
RUNSTEP(par, createindex, ST);
RUNSTEP(par, invalidateindex, MT);
}
- RUNSTEP(par, readverify, MT);
+ RUNSTEP(par, pkupdate, MT);
+ RUNSTEP(par, readverifyfull, MT);
RUNSTEP(par, pkdelete, MT);
- RUNSTEP(par, readverify, MT);
+ RUNSTEP(par, readverifyfull, MT);
RUNSTEP(par, dropindex, ST);
}
return 0;
@@ -2945,11 +3077,27 @@ tpkops(Par par)
RUNSTEP(par, droptable, ST);
RUNSTEP(par, createtable, ST);
RUNSTEP(par, invalidatetable, MT);
+ RUNSTEP(par, createindex, ST);
+ RUNSTEP(par, invalidateindex, MT);
+ for (par.m_slno = 0; par.m_slno < par.m_subloop; par.m_slno++) {
+ RUNSTEP(par, pkops, MT);
+ LL2("rows=" << par.set().count());
+ RUNSTEP(par, readverifyfull, MT);
+ }
+ return 0;
+}
+
+static int
+tpkopsread(Par par)
+{
+ RUNSTEP(par, droptable, ST);
+ RUNSTEP(par, createtable, ST);
+ RUNSTEP(par, invalidatetable, MT);
RUNSTEP(par, pkinsert, MT);
RUNSTEP(par, createindex, ST);
RUNSTEP(par, invalidateindex, MT);
RUNSTEP(par, readverify, ST);
- for (unsigned i = 0; i < par.m_subloop; i++) {
+ for (par.m_slno = 0; par.m_slno < par.m_subloop; par.m_slno++) {
RUNSTEP(par, pkupdatescanread, MT);
RUNSTEP(par, readverify, ST);
}
@@ -2968,7 +3116,7 @@ tmixedops(Par par)
RUNSTEP(par, createindex, ST);
RUNSTEP(par, invalidateindex, MT);
RUNSTEP(par, readverify, ST);
- for (unsigned i = 0; i < par.m_subloop; i++) {
+ for (par.m_slno = 0; par.m_slno < par.m_subloop; par.m_slno++) {
RUNSTEP(par, mixedoperations, MT);
RUNSTEP(par, readverify, ST);
}
@@ -2982,7 +3130,7 @@ tbusybuild(Par par)
RUNSTEP(par, createtable, ST);
RUNSTEP(par, invalidatetable, MT);
RUNSTEP(par, pkinsert, MT);
- for (unsigned i = 0; i < par.m_subloop; i++) {
+ for (par.m_slno = 0; par.m_slno < par.m_subloop; par.m_slno++) {
RUNSTEP(par, pkupdateindexbuild, MT);
RUNSTEP(par, invalidateindex, MT);
RUNSTEP(par, readverify, ST);
@@ -2998,7 +3146,7 @@ ttimebuild(Par par)
RUNSTEP(par, droptable, ST);
RUNSTEP(par, createtable, ST);
RUNSTEP(par, invalidatetable, MT);
- for (unsigned i = 0; i < par.m_subloop; i++) {
+ for (par.m_slno = 0; par.m_slno < par.m_subloop; par.m_slno++) {
RUNSTEP(par, pkinsert, MT);
t1.on();
RUNSTEP(par, createindex, ST);
@@ -3017,7 +3165,7 @@ ttimemaint(Par par)
RUNSTEP(par, droptable, ST);
RUNSTEP(par, createtable, ST);
RUNSTEP(par, invalidatetable, MT);
- for (unsigned i = 0; i < par.m_subloop; i++) {
+ for (par.m_slno = 0; par.m_slno < par.m_subloop; par.m_slno++) {
RUNSTEP(par, pkinsert, MT);
t1.on();
RUNSTEP(par, pkupdate, MT);
@@ -3042,7 +3190,7 @@ ttimescan(Par par)
RUNSTEP(par, droptable, ST);
RUNSTEP(par, createtable, ST);
RUNSTEP(par, invalidatetable, MT);
- for (unsigned i = 0; i < par.m_subloop; i++) {
+ for (par.m_slno = 0; par.m_slno < par.m_subloop; par.m_slno++) {
RUNSTEP(par, pkinsert, MT);
RUNSTEP(par, createindex, ST);
par.m_tmr = &t1;
@@ -3064,7 +3212,7 @@ ttimepkread(Par par)
RUNSTEP(par, droptable, ST);
RUNSTEP(par, createtable, ST);
RUNSTEP(par, invalidatetable, MT);
- for (unsigned i = 0; i < par.m_subloop; i++) {
+ for (par.m_slno = 0; par.m_slno < par.m_subloop; par.m_slno++) {
RUNSTEP(par, pkinsert, MT);
RUNSTEP(par, createindex, ST);
par.m_tmr = &t1;
@@ -3100,9 +3248,10 @@ struct TCase {
static const TCase
tcaselist[] = {
TCase("a", tbuild, "index build"),
- TCase("b", tpkops, "pk operations and scan reads"),
- TCase("c", tmixedops, "pk operations and scan operations"),
- TCase("d", tbusybuild, "pk operations and index build"),
+ TCase("b", tpkops, "pk operations"),
+ TCase("c", tpkopsread, "pk operations and scan reads"),
+ TCase("d", tmixedops, "pk operations and scan operations"),
+ TCase("e", tbusybuild, "pk operations and index build"),
TCase("t", ttimebuild, "time index build"),
TCase("u", ttimemaint, "time index maintenance"),
TCase("v", ttimescan, "time full scan table vs index on pk"),
@@ -3144,6 +3293,10 @@ runtest(Par par)
LL1("start");
if (par.m_seed != 0)
srandom(par.m_seed);
+ assert(par.m_csname != 0);
+ CHARSET_INFO* cs;
+ CHK((cs = get_charset_by_name(par.m_csname, MYF(0))) != 0 || (cs = get_charset_by_csname(par.m_csname, MY_CS_PRIMARY, MYF(0))) != 0);
+ par.m_cs = cs;
Con con;
CHK(con.connect() == 0);
par.m_con = &con;
@@ -3156,10 +3309,10 @@ runtest(Par par)
Thr& thr = *g_thrlist[n];
assert(thr.m_thread != 0);
}
- for (unsigned l = 0; par.m_loop == 0 || l < par.m_loop; l++) {
- LL1("loop " << l);
+ for (par.m_lno = 0; par.m_loop == 0 || par.m_lno < par.m_loop; par.m_lno++) {
+ LL1("loop " << par.m_lno);
if (par.m_seed == 0)
- srandom(l);
+ srandom(par.m_lno);
for (unsigned i = 0; i < tcasecount; i++) {
const TCase& tcase = tcaselist[i];
if (par.m_case != 0 && strchr(par.m_case, tcase.m_name[0]) == 0)
@@ -3195,6 +3348,9 @@ runtest(Par par)
NDB_COMMAND(testOIBasic, "testOIBasic", "testOIBasic", "testOIBasic", 65535)
{
+ ndb_init();
+ if (ndbout_mutex == NULL)
+ ndbout_mutex= NdbMutex_Create();
while (++argv, --argc > 0) {
const char* arg = argv[0];
if (*arg != '-') {
@@ -3207,6 +3363,15 @@ NDB_COMMAND(testOIBasic, "testOIBasic", "testOIBasic", "testOIBasic", 65535)
continue;
}
}
+ if (strcmp(arg, "-bound") == 0) {
+ if (++argv, --argc > 0) {
+ const char* p = argv[0];
+ if (strlen(p) != 0 && strlen(p) == strspn(p, "01234")) {
+ g_opt.m_bound = strdup(p);
+ continue;
+ }
+ }
+ }
if (strcmp(arg, "-case") == 0) {
if (++argv, --argc > 0) {
g_opt.m_case = strdup(argv[0]);
@@ -3217,6 +3382,18 @@ NDB_COMMAND(testOIBasic, "testOIBasic", "testOIBasic", "testOIBasic", 65535)
g_opt.m_core = true;
continue;
}
+ if (strcmp(arg, "-csname") == 0) {
+ if (++argv, --argc > 0) {
+ g_opt.m_csname = strdup(argv[0]);
+ continue;
+ }
+ }
+ if (strcmp(arg, "-die") == 0) {
+ if (++argv, --argc > 0) {
+ g_opt.m_die = atoi(argv[0]);
+ continue;
+ }
+ }
if (strcmp(arg, "-dups") == 0) {
g_opt.m_dups = true;
continue;
@@ -3257,6 +3434,16 @@ NDB_COMMAND(testOIBasic, "testOIBasic", "testOIBasic", "testOIBasic", 65535)
g_opt.m_nologging = true;
continue;
}
+ if (strcmp(arg, "-noverify") == 0) {
+ g_opt.m_noverify = true;
+ continue;
+ }
+ if (strcmp(arg, "-pctnull") == 0) {
+ if (++argv, --argc > 0) {
+ g_opt.m_pctnull = atoi(argv[0]);
+ continue;
+ }
+ }
if (strcmp(arg, "-rows") == 0) {
if (++argv, --argc > 0) {
g_opt.m_rows = atoi(argv[0]);
@@ -3269,15 +3456,15 @@ NDB_COMMAND(testOIBasic, "testOIBasic", "testOIBasic", "testOIBasic", 65535)
continue;
}
}
- if (strcmp(arg, "-scanrd") == 0) {
+ if (strcmp(arg, "-scanbat") == 0) {
if (++argv, --argc > 0) {
- g_opt.m_scanrd = atoi(argv[0]);
+ g_opt.m_scanbat = atoi(argv[0]);
continue;
}
}
- if (strcmp(arg, "-scanex") == 0) {
+ if (strcmp(arg, "-scanpar") == 0) {
if (++argv, --argc > 0) {
- g_opt.m_scanex = atoi(argv[0]);
+ g_opt.m_scanpar = atoi(argv[0]);
continue;
}
}