List:Commits« Previous MessageNext Message »
From:Vladislav Vaintroub Date:November 14 2008 3:30am
Subject:bzr commit into mysql-6.0-falcon-team branch (vvaintroub:2912)
Bug#39789
View as plain text  
#At file:///G:/bzr/mysql-6.0-falcon-team/

 2912 Vladislav Vaintroub	2008-11-14
      Bug#39789 : Falcon recovery failure after several CREATE + DROP TABLESPACE
            
      The problem in this specific situation was removal of datafiles in SRLDropTable
      space::redo(),even if tablespace with the same datafile path in use by another 
      tablespace instance.
            
      The fix reimplements create/dropTablespace handling in recovery in 
      a manner consistent with the rest of Falcon recovery.
            
      -  pass1(check) of recovery  collects information about what tablespaces 
         are dropped at the end
      
      -  pass2 and redo skip any reference to dropped tablespace 
        (except for SRLDropTableSpace record)
      
      -  tablespace (not marked as dropped) are created during 
         pass2 of recovery
      
      -  tablspaces marked as dropped are "redropped" in phase2 of recovery 
         i.e removed from memory structures (hashtables and lists).
         Datafile that is possibly left over in previous session is deleted
         as well.
      
      This patch moves tableSpaceId from classes derived from SerialLogRecord
      to the parent class, for technical reasons - it is much simpler to check
      if log record should be skipped in different recovery phases.
modified:
  storage/falcon/PageInventoryPage.cpp
  storage/falcon/SRLBlobDelete.h
  storage/falcon/SRLBlobUpdate.h
  storage/falcon/SRLCreateIndex.h
  storage/falcon/SRLCreateSection.h
  storage/falcon/SRLCreateTableSpace.cpp
  storage/falcon/SRLCreateTableSpace.h
  storage/falcon/SRLData.h
  storage/falcon/SRLDelete.h
  storage/falcon/SRLDeleteIndex.cpp
  storage/falcon/SRLDeleteIndex.h
  storage/falcon/SRLDropTableSpace.cpp
  storage/falcon/SRLDropTableSpace.h
  storage/falcon/SRLFreePage.h
  storage/falcon/SRLIndexAdd.h
  storage/falcon/SRLIndexDelete.h
  storage/falcon/SRLIndexPage.h
  storage/falcon/SRLInversionPage.h
  storage/falcon/SRLOverflowPages.h
  storage/falcon/SRLRecordLocator.h
  storage/falcon/SRLRecordStub.h
  storage/falcon/SRLSectionLine.h
  storage/falcon/SRLSectionPage.h
  storage/falcon/SRLSectionPromotion.h
  storage/falcon/SRLSequencePage.h
  storage/falcon/SRLUpdateBlob.h
  storage/falcon/SRLUpdateIndex.h
  storage/falcon/SRLUpdateRecords.cpp
  storage/falcon/SRLUpdateRecords.h
  storage/falcon/SerialLog.cpp
  storage/falcon/SerialLog.h
  storage/falcon/SerialLogRecord.cpp
  storage/falcon/SerialLogRecord.h

per-file messages:
  storage/falcon/PageInventoryPage.cpp
    Check no page allocations are done in phase2 of recovery
  storage/falcon/SRLBlobDelete.h
    moved tableSpaceId to parent class
  storage/falcon/SRLBlobUpdate.h
    moved tableSpaceId to parent class
  storage/falcon/SRLCreateIndex.h
    moved tableSpaceId to parent class
  storage/falcon/SRLCreateSection.h
    moved tableSpaceId to parent class
  storage/falcon/SRLCreateTableSpace.cpp
    create tablespace in phase2 of recovery
  storage/falcon/SRLCreateTableSpace.h
    moved tableSpaceId to parent class
  storage/falcon/SRLData.h
    moved tableSpaceId to parent class
  storage/falcon/SRLDelete.h
    moved tableSpaceId to parent class
  storage/falcon/SRLDeleteIndex.cpp
    Move redoing deleteIndex to SRLDeleteIndex::redo() from pass1()
  storage/falcon/SRLDeleteIndex.h
    moved tableSpaceId to parent class
  storage/falcon/SRLDropTableSpace.cpp
    expunge tablespace in pass2, not in redo
  storage/falcon/SRLDropTableSpace.h
    moved tableSpaceId to parent class
  storage/falcon/SRLFreePage.h
    moved tableSpaceId to parent class
  storage/falcon/SRLIndexAdd.h
    moved tableSpaceId to parent class
  storage/falcon/SRLIndexDelete.h
    moved tableSpaceId to parent class
  storage/falcon/SRLIndexPage.h
    moved tableSpaceId to parent class
  storage/falcon/SRLInversionPage.h
    moved tableSpaceId to parent class
  storage/falcon/SRLOverflowPages.h
    moved tableSpaceId to parent class
  storage/falcon/SRLRecordLocator.h
    moved tableSpaceId to parent class
  storage/falcon/SRLRecordStub.h
    moved tableSpaceId to parent class
  storage/falcon/SRLSectionLine.h
    moved tableSpaceId to parent class
  storage/falcon/SRLSectionPage.h
    moved tableSpaceId to parent class
  storage/falcon/SRLSectionPromotion.h
    moved tableSpaceId to parent class
  storage/falcon/SRLSequencePage.h
    moved tableSpaceId to parent class
  storage/falcon/SRLUpdateBlob.h
    moved tableSpaceId to parent class
  storage/falcon/SRLUpdateIndex.h
    moved tableSpaceId to parent class
  storage/falcon/SRLUpdateRecords.cpp
    skip updates to tablespaces that are dropped.
    
    rename local tableSpaceId variables to lowercase tablespaceid, 
    to avoid confusion with class member
  storage/falcon/SRLUpdateRecords.h
    moved tableSpaceId to parent class
  storage/falcon/SerialLog.cpp
    skip records referencing dropped tablespaces in phase2 and redo of recovery
  storage/falcon/SerialLogRecord.cpp
    Initialize tableSpaceId in constructor
  storage/falcon/SerialLogRecord.h
    new class member tableSpaceId, moved here from derived classes
=== modified file 'storage/falcon/PageInventoryPage.cpp'
--- a/storage/falcon/PageInventoryPage.cpp	2008-06-17 17:41:54 +0000
+++ b/storage/falcon/PageInventoryPage.cpp	2008-11-14 02:30:11 +0000
@@ -31,6 +31,8 @@
 #include "Transaction.h"
 #include "Log.h"
 #include "SQLError.h"
+#include "SerialLog.h"
+#include "Database.h"
 
 #ifdef _DEBUG
 #undef THIS_FILE
@@ -80,6 +82,8 @@ Bdb* PageInventoryPage::createInventoryP
 
 Bdb* PageInventoryPage::allocPage(Dbb * dbb, PageType pageType, TransId transId)
 {
+	SerialLog *serialLog = dbb->database->serialLog;
+	ASSERT(!(serialLog->recovering && (serialLog->recoveryPhase ==2)));
 	for (int32 pip = dbb->lastPageAllocated / dbb->pagesPerPip;; ++pip)
 		{
 		int32 pipPageNumber = (pip == 0) ? PIP_PAGE : pip * dbb->pagesPerPip - 1;

=== modified file 'storage/falcon/SRLBlobDelete.h'
--- a/storage/falcon/SRLBlobDelete.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLBlobDelete.h	2008-11-14 02:30:11 +0000
@@ -29,8 +29,7 @@ public:
 	void pass2(void);
 	void redo(void);
 	void print(void);
-	
-	int		tableSpaceId;
+
 	int32	locatorPage;
 	int		locatorLine;
 	int32	dataPage;

=== modified file 'storage/falcon/SRLBlobUpdate.h'
--- a/storage/falcon/SRLBlobUpdate.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLBlobUpdate.h	2008-11-14 02:30:11 +0000
@@ -39,7 +39,6 @@ public:
 	virtual void	pass2(void);
 	virtual void	redo(void);
 
-	int			tableSpaceId;
 	int32		sectionId;
 	int32		locatorPage;
 	int			locatorLine;

=== modified file 'storage/falcon/SRLCreateIndex.h'
--- a/storage/falcon/SRLCreateIndex.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLCreateIndex.h	2008-11-14 02:30:11 +0000
@@ -38,7 +38,6 @@ public:
 	virtual void	read();
 	virtual void	commit(void);
 
-	int			tableSpaceId;
 	int32		indexId;
 	int			indexVersion;
 };

=== modified file 'storage/falcon/SRLCreateSection.h'
--- a/storage/falcon/SRLCreateSection.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLCreateSection.h	2008-11-14 02:30:11 +0000
@@ -39,7 +39,6 @@ public:
 	SRLCreateSection();
 	virtual ~SRLCreateSection();
 
-	int		tableSpaceId;
 	int		sectionId;
 };
 

=== modified file 'storage/falcon/SRLCreateTableSpace.cpp'
--- a/storage/falcon/SRLCreateTableSpace.cpp	2008-07-17 13:52:17 +0000
+++ b/storage/falcon/SRLCreateTableSpace.cpp	2008-11-14 02:30:11 +0000
@@ -85,14 +85,14 @@ void SRLCreateTableSpace::read()
 
 void SRLCreateTableSpace::pass1()
 {
-	TableSpaceInit tsInit;
-	tsInit.comment		= comment;
-	log->database->tableSpaceManager->redoCreateTableSpace(tableSpaceId,
nameLength, name, filenameLength, filename, type, &tsInit);
+
 }
 
 void SRLCreateTableSpace::pass2()
 {
-
+	TableSpaceInit tsInit;
+	tsInit.comment		= comment;
+	log->database->tableSpaceManager->redoCreateTableSpace(tableSpaceId,
nameLength, name, filenameLength, filename, type, &tsInit);
 }
 
 void SRLCreateTableSpace::commit()

=== modified file 'storage/falcon/SRLCreateTableSpace.h'
--- a/storage/falcon/SRLCreateTableSpace.h	2008-07-17 13:52:17 +0000
+++ b/storage/falcon/SRLCreateTableSpace.h	2008-11-14 02:30:11 +0000
@@ -44,7 +44,6 @@ public:
 
 	const char	*name;
 	const char	*filename;
-	int			tableSpaceId;
 	int			nameLength;
 	int			filenameLength;
 	int			type;

=== modified file 'storage/falcon/SRLData.h'
--- a/storage/falcon/SRLData.h	2007-10-16 19:40:17 +0000
+++ b/storage/falcon/SRLData.h	2008-11-14 02:30:11 +0000
@@ -44,7 +44,6 @@ public:
 	
 	void			append(Dbb *dbb, Transaction *transaction, int32 sectionId, int32 recordId,
Stream *stream);
 
-	int			tableSpaceId;
 	int32		sectionId;
 	int32		recordId;
 	int32		length;

=== modified file 'storage/falcon/SRLDelete.h'
--- a/storage/falcon/SRLDelete.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLDelete.h	2008-11-14 02:30:11 +0000
@@ -40,7 +40,6 @@ public:
 	SRLDelete();
 	virtual ~SRLDelete();
 
-	int			tableSpaceId;
 	int32		sectionId;
 	int32		recordId;
 	int32		length;

=== modified file 'storage/falcon/SRLDeleteIndex.cpp'
--- a/storage/falcon/SRLDeleteIndex.cpp	2008-07-15 18:57:27 +0000
+++ b/storage/falcon/SRLDeleteIndex.cpp	2008-11-14 02:30:11 +0000
@@ -72,8 +72,14 @@ void SRLDeleteIndex::read()
 void SRLDeleteIndex::pass1()
 {
 	log->bumpIndexIncarnation(indexId, tableSpaceId, objDeleted);
-	Dbb *dbb = log->findDbb(tableSpaceId);
+}
+
+void SRLDeleteIndex::redo()
+{
+	if (!log->bumpIndexIncarnation(indexId, tableSpaceId, objDeleted))
+		return;
 
+	Dbb *dbb = log->findDbb(tableSpaceId);
 	if (!dbb)
 		return;
 		
@@ -92,12 +98,6 @@ void SRLDeleteIndex::pass1()
 		}
 }
 
-void SRLDeleteIndex::redo()
-{
-	if (!log->bumpIndexIncarnation(indexId, tableSpaceId, objDeleted))
-		return;
-}
-
 void SRLDeleteIndex::print()
 {
 	logPrint("Delete Index %d\n", indexId);

=== modified file 'storage/falcon/SRLDeleteIndex.h'
--- a/storage/falcon/SRLDeleteIndex.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLDeleteIndex.h	2008-11-14 02:30:11 +0000
@@ -38,7 +38,6 @@ public:
 	void			append(Dbb *dbb, TransId transId, int indexId, int idxVersion);
 	void			print();
 
-	int		tableSpaceId;
 	int32	indexId;
 	int		indexVersion;
 };

=== modified file 'storage/falcon/SRLDropTableSpace.cpp'
--- a/storage/falcon/SRLDropTableSpace.cpp	2008-06-08 22:12:35 +0000
+++ b/storage/falcon/SRLDropTableSpace.cpp	2008-11-14 02:30:11 +0000
@@ -63,14 +63,16 @@ void SRLDropTableSpace::read()
 		transactionId = 0;
 }
 
+
 void SRLDropTableSpace::pass1()
 {
-
+	log->setTableSpaceDropped(tableSpaceId);
 }
 
 void SRLDropTableSpace::pass2()
 {
 
+	log->tableSpaceManager->expungeTableSpace(tableSpaceId);
 }
 
 void SRLDropTableSpace::commit()
@@ -80,5 +82,4 @@ void SRLDropTableSpace::commit()
 
 void SRLDropTableSpace::redo()
 {
-	log->tableSpaceManager->expungeTableSpace(tableSpaceId);
 }

=== modified file 'storage/falcon/SRLDropTableSpace.h'
--- a/storage/falcon/SRLDropTableSpace.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLDropTableSpace.h	2008-11-14 02:30:11 +0000
@@ -42,7 +42,6 @@ public:
 	virtual void read();
 	void append (TableSpace *tableSpace, Transaction *transaction);
 
-	int		tableSpaceId;
 };
 
 #endif //
!defined(AFX_SRLDROPTABLESPACE_H__3A416C47_6B8F_49CC_9471_B9F75D024B12__INCLUDED_)

=== modified file 'storage/falcon/SRLFreePage.h'
--- a/storage/falcon/SRLFreePage.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLFreePage.h	2008-11-14 02:30:11 +0000
@@ -41,7 +41,6 @@ public:
 	
 	void			append (Dbb *dbb, int32 pageNumber);
 
-	int			tableSpaceId;
 	int32		pageNumber;
 	int			incarnation;
 };

=== modified file 'storage/falcon/SRLIndexAdd.h'
--- a/storage/falcon/SRLIndexAdd.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLIndexAdd.h	2008-11-14 02:30:11 +0000
@@ -39,7 +39,6 @@ public:
 	SRLIndexAdd();
 	virtual ~SRLIndexAdd();
 
-	int			tableSpaceId;
 	int32		indexId;
 	int32		recordId;
 	int32		length;

=== modified file 'storage/falcon/SRLIndexDelete.h'
--- a/storage/falcon/SRLIndexDelete.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLIndexDelete.h	2008-11-14 02:30:11 +0000
@@ -38,7 +38,6 @@ public:
 	SRLIndexDelete();
 	virtual ~SRLIndexDelete();
 
-	int			tableSpaceId;
 	int32		indexId;
 	int32		recordId;
 	int32		length;

=== modified file 'storage/falcon/SRLIndexPage.h'
--- a/storage/falcon/SRLIndexPage.h	2008-02-13 18:45:15 +0000
+++ b/storage/falcon/SRLIndexPage.h	2008-11-14 02:30:11 +0000
@@ -38,7 +38,6 @@ public:
 	SRLIndexPage();
 	virtual ~SRLIndexPage();
 
-	int			tableSpaceId;
 	int			indexVersion;
 	int32		pageNumber;
 	int32		parent;

=== modified file 'storage/falcon/SRLInversionPage.h'
--- a/storage/falcon/SRLInversionPage.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLInversionPage.h	2008-11-14 02:30:11 +0000
@@ -38,7 +38,6 @@ public:
 	SRLInversionPage();
 	virtual ~SRLInversionPage();
 
-	int			tableSpaceId;
 	int32		pageNumber;
 	int32		parent;
 	int32		prior;

=== modified file 'storage/falcon/SRLOverflowPages.h'
--- a/storage/falcon/SRLOverflowPages.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLOverflowPages.h	2008-11-14 02:30:11 +0000
@@ -32,7 +32,6 @@ public:
 	virtual void	redo(void);
 	virtual void	print(void);
 	
-	int				tableSpaceId;
 	int				dataLength;
 	const UCHAR*	data;
 };

=== modified file 'storage/falcon/SRLRecordLocator.h'
--- a/storage/falcon/SRLRecordLocator.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLRecordLocator.h	2008-11-14 02:30:11 +0000
@@ -39,7 +39,6 @@ public:
 	SRLRecordLocator();
 	virtual ~SRLRecordLocator();
 
-	int		tableSpaceId;
 	int		sectionId;
 	int		sequence;
 	int32	pageNumber;

=== modified file 'storage/falcon/SRLRecordStub.h'
--- a/storage/falcon/SRLRecordStub.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLRecordStub.h	2008-11-14 02:30:11 +0000
@@ -37,7 +37,6 @@ public:
 	SRLRecordStub();
 	virtual ~SRLRecordStub();
 
-	int		tableSpaceId;
 	int32	sectionId;
 	int32	recordId;
 

=== modified file 'storage/falcon/SRLSectionLine.h'
--- a/storage/falcon/SRLSectionLine.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLSectionLine.h	2008-11-14 02:30:11 +0000
@@ -31,7 +31,6 @@ public:
 	virtual void redo(void);
 	virtual void print(void);
 
-	int		tableSpaceId;
 	int32	pageNumber;
 	int32	dataPageNumber;
 };

=== modified file 'storage/falcon/SRLSectionPage.h'
--- a/storage/falcon/SRLSectionPage.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLSectionPage.h	2008-11-14 02:30:11 +0000
@@ -38,7 +38,6 @@ public:
 	SRLSectionPage();
 	virtual ~SRLSectionPage();
 
-	int		tableSpaceId;
 	int32	parentPage;
 	int32	pageNumber;
 	int		sectionSlot;

=== modified file 'storage/falcon/SRLSectionPromotion.h'
--- a/storage/falcon/SRLSectionPromotion.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLSectionPromotion.h	2008-11-14 02:30:11 +0000
@@ -30,7 +30,6 @@ public:
 	virtual void	pass2(void);
 	virtual void	redo(void);
 	
-	int			tableSpaceId;
 	int			sectionId;
 	int			length;
 	int32		rootPageNumber;

=== modified file 'storage/falcon/SRLSequencePage.h'
--- a/storage/falcon/SRLSequencePage.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLSequencePage.h	2008-11-14 02:30:11 +0000
@@ -30,7 +30,6 @@ public:
 	virtual void redo(void);
 	
 	int		pageSequence;
-	int		tableSpaceId;
 	int32	pageNumber;
 	virtual void print(void);
 };

=== modified file 'storage/falcon/SRLUpdateBlob.h'
--- a/storage/falcon/SRLUpdateBlob.h	2007-10-16 19:40:17 +0000
+++ b/storage/falcon/SRLUpdateBlob.h	2008-11-14 02:30:11 +0000
@@ -35,7 +35,6 @@ public:
 	
 	const UCHAR		*data;
 	int			recordNumber;
-	int			tableSpaceId;
 	int			length;
 	int			sectionId;
 };

=== modified file 'storage/falcon/SRLUpdateIndex.h'
--- a/storage/falcon/SRLUpdateIndex.h	2007-09-20 15:44:25 +0000
+++ b/storage/falcon/SRLUpdateIndex.h	2008-11-14 02:30:11 +0000
@@ -39,7 +39,6 @@ public:
 	void			append(DeferredIndex* deferredIndex);
 	void			thaw(DeferredIndex* deferredIndex);
 
-	int				tableSpaceId;
 	int				indexId;
 	const UCHAR		*data;
 	const UCHAR		*ptr;

=== modified file 'storage/falcon/SRLUpdateRecords.cpp'
--- a/storage/falcon/SRLUpdateRecords.cpp	2008-11-09 01:44:58 +0000
+++ b/storage/falcon/SRLUpdateRecords.cpp	2008-11-14 02:30:11 +0000
@@ -84,10 +84,10 @@ int SRLUpdateRecords::thaw(RecordVersion
 	// Get section id, record id and data length written. Input pointer will be at
 	// beginning of record data.
 
-	int tableSpaceId = 0;
+	int tablespaceid = 0;
 	
 	if (control->version >= srlVersion8)
-		tableSpaceId = control->getInt();
+		tablespaceid = control->getInt();
 		
 	control->getInt();			// sectionId
 	int recordNumber = control->getInt();
@@ -179,7 +179,7 @@ void SRLUpdateRecords::append(Transactio
 				break;
 	
 			Table *table = record->format->table;
-			tableSpaceId = table->dbb->tableSpaceId;
+			int tablespaceid = table->dbb->tableSpaceId;
 			Stream stream;
 			
 			// A non-zero virtual offset indicates that the record was previously
@@ -227,7 +227,7 @@ void SRLUpdateRecords::append(Transactio
 			// Ensure record fits within current window
 
 			if (log->writePtr + 
-				 byteCount(tableSpaceId) + 
+				 byteCount(tablespaceid) + 
 				 byteCount(table->dataSectionId) + 
 				 byteCount(record->recordNumber) + 
 				 byteCount(stream.totalLength) + stream.totalLength >= end)
@@ -240,9 +240,9 @@ void SRLUpdateRecords::append(Transactio
 
 			record->setVirtualOffset(log->writeWindow->currentLength +
log->writeWindow->virtualOffset);
 			uint32 sectionId = table->dataSectionId;
-			log->updateSectionUseVector(sectionId, tableSpaceId, 1);
+			log->updateSectionUseVector(sectionId, tablespaceid, 1);
 			
-			putInt(tableSpaceId);
+			putInt(tablespaceid);
 			putInt(record->getPriorVersion() ? sectionId : -(int) sectionId - 1);
 			putInt(record->recordNumber);
 			putStream(&stream);
@@ -303,23 +303,25 @@ void SRLUpdateRecords::redo(void)
 	if (transaction->state == sltCommitted)
 		for (const UCHAR *p = data, *end = data + dataLength; p < end;)
 			{
+			int tablespaceid;
 			if (control->version >= srlVersion8)
-				tableSpaceId = getInt(&p);
+				tablespaceid = getInt(&p);
 			else
-				tableSpaceId = 0;
+				tablespaceid = 0;
 		
 			int id = getInt(&p);
 			uint sectionId = (id >= 0) ? id : -id - 1;
 			int recordNumber = getInt(&p);
 			int length = getInt(&p);
-			log->updateSectionUseVector(sectionId, tableSpaceId, -1);
+			log->updateSectionUseVector(sectionId, tablespaceid, -1);
 
 			if (log->traceRecord && recordNumber == log->traceRecord)
 				print();
 					
-			if (log->bumpSectionIncarnation(sectionId, tableSpaceId, objInUse))
+			if (log->bumpSectionIncarnation(sectionId, tablespaceid, objInUse)
+				&& (!log->isTableSpaceDropped(tablespaceid)))
 				{
-				Dbb *dbb = log->getDbb(tableSpaceId);
+				Dbb *dbb = log->getDbb(tablespaceid);
 				
 				if (length)
 					{
@@ -346,16 +348,20 @@ void SRLUpdateRecords::pass1(void)
 
 	for (const UCHAR *p = data, *end = data + dataLength; p < end;)
 		{
+		int tablespaceid;
 		if (control->version >= srlVersion8)
-			tableSpaceId = getInt(&p);
+			tablespaceid = getInt(&p);
 		else
-			tableSpaceId = 0;
-			
+			tablespaceid = 0;
+
 		int id = getInt(&p);
 		uint sectionId = (id >= 0) ? id : -id - 1;
 		getInt(&p);			// recordNumber
 		int length = getInt(&p);
-		log->bumpSectionIncarnation(sectionId, tableSpaceId, objInUse);
+
+		if (!log->isTableSpaceDropped(tablespaceid))
+			log->bumpSectionIncarnation(sectionId, tablespaceid, objInUse);
+
 		p += length;
 		}
 }
@@ -380,20 +386,21 @@ void SRLUpdateRecords::commit(void)
 	
 	for (const UCHAR *p = data, *end = data + dataLength; p < end;)
 		{
+		int tablespaceid;
 		if (control->version >= srlVersion8)
-			tableSpaceId = getInt(&p);
+			tablespaceid = getInt(&p);
 		else
-			tableSpaceId = 0;
+			tablespaceid = 0;
 			
 		int id = getInt(&p);
 		uint sectionId = (id >= 0) ? id : -id - 1;
 		int recordNumber = getInt(&p);
 		int length = getInt(&p);
-		log->updateSectionUseVector(sectionId, tableSpaceId, -1);
+		log->updateSectionUseVector(sectionId, tablespaceid, -1);
 		
-		if (log->isSectionActive(sectionId, tableSpaceId))
+		if (log->isSectionActive(sectionId, tablespaceid))
 			{
-			Dbb *dbb = log->getDbb(tableSpaceId);
+			Dbb *dbb = log->getDbb(tablespaceid);
 
 			if (length)
 				{
@@ -415,10 +422,11 @@ void SRLUpdateRecords::print(void)
 	
 	for (const UCHAR *p = data, *end = data + dataLength; p < end;)
 		{
+		int tablespaceid;
 		if (control->version >= srlVersion8)
-			tableSpaceId = getInt(&p);
+			tablespaceid = getInt(&p);
 		else
-			tableSpaceId = 0;
+			tablespaceid = 0;
 
 		int id = getInt(&p);
 		uint sectionId = (id >= 0) ? id : -id - 1;
@@ -426,7 +434,7 @@ void SRLUpdateRecords::print(void)
 		int length = getInt(&p);
 		char temp[40];
 		Log::debug("   rec %d, len %d to section %d/%d %s\n", 
-					recordNumber, length, sectionId, tableSpaceId, format(length, p, sizeof(temp),
temp));
+					recordNumber, length, sectionId, tablespaceid, format(length, p, sizeof(temp),
temp));
 		p += length;
 		}
 }

=== modified file 'storage/falcon/SRLUpdateRecords.h'
--- a/storage/falcon/SRLUpdateRecords.h	2008-02-14 21:06:10 +0000
+++ b/storage/falcon/SRLUpdateRecords.h	2008-11-14 02:30:11 +0000
@@ -37,7 +37,6 @@ public:
 	int				thaw(RecordVersion *record, bool *thawed);
 	
 	const UCHAR		*data;
-	int				tableSpaceId;
 	int				savepointId;
 	int				dataLength;
 };

=== modified file 'storage/falcon/SerialLog.cpp'
--- a/storage/falcon/SerialLog.cpp	2008-10-30 00:22:54 +0000
+++ b/storage/falcon/SerialLog.cpp	2008-11-14 02:30:11 +0000
@@ -344,7 +344,8 @@ void SerialLog::recover()
 	// Next, make a second pass to reallocate any necessary pages
 
 	while ( (record = control.nextRecord()) )
-		record->pass2();
+		if (!isTableSpaceDropped(record->tableSpaceId) || record->type ==
srlDropTableSpace)
+			record->pass2();
 
 	recoveryPages->reset();
 	recoveryIndexes->reset();
@@ -362,8 +363,10 @@ void SerialLog::recover()
 	// Make a third pass doing things
 
 	while ( (record = control.nextRecord()) )
-		record->redo();
-		
+		if (!isTableSpaceDropped(record->tableSpaceId))
+			record->redo();
+
+
 	for (SerialLogTransaction *action, **ptr = &running.first; (action = *ptr);)
 		if (action->completedRecovery())
 			{
@@ -400,6 +403,7 @@ void SerialLog::recover()
 	recoveryPages = NULL;
 	recoveryIndexes = NULL;
 	recoverySections = NULL;
+	droppedTablespaces.clear();
 	
 	for (window = firstWindow; window; window = window->next)
 		if (!(window->inUse == 0 || window == writeWindow))
@@ -1150,7 +1154,7 @@ bool SerialLog::bumpPageIncarnation(int3
 
 	bool ret = recoveryPages->bumpIncarnation(pageNumber, tableSpaceId, state, pass1);
 	
-	if (ret && pass1)
+	if (ret && recoveryPhase==2)
 		{
 		Dbb *dbb = getDbb(tableSpaceId);
 		dbb->reallocPage(pageNumber);
@@ -1285,6 +1289,18 @@ void SerialLog::setIndexInactive(int id,
 	recoveryIndexes->setInactive(id, tableSpaceId);
 }
 
+void SerialLog::setTableSpaceDropped(int tableSpaceId)
+{
+	ASSERT(recovering);
+	droppedTablespaces.set(tableSpaceId);
+}
+
+bool SerialLog::isTableSpaceDropped(int tableSpaceId)
+{
+	ASSERT(recovering);
+	return droppedTablespaces.isSet(tableSpaceId);
+}
+
 bool SerialLog::sectionInUse(int sectionId, int tableSpaceId)
 {
 	TableSpaceInfo *info = getTableSpaceInfo(tableSpaceId);
@@ -1461,6 +1477,7 @@ void SerialLog::printWindows(void)
 
 Dbb* SerialLog::getDbb(int tableSpaceId)
 {
+	ASSERT(recoveryPhase != 1);
 	if (tableSpaceId == 0)
 		return defaultDbb;
 		
@@ -1469,6 +1486,7 @@ Dbb* SerialLog::getDbb(int tableSpaceId)
 
 Dbb* SerialLog::findDbb(int tableSpaceId)
 {
+	ASSERT(recoveryPhase != 1);
 	if (tableSpaceId == 0)
 		return defaultDbb;
 	

=== modified file 'storage/falcon/SerialLog.h'
--- a/storage/falcon/SerialLog.h	2008-10-20 21:28:11 +0000
+++ b/storage/falcon/SerialLog.h	2008-11-14 02:30:11 +0000
@@ -29,6 +29,7 @@
 #include "Stack.h"
 #include "DenseArray.h"
 #include "Queue.h"
+#include "Bitmap.h"
 
 static const unsigned int altLogFlag	= 0x80000000;
 static const int srlSignature			= 123456789;
@@ -126,6 +127,8 @@ public:
 	void			setSectionInactive(int id, int tableSpaceId);
 	void			setIndexActive(int id, int tableSpaceId);
 	void			setIndexInactive(int id, int tableSpaceId);
+	void			setTableSpaceDropped(int tableSpaceId);
+	bool			isTableSpaceDropped(int tableSpaceId);
 	void			updateSectionUseVector(uint sectionId, int tableSpaceId, int delta);
 	void			updateIndexUseVector(uint indexId, int tableSpaceId, int delta);
 	bool			sectionInUse(int sectionId, int tableSpaceId);
@@ -170,6 +173,7 @@ public:
 	RecoveryObjects		*recoveryPages;
 	RecoveryObjects		*recoverySections;
 	RecoveryObjects		*recoveryIndexes;
+	Bitmap				droppedTablespaces;
 	Dbb					*defaultDbb;
 	Gopher				*gophers;
 	Thread				*srlQueue;

=== modified file 'storage/falcon/SerialLogRecord.cpp'
--- a/storage/falcon/SerialLogRecord.cpp	2008-11-11 22:33:27 +0000
+++ b/storage/falcon/SerialLogRecord.cpp	2008-11-14 02:30:11 +0000
@@ -100,6 +100,7 @@ int init()
 SerialLogRecord::SerialLogRecord()
 {
 	transactionId = 0;
+	tableSpaceId = 0;
 	type = 0;
 }
 
@@ -268,6 +269,8 @@ SerialLogTransaction* SerialLogRecord::g
 	return transaction;
 }
 
+
+
 void SerialLogRecord::pass1()
 {
 
@@ -323,3 +326,4 @@ void SerialLogRecord::logPrint(const cha
 	else
 		printf("Log %s", temp);
 }
+

=== modified file 'storage/falcon/SerialLogRecord.h'
--- a/storage/falcon/SerialLogRecord.h	2008-11-11 22:33:27 +0000
+++ b/storage/falcon/SerialLogRecord.h	2008-11-14 02:30:11 +0000
@@ -111,6 +111,7 @@ public:
 	SerialLog			*log;
 	SerialLogControl	*control;
 	TransId				transactionId;
+	int					tableSpaceId;
 	UCHAR				type;
 };
 

Thread
bzr commit into mysql-6.0-falcon-team branch (vvaintroub:2912)Bug#39789Vladislav Vaintroub14 Nov
  • Re: bzr commit into mysql-6.0-falcon-team branch (vvaintroub:2912)Bug#39789Kevin Lewis20 Nov