List:Commits« Previous MessageNext Message »
From:Vladislav Vaintroub Date:August 18 2008 10:17pm
Subject:bzr commit into mysql-6.0-falcon branch (vvaintroub:2788) Bug#38843
View as plain text  
#At file:///C:/bzr/mysql-6.0-falcon-team/

 2788 Vladislav Vaintroub	2008-08-18
      Bug#38843 Falcon does not start if datadir is located on home directory on Solaris
      
      Problem
      Falcon tries to create all directories recursively before creating a file
      While trying to create a directory structure, IO::createPath runs onto Solaris bug. 
      mkdir returns ENOSYS instead of EEXIST on an existing path, if if it happens to be NFS 
      automounted root dir.
      
      Fix: 
      1) IO::createPath - Workaround the bug by handling ENOSYS like EEXIST. 
      We do not expect any other OS to return ENOSYS(not supported) for mkdir().
      
      
      2) As Falcon can always rely on datadir to exist, enclose all current 
      occurences of  IO::createPath() into #ifndef FALCONDB. It is possibly 
      needed for Netfrastructure, so the change is safe.
modified:
  storage/falcon/BackLog.cpp
  storage/falcon/IO.cpp
  storage/falcon/RepositoryVolume.cpp
  storage/falcon/StorageDatabase.cpp
  storage/falcon/TableSpace.cpp

per-file messages:
  storage/falcon/BackLog.cpp
    Falcon should not create any directoies
  storage/falcon/IO.cpp
    Workaround a Solaris bug : ENOSYS is not what we think is of it.
    In case of mkdir() ENOSYS means "EEXIST on automounted NFS root directory".
  storage/falcon/RepositoryVolume.cpp
    Falcon should not create any directories
  storage/falcon/StorageDatabase.cpp
    Falcon should not create any directories
  storage/falcon/TableSpace.cpp
    Falcon should not create any directories.
=== modified file 'storage/falcon/BackLog.cpp'
--- a/storage/falcon/BackLog.cpp	2008-07-17 13:52:17 +0000
+++ b/storage/falcon/BackLog.cpp	2008-08-18 20:17:15 +0000
@@ -37,7 +37,9 @@ BackLog::BackLog(Database *db, const cha
 {
 	database = db;
 	dbb = new Dbb(database->dbb, 0);
+#ifndef FALCONDB
 	dbb->createPath(fileName);
+#endif
 	dbb->create(fileName, dbb->pageSize, 0, HdrTableSpace, 0, NULL);
 	dbb->noLog = true;
 	dbb->tableSpaceId = -1;

=== modified file 'storage/falcon/IO.cpp'
--- a/storage/falcon/IO.cpp	2008-08-14 16:34:43 +0000
+++ b/storage/falcon/IO.cpp	2008-08-18 20:17:15 +0000
@@ -411,13 +411,17 @@ void IO::declareFatalError()
 	fatalError = true;
 }
 
+
+#ifndef ENOSYS
+#define ENOSYS EEXIST
+#endif
+
+// Make sure parent directories for file exist
 void IO::createPath(const char *fileName)
 {
-	// First, better make sure directories exists
 	JString fname = getPath(fileName);
 
 	char directory [256], *q = directory;
-
 	for (const char *p = fname.getString(); *p;)
 		{
 		char c = *p++;
@@ -427,9 +431,14 @@ void IO::createPath(const char *fileName
 			*q = 0;
 			
 			if (q > directory && q [-1] != ':')
-				if (MKDIR (directory) && errno != EEXIST)
+				{
+				if (MKDIR (directory) && errno != EEXIST && errno != ENOSYS)
+					// ENOSYS is a Solaris speficic workaround, mkdir returns it
+					// on existing automounted NFS directories, instead
+					// of EEXIST.
 					throw SQLError (IO_ERROR, 
 					"can't create directory \"%s\"\n", directory);
+				}
 			}
 		*q++ = c;
 		}

=== modified file 'storage/falcon/RepositoryVolume.cpp'
--- a/storage/falcon/RepositoryVolume.cpp	2008-07-24 08:45:03 +0000
+++ b/storage/falcon/RepositoryVolume.cpp	2008-08-18 20:17:15 +0000
@@ -232,7 +232,9 @@ void RepositoryVolume::makeWritable()
 
 void RepositoryVolume::create()
 {
+#ifndef FALCONDB
 	IO::createPath (fileName);
+#endif
 	dbb->create(fileName, dbb->pageSize, 0, HdrRepositoryFile, 0, NULL);
 	Sync syncDDL(&database->syncSysDDL, "RepositoryVolume::create");
 	Transaction *transaction = database->getSystemTransaction();

=== modified file 'storage/falcon/StorageDatabase.cpp'
--- a/storage/falcon/StorageDatabase.cpp	2008-08-18 05:45:29 +0000
+++ b/storage/falcon/StorageDatabase.cpp	2008-08-18 20:17:15 +0000
@@ -156,7 +156,9 @@ Connection* StorageDatabase::createDatab
 	try
 		{
 		masterConnection = getConnection();
+#ifndef FALCONDB
 		IO::createPath(filename);
+#endif
 		masterConnection->createDatabase(name, filename, ACCOUNT, PASSWORD, threads);
 		Statement *statement = masterConnection->createStatement();
 		

=== modified file 'storage/falcon/TableSpace.cpp'
--- a/storage/falcon/TableSpace.cpp	2008-07-17 13:52:17 +0000
+++ b/storage/falcon/TableSpace.cpp	2008-08-18 20:17:15 +0000
@@ -123,7 +123,9 @@ void TableSpace::open()
 
 void TableSpace::create()
 {
+#ifndef FALCONDB
 	dbb->createPath(filename);
+#endif
 	dbb->create(filename, dbb->pageSize, 0, HdrTableSpace, 0, NULL);
 	active = true;
 	dbb->flush();

Thread
bzr commit into mysql-6.0-falcon branch (vvaintroub:2788) Bug#38843Vladislav Vaintroub18 Aug
  • Re: bzr commit into mysql-6.0-falcon branch (vvaintroub:2788) Bug#38843Lars-Erik Bjørk19 Aug
  • Re: bzr commit into mysql-6.0-falcon branch (vvaintroub:2788) Bug#38843Olav Sandstaa19 Aug