From: Kevin Lewis Date: July 8 2009 8:05pm Subject: bzr commit into mysql-6.0-falcon-team branch (kevin.lewis:2753) Bug#45746 List-Archive: http://lists.mysql.com/commits/78242 X-Bug: 45746 Message-Id: <0KMH00213BTI6760@mail-amer.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_3NxUWFQ9jHPZtAHrROZDbg)" --Boundary_(ID_3NxUWFQ9jHPZtAHrROZDbg) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///C:/Work/bzr/Merge/mysql-6.0-falcon-team/ based on revid:john.embretsen@stripped 2753 Kevin Lewis 2009-07-08 Bug#45746 - Gopher thread gets error 305. Transaction::thawAll was added for 44946 but it was too intrusive. It required a full thaw of all records in the transaction. This patch limits thawAll to only those records that have already been superceded by a newer change at 'complete time' when thawAll is called. Also, RecordVersion::superceded is converted to RecordVersion::base and made more reliable by updating it in RecordLeaf::store. @ storage/falcon/Record.cpp Bug#45746 - Convert 'superceded' to 'base' The value of 'base does not matter for a Record object since it is not assocviated with any transaction. @ storage/falcon/Record.h Bug#45746 - Convert 'superceded' to 'base' @ storage/falcon/RecordLeaf.cpp Bug#45746 - Set RecordVersion::base in RecordLeaf::store() so that it reliably reflects whether a record is currently the base record. @ storage/falcon/RecordVersion.cpp Bug#45746 - Convert 'superceded' to 'base'. Delete old places where superceded is set since 'base' is set in RecordLeaf::store(). @ storage/falcon/RecordVersion.h Bug#45746 - Convert 'superceded' to 'base'. @ storage/falcon/Table.cpp Bug#45746 - Convert 'superceded' to 'base'. Delete old places where superceded is set since 'base' is set in RecordLeaf::store(). @ storage/falcon/Transaction.cpp Bug#45746 - Convert 'superceded' to 'base'. Use RecordVersion::isBase() to limit the number of records thawed at complete time. modified: storage/falcon/Record.cpp storage/falcon/Record.h storage/falcon/RecordLeaf.cpp storage/falcon/RecordVersion.cpp storage/falcon/RecordVersion.h storage/falcon/Table.cpp storage/falcon/Transaction.cpp === modified file 'storage/falcon/Record.cpp' --- a/storage/falcon/Record.cpp 2009-06-23 21:16:25 +0000 +++ b/storage/falcon/Record.cpp 2009-07-08 20:05:22 +0000 @@ -514,7 +514,7 @@ Record* Record::getPriorVersion() return NULL; } -void Record::setSuperceded(bool flag) +void Record::setBase(bool flag) { } @@ -531,7 +531,7 @@ TransactionState* Record::getTransaction return NULL; } -bool Record::isSuperceded() +bool Record::isBase() { return false; } === modified file 'storage/falcon/Record.h' --- a/storage/falcon/Record.h 2009-06-23 21:16:25 +0000 +++ b/storage/falcon/Record.h 2009-07-08 20:05:22 +0000 @@ -116,7 +116,7 @@ public: virtual TransactionState* getTransactionState() const; virtual TransId getTransactionId(); virtual int getSavePointId(); - virtual void setSuperceded (bool flag); + virtual void setBase (bool flag); virtual Record* fetchVersion (Transaction * transaction); virtual void retire(void); virtual void scavenge(TransId targetTransactionId, int oldestActiveSavePointId); @@ -138,7 +138,7 @@ public: virtual bool isChilled(); virtual bool isALock(); virtual bool isDeleted(); - virtual bool isSuperceded(); + virtual bool isBase(); virtual bool isVersion(); virtual bool isNull(int fieldId); === modified file 'storage/falcon/RecordLeaf.cpp' --- a/storage/falcon/RecordLeaf.cpp 2009-04-16 12:09:15 +0000 +++ b/storage/falcon/RecordLeaf.cpp 2009-07-08 20:05:22 +0000 @@ -54,7 +54,7 @@ RecordLeaf::~RecordLeaf() for (Record *rec = records[n]; rec; rec = rec->getPriorVersion()) rec->active = false; #endif - + records[n]->setBase(false); records[n]->release(REC_HISTORY); } } @@ -94,8 +94,9 @@ bool RecordLeaf::store(Record *record, R return (*parentPtr)->store(record, prior, id, parentPtr); } - // If we're adding a new version, don't bother with a lock. Otherwise we need to lock out - // simultaneous fetches to avoid a potential race between addRef() and release(). + // If we're adding a new version, don't bother with a lock. + // Otherwise we need to lock out simultaneous fetches to avoid + // a potential race between addRef() and release(). if (record && record->getPriorVersion() == prior) { @@ -111,6 +112,17 @@ bool RecordLeaf::store(Record *record, R return false; } + // Set the base boolean for these 2 Records. + // This can be done after a successful CAS because the only thread + // interested in this boolean is the one working on the pending transaction + // of the new base record, which it this thread. + + if (prior) + prior->setBase(false); + + if (record) + record->setBase(true); + return true; } @@ -207,6 +219,7 @@ void RecordLeaf::retireRecords (Table *t { ++recordScavenge->recordsRetired; recordScavenge->spaceRetired += record->getMemUsage(); + record->setBase(false); record->retire(); } else === modified file 'storage/falcon/RecordVersion.cpp' --- a/storage/falcon/RecordVersion.cpp 2009-06-23 21:16:25 +0000 +++ b/storage/falcon/RecordVersion.cpp 2009-07-08 20:05:22 +0000 @@ -65,7 +65,7 @@ RecordVersion::RecordVersion(Table *tbl, setTransactionState(transaction->transactionState); savePointId = transaction->curSavePointId; - superceded = false; + base = false; // Add a use count on the transaction state to ensure it lives // as long as the record version object @@ -77,10 +77,7 @@ RecordVersion::RecordVersion(Table *tbl, // Be sure the priorVersion is thawed. - priorVersion->hasRecord(); - - if (transactionState == priorVersion->getTransactionState()) - oldVersion->setSuperceded (true); + priorVersion->getRecordData(); } else recordNumber = -1; @@ -94,18 +91,13 @@ RecordVersion::RecordVersion(Database* d virtualOffset = stream->getInt64(); TransId transactionId = stream->getInt(); int priorType = stream->getInt(); - superceded = false; + base = false; transactionState = NULL; if (priorType == 0) priorVersion = new Record(database, stream); else if (priorType == 1) - { priorVersion = new RecordVersion(database, stream); - - if (priorVersion->getTransactionId() == transactionId) - superceded = true; - } else priorVersion = NULL; @@ -208,7 +200,7 @@ Record* RecordVersion::fetchVersion(Tran void RecordVersion::rollback(Transaction *transaction) { - if (!superceded) + if (isBase()) format->table->rollbackRecord (this, transaction); } @@ -318,9 +310,9 @@ Record* RecordVersion::getGCPriorVersion return (state == recEndChain) ? NULL : priorVersion; } -void RecordVersion::setSuperceded(bool flag) +void RecordVersion::setBase(bool flag) { - superceded = flag; + base = flag; } /*** @@ -335,9 +327,9 @@ TransactionState* RecordVersion::getTran return transactionState; } -bool RecordVersion::isSuperceded() +bool RecordVersion::isBase() { - return superceded; + return base; } // Set the priorVersion to NULL and return its pointer. @@ -545,7 +537,7 @@ bool RecordVersion::hasRecord(void) if (hasNoData(recordData)) return false; - if (isChilled()) + if (recordData == recordIsChilled) { recordData = thaw(); ASSERT(recordData != recordIsChilled); === modified file 'storage/falcon/RecordVersion.h' --- a/storage/falcon/RecordVersion.h 2009-06-23 21:16:25 +0000 +++ b/storage/falcon/RecordVersion.h 2009-07-08 20:05:22 +0000 @@ -40,7 +40,7 @@ public: virtual TransactionState* getTransactionState() const; virtual TransId getTransactionId(); virtual int getSavePointId(); - virtual void setSuperceded (bool flag); + virtual void setBase (bool flag); virtual Record* getPriorVersion(); virtual Record* getGCPriorVersion(void); virtual void retire(void); @@ -62,7 +62,7 @@ public: virtual bool isChilled(); virtual bool isALock(); virtual bool isDeleted(); - virtual bool isSuperceded(); + virtual bool isBase(); virtual bool isVersion(); void commit(); @@ -82,7 +82,7 @@ public: RecordVersion *prevInTrans; //TransId transactionId; int savePointId; - bool superceded; + bool base; // The record tree currently points to this revord version. //private: TransactionState *transactionState; === modified file 'storage/falcon/Table.cpp' --- a/storage/falcon/Table.cpp 2009-06-25 22:48:40 +0000 +++ b/storage/falcon/Table.cpp 2009-07-08 20:05:22 +0000 @@ -1066,23 +1066,15 @@ void Table::rollbackRecord(RecordVersion Record *priorRecord = recordToRollback->getPriorVersion(); if (priorRecord) - { priorRecord->addRef(REC_HISTORY); - priorRecord->setSuperceded(false); - } // Replace the current version of this record. if (!insertIntoTree(priorRecord, recordToRollback, recordToRollback->recordNumber)) { - // If a transaction inserts a record and then deletes it, - // the deleted record version will have no priorRecord. + // Deleted record versions must always have a prior version. - if (priorRecord == NULL && recordToRollback->isDeleted()) - { - ASSERT(!(priorRecord == NULL && recordToRollback->isDeleted())); - return; // This should not be an excuse to keep going. - } + ASSERT(!(recordToRollback->isDeleted() && priorRecord == NULL)); // The store of this record into the record leaf failed. No way to recover. // While the base record is uncommitted, only that transaction can change it. @@ -1427,10 +1419,6 @@ void Table::update(Transaction * transac if (record) { - Record *prior = record->getPriorVersion(); - if (prior) - prior->setSuperceded(false); - ASSERT(!record->isALock()); record->deleteData(); @@ -3253,10 +3241,6 @@ void Table::update(Transaction * transac } else { - Record* prior = record->getPriorVersion(); - if (prior) - prior->setSuperceded(false); - char* recordData = record->exchangeData((char*) recordDataIsFreed); record->deleteData(recordData, false); @@ -3458,9 +3442,10 @@ void Table::unlockRecord(RecordVersion* if (!record->isALock()) return; - // A lock record that has superceded=true is already unlocked + // A lock record that has base=false is either already unlocked, + // or it has been superceded by an updated version. - if (record->isSuperceded()) + if (!record->isBase()) return; // Only unlock records at the current savepoint @@ -3469,9 +3454,7 @@ void Table::unlockRecord(RecordVersion* return; Record *prior = record->getPriorVersion(); - if (insertIntoTree(prior, record, record->recordNumber)) - record->setSuperceded(true); - else + if (!insertIntoTree(prior, record, record->recordNumber)) Log::debug("Table::unlockRecord: record lock not in record tree\n"); } === modified file 'storage/falcon/Transaction.cpp' --- a/storage/falcon/Transaction.cpp 2009-06-23 21:16:25 +0000 +++ b/storage/falcon/Transaction.cpp 2009-07-08 20:05:22 +0000 @@ -249,7 +249,7 @@ void Transaction::commit() RECORD_HISTORY(record); Table * table = record->format->table; - if (!record->isSuperceded() && !record->isALock()) + if (record->isBase() && !record->isALock()) { table->updateRecord (record); @@ -385,6 +385,8 @@ void Transaction::rollback() Sync syncRec(&syncRecords, "Transaction::rollback(records)"); syncRec.lock(Exclusive); + // firstRecord is the oldest, remove and add to stack. + while (firstRecord) { record = firstRecord; @@ -397,6 +399,8 @@ void Transaction::rollback() lastRecord = NULL; + // Stack is newest to oldest. + while (stack) { record = stack; @@ -1543,7 +1547,7 @@ void Transaction::backlogRecords(void) // Be sure this is the base record. Backlog all chilled records // and deleted records, but not lock records - if ( !record->isSuperceded() + if ( record->isBase() && ( record->isChilled() || record->isDeleted() )) { @@ -1596,6 +1600,10 @@ bool Transaction::committedBefore(TransI return (transactionState->commitId && transactionState->commitId < transactionId); } +// Called at 'transaction complete' time to thaw any records +// that are already updated to a newer version. At this time, +// the record can still be found in the serial log. + void Transaction::thawAll(void) { Sync syncRec(&syncRecords,"Transaction::thawAll"); @@ -1607,7 +1615,7 @@ void Transaction::thawAll(void) for (RecordVersion *record = firstRecord; record && record->nextInTrans; record = record->nextInTrans) { totalRecords++; - if (record->isChilled()) + if (record->isChilled()&& !record->isBase()) { totalThawed++; record->getRecordData(); --Boundary_(ID_3NxUWFQ9jHPZtAHrROZDbg) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/kevin.lewis@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/kevin.lewis@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kevin.lewis@stripped # target_branch: file:///C:/Work/bzr/Merge/mysql-6.0-falcon-team/ # testament_sha1: 4ce46ef110cf918dd9e14f84a6dab17df84555d8 # timestamp: 2009-07-08 15:05:32 -0500 # source_branch: file:///C:/Work/bzr/Merge/mysql-6.0-falcon-team/ # base_revision_id: john.embretsen@stripped\ # 3cyny61n8afqa90p # # Begin bundle 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 SAeVyWGA --Boundary_(ID_3NxUWFQ9jHPZtAHrROZDbg)--