2881 Christopher Powers 2008-10-24
Bug#36631,"Assertion in SerialLogControl::nextRecord"
Bug#38541,"Falcon RecordVersion::thaw assertion """"bytesRestored > 0 || data.record == NULL"""
Bug#38567,"Falcon crash in Record::getEncodedRecord at Record.cpp:743"
Bug#38569,"Falcon assertion in SRLUpdateIndex::thaw : type == srlUpdateIndex"
Bug#39694,"Crash in StorageTable::setRecord during falcon_chill_thaw test"
Bug#39695,"Crash in SRLUpdateRecords::thaw during falcon_chill_thaw test"
Bug#39696,"Assertion in Table.cpp (dup->state == recDeleted) fails during falcon_chill_thaw"
Fix 2 of 3 for chill/thaw bugs.
Synchronized record thaw operations using a pool of sync objects in the associated table.
Record chill operations do not need to be synchronized because chills are performed in one place, and only by the active Transaction.
modified:
storage/falcon/Record.cpp
storage/falcon/Record.h
storage/falcon/RecordVersion.cpp
storage/falcon/Table.cpp
storage/falcon/Table.h
2880 Christopher Powers 2008-10-24
Bug#36631,"Assertion in SerialLogControl::nextRecord"
Bug#38541,"Falcon RecordVersion::thaw assertion """"bytesRestored > 0 || data.record == NULL"""
Bug#38567,"Falcon crash in Record::getEncodedRecord at Record.cpp:743"
Bug#38569,"Falcon assertion in SRLUpdateIndex::thaw : type == srlUpdateIndex"
Bug#39694,"Crash in StorageTable::setRecord during falcon_chill_thaw test"
Bug#39695,"Crash in SRLUpdateRecords::thaw during falcon_chill_thaw test"
Bug#39696,"Assertion in Table.cpp (dup->state == recDeleted) fails during falcon_chill_thaw"
Fix 1 of 3 for chill/thaw bugs.
Modified Record::hasRecord() to thaw if necessary, removed redundant record thaws, added exception handling
modified:
storage/falcon/Record.cpp
storage/falcon/Record.h
storage/falcon/RecordScavenge.cpp
storage/falcon/RecordVersion.cpp
storage/falcon/RecordVersion.h
storage/falcon/SRLUpdateRecords.cpp
storage/falcon/Table.cpp
storage/falcon/Transaction.cpp
2879 Christopher Powers 2008-10-23 [merge]
(no message)
modified:
storage/falcon/Bitmap.cpp
storage/falcon/Cache.cpp
storage/falcon/Database.cpp
storage/falcon/StorageConnection.cpp
storage/falcon/StorageConnection.h
storage/falcon/ha_falcon.cpp
2878 Christopher Powers 2008-10-22
Bug#40265, "Falcon: Concurrent online DROP INDEX of the same key causes MySQL assertion"
Use StorageInterface::alter_table_phase2() to drop index rather than phase1()
Removed check for primary key in StorageInterface::addIndex() and dropIndex().
modified:
storage/falcon/ha_falcon.cpp
=== modified file 'storage/falcon/Bitmap.cpp'
--- a/storage/falcon/Bitmap.cpp 2008-10-18 03:46:34 +0000
+++ b/storage/falcon/Bitmap.cpp 2008-10-23 20:10:01 +0000
@@ -722,7 +722,7 @@ void Bitmap::unitTest(void)
tester->set(bitNumber);
}
- for (int bitNumber = 0; (bitNumber = tester->nextSet(0)) >= 0;)
+ for (bitNumber = 0; (bitNumber = tester->nextSet(0)) >= 0;)
{
if (!tester->isSet(bitNumber))
Log::log("** Error - %d should be set\n", bitNumber);
@@ -750,7 +750,7 @@ void Bitmap::unitTest(void)
tester->set(bitNumber);
}
- for (int bitNumber = 0; (bitNumber = tester->nextSet(bitNumber)) >= 0;)
+ for (bitNumber = 0; (bitNumber = tester->nextSet(bitNumber)) >= 0;)
{
Log::log("Clearing bit %d\n", bitNumber);
tester->clear(bitNumber);
@@ -773,13 +773,13 @@ void Bitmap::unitTest(void)
tester->set(bitNumber);
}
- for (int bitNumber = 0; (bitNumber = tester->nextSet( pseudoRand(bitNumber, 1800000))) >= 0;)
+ for (bitNumber = 0; (bitNumber = tester->nextSet( pseudoRand(bitNumber, 1800000))) >= 0;)
{
Log::log("Clearing bit %d\n", bitNumber);
tester->clear(bitNumber);
}
- for (int bitNumber = 0; (bitNumber = tester->nextSet(0)) >= 0;)
+ for (bitNumber = 0; (bitNumber = tester->nextSet(0)) >= 0;)
{
Log::log("Clearing bit %d\n", bitNumber);
tester->clear(bitNumber);
=== modified file 'storage/falcon/Cache.cpp'
--- a/storage/falcon/Cache.cpp 2008-10-02 23:06:04 +0000
+++ b/storage/falcon/Cache.cpp 2008-10-23 07:58:38 +0000
@@ -934,7 +934,15 @@ void Cache::ioThread(void)
Log::log(LogInfo, "%d: Cache flush: %d pages, %d writes in %d seconds (%d pps)\n",
database->deltaTime, pages, writes, delta, pages / MAX(delta, 1));
- database->pageCacheFlushed(flushArg);
+ try
+ {
+ database->pageCacheFlushed(flushArg);
+ }
+ catch (...)
+ {
+ // Ignores any errors from writing the checkpoint
+ // log record (ie. if we have issues with the serial log)
+ }
}
else
flushLock.unlock();
=== modified file 'storage/falcon/Database.cpp'
--- a/storage/falcon/Database.cpp 2008-10-16 02:40:08 +0000
+++ b/storage/falcon/Database.cpp 2008-10-23 07:58:38 +0000
@@ -2434,7 +2434,16 @@ void Database::updateCardinalities(void)
syncTbl.unlock();
syncDDL.unlock();
- commitSystemTransaction();
+ try
+ {
+ commitSystemTransaction();
+ }
+ catch (...)
+ {
+ // Ignores any errors from committing the updates of the cardinalities
+ // Situations where this might happen can be due to problems with
+ // writing to the serial log
+ }
}
void Database::sync()
=== modified file 'storage/falcon/Record.cpp'
--- a/storage/falcon/Record.cpp 2008-05-09 19:58:50 +0000
+++ b/storage/falcon/Record.cpp 2008-10-24 05:35:38 +0000
@@ -586,22 +586,27 @@ int Record::getSavePointId()
return 0;
}
-void Record::getRecord(Stream *stream)
+bool Record::getRecord(Stream *stream)
{
- switch (encoding)
+ if (data.record != NULL)
{
- case traditional:
- stream->compress (format->length, data.record);
- break;
+ switch (encoding)
+ {
+ case traditional:
+ stream->compress (format->length, data.record);
+ break;
- case shortVector:
- stream->putSegment(getEncodedSize(),
- data.record + ((USHORT*) data.record)[0] - sizeof(short), false);
- break;
+ case shortVector:
+ stream->putSegment(getEncodedSize(),
+ data.record + ((USHORT*) data.record)[0] - sizeof(short), false);
+ break;
- default:
- NOT_YET_IMPLEMENTED;
+ default:
+ NOT_YET_IMPLEMENTED;
+ }
}
+
+ return (data.record != NULL);
}
int Record::getEncodedSize()
@@ -626,11 +631,8 @@ int Record::getEncodedSize()
void Record::getEncodedValue(int fieldId, Value *value)
{
- // If chilled, restore the record data from the serial log
-
- if (state == recChilled)
- thaw();
-
+ try
+ {
switch (encoding)
{
case shortVector:
@@ -663,6 +665,11 @@ void Record::getEncodedValue(int fieldId
NOT_YET_IMPLEMENTED;
}
}
+ catch (SQLException& exception)
+ {
+ int code = exception.getSqlcode();
+ }
+}
void Record::finalize(Transaction *transaction)
{
@@ -849,7 +856,7 @@ void Record::setPriorVersion(Record* rec
ASSERT(false);
}
-int Record::thaw()
+int Record::thaw(bool force)
{
return 0;
}
@@ -964,3 +971,8 @@ SyncObject* Record::getSyncPrior(void)
{
return format->table->getSyncPrior(this);
}
+
+SyncObject* Record::getSyncThaw(void)
+{
+ return format->table->getSyncThaw(this);
+}
=== modified file 'storage/falcon/Record.h'
--- a/storage/falcon/Record.h 2008-05-09 19:58:50 +0000
+++ b/storage/falcon/Record.h 2008-10-24 05:35:38 +0000
@@ -88,12 +88,13 @@ public:
virtual Record* getPriorVersion();
virtual Record* getGCPriorVersion(void);
virtual void print(void);
- virtual int thaw();
+ virtual int thaw(bool force = false);
virtual const char* getEncodedRecord();
virtual int setRecordData(const UCHAR *dataIn, int dataLength);
virtual void serialize(Serialize* stream);
virtual int getSize(void);
virtual SyncObject* getSyncPrior(void);
+ virtual SyncObject* getSyncThaw(void);
const UCHAR* getEncoding (int index);
int setEncodedRecord(Stream *stream, bool interlocked);
@@ -107,7 +108,7 @@ public:
int getBlobId(int fieldId);
void finalize(Transaction *transaction);
void getEncodedValue (int fieldId, Value *value);
- void getRecord (Stream *stream);
+ bool getRecord (Stream *stream);
int getEncodedSize();
void deleteData(void);
void printRecord(const char* header);
@@ -119,10 +120,13 @@ public:
Record (Table *table, int32 recordNumber, Stream *stream);
Record (Database *database, Serialize* stream);
- inline int hasRecord()
+ inline int hasRecord(bool forceThaw = true)
{
- return data.record != NULL;
- };
+ if (state == recChilled && forceThaw)
+ thaw();
+
+ return (data.record != NULL);
+ }
inline char* getRecordData()
{
@@ -142,7 +146,6 @@ protected:
public:
volatile INTERLOCK_TYPE useCount;
- //Table *table;
Format *format;
int recordNumber;
int size;
=== modified file 'storage/falcon/RecordScavenge.cpp'
--- a/storage/falcon/RecordScavenge.cpp 2008-05-09 19:58:50 +0000
+++ b/storage/falcon/RecordScavenge.cpp 2008-10-24 05:06:52 +0000
@@ -56,7 +56,7 @@ void RecordScavenge::inventoryRecord(Rec
uint64 age = baseGeneration - record->generation;
int size = record->size + sizeof(MemBigHeader);
- if (record->hasRecord() || (record->state == recChilled))
+ if (record->hasRecord(false) || record->state == recChilled)
size += sizeof(MemBigHeader);
if (age != UNDEFINED && age < AGE_GROUPS)
=== modified file 'storage/falcon/RecordVersion.cpp'
--- a/storage/falcon/RecordVersion.cpp 2008-10-16 02:57:10 +0000
+++ b/storage/falcon/RecordVersion.cpp 2008-10-24 05:35:38 +0000
@@ -194,7 +194,7 @@ bool RecordVersion::scavenge(RecordScave
if ( useCount == 1
&& !transaction
&& transactionId < recordScavenge->transactionId
- && (!hasRecord()
+ && (!hasRecord(false)
|| generation <= recordScavenge->scavengeGeneration
|| recordScavenge->forced))
{
@@ -231,7 +231,7 @@ bool RecordVersion::scavenge(RecordScave
if ( rec->useCount == 1
&& !rec->getTransaction()
&& rec->getTransactionId() < recordScavenge->transactionId
- && (!rec->hasRecord()
+ && (!rec->hasRecord(false)
|| rec->generation <= recordScavenge->scavengeGeneration))
return true;
}
@@ -353,8 +353,11 @@ uint64 RecordVersion::getVirtualOffset()
return (virtualOffset);
}
-int RecordVersion::thaw()
+int RecordVersion::thaw(bool force)
{
+ Sync syncThaw(format->table->getSyncThaw(this), "RecordVersion::thaw");
+ syncThaw.lock(Exclusive);
+
int bytesRestored = 0;
Transaction *trans = transaction;
@@ -367,7 +370,7 @@ int RecordVersion::thaw()
// true, then the record data can be restored from the serial log. If writePending
// is false, then the record data has been written to the data pages.
- if (trans && trans->writePending)
+ if (trans && (trans->writePending || force))
{
trans->addRef();
bytesRestored = trans->thaw(this);
@@ -381,9 +384,6 @@ int RecordVersion::thaw()
// The record data is no longer available in the serial log, so zap the
// virtual offset and restore from the data page.
- if (state != recChilled)
- return size;
-
bool recordFetched = false;
if (bytesRestored == 0)
@@ -414,9 +414,10 @@ int RecordVersion::thaw()
}
if (state == recChilled)
- ASSERT(bytesRestored > 0 || data.record == NULL);
-
- state = recData;
+ {
+ if (data.record != NULL)
+ state = recData;
+ }
return bytesRestored;
}
=== modified file 'storage/falcon/RecordVersion.h'
--- a/storage/falcon/RecordVersion.h 2008-04-25 04:25:18 +0000
+++ b/storage/falcon/RecordVersion.h 2008-10-24 05:06:52 +0000
@@ -53,7 +53,7 @@ public:
virtual void setPriorVersion (Record *oldVersion);
virtual void setVirtualOffset(uint64 offset);
virtual uint64 getVirtualOffset();
- virtual int thaw();
+ virtual int thaw(bool force = false);
virtual void print(void);
virtual int getSize(void);
virtual void serialize(Serialize* stream);
=== modified file 'storage/falcon/SRLUpdateRecords.cpp'
--- a/storage/falcon/SRLUpdateRecords.cpp 2008-10-16 02:53:35 +0000
+++ b/storage/falcon/SRLUpdateRecords.cpp 2008-10-24 05:06:52 +0000
@@ -198,8 +198,11 @@ void SRLUpdateRecords::append(Transactio
// Load the record data into a stream
- if (record->hasRecord())
- record->getRecord(&stream);
+ if (record->hasRecord(false))
+ {
+ if (!record->getRecord(&stream))
+ continue;
+ }
else
ASSERT(record->state == recDeleted);
@@ -247,7 +250,6 @@ void SRLUpdateRecords::append(Transactio
log->chilledRecords += chilledRecordsWindow;
log->chilledBytes += chilledBytesWindow;
transaction->chilledRecords += chilledRecordsWindow;
- transaction->chilledBytes += chilledBytesWindow;
windowNumber = (uint32)log->writeWindow->virtualOffset / SRL_WINDOW_SIZE;
}
} // next window
=== modified file 'storage/falcon/StorageConnection.cpp'
--- a/storage/falcon/StorageConnection.cpp 2008-03-11 16:15:47 +0000
+++ b/storage/falcon/StorageConnection.cpp 2008-10-23 07:58:38 +0000
@@ -133,6 +133,8 @@ void StorageConnection::close(void)
int StorageConnection::commit(void)
{
+ int errorCode = 0;
+
if (connection)
{
if (traceStream)
@@ -142,15 +144,22 @@ int StorageConnection::commit(void)
traceStream->clear();
}
-
- connection->commit();
+
+ try
+ {
+ connection->commit();
+ }
+ catch (SQLException& exception)
+ {
+ errorCode = translateError(exception, StorageErrorIOErrorSerialLog);
+ }
}
transactionActive = false;
implicitTransactionCount = 0;
verbMark = 0;
- return 0;
+ return errorCode;
}
int StorageConnection::prepare(int xidLength, const UCHAR *xid)
@@ -165,6 +174,8 @@ int StorageConnection::prepare(int xidLe
int StorageConnection::rollback(void)
{
+ int errorCode = 0;
+
if (connection)
{
if (traceStream)
@@ -174,14 +185,22 @@ int StorageConnection::rollback(void)
traceStream->clear();
}
- connection->rollback();
+
+ try
+ {
+ connection->rollback();
+ }
+ catch (SQLException& exception)
+ {
+ errorCode = translateError(exception, StorageErrorIOErrorSerialLog);
+ }
}
transactionActive = false;
implicitTransactionCount = 0;
verbMark = 0;
- return 0;
+ return errorCode;
}
int StorageConnection::startTransaction(int isolationLevel)
@@ -321,10 +340,16 @@ int StorageConnection::startImplicitTran
return false;
}
-void StorageConnection::endImplicitTransaction(void)
+int StorageConnection::endImplicitTransaction(void)
{
+ int errorCode = 0;
+
if (implicitTransactionCount > 0 && --implicitTransactionCount == 0)
- commit();
+ {
+ errorCode = commit();
+ }
+
+ return errorCode;
}
int StorageConnection::markVerb(void)
@@ -339,13 +364,22 @@ int StorageConnection::markVerb(void)
return false;
}
-void StorageConnection::rollbackVerb(void)
+int StorageConnection::rollbackVerb(void)
{
if (verbMark)
{
- savepointRollback(verbMark);
- verbMark = 0;
+ try
+ {
+ savepointRollback(verbMark);
+ verbMark = 0;
+ }
+ catch (SQLException& exception)
+ {
+ return translateError(exception, StorageErrorIOErrorSerialLog);
+ }
}
+
+ return 0;
}
void StorageConnection::releaseVerb(void)
@@ -416,3 +450,26 @@ void StorageConnection::validate(int opt
connection->validate(flags);
}
+
+int StorageConnection::translateError(SQLException& exception, int defaultStorageError)
+{
+ // This method is inspired by the corresponding method in
+ // StorageTable::translateError.
+
+ int errorCode;
+ int sqlCode = exception.getSqlcode();
+
+ switch (sqlCode)
+ {
+ case IO_ERROR_SERIALLOG:
+ errorCode = StorageErrorIOErrorSerialLog;
+ break;
+
+ default:
+ errorCode = defaultStorageError;
+ }
+
+ setErrorText(&exception);
+
+ return errorCode;
+}
=== modified file 'storage/falcon/StorageConnection.h'
--- a/storage/falcon/StorageConnection.h 2008-03-11 16:15:47 +0000
+++ b/storage/falcon/StorageConnection.h 2008-10-23 07:58:38 +0000
@@ -54,12 +54,12 @@ public:
virtual int rollback(void);
virtual int startTransaction(int isolationLevel);
virtual int startImplicitTransaction(int isolationLevel);
- virtual void endImplicitTransaction(void);
+ virtual int endImplicitTransaction(void);
virtual int savepointSet();
virtual int savepointRelease(int savePoint);
virtual int savepointRollback(int savePoint);
virtual int markVerb();
- virtual void rollbackVerb();
+ virtual int rollbackVerb();
virtual void releaseVerb();
virtual void addRef(void);
virtual void release(void);
@@ -81,6 +81,7 @@ public:
void setMySqlThread(THD* thd);
void setCurrentStatement(const char* text);
Transaction* getTransaction(void);
+ int translateError(SQLException& exception, int defaultStorageError);
Connection *connection;
Database *database;
=== modified file 'storage/falcon/Table.cpp'
--- a/storage/falcon/Table.cpp 2008-10-21 20:51:43 +0000
+++ b/storage/falcon/Table.cpp 2008-10-24 05:35:38 +0000
@@ -859,8 +859,12 @@ void Table::init(int id, const char *sch
syncTriggers.setName("Table::syncTriggers");
syncScavenge.setName("Table::syncScavenge");
syncAlter.setName("Table::syncAlter");
+
for (int n = 0; n < SYNC_VERSIONS_SIZE; n++)
syncPriorVersions[n].setName("Table::syncPriorVersions");
+
+ for (int n = 0; n < SYNC_THAW_SIZE; n++)
+ syncThaw[n].setName("Table::syncThaw");
}
Record* Table::fetch(int32 recordNumber)
@@ -2545,9 +2549,6 @@ bool Table::checkUniqueRecordVersion(int
state = transaction->getRelativeState(dup, DO_NOT_WAIT);
- if (dup->state == recChilled)
- dup->getRecordData();
-
// Check for a deleted record or a record lock
if (!dup->hasRecord())
@@ -3548,6 +3549,13 @@ Record* Table::fetchForUpdate(Transactio
return NULL;
}
+ if (record->state == recChilled && !record->thaw())
+ {
+ record->release();
+
+ return NULL;
+ }
+
// Lock the record
if (dbb->debug & DEBUG_RECORD_LOCKS)
@@ -3562,9 +3570,6 @@ Record* Table::fetchForUpdate(Transactio
transaction->addRecord(recordVersion);
recordVersion->release();
- if (record->state == recChilled)
- record->thaw();
-
ASSERT(record->useCount >= 2);
return record;
@@ -3818,6 +3823,18 @@ SyncObject* Table::getSyncPrior(int reco
return syncPriorVersions + lockNumber;
}
+SyncObject* Table::getSyncThaw(Record* record)
+{
+ int lockNumber = record->recordNumber % SYNC_THAW_SIZE;
+ return syncThaw + lockNumber;
+}
+
+SyncObject* Table::getSyncThaw(int recordNumber)
+{
+ int lockNumber = recordNumber % SYNC_THAW_SIZE;
+ return syncThaw + lockNumber;
+}
+
static bool needUniqueCheck(Index *index, Record *record)
{
Record *oldRecord = record->getPriorVersion();
=== modified file 'storage/falcon/Table.h'
--- a/storage/falcon/Table.h 2008-10-16 02:53:35 +0000
+++ b/storage/falcon/Table.h 2008-10-24 05:35:38 +0000
@@ -43,6 +43,7 @@ static const int PostCommit = 128;
static const int BL_SIZE = 128;
static const int FORMAT_HASH_SIZE = 20;
static const int SYNC_VERSIONS_SIZE = 16;
+static const int SYNC_THAW_SIZE = 16;
#define FOR_FIELDS(field,table) {for (Field *field=table->fields; field; field = field->next){
#define FOR_INDEXES(index,table) {for (Index *index=table->indexes; index; index = index->next){
@@ -224,7 +225,8 @@ public:
SyncObject* getSyncPrior(Record* record);
SyncObject* getSyncPrior(int recordNumber);
-
+ SyncObject* getSyncThaw(Record* record);
+ SyncObject* getSyncThaw(int recordNumber);
Dbb *dbb;
SyncObject syncObject;
@@ -232,6 +234,7 @@ public:
SyncObject syncScavenge;
SyncObject syncAlter; // prevent concurrent Alter statements.
SyncObject syncPriorVersions[SYNC_VERSIONS_SIZE];
+ SyncObject syncThaw[SYNC_THAW_SIZE];
Table *collision; // Hash collision in database
Table *idCollision; // mod(id) collision in database
Table *next; // next in database linked list
=== modified file 'storage/falcon/Transaction.cpp'
--- a/storage/falcon/Transaction.cpp 2008-10-16 02:53:35 +0000
+++ b/storage/falcon/Transaction.cpp 2008-10-24 05:06:52 +0000
@@ -1526,7 +1526,7 @@ void Transaction::backlogRecords(void)
{
prior = record->prevInTrans;
- if (!record->hasRecord())
+ if (!record->hasRecord(false))
{
if (savePoints)
for (; savePoint && record->savePointId < savePoint->id; savePoint = savePoint->next)
=== modified file 'storage/falcon/ha_falcon.cpp'
--- a/storage/falcon/ha_falcon.cpp 2008-10-23 01:21:55 +0000
+++ b/storage/falcon/ha_falcon.cpp 2008-10-24 00:12:20 +0000
@@ -1203,20 +1203,26 @@ int StorageInterface::commit(handlerton
{
DBUG_ENTER("StorageInterface::commit");
StorageConnection *storageConnection = getStorageConnection(thd);
+ int ret = 0;
if (all || !thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
{
if (storageConnection)
- storageConnection->commit();
+ ret = storageConnection->commit();
else
- storageHandler->commit(thd);
+ ret = storageHandler->commit(thd);
}
else
{
if (storageConnection)
storageConnection->releaseVerb();
else
- storageHandler->releaseVerb(thd);
+ ret = storageHandler->releaseVerb(thd);
+ }
+
+ if (ret != 0)
+ {
+ DBUG_RETURN(getMySqlError(ret));
}
DBUG_RETURN(0);
@@ -1245,20 +1251,26 @@ int StorageInterface::rollback(handlerto
{
DBUG_ENTER("StorageInterface::rollback");
StorageConnection *storageConnection = getStorageConnection(thd);
+ int ret = 0;
if (all || !thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
{
if (storageConnection)
- storageConnection->rollback();
+ ret = storageConnection->rollback();
else
- storageHandler->rollback(thd);
+ ret = storageHandler->rollback(thd);
}
else
{
if (storageConnection)
- storageConnection->rollbackVerb();
+ ret = storageConnection->rollbackVerb();
else
- storageHandler->rollbackVerb(thd);
+ ret = storageHandler->rollbackVerb(thd);
+ }
+
+ if (ret != 0)
+ {
+ DBUG_RETURN(getMySqlError(ret));
}
DBUG_RETURN(0);
@@ -1929,10 +1941,12 @@ int StorageInterface::external_lock(THD
if (lock_type == F_UNLCK)
{
+ int ret = 0;
+
storageConnection->setCurrentStatement(NULL);
if (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
- storageConnection->endImplicitTransaction();
+ ret = storageConnection->endImplicitTransaction();
else
storageConnection->releaseVerb();
@@ -1941,6 +1955,9 @@ int StorageInterface::external_lock(THD
storageTable->clearStatement();
storageTable->clearCurrentIndex();
}
+
+ if (ret)
+ DBUG_RETURN(error(ret));
}
else
{
| Thread |
|---|
| • bzr push into mysql-6.0-falcon-team branch (cpowers:2878 to 2881) Bug#36631Bug#38541 Bug#38567 Bug#38569 Bug#39694 Bug#39695 Bug#39696 | Christopher Powers | 24 Oct |