int test() { int i; int writeVal, readVal; /** These need to be reset manually. */ int xid = 2; recordid rec = { 0,0,sizeof(int) }; InitiateRecovery(); printf("\nRunning prepare testing commit.\n"); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tcommit(xid); xid = Tbegin(); printf("xid = %d\n", xid); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tabort(xid); exit(-1); }
} END_TEST START_TEST(regions_lockSmokeTest) { Tinit(); int xid = Tbegin(); pageid_t pageid = TregionAlloc(xid, 100,0); fsckRegions(xid); Tcommit(xid); xid = Tbegin(); int xid2 = Tbegin(); TregionDealloc(xid, pageid); for(int i = 0; i < 50; i++) { TregionAlloc(xid2, 1, 0); } fsckRegions(xid); Tabort(xid); fsckRegions(xid2); Tcommit(xid2); Tdeinit(); } END_TEST
int test() { unsigned int i, xid; const unsigned int INSERT_NUM = 10000; /* should be > JB_HASHTABLE_SIZE */ char value[22]; /* should be log(INSERT_NUM)+8 */ jbHashTable_t *ht; xid = Tbegin(); ht = jbHtCreate(xid, 1000); for( i = 0; i < INSERT_NUM; i++ ) { sprintf(value, "value: %u\n", i); jbHtInsert(xid, ht, &i, sizeof(int), value, sizeof(char)*strlen(value)); } Tcommit(xid); xid = Tbegin(); for( i = 0; i < INSERT_NUM; i++ ) { jbHtLookup(xid, ht, &i, sizeof(int), value); printf("%s", value); } jbHtDelete(xid, ht); Tabort(xid); return 0; }
int test(void) { struct timeval start, end, total; recordid rids[TESTS]; long commited[TESTS]; long aborted[TESTS]; long temp; int i, j, xid = Tbegin(); for( i = 0; i < TESTS; i++ ) { rids[i] = Talloc(xid, sizeof(long)); commited[i] = random(); aborted[i] = random(); Tset(xid, rids[i], &commited[i]); } gettimeofday(&start, NULL); Tcommit(xid); gettimeofday(&end, NULL); timersub(&end, &start, &total); printf("commit %u: %ld.%ld\n", TESTS, total.tv_sec, total.tv_usec); for( j = 0; j < 10; j++ ) { xid = Tbegin(); for( i = 0; i < TESTS*j; i++ ) { Tset(xid, rids[random() % TESTS], &aborted[i%TESTS]); } gettimeofday(&start, NULL); Tabort(xid); gettimeofday(&end, NULL); timersub(&end, &start, &total); printf("abort %u: %ld.%ld\n", TESTS*j, total.tv_sec, total.tv_usec); xid = Tbegin(); for( i = 0; i < TESTS; i++ ) { Tread( xid, rids[i], &temp ); if( temp != commited[i] ) return -1; } Tabort(xid); } return 0; }
} END_TEST START_TEST(regions_recoveryTest) { Tinit(); pageid_t pages[50]; int xid1 = Tbegin(); int xid2 = Tbegin(); for(int i = 0; i < 50; i+=2) { pages[i] = TregionAlloc(xid1, stasis_util_random64(4)+1, 0); pages[i+1] = TregionAlloc(xid2, stasis_util_random64(2)+1, 0); } fsckRegions(xid1); Tcommit(xid1); Tdeinit(); if(TdurabilityLevel() == VOLATILE) { return; } Tinit(); int xid = Tbegin(); fsckRegions(xid); for(int i = 0; i < 50; i+=2) { TregionDealloc(xid, pages[i]); } fsckRegions(xid); Tabort(xid); fsckRegions(Tbegin()); Tdeinit(); Tinit(); fsckRegions(Tbegin()); Tdeinit(); } END_TEST
} END_TEST START_TEST(pagedListCheck) { Tinit(); int xid = Tbegin(); recordid list = TpagedListAlloc(xid); int a; recordid b; int i; printf("\n"); for(i = 0; i < NUM_ENTRIES; i++) { if(!(i % (NUM_ENTRIES/10))) { printf("."); fflush(stdout); } a = i; b.page = i+1; b.slot = i+2; b.size = i+3; int ret; { byte * t; ret = TpagedListFind(xid, list, (byte*)&a, sizeof(int), &t); assert(-1 == ret); } ret = TpagedListInsert(xid, list, (byte*)&a, sizeof(int), (byte*)&b, sizeof(recordid)); assert(!ret); recordid * bb; recordid ** bbb = &bb; ret = TpagedListFind(xid, list, (byte*)&a, sizeof(int), (byte**)bbb); assert(ret == sizeof(recordid)); assert(!memcmp(bb, &b, sizeof(recordid))); } Tcommit(xid); printf("\n"); xid = Tbegin(); for(i = 0; i < NUM_ENTRIES; i++ ) { if(!(i % (NUM_ENTRIES/10))) { printf("."); fflush(stdout); } a = i; b.page = i+1; b.slot = i+2; b.size = i+3; recordid * bb; recordid ** bbb = &bb; int ret = TpagedListFind(xid, list, (byte*)&a, sizeof(int), (byte**)bbb); assert(ret == sizeof(recordid)); assert(!memcmp(bb, &b, sizeof(recordid))); if(!(i % 10)) { ret = TpagedListRemove(xid, list, (byte*)&a, sizeof(int)); assert(ret); free(bb); bb = 0; ret = TpagedListFind(xid, list, (byte*)&a, sizeof(int), (byte**)bbb); assert(-1==ret); assert(!bb); } } Tabort(xid); xid = Tbegin(); printf("\n"); for(i = 0; i < NUM_ENTRIES; i++) { if(!(i % (NUM_ENTRIES/10))) { printf("."); fflush(stdout); } a = i; b.page = i+1; b.slot = i+2; b.size = i+3; recordid * bb; recordid ** bbb = &bb; int ret = TpagedListFind(xid, list, (byte*)&a, sizeof(int), (byte**)bbb); assert(ret == sizeof(recordid)); assert(!memcmp(bb, &b, sizeof(recordid))); } byte * seen = stasis_calloc(NUM_ENTRIES, byte); lladd_pagedList_iterator * it = TpagedListIterator(xid, list); int keySize; int valueSize; int * key = 0; int ** bkey = &key; recordid * value = 0; recordid ** bvalue = &value; while(TpagedListNext(xid, it, (byte**)bkey, &keySize, (byte**)bvalue, &valueSize)) { assert(!seen[*key]); seen[*key] = 1; assert(value->page == *key+1); assert(value->slot == *key+2); assert(value->size == *key+3); free(key); free(value); key = 0; value = 0; } for(i = 0; i < NUM_ENTRIES; i++) { assert(seen[i] == 1); } Tcommit(xid); Tdeinit(); } END_TEST
JNIEXPORT void JNICALL Java_stasis_jni_Stasis_abort (JNIEnv *e, jclass c, jlong xid) { Tabort((int)xid); }
} END_TEST START_TEST(regions_lockRandomizedTest) { Tinit(); const int NUM_XACTS = 100; const int NUM_OPS = 10000; const int FUDGE = 10; int xids[NUM_XACTS]; pageid_t * xidRegions[NUM_XACTS + FUDGE]; int xidRegionCounts[NUM_XACTS + FUDGE]; int longXid = Tbegin(); time_t seed = time(0); printf("\nSeed = %ld\n", seed); srandom(seed); for(int i = 0; i < NUM_XACTS; i++) { xids[i] = Tbegin(); assert(xids[i] < NUM_XACTS + FUDGE); xidRegions[xids[i]] = stasis_malloc(NUM_OPS, pageid_t); xidRegionCounts[xids[i]] = 0; } int activeXacts = NUM_XACTS; for(int i = 0; i < NUM_OPS; i++) { pageid_t j; if(!(i % (NUM_OPS/NUM_XACTS))) { // abort or commit one transaction randomly. activeXacts --; j = stasis_util_random64(activeXacts); if(stasis_util_random64(2)) { Tcommit(xids[j]); } else { Tabort(xids[j]); } if(activeXacts == 0) { break; } for(; j < activeXacts; j++) { xids[j] = xids[j+1]; } fsckRegions(longXid); } j = stasis_util_random64(activeXacts); if(stasis_util_random64(2)) { // alloc xidRegions[xids[j]][xidRegionCounts[xids[j]]] = TregionAlloc(xids[j], stasis_util_random64(100), 0); xidRegionCounts[xids[j]]++; } else { // free if(xidRegionCounts[xids[j]]) { pageid_t k = stasis_util_random64(xidRegionCounts[xids[j]]); TregionDealloc(xids[j], xidRegions[xids[j]][k]); xidRegionCounts[xids[j]]--; for(; k < xidRegionCounts[xids[j]]; k++) { xidRegions[xids[j]][k] = xidRegions[xids[j]][k+1]; } } } } for(int i = 0; i < activeXacts; i++) { Tabort(i); fsckRegions(longXid); } Tcommit(longXid); Tdeinit(); } END_TEST
int test() { int i; int xid, writeVal, readVal; recordid rec; printf("\nRunning test1\n"); writeVal = 10; xid = Tbegin(); rec = Talloc(xid, sizeof(int)); Tset(xid, rec, &writeVal); Tread(xid, rec, &readVal); printf("value set is %d, value read is %d\n", writeVal, readVal); Tcommit(xid); xid = Tbegin(); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tincrement(xid, rec); printf("calling Tincrement\n"); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tincrement(xid, rec); printf("calling Tincrement\n"); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tabort(xid); printf("aborting\n"); xid = Tbegin(); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tincrement(xid, rec); printf("calling Tincrement\n"); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tdecrement(xid, rec); printf("calling Tdecrement\n"); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tdecrement(xid, rec); printf("calling Tdecrement\n"); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tdecrement(xid, rec); printf("calling Tdecrement\n"); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); for (i = 0; i < 10; i++) { Tdecrement(xid, rec); printf("calling Tdecrement\n"); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); } Tcommit(xid); printf("committing\n"); xid = Tbegin(); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tdecrement(xid, rec); printf("calling Tdecrement\n"); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tincrement(xid, rec); printf("calling Tincrement\n"); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); Tdecrement(xid, rec); printf("calling Tdecrement\n"); Tread(xid, rec, &readVal); printf("value read is %d\n", readVal); printf("\n"); return 0; }
int test(int argc, char **argv) { int xids[NUM_TRIALS]; int initVals[NUM_TRIALS]; int writeVals[NUM_TRIALS]; int readVals[NUM_TRIALS]; int commits[NUM_TRIALS]; int i; recordid recs[NUM_TRIALS]; int failed = 0; printf("\nRunning %s\n", __FILE__); for (i = 0; i < NUM_TRIALS; i++) { xids[i] = Tbegin(); initVals[i] = rand(); recs[i] = Talloc(xids[i], sizeof(int)); Tset(xids[i], recs[i], &initVals[i]); Tcommit(xids[i]); } for (i = 0; i < NUM_TRIALS; i++) { xids[i] = Tbegin(); commits[i] = 0; writeVals[i] = rand(); } for (i = 0; i < NUM_TRIALS; i++) { Tset(xids[i], recs[i], &writeVals[i]); } for (i = 0; i < NUM_TRIALS; i++) { if (rand() % 2) { Tcommit(xids[i]); commits[i] = 1; } else { Tabort(xids[i]); } } for (i = 0; i < NUM_TRIALS; i++) { Tread(xids[i], recs[i], &readVals[i]); } for (i = 0; i < NUM_TRIALS; i++) { if (VERBOSE) { if (commits[i]) printf("xid %d commited value %d, and read %d\n", xids[i], writeVals[i], readVals[i]); else printf("xid %d aborted while setting value %d, and read %d and should've read %d\n", xids[i], writeVals[i], readVals[i], initVals[i]); } if (commits[i]) { if (writeVals[i] != readVals[i]) failed = 1; } else { if (initVals[i] != readVals[i]) failed = 1; } } printf("%s\n\n", failed ? "****FAILED****" : "PASSED"); return failed; }
int test() { int xid; char *handle_in = "jkit"; char *name_in = "Jimmy Kittiyachavalit"; int phone_in = 8821417; char *handle_out = (char *)malloc(strlen(handle_in)+1); char *name_out = (char *)malloc(strlen(name_in)+1); int phone_out; recordid r_name, r_handle, r_phone; xid = Tbegin(); r_handle = Talloc(xid, strlen(handle_in)+1); r_name = Talloc(xid, strlen(name_in)+1); r_phone = Talloc(xid, sizeof(int)); Tset(xid, r_handle, handle_in); printf("set handle to [%s]\n", handle_in); Tset(xid, r_name, name_in); printf("set name to [%s]\n", name_in); Tset(xid, r_phone, &phone_in); printf("set name to [%d]\n", phone_in); Tread(xid, r_handle, handle_out); printf("read handle is [%s]\n", handle_out); Tread(xid, r_name, name_out); printf("read name is [%s]\n", name_out); Tread(xid, r_phone, &phone_out); printf("read name is [%d]\n", phone_out); Tcommit(xid); xid = Tbegin(); handle_in = "tikj"; name_in = "tilavahcayittik ymmij"; phone_in = 3142116; handle_out = (char *)malloc(strlen(handle_in)+1); name_out = (char *)malloc(strlen(name_in)+1); phone_out = 0; Tset(xid, r_handle, handle_in); printf("set handle to [%s]\n", handle_in); Tset(xid, r_name, name_in); printf("set name to [%s]\n", name_in); Tset(xid, r_phone, &phone_in); printf("set name to [%d]\n", phone_in); Tread(xid, r_handle, handle_out); printf("read handle is [%s]\n", handle_out); Tread(xid, r_name, name_out); printf("read name is [%s]\n", name_out); Tread(xid, r_phone, &phone_out); printf("read name is [%d]\n", phone_out); printf("aborted the transaction\n"); Tabort(xid); xid = Tbegin(); handle_out = (char *)malloc(strlen(handle_in)+1); name_out = (char *)malloc(strlen(name_in)+1); phone_out = 0; Tread(xid, r_handle, handle_out); printf("read handle is [%s]\n", handle_out); Tread(xid, r_name, name_out); printf("read name is [%s]\n", name_out); Tread(xid, r_phone, &phone_out); printf("read name is [%d]\n", phone_out); Tcommit(xid); return 0; }