From: Dmitry Lenev Date: July 1 2009 8:08pm Subject: bzr commit into mysql-6.1-fk branch (dlenev:2723) Bug#45701 List-Archive: http://lists.mysql.com/commits/77699 X-Bug: 45701 Message-Id: <20090701200803.3EE49B818C@mockturtle> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_kcJmvjB+1Yp/qNlH65Gzrg)" --Boundary_(ID_kcJmvjB+1Yp/qNlH65Gzrg) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/dlenev/src/bzr/mysql-6.1-falcon-bugs/ based on revid:dlenev@stripped 2723 Dmitry Lenev 2009-07-02 Bug#45701 - If a table has two foreign key relationships with one other table, an alter table that drops one of the FKs will call external_lock twice for each table. And if a table has a foreign key relationship with another table, an alter that creates another foreign key relationship between the two tables will also call external_lock twice for each table. So it is necessary for Falcon to support multiple calls to external_lock by the same connection to the same table. This was not needed before the Foreign Key implementation. So the current Connection pointer is sent into Table::SetAlter() and stored in Table::alterConnection. And alterIsActive is now an int instead of a boolean. If the same connection locks the table a second time, alterIsActive is incremented and alterConnection remains set. It is not set to NULL until alterIsActive is decremented to zero. Manually applied patch from Falcon team tree to mysql-6.1-fk tree. modified: storage/falcon/StorageTable.cpp storage/falcon/Table.cpp storage/falcon/Table.h === modified file 'storage/falcon/StorageTable.cpp' --- a/storage/falcon/StorageTable.cpp 2009-04-16 11:25:48 +0000 +++ b/storage/falcon/StorageTable.cpp 2009-07-01 20:07:55 +0000 @@ -634,7 +634,7 @@ void StorageTable::clearAlter(void) bool StorageTable::setAlter(void) { - return share->table->setAlter(); + return share->table->setAlter(storageConnection->connection); } int StorageTable::alterCheck(void) === modified file 'storage/falcon/Table.cpp' --- a/storage/falcon/Table.cpp 2009-04-16 11:25:48 +0000 +++ b/storage/falcon/Table.cpp 2009-07-01 20:07:55 +0000 @@ -914,7 +914,8 @@ void Table::init(int id, const char *sch debugThawedBytes = 0; cardinality = 0; priorCardinality = 0; - alterIsActive = false; + alterIsActive = 0; + alterConnection = NULL; syncObject.setName("Table::syncObject"); syncTriggers.setName("Table::syncTriggers"); syncAlter.setName("Table::syncAlter"); @@ -1765,7 +1766,8 @@ void Table::truncate(Transaction *transa ageGroup = database->currentGeneration; debugThawedRecords = 0; debugThawedBytes = 0; - alterIsActive = false; + alterIsActive = 0; + alterConnection = NULL; deleting = false; } @@ -3638,19 +3640,21 @@ void Table::clearAlter(void) { Sync sync(&syncAlter, "Table::clearAlter"); sync.lock(Exclusive); - alterIsActive = false; + if (--alterIsActive == 0) + alterConnection = NULL; } } -bool Table::setAlter(void) +bool Table::setAlter(Connection* connection) { Sync sync(&syncAlter, "Table::setAlter"); sync.lock(Exclusive); - if (alterIsActive) + if (alterIsActive && (connection != alterConnection)) return false; - alterIsActive = true; + alterIsActive++; + alterConnection = connection; return true; } === modified file 'storage/falcon/Table.h' --- a/storage/falcon/Table.h 2009-04-09 15:40:11 +0000 +++ b/storage/falcon/Table.h 2009-07-01 20:07:55 +0000 @@ -127,7 +127,7 @@ public: int nextColumnId (int previous); void loadStuff(); void clearAlter(void); - bool setAlter(void); + bool setAlter(Connection* connection); void addTrigger (Trigger *trigger); void dropTrigger (Trigger *trigger); @@ -271,7 +271,8 @@ public: bool changed; bool eof; bool markedForDelete; - bool alterIsActive; + int alterIsActive; + Connection* alterConnection; // The connection currintly doing an alter. bool deleting; // dropping or truncating. int32 recordBitmapHighWater; int32 ageGroup; --Boundary_(ID_kcJmvjB+1Yp/qNlH65Gzrg) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/dlenev@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/dlenev@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: dlenev@stripped # target_branch: file:///home/dlenev/src/bzr/mysql-6.1-falcon-bugs/ # testament_sha1: 0972bbcf8deff0ebed99c0b844ea1947acb1aed0 # timestamp: 2009-07-02 00:08:02 +0400 # base_revision_id: dlenev@stripped # # Begin bundle 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 --Boundary_(ID_kcJmvjB+1Yp/qNlH65Gzrg)--