From 4c8466555c420d4865266d07021430bddafc1ce2 Mon Sep 17 00:00:00 2001 From: Sears Russell Date: Wed, 28 Mar 2007 09:21:07 +0000 Subject: [PATCH] Cleaned up Tupdate() by adding TupdateRaw(); removed *_RAW and updated linear hash accordingly. --- lladd/constants.h | 4 +- lladd/transactional.h | 8 +++- src/lladd/operations/arrayList.c | 46 ++----------------- src/lladd/operations/instantSet.c | 12 ----- src/lladd/operations/linearHash.c | 4 +- src/lladd/operations/set.c | 9 ---- src/lladd/page.c | 3 ++ src/lladd/transactional2.c | 75 +++++++++++-------------------- 8 files changed, 43 insertions(+), 118 deletions(-) diff --git a/lladd/constants.h b/lladd/constants.h index 8182dbe..1be6142 100644 --- a/lladd/constants.h +++ b/lladd/constants.h @@ -144,8 +144,8 @@ terms specified in this license. #define OPERATION_LINEAR_HASH_INSERT 31 #define OPERATION_LINEAR_HASH_REMOVE 32 -#define OPERATION_SET_RAW 33 -#define OPERATION_INSTANT_SET_RAW 34 +//#define OPERATION_SET_RAW 33 +//#define OPERATION_INSTANT_SET_RAW 34 #define OPERATION_ALLOC_BOUNDARY_TAG 35 diff --git a/lladd/transactional.h b/lladd/transactional.h index f97a04b..b843745 100644 --- a/lladd/transactional.h +++ b/lladd/transactional.h @@ -368,8 +368,12 @@ int Tbegin(); * * @see operations.h set.h */ -compensated_function void Tupdate(int xid, recordid rid, const void *dat, int op); - +compensated_function void Tupdate(int xid, recordid rid, + const void *dat, int op); +compensated_function void TupdateRaw(int xid, recordid rid, + const void *dat, int op); +compensated_function void TupdateDeferred(int xid, recordid rid, + const void *dat, int op); /** * @param xid transaction ID * @param rid reference to page/slot diff --git a/src/lladd/operations/arrayList.c b/src/lladd/operations/arrayList.c index 3f29494..335671f 100644 --- a/src/lladd/operations/arrayList.c +++ b/src/lladd/operations/arrayList.c @@ -166,30 +166,25 @@ static compensated_function int TarrayListExtendInternal(int xid, recordid rid, DEBUG("block %d\n", i); /* We used to call OPERATION_INITIALIZE_FIXED_PAGE on each page in current indirection block. */ tmp.slot = i + FIRST_DATA_PAGE_OFFSET; - // alTupdate(xid, tmp, &newFirstPage, op); - /** - @XXX the calls to Tupdate in arrayList.c are bypassing operation implementations. - */ - Tupdate(xid, tmp, &newFirstPage, op); + TupdateRaw(xid, tmp, &newFirstPage, op); DEBUG("Tset: {%d, %d, %d} = %d\n", tmp.page, tmp.slot, tmp.size, newFirstPage); } tmp.slot = MAX_OFFSET_POSITION; int newMaxOffset = tlp.maxOffset+slots; - // alTupdate(xid, tmp, &newMaxOffset, op); - Tupdate(xid, tmp, &newMaxOffset, op); + TupdateRaw(xid, tmp, &newMaxOffset, op); } end_ret(compensation_error()); return 0; } compensated_function int TarrayListInstantExtend(int xid, recordid rid, int slots) { - return TarrayListExtendInternal(xid, rid, slots, OPERATION_INSTANT_SET_RAW); + return TarrayListExtendInternal(xid, rid, slots, OPERATION_INSTANT_SET); } compensated_function int TarrayListExtend(int xid, recordid rid, int slots) { - return TarrayListExtendInternal(xid, rid, slots, OPERATION_SET_RAW); + return TarrayListExtendInternal(xid, rid, slots, OPERATION_SET); } compensated_function int TarrayListLength(int xid, recordid rid) { Page * p = loadPage(xid, rid.page); @@ -198,39 +193,6 @@ compensated_function int TarrayListLength(int xid, recordid rid) { return tlp.maxOffset+1; } -/*static int operateInitFixed(int xid, Page * p, lsn_t lsn, recordid rid, const void * dat) { - - fixedPageInitialize(p, rid.size, recordsPerPage(rid.size)); - pageWriteLSN(xid, p, lsn); - return 0; -} - -static int operateUnInitPage(int xid, Page * p, lsn_t lsn, recordid rid, const void * dat) { - *page_type_ptr(p) = UNINITIALIZED_PAGE; - pageWriteLSN(xid, p, lsn); - return 0; -} - -Operation getInitFixed() { - Operation o = { - OPERATION_INITIALIZE_FIXED_PAGE, - 0, // The necessary parameters are hidden in the rid - //OPERATION_UNINITIALIZE_PAGE, - OPERATION_NOOP, - &operateInitFixed - }; - return o; -} -Operation getUnInitPage() { - Operation o = { - OPERATION_UNINITIALIZE_PAGE, - PAGE_SIZE, - NO_INVERSE_WHOLE_PAGE, //OPERATION_NOOP, - &operateUnInitPage - }; - return o; -}*/ - /*----------------------------------------------------------------------------*/ /** @todo locking for arrayLists */ diff --git a/src/lladd/operations/instantSet.c b/src/lladd/operations/instantSet.c index f30ffcd..1220091 100644 --- a/src/lladd/operations/instantSet.c +++ b/src/lladd/operations/instantSet.c @@ -51,7 +51,6 @@ terms specified in this license. static int operate(int xid, Page *p, lsn_t lsn, recordid rid, const void *dat) { writeRecord(xid, p, lsn, rid, dat); - //writeRecordUnlocked(xid, p, lsn, rid, dat); return 0; } @@ -64,14 +63,3 @@ Operation getInstantSet() { }; return o; } -Operation getInstantSetRaw() { - Operation o = { - OPERATION_INSTANT_SET_RAW, /* id */ - SIZEOF_RECORD, /* use the size of the record as size of arg */ - OPERATION_NOOP, - &operate /* Function */ - }; - return o; -} - - diff --git a/src/lladd/operations/linearHash.c b/src/lladd/operations/linearHash.c index 6155679..aadc31c 100644 --- a/src/lladd/operations/linearHash.c +++ b/src/lladd/operations/linearHash.c @@ -130,7 +130,7 @@ void TlogicalHashInsert(int xid, recordid hashRid, void * key, int keySize, void hashRid.slot = valSize; hashRid.size = keySize; - Tupdate(xid, hashRid, key, OPERATION_LINEAR_INSERT); + TupdateRaw(xid, hashRid, key, OPERATION_LINEAR_INSERT); /* Perform redo-only insert. */ hashRid.size = sizeof(hashEntry) + keySize + valSize; @@ -157,7 +157,7 @@ int TlogicalHashDelete(int xid, recordid hashRid, void * key, int keySize, void hashRid.size = sizeof(undoDeleteArg) + keySize + valSize; - Tupdate(xid, hashRid, arg, OPERATION_LINEAR_DELETE); + TupdateRaw(xid, hashRid, arg, OPERATION_LINEAR_DELETE); hashRid.size = sizeof(hashEntry) + keySize + valSize; free(arg); /* hashRid.size = sizeof(recordid); */ diff --git a/src/lladd/operations/set.c b/src/lladd/operations/set.c index 09e1148..c2d6924 100644 --- a/src/lladd/operations/set.c +++ b/src/lladd/operations/set.c @@ -140,15 +140,6 @@ Operation getSet() { }; return o; } -Operation getSetRaw() { - Operation o = { - OPERATION_SET_RAW, /* id */ - SIZEOF_RECORD, /* use the size of the record as size of arg */ - NO_INVERSE, - &operate /* Function */ - }; - return o; -} Operation getSetRange() { Operation o = { diff --git a/src/lladd/page.c b/src/lladd/page.c index 90e6210..057df37 100644 --- a/src/lladd/page.c +++ b/src/lladd/page.c @@ -128,6 +128,9 @@ void pageDeinit() { slottedPageDeInit(); } +/** + @todo this updates the LSN of the page that points to blob, even if the page is otherwise untouched!! +*/ void writeRecord(int xid, Page * p, lsn_t lsn, recordid rid, const void *dat) { assert( (p->id == rid.page) && (p->memAddr != NULL) ); diff --git a/src/lladd/transactional2.c b/src/lladd/transactional2.c index 5bbf0bb..e9cd4d9 100644 --- a/src/lladd/transactional2.c +++ b/src/lladd/transactional2.c @@ -43,6 +43,7 @@ pthread_mutex_t transactional_2_mutex; void setupOperationsTable() { memset(XactionTable, INVALID_XTABLE_XID, sizeof(TransactionLog)*MAX_TRANSACTIONS); + // @todo clean out unused constants... operationsTable[OPERATION_SET] = getSet(); operationsTable[OPERATION_INCREMENT] = getIncrement(); operationsTable[OPERATION_DECREMENT] = getDecrement(); @@ -85,8 +86,8 @@ void setupOperationsTable() { operationsTable[OPERATION_LINEAR_HASH_INSERT] = getLinearHashInsert(); operationsTable[OPERATION_LINEAR_HASH_REMOVE] = getLinearHashRemove(); - operationsTable[OPERATION_SET_RAW] = getSetRaw(); - operationsTable[OPERATION_INSTANT_SET_RAW] = getInstantSetRaw(); + //operationsTable[OPERATION_SET_RAW] = getSetRaw(); + //operationsTable[OPERATION_INSTANT_SET_RAW] = getInstantSetRaw(); operationsTable[OPERATION_ALLOC_BOUNDARY_TAG] = getAllocBoundaryTag(); @@ -95,15 +96,6 @@ void setupOperationsTable() { operationsTable[OPERATION_ALLOC_REGION] = getAllocRegion(); operationsTable[OPERATION_DEALLOC_REGION] = getDeallocRegion(); - /* - int i; - - for(i = 0; i <= OPERATION_LINEAR_HASH_REMOVE; i++) { - if(operationsTable[i].id != i) { - printf("mismatch %d -> %d\n", i, operationsTable[i].id); - } - } - */ } // @todo this factory stuff doesn't really belong here... @@ -228,43 +220,28 @@ static compensated_function void TupdateHelper(int xid, recordid rid, const void FreeLogEntry(e); } -compensated_function void Tupdate(int xid, recordid rid, const void *dat, int op) { - Page * p; +compensated_function void TupdateRaw(int xid, recordid rid, + const void * dat, int op) { assert(xid >= 0); -#ifdef DEBUGGING - pthread_mutex_lock(&transactional_2_mutex); - assert(numActiveXactions <= MAX_TRANSACTIONS); - pthread_mutex_unlock(&transactional_2_mutex); -#endif - try { - p = loadPage(xid, rid.page); - } end; - if(op != OPERATION_SET_RAW && op != OPERATION_INSTANT_SET_RAW) { - if(*page_type_ptr(p) == INDIRECT_PAGE) { - releasePage(p); - try { - rid = dereferenceRID(xid, rid); - p = loadPage(xid, rid.page); - } end; - // @todo Kludge! Shouldn't special case operations in transactional2. - } else if(*page_type_ptr(p) == ARRAY_LIST_PAGE && - op != OPERATION_LINEAR_INSERT && - op != OPERATION_UNDO_LINEAR_INSERT && - op != OPERATION_LINEAR_DELETE && - op != OPERATION_UNDO_LINEAR_DELETE ) { - rid = dereferenceArrayListRid(p, rid.slot); - releasePage(p); - try { - p = loadPage(xid, rid.page); - } end; - } + Page * p = loadPage(xid, rid.page); + TupdateHelper(xid, rid, dat, op, p); + releasePage(p); +} + +compensated_function void Tupdate(int xid, recordid rid, + const void *dat, int op) { + Page * p = loadPage(xid, rid.page); + if(*page_type_ptr(p) == INDIRECT_PAGE) { + rid = dereferenceRID(xid, rid); + } else if(*page_type_ptr(p) == ARRAY_LIST_PAGE) { + rid = dereferenceArrayListRid(p, rid.slot); } - - /** @todo For logical undo logs, grabbing a lock makes no sense! */ - begin_action(releasePage, p) { - TupdateHelper(xid, rid, dat, op, p); - } compensate; - + if(p->id != rid.page) { + releasePage(p); + p = loadPage(xid, rid.page); + } + TupdateHelper(xid, rid, dat, op, p); + releasePage(p); } void TreadUnlocked(int xid, recordid rid, void * dat) { @@ -327,10 +304,10 @@ int Tabort(int xid) { TransactionLog * t =&XactionTable[xid%MAX_TRANSACTIONS]; - lsn = LogTransAbort(t /*&XactionTable[xid%MAX_TRANSACTIONS]*/); + lsn = LogTransAbort(t); /** @todo is the order of the next two calls important? */ - undoTrans(*t/*XactionTable[xid%MAX_TRANSACTIONS]*/); + undoTrans(*t); if(globalLockManager.abort) { globalLockManager.abort(xid); } allocTransactionAbort(xid); @@ -395,7 +372,7 @@ void TsetXIDCount(int xid) { } lsn_t transactions_minRecLSN() { - lsn_t minRecLSN = LSN_T_MAX; // LogFlushedLSN() + lsn_t minRecLSN = LSN_T_MAX; pthread_mutex_lock(&transactional_2_mutex); for(int i = 0; i < MAX_TRANSACTIONS; i++) { if(XactionTable[i].xid != INVALID_XTABLE_XID) {