Commit 5b8eb5f6 authored by Bradley C. Kuszmaul's avatar Bradley C. Kuszmaul

Fancy concurrent aborts and commits. Addresses #27.

git-svn-id: file:///svn/tokudb@2439 c7de825b-a66e-492c-adef-691d508d4ae1
parent f9efd31a
......@@ -7,10 +7,10 @@
#include <db.h>
#include "test.h"
#define N_TXNS 1
#define N_TXNS 4
void test_txn_abort(int n, int which_guys_to_abort) {
if (verbose) printf("test_txn_abort:%d\n", n);
if (verbose>1) printf("test_txn_abort(%d,%x)\n", n, which_guys_to_abort);
system("rm -rf " DIR);
mkdir(DIR, 0777);
......@@ -49,12 +49,14 @@ void test_txn_abort(int n, int which_guys_to_abort) {
for (j=N_TXNS; j>0; j--) {
if (i%j==0) { // This is guaranteed to be true when j==1, so someone will do it.
DBT key, val;
r = db->put(db, txns[j], dbt_init(&key, &i, sizeof i), dbt_init(&val, &i, sizeof i), 0);
r = db->put(db, txns[j-1], dbt_init(&key, &i, sizeof i), dbt_init(&val, &i, sizeof i), 0);
if (r != 0) printf("%s:%d:%d:%s\n", __FILE__, __LINE__, r, db_strerror(r));
assert(r == 0);
break;
goto didit;
}
}
abort();
didit: ;
}
}
{
......@@ -65,14 +67,38 @@ void test_txn_abort(int n, int which_guys_to_abort) {
} else {
r = txns[j]->commit(txns[j], 0);
}
if (r != 0) printf("%s:%d:abort:%d\n", __FILE__, __LINE__, r);
assert(r == 0);
}
}
}
#if 0
assert(r == 0);
#else
if (r != 0) printf("%s:%d:abort:%d\n", __FILE__, __LINE__, r);
#endif
{
DB_TXN *txn;
int i;
r = env->txn_begin(env, 0, &txn, 0); assert(r==0);
if (verbose>1) printf("Now see what's there: which_guys_to_abort=%x: ", which_guys_to_abort);
for (i=0; i<n; i++) {
DBT key,val;
memset(&val, 0, sizeof val);
r = db->get(db, txn, dbt_init(&key, &i, sizeof i), &val, 0);
if (r==0) { if (verbose>1) printf(" %d", i); }
}
if (verbose>1) printf("\n");
for (i=0; i<n; i++) {
DBT key,val;
memset(&val, 0, sizeof val);
r = db->get(db, txn, dbt_init(&key, &i, sizeof i), &val, 0);
int j;
for (j=N_TXNS; j>0; j--) {
if (i%j==0) {
if (which_guys_to_abort&(1<<(j-1))) assert(r==DB_NOTFOUND);
else assert(r==0);
break;
}
}
}
r = txn->commit(txn, 0); assert(r==0);
}
r = db->close(db, 0); assert(r == 0);
r = env->close(env, 0); assert(r == 0);
......@@ -87,8 +113,11 @@ int main(int argc, char *argv[]) {
continue;
}
}
if (verbose>0) printf("%s:", __FILE__);
if (verbose==1) printf("\n");
for (j=0; j<(1<<N_TXNS); j++)
for (i=1; i<100; i*=2)
test_txn_abort(i, j);
if (verbose>0) printf("OK\n");
return 0;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment