List:Commits« Previous MessageNext Message »
From:Mats Kindahl Date:June 10 2008 4:14pm
Subject:bzr commit into mysql-6.0-falcon:mysql-6.0-falcon branch (mats:2697)
View as plain text  
#At bzr+ssh://bk-internal.mysql.com/bzrroot/server/mysql-6.0-falcon/

 2697 Mats Kindahl	2008-06-10 [merge]
      Merging.
modified:
  storage/falcon/Gopher.cpp
  storage/falcon/SRLDropTableSpace.cpp
  storage/falcon/SerialLog.h
  storage/falcon/SerialLogTransaction.cpp
  storage/falcon/SerialLogTransaction.h
  storage/falcon/TableSpaceManager.cpp
  storage/falcon/TableSpaceManager.h

=== modified file 'storage/falcon/Gopher.cpp'
--- a/storage/falcon/Gopher.cpp	2008-03-25 03:55:03 +0000
+++ b/storage/falcon/Gopher.cpp	2008-06-08 22:12:35 +0000
@@ -64,11 +64,22 @@ void Gopher::gopherThread(void)
 		
 		SerialLogTransaction *transaction = log->pending.first;
 		log->pending.remove(transaction);
+
+		
+		Sync serializeGophers(&log->syncSerializeGophers, "Gopher::gopherThread(4)");
+
+		if (transaction->allowConcurrentGophers)
+			serializeGophers.lock(Shared);
+		else
+			serializeGophers.lock(Exclusive);
+
 		sync.unlock();
 
 		transaction->doAction();
 
 		sync.lock(Exclusive);
+		serializeGophers.unlock();
+
 		log->inactions.append(transaction);
 		
 		if (log->pending.count > log->maxTransactions && !log->blocking)

=== modified file 'storage/falcon/SRLDropTableSpace.cpp'
--- a/storage/falcon/SRLDropTableSpace.cpp	2007-11-14 23:24:47 +0000
+++ b/storage/falcon/SRLDropTableSpace.cpp	2008-06-08 22:12:35 +0000
@@ -24,6 +24,7 @@
 #include "SRLVersion.h"
 #include "SerialLogControl.h"
 #include "Transaction.h"
+#include "SerialLogTransaction.h"
 
 //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
@@ -42,7 +43,12 @@ SRLDropTableSpace::~SRLDropTableSpace()
 void SRLDropTableSpace::append(TableSpace *tableSpace, Transaction *transaction)
 {
 	START_RECORD(srlDropTableSpace, "SRLDropTableSpace::append");
-	log->getTransaction(transaction->transactionId);
+
+	SerialLogTransaction* serialLogTransaction 
+		= log->getTransaction(transaction->transactionId);
+
+	serialLogTransaction->allowConcurrentGophers = false;
+
 	putInt(tableSpace->tableSpaceId);
 	putInt(transaction->transactionId);
 }

=== modified file 'storage/falcon/SerialLog.h'
--- a/storage/falcon/SerialLog.h	2008-03-11 16:15:47 +0000
+++ b/storage/falcon/SerialLog.h	2008-06-08 22:12:35 +0000
@@ -188,6 +188,7 @@ public:
 	SyncObject			syncSections;
 	SyncObject			syncIndexes;
 	SyncObject			syncGopher;
+	SyncObject			syncSerializeGophers;
 	SyncObject			syncUpdateStall;
 	Stack				buffers;
 	UCHAR				*bufferSpace;

=== modified file 'storage/falcon/SerialLogTransaction.cpp'
--- a/storage/falcon/SerialLogTransaction.cpp	2008-02-14 21:45:27 +0000
+++ b/storage/falcon/SerialLogTransaction.cpp	2008-06-08 22:12:35 +0000
@@ -46,6 +46,7 @@ SerialLogTransaction::SerialLogTransacti
 	window = NULL;
 	finished = false;
 	ordered = false;
+	allowConcurrentGophers = true;
 	transaction = NULL;
 	rolledBackSavepoints = NULL;
 	blockNumber = maxBlockNumber = minBlockNumber = physicalBlockNumber = 0;

=== modified file 'storage/falcon/SerialLogTransaction.h'
--- a/storage/falcon/SerialLogTransaction.h	2008-03-11 16:15:47 +0000
+++ b/storage/falcon/SerialLogTransaction.h	2008-06-08 22:12:35 +0000
@@ -71,6 +71,7 @@ public:
 	int						xidLength;
 	UCHAR					*xid;
 	bool					finished;
+	bool					allowConcurrentGophers;
 
 	SerialLog				*log;
 	SerialLogTransaction	*next;

=== modified file 'storage/falcon/TableSpaceManager.cpp'
--- a/storage/falcon/TableSpaceManager.cpp	2008-05-06 23:37:54 +0000
+++ b/storage/falcon/TableSpaceManager.cpp	2008-06-08 22:12:35 +0000
@@ -41,6 +41,7 @@
 #include "SRLDropTableSpace.h"
 #include "Log.h"
 #include "InfoTable.h"
+#include "Thread.h"
 
 #ifdef _DEBUG
 #undef THIS_FILE
@@ -57,6 +58,7 @@ TableSpaceManager::TableSpaceManager(Dat
 	memset(nameHash, 0, sizeof(nameHash));
 	memset(idHash, 0, sizeof(nameHash));
 	tableSpaces = NULL;
+	pendingDrops = 0;
 }
 
 TableSpaceManager::~TableSpaceManager()
@@ -168,10 +170,32 @@ TableSpace* TableSpaceManager::createTab
 	
 	TableSpace *tableSpace = new TableSpace(database, name, id, fileName, type, tsInit);
 	
-	if (!repository && tableSpace->dbb->doesFileExist(fileName))
+	if (!repository)
 		{
-		delete tableSpace;
-		throw SQLError(TABLESPACE_DATAFILE_EXIST_ERROR, "table space file name \"%s\" already
exists\n", fileName);
+		bool fileExists;
+
+		// Check if table space file already exists.
+		// Take into account, that tablespace might have been already  dropped
+		// by another transaction, yet file can still be present on the disk,
+		// if log record is not yet fully committed by the gopher thread).
+		// So we'll wait for a few seconds if there are pending drops and 
+		// tablespace file exists.
+
+		for (int i=0; i < 10; i++)
+			{
+			fileExists = tableSpace->dbb->doesFileExist(fileName);
+
+			if (fileExists && pendingDrops > 0)
+				Thread::getThread("TableSpaceManager::createTableSpace")->sleep(1000);
+			else
+				break;
+			}
+
+		if (fileExists)
+			{
+			delete tableSpace;
+			throw SQLError(TABLESPACE_DATAFILE_EXIST_ERROR, "table space file name \"%s\" already
exists\n", fileName);
+			}
 		}
 		
 	try
@@ -302,6 +326,7 @@ void TableSpaceManager::dropTableSpace(T
 	statement->executeUpdate();
 	Transaction *transaction = database->getSystemTransaction();
 	transaction->hasUpdates = true;
+	pendingDrops++;
 	database->serialLog->logControl->dropTableSpace.append(tableSpace,
transaction);
 
 	syncDDL.unlock();
@@ -386,6 +411,9 @@ void TableSpaceManager::expungeTableSpac
 	sync.unlock();
 	tableSpace->dropTableSpace();
 	delete tableSpace;
+
+	sync.lock(Exclusive);
+	if(pendingDrops >0) pendingDrops--;
 }
 
 void TableSpaceManager::reportWrites(void)

=== modified file 'storage/falcon/TableSpaceManager.h'
--- a/storage/falcon/TableSpaceManager.h	2008-04-05 22:09:17 +0000
+++ b/storage/falcon/TableSpaceManager.h	2008-06-08 22:12:35 +0000
@@ -69,6 +69,7 @@ public:
 	TableSpace	*idHash[TS_HASH_SIZE];
 	SyncObject	syncObject;
 	void postRecovery(void);
+	int pendingDrops;
 };
 
 #endif //
!defined(AFX_TABLESPACEMANAGER_H__BD1D39F6_2201_4136_899C_7CB106E99B8C__INCLUDED_)

Thread
bzr commit into mysql-6.0-falcon:mysql-6.0-falcon branch (mats:2697) Mats Kindahl10 Jun