//delete holder and object (take) void testRollback(void) { //save new test data int ret = put1(0, OESTORE_UNLOCKED, "txn_two"); assert(ret == 0); //start a txn OESTORE_TXN oetxn; ret = OeStore_start_txn(store, 10000, &oetxn, arena); assert(ret == 0); OeStoreHolder holder; ret = take1(oetxn.tid, &holder, "txn_two"); DataObject data = OeStoreHolder_get_data(holder); assert(!ret); assert(holder); assert(strcmp(DataObject_get_bytes( data ), "txn_nonesense") == 0); Iterator iter = DataObject_iterator(data, true); Iterator_next(iter); //0 assert(strcmp(Iterator_next( iter ), "txn_two") == 0); //make sure it isn't visible anymore OeStoreHolder holder2; ret = get1(&holder2, "txn_two"); OE_ERR(NULL, "get1: %s\n", db_strerror(ret)); assert(ret == OE_STORE_ITEM_NOTFOUND); ret = take1(0, &holder2, "txn_two"); OE_ERR(NULL, "take1: %s\n", db_strerror(ret)); assert(ret == OE_STORE_ITEM_NOTFOUND); //rollback the txn ret = OeStore_update_txn(store, oetxn.tid, 0, OESTORE_TXN_ROLLED_BACK, arena, -1); OE_ERR(NULL, "updatetxn: %s\n", db_strerror(ret)); assert(ret == 0); //make sure it IS visible again after rollback of take OeStoreHolder holder4; ret = get1(&holder4, "txn_two"); DataObject data4 = OeStoreHolder_get_data(holder4); OE_ERR(NULL, "get1: %s\n", db_strerror(ret)); assert(!ret); iter = DataObject_iterator(data4, true); Iterator_next(iter); //0 assert(strcmp(Iterator_next( iter ), "txn_two") == 0); OeStoreHolder holder3 = NULL; OeStore_start_txn(store, 10000, &oetxn, arena); ret = take1(oetxn.tid, &holder3, "txn_two"); //and clean up for next tests... DataObject data3 = OeStoreHolder_get_data(holder3); OE_ERR(NULL, "take1: %s\n", db_strerror(ret)); assert(!ret); iter = DataObject_iterator(data3, true); Iterator_next(iter); //0 assert(strcmp(Iterator_next( iter ), "txn_two") == 0); OeStore_update_txn(store, oetxn.tid, 0, OESTORE_TXN_COMMITTED, arena, 1); }
// read/modify/write void testCommitRMW(void) { //save new test data int ret = put1(0, OESTORE_UNLOCKED, "three"); assert(ret == 0); //start a txn OESTORE_TXN oetxn; ret = OeStore_start_txn(store, 10000, &oetxn, arena); assert(ret == 0); //take the new data OeStoreHolder holder; ret = take1(oetxn.tid, &holder, "three"); DataObject data = OeStoreHolder_get_data(holder); assert(!ret); Iterator iter = DataObject_iterator(data, true); assert(strcmp(Iterator_next( iter ), "key") == 0); assert(strcmp(Iterator_next( iter ), "three") == 0); assert(strcmp(DataObject_get_bytes( data ), "txn_nonesense") == 0); //make sure it isn't visible anymore OeStoreHolder holder2 = NULL; ret = get1( &holder2, "three"); assert(ret == OE_STORE_ITEM_NOTFOUND); //put the replacement item into the space ret = put1(oetxn.tid, OESTORE_WRITE_LOCK, "four"); assert(!ret); //commit the txn ret = OeStore_update_txn(store, oetxn.tid, 0, OESTORE_TXN_COMMITTED, arena, 1); //wrong enlisted count assert(ret); ret = OeStore_update_txn(store, oetxn.tid, 0, OESTORE_TXN_COMMITTED, arena, 2);//right enlisted count assert(!ret); //make sure four IS visible after commit OeStoreHolder holder3; OeStore_start_txn(store, 10000, &oetxn, arena); ret = take1(oetxn.tid, &holder3, "four"); //and clean up for next tests... DataObject data3 = OeStoreHolder_get_data(holder3); OeStore_update_txn(store, oetxn.tid, 0, OESTORE_TXN_COMMITTED, arena, -1); assert(!ret); iter = DataObject_iterator(data3, true); assert(strcmp(Iterator_next( iter ), "key") == 0); assert(strcmp(Iterator_next( iter ), "four") == 0); assert(strcmp(DataObject_get_bytes( data3 ), "txn_nonesense") == 0); //make sure three is NOT visible OeStoreHolder holder4; ret = get1(&holder4, "three"); assert(ret == OE_STORE_ITEM_NOTFOUND); }
//look up holder void testCommitTake(void) { //start a txn OESTORE_TXN oetxn; int ret = OeStore_start_txn(store, 10000, &oetxn, arena); assert(ret == 0); OeStoreHolder holder; ret = take1(oetxn.tid, &holder, "txn_one"); DataObject data = OeStoreHolder_get_data(holder); assert(!ret); assert(strcmp(DataObject_get_bytes( data ), "txn_nonesense") == 0); Iterator iter = DataObject_iterator(data, true); Iterator_next(iter);//0 assert(strcmp(Iterator_next( iter ), "txn_one") == 0); //make sure it isn't visible anymore OeStoreHolder holder2; ret = get1( &holder2, "txn_one"); assert(ret == OE_STORE_ITEM_NOTFOUND); //commit the txn ret = OeStore_update_txn(store, oetxn.tid, 0, OESTORE_TXN_COMMITTED, arena, -1); assert(ret == 0); //make sure it IS STILL not visible after commit of take OeStoreHolder holder3; ret = get1( &holder3, "txn_one"); assert(ret == OE_STORE_ITEM_NOTFOUND); }
int main(void) { //Note: x%3 == 0 exactly when x evenly divisible by 3 // and x%5 == 0 when x divisible by 5 int n; n=1000; printf("The sum through %d is...\nTake1: %d\nTake2: %d\nTake3: %d\n", n, take1(n), take2(n), take3(n)); return 0; }